Fusic Tech Blog

Fusion of Society, IT and Culture

AWS SAMのsamconfigを使って環境ごとにビルド・デプロイしてみる
2021/12/09

AWS SAMのsamconfigを使って環境ごとにビルド・デプロイしてみる

こんにちは、Fusic武末と申します。

現在、AWS SAMを使ったLambdaバッチ開発に取り組んでいます。その中でLambdaを環境ごとに切り替えてビルド・デプロイする方法を調べました。様々な方法を調べた中でsamconfig.tomlを使ったやり方が良かったので紹介します。

目次

  1. samconfig.tomlについて
  2. samconfig.tomlで環境ごとにビルド・デプロイ
  3. 試してみた所感

前提条件

  • AWS SAM CLIが使用できること

samconfig.tomlについて

まず今回の方法で重要な要素であるsamconfigについて説明します。samconfig.tomlとはAWS SAM CLIの設定ファイルであり、samコマンドを使用する際の設定が定義されたファイルです。

sam deploy --guided コマンドを使用した際にプロジェクトのルートディレクトリに自動生成されます。自動で生成された状態にはデプロイに関する設定のみ書かれていますが、ビルドやローカル実行に関する設定を定義することもできます。

samconfig.tomlで環境ごとにビルド・デプロイ

samconfig.tomlにはビルド・デプロイ、ローカル実行に関する設定を書くことができますが、その設定を環境ごとに定義することができます。環境ごとの設定を定義するためにはtomlのテーブルヘッダーに環境名を定義し、samコマンドを実行する際に--config-env オプションで環境名を指定すればOKです。

sam deploy --guided コマンド使用時に自動生成された状態では[default] という環境のみ定義されています。

version = 0.1

[default.deploy]
[default.deploy.parameters]
stack_name = "lambda-default"
s3_bucket = "aws-sam-cli-managed-bucket"
s3_prefix = "lambda-default"
region = "ap-northeast-1"
capabilities = "CAPABILITY_NAMED_IAM"
image_repositories = []

このファイルにdev環境の定義を追加してみます。

[環境名.コマンド名.parameters] というヘッダーの書き方で環境設定を追加できます。dev環境の設定を追加するためには、[dev.deploy.parameters] というヘッダーを書き、その下の行に各設定値を列挙すればOKです。

version = 0.1

[default.deploy]
[default.deploy.parameters]
stack_name = "lambda-default"
s3_bucket = "aws-sam-cli-managed-bucket"
s3_prefix = "lambda-default"
region = "ap-northeast-1"
capabilities = "CAPABILITY_NAMED_IAM"
image_repositories = []

[dev.deploy]
[dev.deploy.parameters]
stack_name = "lambda-dev"
s3_bucket = "aws-sam-cli-managed-bucket"
s3_prefix = "lambda-dev"
region = "ap-northeast-1"
capabilities = "CAPABILITY_NAMED_IAM"
image_repositories = []

特定の環境設定でsamコマンドを使いたい場合は、sam コマンド名 --config-env 環境名 という呼び出し方になります。例えば、上記の設定ファイルに書いたdev環境でデプロイをしたい場合は以下のようなコマンドになります。

sam deploy --config-env dev

今回の最終的なファイルの構成は以下のようになりました。ビルド設定でtemplate.yamlを環境ごとに分けましたが、--parameter-overrides オプションを使えばテンプレートを統一し、環境変数を外部から注入できるかもと思いました。

### Dev環境 ###
[dev]
# build
[dev.build]
[dev.build.parameters]
template = "templates/template-dev.yaml"
base_dir = "./src"
# deploy
[dev.deploy]
[dev.deploy.parameters]
stack_name = "lambda-dev"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_NAMED_IAM"
disable_rollback = true
image_repositories = []
s3_bucket = "aws-sam-cli-managed-bucket"
s3_prefix = "lambda-dev"

### Staging環境 ###
[staging]
# build
[staging.build]
[staging.build.parameters]
template = "templates/template-staging.yaml"
base_dir = "./src"
# deploy
[staging.deploy]
[staging.deploy.parameters]
stack_name = "lambda-staging"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_NAMED_IAM"
disable_rollback = true
image_repositories = []
s3_bucket = "aws-sam-cli-managed-bucket"
s3_prefix = "lambda-staging"

### Prod環境 ###
[prod]
# build
[prod.build.parameters]
template = "templates/template-prod.yaml"
base_dir = "./src"
# deploy
[prod.deploy]
[prod.deploy.parameters]
stack_name = "lambda-prod"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_NAMED_IAM"
disable_rollback = true
image_repositories = []
s3_bucket = "aws-sam-cli-managed-bucket"
s3_prefix = "lambda-prod"

試してみた所感

  • samconfig.tomlに全ての環境設定がまとまるので、管理が楽
  • samコマンドごとにパラメータを設定できるので、きめ細やかな設定管理が可能
  • 環境ごとにtemplate.yamlを分けるか統一するか検討が必要
  • CI/CDパイプラインとの連携についても調査・検討が必要

今回はsamconfig.tomlを使った環境管理方法を紹介させていただきました。

以上、ご拝読ありがとうございました。

takematsu

takematsu

Company : Fusic CO., LTD. Program Language : PHP, Java/Kotlin, Python Skills : AWS, Terraform, gRPC Interest: Serverless, TDD, Agile Practice