🐡

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を使用します

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/using-sam-cli-local.html

当記事の環境・条件

  • S3, DynamoDBと連携するLambda関数+APIGatewayの構築
  • ローカル環境としてDynamoDBにはDynamoDB local、S3にはMinIOを使用。docker composeを用いてネットワークを作成・開発環境を構築。

イメージ
samlocal.png

samconfig.tomlを設定する

SAM CLIはプロジェクト内でパラメータ値を指定できる設定ファイルを使用することができます。
参考

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

samconfig.tomlを使用しない場合

ローカル開発環境とステージング・本番環境を分離していること、DynamoDBやS3をDockerでローカルにエミュレートしていることから、SAMテンプレートのParametersセクションに環境名や各エンドポイント(Lambda関数の環境変数)を指定していました。

SAMテンプレート
template.yaml
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だけでなく、builddeploy等も指定可能。全てのコマンドについて指定する際はglobalを使用。
スペース やハイフン-アンダースコア_に置き換える。

パラメータ

キーと値のペアで指定。
ハイフン-アンダースコア_に置き換える。

このように、ローカル起動だけでなくコマンドごとに設定することができます。ステージング環境・本番環境などのデプロイ先環境に応じてパラメータを指定する目的としても有用です。便利!

GitHubで編集を提案
Fusic 技術ブログ

Discussion