SAM設定ファイルsamconfig.tomlでローカルAPIサーバー起動を楽にする
この記事で話すこと
- AWS SAM設定ファイル(samconfig.toml)を用いたローカル開発のセットアップ方法
AWS SAMでローカルAPIサーバーを起動する
AWS SAMのローカル起動とは?
AWS SAMはsam local invoke {関数名(ex:XxxFunction)}
やsam local start-api
を実行するとローカルコンテナを作成してLambda関数を構築・実行します。
特にsam local start-api
はローカルHTTPサーバーを用いてローカルAPIサーバーを起動します。
$ sam local start-api // 実行
Mounting DeleteFunction at http://127.0.0.1:3000/delete/{id} [DELETE]
Mounting CreateFunction at http://127.0.0.1:3000/create [POST]
Mounting UpdateFunction at http://127.0.0.1:3000/update/{id} [POST]
Mounting ReadFunction at http://127.0.0.1:3000/read/{id} [GET]
前提
- SAM CLIをインストールし、SAMプロジェクトを作成している
- Docker環境が準備できている
以下のドキュメントに従って、sam local
を使用します
当記事の環境・条件
- S3, DynamoDBと連携するLambda関数+APIGatewayの構築
- ローカル環境としてDynamoDBにはDynamoDB local、S3にはMinIOを使用。docker composeを用いてネットワークを作成・開発環境を構築。
イメージ
samconfig.toml
を設定する
SAM CLIはプロジェクト内でパラメータ値を指定できる設定ファイルを使用することができます。
参考
samconfig.toml
を使用しない場合
ローカル開発環境とステージング・本番環境を分離していること、DynamoDBやS3をDockerでローカルにエミュレートしていることから、SAMテンプレートのParametersセクションに環境名や各エンドポイント(Lambda関数の環境変数)を指定していました。
SAMテンプレート
AWSTemplateFormatVersion: 2010-09-09
Description:
sam-test
Transform:
- AWS::Serverless-2016-10-31
Parameters:
Env:
Type: String
AllowedValues:
- prod
- dev
- local
Default: local
DynamoDBEndpointParameter:
Type: String
Default: ''
S3EndpointParameter:
Type: String
Defult: ''
Globals:
Function:
Environment:
Variables:
DYNAMODB_ENDPOINT: !Ref DynamoDBEndpointParameter
S3_ENDPOINT: !Ref S3EndpointParameter
伴って、SAM CLIコマンドを実行する際にparameter-overrides
オプションを指定する必要があります。
他にもDockerネットワークやログファイルなどを指定するパラメータも。
ローカル起動時のコマンドは以下の通りです。
$ sam local start-api \
--docker-network {ネットワーク名} \
--template template.yaml \
--parameter-overrides Env=local \
DynamoDBEndpointParameter=http://dynamodb-local:8000 \ # Docker起動しているdynamodb-localのエンドポイント
S3EndpointParameter=http://minio:9000 \ # Docker起動しているMinIOのエンドポイント
--log-file sam-local.log
長いですね。
たしかに実行はできますが、毎回このコマンドを入力するのは面倒ですしちょっとした入力ミスでうまく動かないといったことも起こりやすくなります。なので、なるべく短くまとめたい。
samconfig.toml
を使用する
上記パラメータを設定ファイルにまとめます。
[local]
[local.local_start_api]
[local.local_start_api.parameters]
docker_network = "sam-test-local"
template = "template.yaml"
parameter_overrides = "Env=local DynamoDBEndpointParameter=http://dynamodb-local:8000 S3EndpointParameter=http://minio:9000"
log_file = "sam-local.log"
ローカル起動時のコマンドは以下のようになります。
$ sam local start-api --config-env local
このようにconfig-env
オプションを指定するだけになりました。スッキリ!
まとめ(SAM CLI設定ファイルでできること)
SAMプロジェクトを開始するとルートディレクトリ下にsamconfig.toml
が作成されます。
ドキュメントにある通り、設定ファイルの基本構文は以下のようになります。
[environment]
[environment.command]
[environment.command.parameters]
option = parameter value
environment
SAM CLIコマンドで--config-env
オプションで指定する環境名。
command
local
だけでなく、build
やdeploy
等も指定可能。全てのコマンドについて指定する際はglobal
を使用。
スペース
やハイフン-
は アンダースコア_
に置き換える。
パラメータ
キーと値のペアで指定。
ハイフン-
は アンダースコア_
に置き換える。
このように、ローカル起動だけでなくコマンドごとに設定することができます。ステージング環境・本番環境などのデプロイ先環境に応じてパラメータを指定する目的としても有用です。便利!
Discussion