前の記事で「質問したことを備忘録として記事にまとめて」と言ったところ、なんと「次回は〜〜をします!お楽しみに!」とまさかの備忘録の次回作を勝手に予告されてしまってめっちゃ笑った。せっかくChatGPTが意欲的になったので、次回作を書いてもらったのだが、「パラメータストアの値をCloudformationで取得する(コードで取得しなくてよい)」という知らなかった方法を紹介されてめっちゃためになってしまった……。
はじめに
AWS SAM (Serverless Application Model)を使用すると、サーバーレスアプリケーションのデプロイメントと管理が大幅に簡素化されます。一方、AWS Systems Manager Parameter Storeは、設定データやシークレットをセキュアに保存し、アプリケーションから簡単にアクセスすることができるサービスです。今回は、これら2つのサービスを組み合わせて、AWS SAMテンプレート内で直接Parameter Storeの値を取得する方法について解説します。
直接Parameter Storeの値を取得
Lambda関数のコード内でAWS SDKを使用してParameter Storeからパラメータを取得する代わりに、AWS SAMテンプレート内でCloudFormationのサブスティテューション機能を使用してParameter Storeの値を直接取得することができます。
これは、以下のようにAWS SAMテンプレートを記述することで可能です。
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs14.x
CodeUri: s3://my-bucket/my-function.zip
Environment:
Variables:
MY_VARIABLE: !Sub "{{resolve:ssm:/path/to/parameter:1}}"
ここで、!Sub
はCloudFormationのサブスティテューション(置換)機能を使用しています。{{resolve:ssm:/path/to/parameter:1}}
は、バージョン1の/path/to/parameter
という名前のParameter Storeのパラメータの値を取得しています。/path/to/parameter
は実際のパラメータの名前に置き換えてください。
(著者注記: パス部分はパラメータストアのパラメータ名をそのまま入れたら良い)
この記述により、Lambda関数内では、process.env.MY_VARIABLE
のように通常の環境変数を参照するだけで、Parameter Storeのパラメータの値を取得することができます。
注意点
この方法でパラメータを取得する際、実行はCloudFormationサービスにより行われます。そのため、CloudFormation自身がParameter Storeへのアクセス権限を持っている必要があります。通常、CloudFormationのService RoleはAWS管理ポリシー AWSCloudFormationFullAccess
をアタッチして作成され、このポリシーにはParameter Storeへのアクセス権限が含まれています。したがって、通常はService Roleを特別に設定する必要はありませんが、カスタムポリシーを使用してService Roleを作成した場合など、適切な権限が設定されていることを確認してください。
まとめ
AWS SAMテンプレートとCloudFormationのサブスティテューション機能を使用することで、コード内でAWS SDKを使用せずに直接Parameter Storeからパラメータを取得することが可能になります。これにより、コードの見通しが良くなり、Parameter Storeのパラメータ管理がさらに便利になります。
次回は、AWS SAMテンプレートでのLambda Layerの利用について解説します。お楽しみに!
(著者注: そんな予定はない)
寸評
なんで備忘録だといってるのに次回予告するねんwwwとか言ってたら、フツーに知らない情報書かれて焦った。ちゃんと動きました。ためになりました。
元々は環境変数の使い方とかいう超初歩的な記事を書いていたんだけれど、その中でしれっとパラメータストアの値を直接取得していて、「え、そんなことできるの?」となってしまった。毎回Lambda関数の中でGetParametersしてたっていうね。。。ためになりました。。。