← All Articles

sam deploy コマンドで異なる環境にデプロイする。

Posted on

20210829-01

はじめに

SAMを初めにデプロイするときは、sam deploy --guided を使用すると、デプロイのパラメータを聞かれるので、それに従ってデプロイできます。

2回以降は guided のオプションを省略した場合、 samconfig.toml に保存されたデフォルトパラメータを使って簡単にデプロイできます。

さらに samconfig.toml にはデフォルト以外のパラメータも設定できるようになっています。

ここでは、sam deploy のデフォルト以外の環境のパラメータの呼び出し方について調べました。

やること

sam deploy --guidedを使ってふたつのリージョン(ap-northeast-1,us-east-1)にデプロイします。

ap-northeast-1 へのデプロイは デフォルトの環境として指定します。

us-east-1 へのデプロイは、hogeという環境名に指定します。

結果それぞれの設定が、samconfig.toml にどのように記載されるのかを見てみます。

最後にhoge環境を指定したデプロイ sam deploy --config-env hoge を実行して、hogeのパラメータが読み込まれたことも確認します。

やってみた。

1). サンプルのsamを作成する。

samのアプリはなんでも良いので、サンプルのアプリを使用する。

$ sam init 
Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1
What package type would you like to use?
	1 - Zip (artifact is a zip uploaded to S3)	
	2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Which runtime would you like to use?
	1 - nodejs14.x
	2 - python3.8
	3 - ruby2.7
	4 - go1.x
	5 - java11
	6 - dotnetcore3.1
	7 - nodejs12.x
	8 - nodejs10.x
	9 - python3.7
	10 - python3.6
	11 - python2.7
	12 - ruby2.5
	13 - java8.al2
	14 - java8
	15 - dotnetcore2.1
Runtime: 2

Project name [sam-app]: sample

Cloning from https://github.com/aws/aws-sam-cli-app-templates

AWS quick start application templates:
	1 - Hello World Example
	2 - EventBridge Hello World
	3 - EventBridge App from scratch (100+ Event Schemas)
	4 - Step Functions Sample App (Stock Trader)
	5 - Elastic File System Sample App
Template selection: 1

    -----------------------
    Generating application:
    -----------------------
    Name: sample
    Runtime: python3.8
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    
    Next steps can be found in the README file at ./sample/README.md

2). samをビルドする。

コンテナを使用してsamをビルドする。

$ cd sample
$ sam build --use-container

3). sam deploy --guided を使って ap-northeast-1 にデプロイする。

sam deploy --guided を使ってデプロイしていく。

SAM configuration environment [default]: は、空欄のままにしてdefaultの環境として登録する。

$ sam deploy --guided

Configuring SAM deploy
======================

	Looking for config file [samconfig.toml] :  Not found

	Setting default arguments for 'sam deploy'
	=========================================
	Stack Name [sam-app]: 
	AWS Region [ap-northeast-1]:                      ← メモ) 'ap-northeast-1' なので空欄のママ
	#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
	Confirm changes before deploy [y/N]: y
	#SAM needs permission to be able to create roles to connect to the resources in your template
	Allow SAM CLI IAM role creation [Y/n]: y
	HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
	Save arguments to configuration file [Y/n]: y
	SAM configuration file [samconfig.toml]: 
	SAM configuration environment [default]:       ← メモ) 'default' なので空欄のママ

  :
  :

4). samconfig.toml を確認する。

samconfig.tomlが作成されているので、内容を確認すると 先ほど記載した内容が default に登録されている。

version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-geiohp0cab5e"
s3_prefix = "sam-app"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

5). パラメータの読み込みを確認するため、sam deploy を実行する

sam deploy を実行すると、samconfig.toml の default の設定が読み込まれていることがわかる。

(デプロイ自体は、samに変更が入っていないので失敗する。)

$ sam deploy
File with same data already exists at sam-app/88bd6722efd39f95c2a8ca00aad6e623, skipping upload

	Deploying with following values
	===============================
	Stack name                   : sam-app
	Region                       : ap-northeast-1
	Confirm changeset            : True
	Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-geiohp0cab5e
	Capabilities                 : ["CAPABILITY_IAM"]
	Parameter overrides          : {}
	Signing Profiles             : {}

Initiating deployment
=====================
File with same data already exists at sam-app/21689c3b30d88b36636078755484b3b1.template, skipping upload

Waiting for changeset to be created..
Error: No changes to deploy. Stack sam-app is up to date

6). sam deploy --guided を使って us-east-1 にデプロイする。

再度デプロイをするが、今度はリージョンを us-east-1 にしてenvironmentの設定は hoge に設定する。

$ sam deploy --guided

Configuring SAM deploy
======================

	Looking for config file [samconfig.toml] :  Found
	Reading default arguments  :  Success

	Setting default arguments for 'sam deploy'
	=========================================
	Stack Name [sam-app]: 
	AWS Region [ap-northeast-1]: us-east-1                      ← メモ) 'us-east-1'を指定
	#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
	Confirm changes before deploy [Y/n]: y
	#SAM needs permission to be able to create roles to connect to the resources in your template
	Allow SAM CLI IAM role creation [Y/n]: y
	HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
	Save arguments to configuration file [Y/n]: y
	SAM configuration file [samconfig.toml]: 
	SAM configuration environment [default]: hoge               ← メモ) environmentの設定を hoge にする

:
:

7). 再度samconfig.toml を確認する。

再度内容を確認すると hoge が追記されている。 region = “us-east-1” になっている。

version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-geiohp0cab5e"
s3_prefix = "sam-app"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

[hoge]
[hoge.deploy]
[hoge.deploy.parameters]
stack_name = "sam-app"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-1tn7p7zgvh8ru"
s3_prefix = "sam-app"
region = "us-east-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

5). sam deploy --config-env hoge を実行する

sam deploy --config-env hoge を実行すると、Region が us-east-1 になっており hoge の設定が読み込まれていることがわかる。

$ sam deploy --config-env hoge
File with same data already exists at sam-app/88bd6722efd39f95c2a8ca00aad6e623, skipping upload

	Deploying with following values
	===============================
	Stack name                   : sam-app
	Region                       : us-east-1   ← メモ) hogeで設定していた'us-east-1'になっている。
	Confirm changeset            : True
	Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-1tn7p7zgvh8ru
	Capabilities                 : ["CAPABILITY_IAM"]
	Parameter overrides          : {}
	Signing Profiles             : {}

Initiating deployment
=====================
File with same data already exists at sam-app/abcf6d1173df7e618c27780727d47358.template, skipping upload

Waiting for changeset to be created..
Error: No changes to deploy. Stack sam-app is up to date

まとめ

samの実装時など、検証環境へのデプロイを何回もするとおもいますが 今回の環境の切り替えができれば、楽ができるかと思いました。

参考サイト

[アップデート]AWS SAMのデプロイが簡単になりました

AWS SAMCLI 設定ファイル

技術AWSSAM