コラム

AWS CDKでStepFunctionsを実行するApiGatewayを構築

今回はAWS CDKを使用して、StepFunctions同期実行するApiGatewayの設定をしてみたいと思います。

環境

AWS CDK 2.78.0

設定内容

設定一覧

  • 既存のStepFunctionsを実行するPOSTメソッド作成
  • StepFunctionsを実行する用のIAMロールは新たに作成
  • StepFunctionsは同期実行を行う
  • リクエストのマッピングテンプレートに、StepFunctionsに送るリクエスト本文簡素化する為の設定を行う
  • レスポンスのマッピングテンプレートに、StepFunctionsから取得したレスポンス文の簡素化する為の設定を行う

リクエストテンプレート、レスポンステンプレートの設定の意味は以前に書いたコラムの「リクエスト・レスポンス本文簡素化」の章を見た貰えればと思います。

StepFunctions自体の作成について

StepFunctions自体の作成もCDKでやろうかと思いましたが、「Amazon States Language」のJSONデータでの作成が出来ず、ロジックでワークフローを作成しなくてもならない為、それなら画面から作成した方がやり易いと思い今回は辞めておきました。

CDKソースコード

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にして実装したものですのでので、詳しくは其方もご覧いただければと思います。
この様にインフラや環境周りをコード化出来るのは、楽だし楽しいですね。
ソフトウェアエンジニアがインフラ面に興味を持つきっかけにもなると思います。

この記事をシェアする
  • Facebookアイコン
  • Twitterアイコン
  • LINEアイコン

お問い合わせ ITに関するお悩み不安が少しでもありましたら、
ぜひお気軽にお問い合わせください

お客様のお悩みや不安、課題などを丁寧に、そして誠実にお伺いいたします。

お問い合わせはこちら
お電話でのお問い合わせ 03-5820-1777(平日10:00〜18:00)
よくあるご質問