AWS SAM CLIのinit、build、deploy、delete の実行結果から学んだ事とsamconfig.tomlについて。
AWS SAM CLIとは
AWS SAM CLIは、AWS SAMテンプレートおよびアプリケーションコードで動作するコマンドラインツールです。
AWS SAM CLIでは、ローカルでのLambda関数の呼び出し、サーバーレスアプリケーションのデプロイパッケージの作成、サーバーレスアプリケーションの AWS クラウドへのデプロイなどを行うことができます。
SAM CLIのインストール
sam init について
このコマンドは、選択した言語での事前設定済みの AWS SAM テンプレートとサンプルアプリケーションコードを生成します。
※実行した結果にコメントを添えています。
$ sam init
# 訳:sam init` を使用する際に、特定のランタイムやパッケージの種類を事前に選択することができます。
詳細は `sam init --help` を呼び出してください。
You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.
# クイックスタートテンプレートとカスタムテンプレートロケーションの選択を迫られる。
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1 # クイックスタートテンプレートを選択
# 2022年11月現在11種類のテンプレートがあるようです。
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Multi-step workflow
3 - Serverless API
4 - Scheduled task
5 - Standalone function
6 - Data processing
7 - Infrastructure event management
8 - Serverless Connector Hello World Example
9 - Multi-step workflow with Connectors
10 - Lambda EFS example
11 - Machine Learning
Template: 1 # ←を選択
# 最も一般的なランタイムとパッケージの種類を使用しますか? (Pythonとzip)
Use the most popular runtime and package type? (Python and zip) [y/N]: y # イエス
#アプリケーションの関数で X-Ray トレースを有効にしますか?
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: y # イエス
X-Ray will incur an additional cost. View https://aws.amazon.com/xray/pricing/ for more details #X-Ray撮影は別途費用がかかります。表示 https://[省略] 詳しくはこちら
# プロジェクトネームを聞かれます。
Project name [sam-app]: sam-app-test #空白のままであれば[]内と同じ名前になりますが、今回はsam-app-testとしました。
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) # https://[省略] からのクローン作成(処理に時間がかかる場合があります。)
-----------------------
Generating application: # アプリケーションを生成
-----------------------
Name: sam-app-test # 名前
Runtime: python3.9 # ランタイム
Architectures: x86_64 # アーキテクチャ
Dependency Manager: pip # 依存性マネージャ(直訳)
Application Template: hello-world # アプリケーションテンプレート
Output Directory: . # 出力先ディレクトリ
Next steps can be found in the README file at ./sam-app-test/README.md # 次のステップは、READMEファイル([省略])に記載されています。
Commands you can use next # 次に使えるコマンド
=========================
[*] Create pipeline: cd sam-app-test && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-app-test && sam validate
[*] Test Function in the Cloud: cd sam-app-test && sam sync --stack-name {stack-name} --watch
sam initをしたディレクトリを見るとファイルが作成されています。
クリックするとこのように、
作成されていました。
sam-app/
├── README.md
├── __init__.py
├── events/
│ └── event.json
├── hello_world/
│ ├── __init__.py
│ ├── app.py # AWS Lambdaのハンドラロジックが含まれます。
│ └── requirements.txt # アプリケーションに必要な Python の依存関係が含まれており、サンプルビルドに使用されます。
├── template.yaml # アプリケーションのAWSリソースを定義するAWS SAMテンプレートが含まれています。
└── tests/
├── unit/
│ ├── __init__.py
│ └── test_handler.py
├── integration
│ ├── __init__.py
│ └── test_handler.py
├── __init__.py
└── requirements.txt
「最も一般的なランタイムとパッケージの種類を使用しますか?」をN(※いいえ)とした場合
以下のような流れとなります。
Use the most popular runtime and package type? (Python and zip) [y/N]: N
Which runtime would you like to use?
1 - dotnet6
2 - dotnet5.0
3 - dotnetcore3.1
4 - go1.x
5 - graalvm.java11 (provided.al2)
6 - graalvm.java17 (provided.al2)
7 - java11
8 - java8.al2
9 - java8
10 - nodejs16.x
11 - nodejs14.x
12 - nodejs12.x
13 - python3.9
14 - python3.8
15 - python3.7
16 - ruby2.7
17 - rust (provided.al2)
Runtime: 13 # 今回は当該質問に"y"と答えた場合と同じpython3.9を選んでみます。
What package type would you like to use? # パッケージタイプを選択。
1 - Zip
2 - Image
Package type: 1 # Zipを選択しました。
Based on your selections, the only dependency manager available is pip.
We will proceed copying the template using pip.
# 訳:選択した内容から、利用可能な依存関係管理者はpipのみです。
pipを使用してテンプレートのコピーを進めていきます。
となります。
「X-rayのトレース有効化しますか?」をN(※いいえ)とした場合
違いは、作成されたtemplate.yaml内のGlobals:セクション内(今回だと12〜14行目)に以下が追加されているかどうかでした。
Tracing: Active
Api:
TracingEnabled: True
さらに詳しくはsam initを参照。
sam build について
サーバーレスアプリケーションを構築し、アプリケーションのローカルでのテスト、またはAWSクラウドへのデプロイなどのワークフロー内の後続ステップのためにアプリケーションを準備します。
先程のsam-app-testで実行してみます。
$ cd sam-app-test
$ sam build
Your template contains a resource with logical ID "ServerlessRestApi", which is a reserved logical ID in AWS SAM. It could result in unexpected behaviors and is not recommended.
Building codeuri: /Users/[YourDirectory]/sam-app-test/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
Commands you can use next
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
[*] Deploy: sam deploy --guided
(横道)今回のsam build実行時の"ServerlessRestApi"についての注意について
注意書きの直訳:テンプレートに論理ID「ServerlessRestApi」のリソースが含まれていますが、これはAWS SAMで予約された論理IDです。予期せぬ動作をする可能性があり、推奨されません。
とあります。
折角注意喚起をしてもらえたので、生成されたtemplate.yamlを見てみました。
Outputセクションにコメントが添えてあります。
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
# Find out more about other implicit resources you can reference within SAM
# https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
[以下略]
直訳:ServerlessRestApi は Serverless::Function の下にある Events キーから作成された暗黙の API です。SAM 内で参照できる他の暗黙のリソースについて詳細を確認する https://[省略]
とこちらでも重ねて注意書きをしてくれています。
実際にリンク先に飛んでみると、
イベントタイプに以下のように "Api"が指定されている場合は
これを「暗黙の API」と呼びます。
としています。
Type: AWS::Serverless::Function
Properties:
...
Events:
ThumbnailApi:
Type: Api
テンプレートには、これらの API を定義する多くの関数が含まれる場合があります。バックグラウンドで、SAM はテンプレート内のすべての関数からすべての暗黙的な API を収集し、Swagger を生成し、AWS::Serverless::Apiこの Swagger を使用して暗黙的な API を作成します。
の説明から全てを明示的に指定せずに暗黙値=指定していない場合デフォルト、或いは良しなに設定される値で作成される為、
予期せぬ動作をする可能性があり、推奨されません。
という事と解釈しました。
ちなみに、"Api"ではなく以下が指定されている場合については、
Type: HttpApi
これは「暗黙の HTTP API」と呼ばれます。
としてこちらもAWS::Serverless::HttpApiが暗黙的なHTTP APIを収集する事を説明しています。
実行後の変化について
一見、変化がないように見えます。
がチュートリアル: Hello World アプリケーションのデプロイで
次の最上位のツリーが .aws-sam の下に表示されます。
.aws-sam/
└── build/
├── HelloWorldFunction/
└── template.yaml
とあります。
「なるほど、”.aws-sam(隠しファイル)”か!」
という事でMac環境では、
command + shift + .(コマンド + シフト + ピリオド)で表示させてみます。(Win環境でいう所の「表示」→「隠しファイル」にチェック入れ)
現れました。
隣の.gitignoreファイルは実はsam build実行前から存在するもので、念の為確認すると実行前後で内容に違いも見られませんでしたが、.aws-samディレクトリ以下は確かに当該コマンド実行後作成されているものです。
build.tomlが生成されていた。
厳密には作成されたファイル内容は以下のようになっていました。
.aws-sam/
├── build/
│ ├── HelloWorldFunction/
│ └── template.yaml
└── build.toml
今回のケースでは、ドキュメントの説明にはなかったbuild.tomlという設定ファイルが作成されています。
TOMLは、設定ファイルのフォーマットの1種である。「ミニマル」であることを目指した明確な構文を採用することで、読みやすいフォーマットとなるように作られた。
以下内容です。
# This file is auto generated by SAM CLI build command
[function_build_definitions]
[function_build_definitions.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
codeuri = "/Users/[Your Directory]/sam-app-test/hello_world"
runtime = "python3.9"
architecture = "x86_64"
handler = "app.lambda_handler"
manifest_hash = ""
packagetype = "Zip"
functions = ["HelloWorldFunction"]
[layer_build_definitions]
buildされたテンプレート同士を見比べる。
sam-app-test(プロジェクトのルートディレクトリ)直下のtemplate.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app-test
Sample SAM Template for sam-app-test
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
# Find out more about other implicit resources you can reference within SAM
# https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
.aws-sam/build内のtemplate.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: 'sam-app-test
Sample SAM Template for sam-app-test
'
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: HelloWorldFunction
Handler: app.lambda_handler
Runtime: python3.9
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Metadata:
SamResourceId: HelloWorldFunction
Outputs:
HelloWorldApi:
Description: API Gateway endpoint URL for Prod stage for Hello World function
Value:
Fn::Sub: https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/
HelloWorldFunction:
Description: Hello World Lambda Function ARN
Value:
Fn::GetAtt:
- HelloWorldFunction
- Arn
HelloWorldFunctionIamRole:
Description: Implicit IAM Role created for Hello World function
Value:
Fn::GetAtt:
- HelloWorldFunctionRole
- Arn
さらに詳しくはsam buildを参照。
(横道②)VS CODEでテンプレートを表示した時、気になった"AWS:Add Debug Configuration"
AWS SAMアプリケーションをテストする場合、Lambda関数だけを実行してデバッグし、AWS SAMテンプレートが定義する他のリソースを除外することを選択することができます。この方法では、CodeLens機能を使用して、直接呼び出すことができるソースコード内のLambda関数ハンドラを特定します。
つまりCodeLensというVisual Studio Codeの機能を利用してAWS SAMをVS CODEから直接実行したり、デバッグしたり出来る という拡張機能があるようです。
その内デバッグに関する表示のようでした。
ここもゆくゆく深堀してみたいと思いますが、今回はこのルートは探索せずここで撤退します。
sam deployについて
AWS SAM アプリケーションをデプロイします。
詳しい説明を見ると、
このコマンドを使用する場合、AWS SAM CLIはデフォルトで、現在の作業ディレクトリがプロジェクトのルートディレクトリであると想定します。
AWS SAM CLI はまず、sam buildコマンドを使用して構築されたテンプレートファイルを見つけようとします。
これは .aws-samサブフォルダにあり、template.yamlと命名されています。?>
AWS SAM CLIは次に、現在の作業ディレクトリで、template.yaml または template.ymlと命名されているテンプレートファイルを見つけようとします。
先程.aws-sam内のテンプレートを探して、無ければコマンドを叩いたディレクトリに存在するテンプレートファイルをデプロイしようとするとの事です。
実際にそれぞれ結果をみてみます。
まず知っておかなければいけない点として、
$ sam deploy
Usage: sam deploy [OPTIONS]
Try 'sam deploy -h' for help.
Error: Missing option '--stack-name', 'sam deploy --guided' can be used to provide and save needed parameters for future deploys.
エラーがおきます。
こちらの記事の「どういうこと? sam deploy だけでデプロイできるんじゃなかったの?」にあるように、
sam deploy --guided
として--guidedオプションをつけないとエラーが起きるようです。
※記事にはその経緯などもわかりやすく説明があります。
気を取り直して
実行結果(長いので折りたたみました)
$ sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Not found
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: sam-app-test1
AWS Region [us-east-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
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: N
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]:
Looking for resources needed for deployment:
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxx
A different default S3 bucket can be set in samconfig.toml
Saved arguments to config file
Running 'sam deploy' for future deployments will use the parameters saved above.
The above parameters can be changed by modifying samconfig.toml
Learn more about samconfig.toml syntax at
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
Uploading to sam-app-test1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 466367 / 466367 (100.00%)
Deploying with following values
===============================
Stack name : sam-app-test1
Region : ap-northeast-1
Confirm changeset : True
Disable rollback : False
Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxx
Capabilities : ["CAPABILITY_IAM"]
Parameter overrides : {}
Signing Profiles : {}
Initiating deployment
=====================
Uploading to sam-app-test1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.template 1195 / 1195 (100.00%)
Waiting for changeset to be created..
CloudFormation stack changeset
-------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement
-------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionHell AWS::Lambda::Permissio N/A
oWorldPermissionProd n
+ Add HelloWorldFunctionRole AWS::IAM::Role N/A
+ Add HelloWorldFunction AWS::Lambda::Function N/A
+ Add ServerlessRestApiDeplo AWS::ApiGateway::Deplo N/A
ymentxxxxxxxxxx yment
+ Add ServerlessRestApiProdS AWS::ApiGateway::Stage N/A
tage
+ Add ServerlessRestApi AWS::ApiGateway::RestA N/A
pi
-------------------------------------------------------------------------------------------------
Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:[Your AWS Account Id]:changeSet/samcli-deployxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y
2022-11-04 16:40:30 - Waiting for stack create/update to complete
CloudFormation events from stack operations (refresh every 0.5 seconds)
-------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS AWS::CloudFormation::S sam-app-test1 User Initiated
tack
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation
Initiated
CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation
Initiated
CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::ApiGateway::RestA ServerlessRestApi -
pi
CREATE_IN_PROGRESS AWS::ApiGateway::RestA ServerlessRestApi Resource creation
pi Initiated
CREATE_COMPLETE AWS::ApiGateway::RestA ServerlessRestApi -
pi
CREATE_IN_PROGRESS AWS::Lambda::Permissio HelloWorldFunctionHell -
n oWorldPermissionProd
CREATE_IN_PROGRESS AWS::ApiGateway::Deplo ServerlessRestApiDeplo -
yment ymentxxxxxxxxxx
CREATE_IN_PROGRESS AWS::Lambda::Permissio HelloWorldFunctionHell Resource creation
n oWorldPermissionProd Initiated
CREATE_IN_PROGRESS AWS::ApiGateway::Deplo ServerlessRestApiDeplo Resource creation
yment ymentxxxxxxxxxx Initiated
CREATE_COMPLETE AWS::ApiGateway::Deplo ServerlessRestApiDeplo -
yment ymentxxxxxxxxxx
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdS -
tage
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdS Resource creation
tage Initiated
CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdS -
tage
CREATE_COMPLETE AWS::Lambda::Permissio HelloWorldFunctionHell -
n oWorldPermissionProd
CREATE_COMPLETE AWS::CloudFormation::S sam-app-test1 -
tack
-------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
-------------------------------------------------------------------------------------------------
Outputs
-------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam::[Your AWS Account Id]:role/sam-app-
test1-HelloWorldFunctionRole-xxxxxxxxxxxx
Key HelloWorldApi
Description API Gateway endpoint URL for Prod stage for Hello World function
Value https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-1:[Your AWS Account Id]:function:sam-app-
test1-HelloWorldFunction-xxxxxxxxxxxx
TokyoリージョンのCloudFormationコンソールを見ると、
以下のように2スタックが出来上がっています。
「aws-sam-cli-managed-default」スタックが同時に作成されている。
中身を覗いてみます。
リソースは以下2つだったようです。
・S3バケット
・バケットポリシー(↓)
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "serverlessrepo.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxx/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "[Your Account Id]"
}
}
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxx",
"arn:aws:s3:::aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxx/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
再びこちらの記事説明を引用しますが、
S3バケットを作成するCFnスタックも自動で作成される
aws-sam-cli-managed-defaultという名前で、以下テンプレートを使ったCFnスタックが作成されていました。ソースコードのzipファイルと、それを見に行くように変換されたSAM templateファイルが配置されます。
にあたります。
今回作成したsam-app-testスタックも作成完了。
CREATE_COMPLETE
アクセスすると{"message": "hello world"}が無事表示されています。
samconfig.tomlも確認。
忘れそうになりましたが、
先程のsam deploy時の対話形式で
Save arguments to configuration file [Y/n]: Y
SAM configuration file [samconfig.toml]:
とあったやりとりでsamconfig.tomlも生成されています。
中身を覗いてみます。
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app-test1"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxx"
s3_prefix = "sam-app-test1"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
image_repositories = []
スタックの一部としてIAMリソースの作成もありますので、「CAPABILITY_IAMのチェック」に該当する表示もありますね。
samconfig.tomlについて追加で試した事。
いくつか試したい事があったので、まず同じディレクトリで以下になるようにsam initを2回しました。
MyTest/
├── sam-app-test-a
└── sam-app-test-b
これ以降それぞれを[a]、[b]と呼称します。
確認
①sam initで[a]を生成→sam buildで .aws-samを生成→sam deploy --guidedでローカルの[a]内にはsamconfig.tomlが、コンソール上「aws-sam-cli-managed-default」(S3バケット&バケットポリシー)は存在する状況を作る。
②再度sam deploy --guidedを実行、SAM configuration file [samconfig.toml]: samconfig2.toml と回答して先程との違いを確認。
【結果】
①sam deploy -guided実行時
Looking for config file [samconfig.toml] : Not found
↓
Looking for resources needed for deployment:
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-aaaaaaaaaaaa
A different default S3 bucket can be set in samconfig.toml
samconfig.toml
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app-test-a"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-aaaaaaaaaaaa"
s3_prefix = "sam-app-test-a"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
image_repositories = []
②sam deploy -guided実行時
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
↓
Looking for resources needed for deployment:
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-myqlg526jj0s
A different default S3 bucket can be set in samconfig.toml
samconfig2.toml
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app-test-a2"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-aaaaaaaaaaaa"
s3_prefix = "sam-app-test-a2"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
image_repositories = []
となる事が確認出来ました。
そして
追加確認結果です。
【2】三回目に参照されるのもやはりsamconfig.tomlであり、ひとつ前のsamconfig2.tomlではなかった事。
【3】samconfig.tomlを削除して再度試したからといってsamconfig2.tomlは参照してくれない事。
【4】samconfig.tomlが存在する状態で同名のsamlcofig.tomlファイルを作成した場合内容は上書きされる事。(そしてversion = 0.1が0.2にならなかった事から、ここでいうversionはsamconfig.toml自体のヴァージョンではない事)
【5】samconfig.tomlで指すリージョンに目的のS3バケットを作成した「aws-sam-cli-managed-default」スタックが存在しなかった場合は再度、新規作成される事。
【6】[a]内にsamconfig.tomlが存在する状態で、[b]でsam-deploy-guidedを実行しても「aws-sam-cli-managed-default」スタックは追加作成される事はない事。
【7】スタックはリージョン単位なので、デプロイ先リージョンを変えた場合は指定リージョンに「aws-sam-cli-managed-default」は新しく作成される
結果を踏まえて再度ドキュメントを読み直します。
・結局samconfig.toml(=デフォルトに設定したディレクトリとファイル名も同意)以外を探してくれないのであればsamconfig.toml以外の名前を指定出来る意味は?
と後で恥ずかしくなる素人な疑問を感じ、改めて「sam deploy --guided を使用した設定の書き込み」を確認しましたが、目新しい情報はありませんでした。
が、「sam deploy」に
--config-file PATH | 使用するデフォルトのパラメータ値が含まれる設定ファイルのパスとファイル名です。デフォルト値は、プロジェクトディレクトリのルートにある samconfig.tomlです。設定ファイルの詳細については、「AWS SAM CLIの設定ファイル」を参照してください。
というオプションとその説明がありました。
sam deploy --guided --config-file samconfig2.toml
等して指定出来る訳なので当然、複数設定ファイルが存在する意味がある訳か と腑に落ちました。
またデフォルトはsamconfig.tomlですが、それも変更する事が出来る事もドキュメントに記載がありました。そもそもデフォルトのパスとファイル名初を期に既に設定してあるだけであって、ルートディレクトリ内の.tomlファイルを何かの順に探してくれる訳ではないのは至極当然でした。
次回に繰り越す疑問
・sam buildで生成した「.aws-sam(内のtemplate.yaml)」がルートディレクトリに存在しなかった場合、元のテンプレを探して同じ結果のスタックを仕上げてくれるならsam buildの意味って何?
という根本的にbuildを理解していない疑問は、ここに調べて言及するにはボリュームオーバー気味な気がしたので次回以降に回す事にしました。
sam delete について
AWS CloudFormationスタック、Amazon S3および Amazon ECRにパッケージ化およびデプロイされたアーティファクト、および AWS SAMテンプレートファイルを削除して、AWS SAMアプリケーションを削除します。
$ sam delete
Are you sure you want to delete the stack sam-app-test in the region ap-northeast-1 ? [y/N]: y
Are you sure you want to delete the folder sam-app-test in S3 which contains the artifacts? [y/N]: y
- Deleting S3 object with key sam-app-test/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- Deleting S3 object with key sam-app-test/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.template
- Deleting Cloudformation stack sam-app-test
Deleted successfully
こちらはdeploy時のように"Looking for config file"というような文字こそありませんでしたが、samconfig.tomlの情報を元に削除に着手している事がわかりました。
以上でした。
ありがとうございました。
Discussion