CDK で AWS Parameters and Secrets Lambda Extension を使ってみる
CDK で AWS Parameters and Secrets Lambda Extension を使ってパラメータを取得する Lambda を作成する。
環境
- aws-cdk: 2.59.0
- @aws-cdk/aws-lambda-go-alpha: 2.59.0-alpha.0
- aws-cdk-lib: 2.59.0
概要
以前『Lambda (Go) + EventBridge (Cron) + Systems Manager Parameter Store + CDK』という記事を書いたが、この実装では Lambda が呼び出されるたびに AWS Systems Manager Parameter Store から値の呼び出しを行っていた。
もともと cron 実行的な Lambda であって大量に呼び出されるものではないので別にいいのだが、大量に呼び出される可能性がある Lambda の場合は取得した値をキャッシュしてやるほうがいい。
キャッシュするための機能として去年の秋に生まれたのが AWS Parameters and Secrets Lambda Extension である。
今回は前回実装したコードを書き換え、値をキャッシュするようにする。
ディレクトリ構成は前回と同じで完成品はここ。
Lambda のソースコード
app/main.go
前回からの変更点をハイライトしている。
|
|
パラメータストアに予め “/sololog/DSN” という名前で MySQL への接続情報を保存していることを前提としている。
AWS Parameters and Secrets Lambda Extension を使用すると、localhost の 2773 ポート(ポート番号は変更できる)にアクセスすることによってパラメータを取得できるようになる。
AWS_SESSION_TOKEN
という環境変数は勝手にセットされているので、GET リクエスト時に X-Aws-Parameters-Secrets-Token
というヘッダに設定する必要がある。
詰まった点としては、最初このページを見て
To retrieve a secret, for secretId, use the ARN or name of the secret.
GET: /secretsmanager/get?secretId=secretId
と書いてあったので secretId にパラメータ名を入れたら取得できなかった。
こっちのページには
For example, in Python, your GET URL might look something like the following example.
parameter_url = ('http://localhost:' + port + '/systemsmanager/parameters/get/?name=' + ssm_parameter_path)
と書いてあり、これに従って URL を変更したら取得できた。
CDK
cdk/lib/app-stack.ts
前回からの変更点をハイライトしている。
|
|
AWS Parameters and Secrets Lambda Extension は Layer として追加することになるが、ARN はこのページに書いてある。
また Lambda からパラメータストアを読み取る必要があるので読み取り権限は付与する必要がある。
前回使っていた ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMReadOnlyAccess")
では駄目そうだったので、PolicyStatement を作成した。
また前回からの改善点として、GoFunction
で Lambda を作成してから必要な Policy だけ追加するようにしている。
参考
- Using Parameter Store parameters in AWS Lambda functions
- Use AWS Secrets Manager secrets in AWS Lambda functions
以上