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に進むようにした。