クロスパワーブログをご覧の皆さんこんにちは。初めての投稿です。
早速ですが最近AWS SAMに触れる機会がありました。
以前にもAWS SAMの記事はありましたが、今回はテンプレート内でLambda環境変数について記述する部分に着目してみました。
SAMで構築したアプリケーションのデプロイはこちらの記事を参照ください
ひとまずデプロイ
一から書くのが面倒なので今回はSAMが用意しているクイックスタートテンプレートからHello World Exampleを使用して説明します。言語はnodejs14.xを選びました。
Hello World Exampleを使用した場合、template.yaml内にはすでにHelloWorldFunctionが記載されています。
API Gatewayも1つ記述されていますが、今回は要らないので記述から削除します。
Lambda環境変数を定義したい場合はEnvironment Variablesに設定したい数だけ記述をしてください。
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: FunctionName: hello-world-blog CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs14.x Environment: Variables: SAM_TEST: 直接yamlにかいてます
コードは適当にしてこのままデプロイしてみます。
AWSコンソールから確認すると、template.yamlに記載した値が環境変数に設定されています。
パラメータストアから参照させる
タイトルにある通り、template.yaml内に値を直接かかず、参照させる形で環境変数を設定していきます。
今回参照したいパラメータストアに登録されているパラメータ名は「sam-test-blog」とします。
値には「ブログ用」の文字列が登録されています。
パラメータストアに格納されている値をLambda環境変数として設定したい場合は以下のように記載します。
Parameters: SAMTEST: Type: AWS::SSM::Parameter::Value<String> Default: 'sam-test-blog' Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: FunctionName: hello-world-blog CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs14.x Environment: Variables: SAM_TEST: !Ref SAMTEST
デプロイしてみると…
Lambdaのコンソール画面上では値がそのまま出てしまっていますが、パラメータストアに登録した値が設定されています。
躓いたところ
テンプレートの書き方の話になってしまいますが、環境変数のキーと同じパラメータ名にしてデプロイしようとしたら怒られました。
Parameters: SAM_TEST: ←アンダーバーが入ってる Type: AWS::SSM::Parameter::Value<String> Default: 'sam-test-blog' Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: FunctionName: hello-world-blog CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs14.x Environment: Variables: SAM_TEST: !Ref SAM_TEST
表示されたエラーは以下です。
Error: Failed to create changeset for the stack: sam-app-blog, An error occurred (ValidationError) when calling the CreateChangeSet operation: Template format error: Parameter name SAM_TEST is non alphanumeric.
英数字じゃないとダメみたいです。環境変数のキーと違くて問題ないのでアンダーバーを抜いたら無事デプロイできました。
ポイント
この方法には1つ制限があります。2021年10月現在、LambdaではSecureStringの値は参照できません。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html
また、パラメータストアの値が変更された場合は再デプロイしないと反映されませんのでお気を付けください。
終わりに
パラメータストアの値をとるのに遠回しなやり方でしたが、複数のLambdaで同じ環境変数を使用したいときに値を一元管理できて便利そうです。
次回はLambda環境変数に設定されている値の保護についてブログにしたいと思います。