ネストされたAWS SAM アプリケーションのサンプル その1

概要

AWS SAM を使用して、ネストされたスタックのサンプルを作成してみました。
S3 -> EventBridge -> Lambda の流れで、S3にオブジェクトを作成したイベントを使ってLambdaをトリガーします。
既存のS3にイベントを追加するのは手間が多そうだったので、EventBridgeを使用することにしました。

ソースコード

以下のリポジトリで公開しています。

プロジェクト構造

アプリケーションは、次の3つのSAMテンプレートで構成されます。

  1. template.yaml: ネストされたスタックをオーケストレーションするメインテンプレートです。
  2. s3-eventbridge-template.yaml: S3バケットとEventBridgeのカスタムイベントバスを作成し、defaultイベントバスからカスタムイベントバスへの転送ルールを定義します。
  3. lambda-template.yaml: トリガーされるLambda関数を定義します。

アーキテクチャ

  1. ファイルがS3バケットにアップロードされると、S3イベントが生成されます。
  2. S3イベントは、Amazon EventBridgeのdefaultイベントバスへ送信されます。
  3. EventBridgeのdefaultイベントバスは、定義されたルールに基づいてイベントをカスタムイベントバスへルーティングします。
  4. EventBridgeのカスタムイベントバスは、定義されたルールに基づいてイベントをLambda関数へルーティングします。
  5. イベントに応じてLambda関数がトリガーされます。

前提条件

このサンプルを実行するには、以下の権限およびツールが必要です。

  • 適切な権限を持つAWSアカウント
  • AWS CLI
  • AWS SAM CLI

デプロイ方法

このアプリケーションをデプロイする手順は以下のようになります。

  • このリポジトリをクローンします
    1
    2
    $ git clone https://github.com/hiroaki-ma1203/aws-sam-samples.git
    $ cd aws-sam-samples/nested-sam-app-1
  • SAMアプリケーションをビルドします。
    1
    $ sam build
  • SAMアプリケーションをデプロイします。
    1
    $ sam deploy --guided
    指示に従ってデプロイメント構成を設定します。

使用法

  • デプロイ後、作成されたS3バケットにファイルをアップロードしてください。
  • 発生したS3イベントは、EventBridge を介して Lambda 関数をトリガーします。
  • AWS コンソールまたは CloudWatch Logs を通じて Lambda 関数の実行結果を確認してください。

カスタマイズ

  • template.yaml: ネストされたスタックを追加や変更する場合は、メインのテンプレートを変更してください。
  • s3-eventbridge-template.yaml: S3バケット設定または EventBridgeルールを変更できます。ファイル削除時にもイベント通知するなど。
  • lambda-template.yamlLambda: 関数のランタイムや構成を変更できます。
  • 変更した場合は再度ビルドとデプロイを実行してください。

環境の削除

このアプリケーションによって作成されたすべてのリソースを削除するには、以下の操作を行ってください。

  • S3バケット内のファイルを削除します。
    1
    $ aws cloudformation describe-stacks --stack-name nested-sam-app-1 --query "Stacks[0].Outputs[?OutputKey=='S3BucketName'].OutputValue" --output text | xargs -I {} aws s3 rm s3://{} --recursive
  • スタックを削除します。
    1
    $ sam delete