Lambdaで環境ごとに向き先を切り替えたりなどをしたく、環境変数でその辺を切り分けたい。
ぶっちゃけどうやって管理するのが一番楽かわかりませんが、一つの選択肢としてtemplate.yamlに記載するtemplate.yamlで切り分けられるようにする方法があるようなので備忘録として残します。
前提とゴール
まず前提として、以下の環境で実施しています。
- VSCodeを使用
- SAM CLIを使用し、構成はtemplate.yamlに記載
目指すところとしてはtemplate.yamlにステージごと(今回はDEV, PRDにします)の環境変数を記載し、以下のようなコマンドで切り替えられるようにします。
sam deploy --parameter-overrides Environment=PRD
Mappingを使ったtemplate.yamlの書き方
本題のtemplate.yamlの書き方です。
Parameters:
Environment:
Type: String
Default: DEV
AllowedValues:
- DEV
- PRD
Mappings:
StageVariables:
PRD:
SampleEndpoint: ProdEndpoint
OtherEnvVar: hoge
DEV:
SampleEndpoint: DevEndpoint
OtherEnvVar: fuga
Resources:
MyFunction:
Properties:
Environment:
Variables:
SAMPLE_ENDPOINT: !FindInMap [ StageVariables, !Ref Environment, SampleEndpoint ]
OTHER_ENDPOINT: !FindInMap [ StageVariables, !Ref Environment, OtherEnvVar ]
本当は”SampleEndpoint”を”SAMPLE_ENDPOINT”というように書きたかったのですが、cfn-lintのバリデーションにひっかかるので断念しました。
If文を使ったtemplate.yamlの書き方
Mappingの他にIf文でセットする方法もあるようなので、記載しておきます。
先にVSCodeのsettings.jsonを編集
まずはVSCodeからエラーが出ないように、setting.jsonを編集します。
VSCodeの設定画面にYaml: Custom Tagsというものがあるので、そこからsetting.jsonを変更します。
ちなみにここからじゃなくてもsetting.jsonは編集できますが、適した窓口はここってだけです。
setting.jsonの中に“yaml.customTags”というlistがあるので、そこの末尾に以下を追加します。
“!Equals sequence”,
“!If sequence”,
template.yamlにIf文を書く
普通に環境変数を記載するEnvironment > Variablesに環境変数を記載していきます。
If文を使った例としては以下のとおり。
Parameters:
Environment:
Type: String
Default: DEV
AllowedValues:
- DEV
- PRD
Conditions:
IsPRD: !Equals [ !Ref Environment, 'PRD' ]
Resources:
MyFunction:
Properties:
Environment:
Variables:
SAMPLE_ENDPOINT: !If
- IsPRD
- ProdEndpoint
- DevEndpoint
OTHER_ENV_VAR: !If
- IsPRD
- hoge
- fuga
If部分は以下の書き方でもできるっぽいのでお好みの方で。
SAMPLE_ENDPOINT: !If [ IsPRD, ProdEndpoint, DevEndpoint]
使い分けについて
正直ベストプラクティスはまだ分かりませんが、私は前者のMappingを使った書き方の方が実装者以外の人でも読みやすいかなと思っています。環境による違いの比較もしやすいはず。
ただ切り分けたい変数が限られているようなら、If文を使った方がメンテしやすそうですね。
パラメータストアと組み合わせてキー値を切り分ければ、重要な情報も扱えます。
上手いこと活用しましょう。