Amazon SQS を触った時のメモ
- aws-cdk の設定
- ローカルの
node_modules
以下にaws-cdk
をインストールしているため、グローバルに aws-cdk をインストールする必要はない - ちょっと古いけど AWS CDK Workshop を一読しておくとよい
- ローカルの
- NodeJS v18
- 今回はあまり関係ないが、Node のバージョン次第で aws-sdk のバージョンが変わるので注意
aws-cdk を用いてデプロイする。 FIFO ではなく標準キューで作成。 特筆することはない。
Web のコンソールからメッセージを追加しても良いが、AWS SDK を触ってみたかったのでローカルのスクリプトからキューにメッセージを送信出来るようにする。
producer/.env.example を producer/.env にリネームして、 上で作成した SQS の設定を書き込む。
AWS_REGION
: SQS のあるリージョンQUEUE_URL
: SQS の URL
See producer/index.ts.
TypeScript で書いてそのままデプロイする。
NodejsFunction
を利用してトランスパイルとバンドルを行う。
Note esbuild をインストールしておく必要がある。
$ npm install --save-dev @types/node @types/aws-lambda esbuild
Lambda 関数のハンドラーの型が @types/aws-lambda
で提供されている。
SQS のトリガーとして利用するので、SQSHandler
とする。
SQS から Lambda 関数をトリガーするため、適切な実行ロールを付与する必要がある。 デベロッパーガイドのチュートリアルの通り実行ロールを作成し、 Lambda 関数に設定する。 SQS の Lambdd トリガーへ設定する方法は「AWS Lambda 関数をトリガーするためのキューの設定」を参照。
SQS にメッセージを送る:
cd producer && npm run send-message
設定が上手くいっていれば Lambda 関数がトリガーされているはず。 Lambda 関数コンソールから CloudWatch のログを見て、送ったメッセージの内容が出力されていれば OK.
SQS から受け取ったメッセージを外部システムへ POST することを想定。 API call のための認証情報を Secret Manager から取得する。
コンソールから設定できる。
シークレット名は sample-auth
にしておく(何でもよい)。
ユーザーガイドを参考に、AWS Parameters and Secrets Lambda Extension を ConsumerStack で作成した Lambda 関数のレイヤーに追加する。
また Lambda 実行ロールを、シークレットにアクセスできるように適切に変更する。 今回は SecretsManagerReadWrite ポリシーを Lambda 実行ロールに追加。
Lambda からシークレットを取得するには @aws-sdk/client-secrets-manager
を利用する。
aws-cdk で実行ロールを定義することもできる。
最終的なサンプルコードでは lambda-sqs-sample-role
というロールを定義して、Lambda 関数の実効ロールとして指定した。
例として httpbin.org を利用した。 https://httpbin.org/basic-auth はアクセストークンを返却したりはしないので、本当に動作しているかのみ確認する。 HTTP メソッドを実行するために axios を利用している。
NOTE Array.prototype.forEach の中で async/await を上手く使うには少し頭を使う。
ベース URL httpbin.org をハードコードするのではなく、Lambda の環境変数から取得するようにする。
Lambda 関数のコンソールからの設定だと npm run cdk deploy
するたびに、コンソールから消えてしまう。
aws-cdk で Lambda 関数を作成する際に環境変数の設定も入れる。