mahito1594 / 2023-05-14_aws-cdk-sample-queue

Amazon SQS を触ってみたときのメモ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Amazon SQS を触った時のメモ

Requirements

  • aws-cdk の設定
    • ローカルの node_modules 以下に aws-cdk をインストールしているため、グローバルに aws-cdk をインストールする必要はない
    • ちょっと古いけど AWS CDK Workshop を一読しておくとよい
  • NodeJS v18
    • 今回はあまり関係ないが、Node のバージョン次第で aws-sdk のバージョンが変わるので注意

メモ

SQS のセットアップ

aws-cdk を用いてデプロイする。 FIFO ではなく標準キューで作成。 特筆することはない。

ローカルから SQS へメッセージを送れるように

Web のコンソールからメッセージを追加しても良いが、AWS SDK を触ってみたかったのでローカルのスクリプトからキューにメッセージを送信出来るようにする。

producer/.env.example を producer/.env にリネームして、 上で作成した SQS の設定を書き込む。

  • AWS_REGION: SQS のあるリージョン
  • QUEUE_URL: SQS の URL

See producer/index.ts.

キューがトリガーする Lambda 関数の作成

TypeScript で書いてそのままデプロイする。 NodejsFunction を利用してトランスパイルとバンドルを行う。

Note esbuild をインストールしておく必要がある。

$ npm install --save-dev @types/node @types/aws-lambda esbuild

Lambda 関数のハンドラーの型が @types/aws-lambda で提供されている。 SQS のトリガーとして利用するので、SQSHandler とする。

Lambda へ適切な実行ロールの付与

SQS から Lambda 関数をトリガーするため、適切な実行ロールを付与する必要がある。 デベロッパーガイドのチュートリアルの通り実行ロールを作成し、 Lambda 関数に設定する。 SQS の Lambdd トリガーへ設定する方法は「AWS Lambda 関数をトリガーするためのキューの設定」を参照。

後で読む

動作確認

SQS にメッセージを送る:

cd producer && npm run send-message

設定が上手くいっていれば Lambda 関数がトリガーされているはず。 Lambda 関数コンソールから CloudWatch のログを見て、送ったメッセージの内容が出力されていれば OK.

Lambda から Secret Manager 経由で認証情報を取得する

SQS から受け取ったメッセージを外部システムへ POST することを想定。 API call のための認証情報を Secret Manager から取得する。

Secret Manager にパラメータを設定する

コンソールから設定できる。 シークレット名は sample-auth にしておく(何でもよい)。

Lambda 関数に拡張機能を入れる

ユーザーガイドを参考に、AWS Parameters and Secrets Lambda Extension を ConsumerStack で作成した Lambda 関数のレイヤーに追加する。

また Lambda 実行ロールを、シークレットにアクセスできるように適切に変更する。 今回は SecretsManagerReadWrite ポリシーを Lambda 実行ロールに追加。

Lambda からシークレットを取得するには @aws-sdk/client-secrets-manager を利用する。

Lambda の実行ロールについて

aws-cdk で実行ロールを定義することもできる。 最終的なサンプルコードでは lambda-sqs-sample-role というロールを定義して、Lambda 関数の実効ロールとして指定した。

See aws-cdk-lib/aws-iam

Lambda からシークレットを取得して HTTP メソッドを実行する

例として 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 関数を作成する際に環境変数の設定も入れる。

See AWS Lambda 環境変数の仕様

About

Amazon SQS を触ってみたときのメモ

License:Do What The F*ck You Want To Public License


Languages

Language:TypeScript 87.6%Language:JavaScript 12.4%