🫠

【AWS】SAMのtemplate.yamlで環境変数を読み込みたい

2024/07/23に公開

背景

SAMでwebアプリを作っていてい、コミットログを綺麗に残したい。
重要な値を直で書いているためコミットできないので困った。
とりあえず、コミットするために環境変数を外部から読みこむ方法を探した。

やり方が何パターンもあるため、ネット上に情報が散乱している。
この辺りで意外と悩まされたりするので、備忘録として残しておく。

流れ

  • ①template.yamlの上の方にParametersセクションを定義しておく。
  • ②template.yamlの使いたい場所にEnviromentセクションを定義
  • ③ deployコマンド実行
  • ④ おまけ:TypeScriptで書いたlambdaで読み込む

①template.yamlの上の方にParametersセクションを定義しておく

Transform: AWS::Serverless-2016-10-31
Parameters:
  HOGELAMBDA:
    Type: String

アルファベットの大文字と小文字以外は使用できないので、注意!
(最初HOGE_LAMBDAで怒られた。)

②template.yamlの使いたい場所にEnviromentセクションを定義

ここで①で定義した値をvalueとして使う。
HOGE_LAMBDA: !Ref HOGELAMBDA

  # ===========================
  # Lambda関数
  # ===========================
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: unite-tune-lambda/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
            RestApiId:
              Ref: UniteTuneApiGateway
      Environment:
        Variables:
          HOGE_LAMBDA: !Ref HOGELAMBDA # !Refで参照するのを忘れずにね
    Metadata: # TypeScriptのビルド設定
      BuildMethod: esbuild
      BuildProperties:
        Minify: true
        Target: "es2020"
        Sourcemap: true
        EntryPoints:
          - app.ts
        External: # 外部パッケージの追加(ビルドの際に除外される)
          - "@aws-sdk/client-dynamodb"
          - "@aws-sdk/lib-dynamodb"

③ deployコマンド実行

sam buildで通常同様にビルドを行った後、
以下のオプション付きでsam deployを実行する。

sam deploy --parameter-overrides ParameterKey=HOGE_LAMBDA,ParameterValue=HelloEnv

この手順③をJsonファイル経由にしたりといろいろできるらしいが、
それはあくまでもプラスアルファなので今は省略する。
(結局デプロイシェルに書けばいいしな)

=== 追記 ===
②を定義した状態で、sam deploy --guidedを実行したら
samconfig.tomlを更新できるので便利。デプロイシェルよりそっちの方がいい。

④ TypeScriptで書いたlambdaで読み込む

環境変数はLambdaにシークレットを持たせたい時なんかに重宝すると思うので、
lambdaから読み込むサンプルを載せておく。
process.env.HOGE_LAMBDA
というように、node系でお馴染みの方法で読み込めるので嬉しい!

ちなみに今回試したメソッドは以下。

export const lambdaHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
        console.log('hello_debug')
        console.log(process.env.HOGE_LAMBDA);
        return {
            statusCode: 200,
            headers: {
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Methods': 'OPTIONS,POST,GET',
                'Access-Control-Allow-Headers': 'Content-Type, Authorization'
            },
            body: JSON.stringify({
                message: 'hello world',
                HogeParam: process.env.HOGE_LAMBDA
            }),
        };

テストなんかを叩いてcloudWatchでログを見てみる。

2024-07-23T09:52:43.547Z 0c9a3669-b237-44d8-95c6-0e5f34e1c7e6 INFO hello_debug
2024-07-23T09:52:43.547Z 0c9a3669-b237-44d8-95c6-0e5f34e1c7e6 INFO HelloEnv

やったー!
コマンドのオプションで私た値であるHelloEnvが出力されてる!

これでGitHubにあげられる!笑

あと、デプロイシェルはチャットGPTが書いてくれた笑

#!/bin/bash

# 環境変数の設定(必要なだけ追加)
PARAM_KEYS=("HOGELAMBDA" "FOOBAR")
PARAM_VALUES=("HelloEnv" "AnotherValue")

# パラメータオーバーライドを作成
PARAM_OVERRIDE=""

for i in "${!PARAM_KEYS[@]}"; do
    if [ $i -ne 0 ]; then
        PARAM_OVERRIDE+=" "
    fi
    PARAM_OVERRIDE+="ParameterKey=${PARAM_KEYS[$i]},ParameterValue=${PARAM_VALUES[$i]}"
done

# SAMビルドの実行
sam build

# SAMデプロイの実行
sam deploy --parameter-overrides $PARAM_OVERRIDE

SAMの話は以下の記事で詳しく書いてるのでよかったらみてください。
https://zenn.dev/antapp/articles/88cfab11861dfe

Discussion