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

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

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

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

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

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

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

AWS SAMで作ったLambdaアプリをCircleCIでデプロイする

circleci/aws-serverlessのOrbを使った

Nodejs12のLambdaでawscliを使う

aws-lambda-layer-awscliを使う

BME280センサ情報をAWS IoTで管理してChatbotでSlackに通知する

AWS IoTでデータを管理して不快指数がしきい値を超えたらSlackにアラート通知をするようにした