SAMのtemplate.yamlで環境変数を読み込みたい
背景
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の話は以下の記事で詳しく書いてるのでよかったらみてください。
Discussion