はじめに
SAMを使ったサーバーレス環境の構築時に、1つのtemplate.yamlを使って、develop, staging, production毎に環境変数を切り替える方法を忘れるため、備忘もかねて記事にしました
目的
SAMのtemplateを使って、各環境毎に変数値を変えてlambdaを実行できるようにする
どうやるのか?
SAMテンプレートの中の、ParametersとMappingsを使うと、一つの環境変数でKey-Value方式で、複数の値を切り替えることができる
実例
まず、ParametersとMappingを記述する
Parameters:
Environment:
Type: String
AllowedValues:
- development # 開発環境
- staging # ステージング環境
- production # 本番環境
Default: development
Mappings:
EnvironmentMap:
development:
HELLO: 'developmen Hello World'
staging:
HELLO: 'staging Hello World'
production:
HELLO: 'production Hello World'
それを使いたい時は、以下のように指定すれば、環境変数がKeyになり、Valueが取得できる
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs12.x
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Environment:
Variables:
SAMPLE_ENV: !FindInMap [ EnvironmentMap, !Ref Environment, HELLO]
動作確認
# ビルド
sam build
# 実行
sam local start-api --parameter-overrides Environment={書き換えたい環境変数}
アクセスして確認する
curl 'http://localhost:3000/hello'
CI/CDをどうするか?
CIに関しては、一つのtemplate.yamlをビルドするだけで良い
CDの時に、 --parameter-overrides
を使って、Parametersを書き換えてデプロイするフローになる
❯ sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
Setting default arguments for 'sam deploy'
=========================================
Stack Name [SAMPLE-ENV]:
AWS Region [ap-northeast-1]:
Parameter Environment [staging]: ← ここで使いたい環境を指定するだけで良い
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
---- 省略 ----
まとめ
かなり雑にまとめてしまいましたが、templateのParametersだけを使う場合だと、環境変数が多くなると管理が大変になるので、Mappingsを活用すると使いたい環境を指定するだけで、セットアップができる
誰かのご参考になれば幸いです