- 03-5820-1777平日10:00〜18:00
- お問い合わせ
今回はAWS CDKを使用して、StepFunctions同期実行するApiGatewayの設定をしてみたいと思います。
AWS CDK 2.78.0
リクエストテンプレート、レスポンステンプレートの設定の意味は以前に書いたコラムの「リクエスト・レスポンス本文簡素化」の章を見た貰えればと思います。
StepFunctions自体の作成もCDKでやろうかと思いましたが、「Amazon States Language」のJSONデータでの作成が出来ず、ロジックでワークフローを作成しなくてもならない為、それなら画面から作成した方がやり易いと思い今回は辞めておきました。
import * as cdk from 'aws-cdk-lib/core';
import * as apigw from 'aws-cdk-lib/aws-apigateway';
import * as iam from 'aws-cdk-lib/aws-iam';
export class ApigatewayCdkStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 既存のステートマシンのARNを指定
const stateMachineArn = 'arn:aws:states:ap-northeast-1:XXXXXXXX:stateMachine:JankenStateMachine';
// API Gatewayを作成
const api = new apigw.RestApi(this, 'CdkTestApi', {
restApiName: 'CdkTestApi',
description: 'CDK Test',
endpointConfiguration: {
types: [apigw.EndpointType.REGIONAL], //エンドポイントタイプ設定
},
});
// API Gatewayにリソース作成
const startExecutionResource = api.root.addResource(
'startExecution'
);
// リソースにメソッドを追加
startExecutionResource.addMethod('POST', new apigw.AwsIntegration({
service: 'states',
action: 'StartSyncExecution', //同時実行なのでStartSyncExecutionを設定
options: {
//実行ロール設定(ここで新規ポリシー、新規ロールを作成している)
credentialsRole: new iam.Role(this, 'StatesExecutionRole', {
assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'),
inlinePolicies: {
StatesExecutionPolicy: new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
actions: ['states:StartSyncExecution'], //ここもStartSyncExecutionを設定
resources: [stateMachineArn],
}),
],
}),
},
}),
//リクエスト本文の簡素化のための設定をする
requestTemplates: {
'application/json': `{
"stateMachineArn": "${stateMachineArn}",
"input": "$util.escapeJavaScript($input.json('$'))"
}`,
},
//レスポンスの設定、
//正常終了の場合はレスポンスのマッピングテンプレートに
//本文の簡素化のための設定をする
integrationResponses: [
{
statusCode: '200',
responseTemplates: {
'application/json': `$util.parseJson($input.json('$.output'))`,
},
},
{
selectionPattern: '4\\d{2}',
statusCode: '400',
responseTemplates: {
'application/json': `$input.path('$.errorMessage')`,
},
},
{
selectionPattern: '5\\d{2}',
statusCode: '500',
responseTemplates: {
'application/json': `$input.path('$.errorMessage')`,
},
},
],
},
}), {
methodResponses: [
{ statusCode: '200' },
{ statusCode: '400' },
{ statusCode: '500' },
],
});
}
}
以上、CDKでStepFunctionsを同期実行するApiGatewayの作成を行ってみました。
以前書いたコラムで画面で作成していたものをCDKにして実装したものですのでので、詳しくは其方もご覧いただければと思います。
この様にインフラや環境周りをコード化出来るのは、楽だし楽しいですね。
ソフトウェアエンジニアがインフラ面に興味を持つきっかけにもなると思います。