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

Step Functionsステートマシンから別のStep Functionsを呼び出す

複雑なステートマシンを小さいステートマシンに分割しておけばテストと確認がやりやすくなる

マネージメントコンソール上のエディタでLambdaのコードを書く際にnpmライブラリを追加したい

ローカルでライブラリをインストールしてからインポートする必要があった

Amazon API Gatewayのタイムアウト設定は最大29秒まで

上限緩和もできないので注意

MFA必須のスイッチロールアカウントでaws cliを使う

switch role用のprofileを追加する

AWSのコスト異常検出を設定する

意図しない課金を防ぐためにとりあえず設定しておくと良さそう