🚕

AWS SAM CLIのinit、build、deploy、delete の実行結果から学んだ事とsamconfig.tomlについて。

2022/11/04に公開

AWS SAM CLIとは

AWS SAM リファレンス

AWS SAM CLIは、AWS SAMテンプレートおよびアプリケーションコードで動作するコマンドラインツールです。
AWS SAM CLIでは、ローカルでのLambda関数の呼び出し、サーバーレスアプリケーションのデプロイパッケージの作成、サーバーレスアプリケーションの AWS クラウドへのデプロイなどを行うことができます。

SAM CLIのインストール

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"

Lambda 関数をコードから直接実行およびデバッグ

AWS SAMアプリケーションをテストする場合、Lambda関数だけを実行してデバッグし、AWS SAMテンプレートが定義する他のリソースを除外することを選択することができます。この方法では、CodeLens機能を使用して、直接呼び出すことができるソースコード内のLambda関数ハンドラを特定します。

CodeLens を使用した拡張機能

つまり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