Step FunctionsでCodeBuildを実行する際にinputを環境変数に設定する

公開日時

Step FunctionsからCodeBuildを実行する際に、前のTask(Lambda)の実行結果をパラメータとして受け取りたかったので対応方法を調べた。

Lambdaの場合はinputPathで渡したものをeventとして受け取ることができたが、CodeBuildの場合はinputPathを直接受け取ることができず環境変数として設定する必要があった。

また、inputPathの値を環境変数に設定するには JsonPath.stringAt を使用する必要があった。

CDKで設定する場合は↓のようになる。

import * as cdk from '@aws-cdk/core'
import { IntegrationPattern, JsonPath } from '@aws-cdk/aws-stepfunctions'
import { LambdaInvoke, CodeBuildStartBuild } from '@aws-cdk/aws-stepfunctions-tasks'
import { Project, BuildEnvironmentVariableType } from '@aws-cdk/aws-codebuild'

export class StepfunctionsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    // create someLambda
    // create someCodebuild

    // Lambda return value
    // {
    //   someValue: 'test'
    // }
    const lambda = new LambdaInvoke(this, 'Before Build', {
      lambdaFunction: someLambda,
      resultPath: '$.someLambda',
    })

    const build = new CodeBuildStartBuild(this, 'Build', {
      project: someCodebuild,
      inputPath: '$.someLambda.Payload',
      integrationPattern: IntegrationPattern.RUN_JOB,
      environmentVariablesOverride: {
        SOME_VALUE: {
          type: BuildEnvironmentVariableType.PLAINTEXT,
          value: JsonPath.stringAt('$.someValue'),
        },
      },
    })

    const stateMachine = new StateMachine(this, 'BuildStateMachine', {
      stateMachineName: 'BuildStateMachine',
      definition: lambda.next(build),
    })
  }
}

なお、デフォルトだとビルドの開始が完了すると次のStateに進んでしまうため、 IntegrationPattern.RUN_JOB でCodeBuildの実行完了を待ってから次のStateに進むようにした。

参考


Related #aws

RDSを定期的に停止するLambdaを作る

手動起動は大変なので

AWS SESの受信メールを暗号化してs3に保存しLambdaで読み込む

jsの場合、複合処理を独自実装する必要がある

CloudWatchアラームを一時的に無効化する

AWS CLIで設定する必要がある

Alexaに気温と二酸化炭素濃度を教えてもらう

「Alexa、気温」でセンサー情報を教えてくれるようになった

CloudWatchのカスタムメトリクスを減らす

あまりチェックしないセンサー値の送信を止めた