経緯
新規プロダクトサービスの一環で、AWS SAMでServerlessを使ったんですが、今後の開発環境どうしよう?となりまして。
基本的なテストはローカルでいいにしてもステージング的な環境は欲しいし、複数のリリース先ってどうやって管理するん?
sam deployの設定をお手軽に切り替える、そんな機能ないの?
ドキュメントやhelp(当時sam --version 1.2.0)見てもそれっぽいものは見つからなかったんですが、AWS SAMのissue探してみたらあっさりありまして。
Release 1.3.0 - Support for Multi Config
https://github.com/aws/aws-sam-cli/releases/tag/v1.3.0
ついこないだリリースされてた。
※気づいた時点でちょうど1週間前
しかしまだあんまり情報ないようなので、とりあえずざっくり情報書いておきます。
あんまり詳しいわけではないので、間違ってたらごめんね!(修正ツッコミいただけると助かります
前提
$ sam --version
SAM CLI, version 1.3.2
ファイル指定とセクション指定
実はドキュメント化されていなかっただけで、--config-envというsamconfig.tomlをセクションで切り替えるオプションはあったらしいです。(って前述のissueに書いてありました)
また、今回で--config-fileというsamconfig.tomlを直指定できるオプションができました。
ちなみにsam buildなど他のコマンドでも--config-envや--config-fileは有効のようです。
--config-file [Filename]
samconfig.tomlファイル自体を指定します。
例えば本番用にsamconfig_prod.toml、開発用にsamconfig_dev.tomlというファイルを作成しておいて、コマンドで使い分ける感じです。
# 本番用
sam deploy --config-file samconfig_prod.toml
# 開発用
sam deploy --config-file samconfig_dev.toml
なお、1.3.0でマルチ構成がサポートされたタイミングで、sam deploy --guideで書き込み先ファイル名を聞いてくれるようになりましたので、別設定も作りやすいですね。
(私はコピペしちゃいましたけど)
--config-env [section]
samconfig.toml内のセクションを指定します。
guideオプション使用時に--config-envでセクションを指定すると、そのセクションで設定を作ってくれます。
# devセクションで設定を作る
sam deploy --config-env dev --guide
--config-envの指定がない場合は従来通りdefaultセクションで作られます。
実行するときは前述のセクションを指定します。
# 本番用
sam deploy --config-env prod
# 開発用
sam deploy --config-env dev
また、他コマンド(buildなど)で設定を指定したい場合はsamconfig.tomlに追記して対応できます。
例えばsam buildのtemplate.yamlを指定したい場合、下記のような感じになります。
[dev]
[dev.build]
[dev.build.parameters]
template_file = "template_dev.yaml"
[dev.deploy]
[dev.deploy.parameters]
stack_name = "stackname-dev"
s3_bucket = "deploy-bucket"
s3_prefix = "deploy-dev"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
これでsam build実行時にtemplate_dev.yamlを適用してくれます。
# template_dev.yamlを適用してsam build実行
sam build --config-env dev
sam build --template-fileで指定していたものが--config-envで指定できるようになるので、構成によってはちょっと楽かも。
まとめ
この2種を組み合わせると、かなり複雑な設定でもできますね。
ただ、今回に関しては全く複雑な構成ではなく、むしろ本番と開発の2本のみ、開発者が私だけなので、シンプルに--config-envで指定する方向になりそうです。