AWS SAMで開発・本番環境を分けて構築する方法
はじめに
本番環境と開発環境を分けることは非常に重要です。
AWS SAM(Serverless Application Model)では、テンプレートや設定ファイルを工夫することで環境を簡単に分離できます。
この記事では、私がAWS SAMで環境を分けて構築・デプロイする際に実践している方法を紹介します。
なぜ環境を分けるのか?
私が環境を分けて開発している理由は以下の通りです。
- 本番環境でのトラブルを未然に防げる
- 実際の案件でも複数環境を扱うことが多い
個人開発でも環境を分けることで、開発・検証・運用を安全かつ効率的に、実際の案件に近い形で行うことができます。
AWS SAMで環境を分ける方法
AWS SAMでは以下の設定を使うことで環境を分けることができます。
1. Parameters と !Sub を使った環境識別
template.yaml で Parameters を使い、環境ごとにリソース名や値を切り替えることができます。
このサンプルでは
Environmentをdevやprodに切り替えることで、関数名などが環境ごとにユニークになるようにしています。
Parameters:
Environment:
Type: String
Default: dev
Resources:
WeatherAppFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub weather-function-${Environment}
CodeUri: lambdas/function/
Handler: app.lambda_handler
Runtime: python3.13
2. Globals の活用(共通設定)
すべての Lambda 関数に共通する設定は Globals に記載します。
このサンプルでは、関数のタイムアウト時間とランタイムを共通化しています。
globals:
Function:
Timeout: 30
Runtime: python3.13
3. samconfig.toml の環境別セクション
samconfig.toml はプロジェクトのルートディレクトリに配置します。
sam deploy コマンド実行時に、このファイルの内容が反映されます。
初めてデプロイする場合は
sam deploy --guidedを使うと対話式で設定を入力し、入力内容を反映したsamconfig.tomlを自動生成できます。
環境ごとにデプロイ設定を分けるには[dev.deploy.parameters] や [prod.deploy.parameters] を使います。
[dev.deploy.parameters]
stack_name = "weather-app-dev"
s3_prefix = "weather-app-dev"
region = "ap-northeast-1"
parameter_overrides = "Environment=dev"
[prod.deploy.parameters]
stack_name = "weather-app-prod"
s3_prefix = "weather-app-prod"
region = "ap-northeast-1"
parameter_overrides = "Environment=prod"
parameter_overridesはtemplate.yamlのParametersに指定した値を上書きするためのオプションです。
これにより同じテンプレートで複数の環境に異なる設定を適用できます。
[dev.deploy.parameters] と [prod.deploy.parameters] どちらの設定を使ってデプロイするかはデプロイコマンドで指定します。
# 開発環境にデプロイ
sam deploy --config-env dev
# 本番環境にデプロイ
sam deploy --config-env prod
個人開発では環境をいくつに分ける?
私の場合、個人開発では以下のようにシンプルに2つに分けています:
-
dev: 開発環境(動作確認や変更テスト用) -
prod: 本番環境(開発環境で動作確認したものをデプロイ)
センシティブなデータを扱わないアプリならこの2つだけで十分なことも多いです。
たくさん分けると、その分コストもかかるので注意が必要です。
おわりに
AWS SAMを使ったサーバーレスアプリでも環境ごとの構成管理は非常に重要です。
個人開発のうちから環境を分けておくことで、実践的でスムーズな運用が可能です。
運用しやすい環境の分け方などがあれば、ぜひ教えてください。
Discussion