SAM CLIのtemplate.yamlでステージごとに環境変数を変える

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文を使った方がメンテしやすそうですね。

パラメータストアと組み合わせてキー値を切り分ければ、重要な情報も扱えます。

上手いこと活用しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

Author

都内Edtech企業のコーポレートエンジニア。
業務改善・自動化についての開発をしています。
エンジニア歴9年、コーポレートエンジニア歴4年。

目次