Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
125
Help us understand the problem. What is going on with this article?
@hayao_k

AWS SAM CLI 再入門 2020.07

この記事は AWS Advent Calendar 2019 16日目の記事でしたが、
2020/7/21 に AWS SAM CLI が General Available となっため、v1.0.0 時点の情報に更新しました。

:tada: Announcing AWS Serverless Application Model (SAM) CLI now generally available for production use
https://aws.amazon.com/jp/about-aws/whats-new/2020/07/announcing-aws-serverless-application-model-cli-generally-available-production-use/

はじめに

2018年の5月にaws-sam-local 改め aws-sam-cli の新機能 sam init を試すという記事を投稿しました。
AWS SAM CLI は GitHub 上で開発がおこなわれていますが、リリースのペースが早く
日々機能追加や改善が行われています。結果として上記の記事の内容は一部古いものとなっています。
本記事では2020年7月22日時点の最新バージョンである v1.0.0 までのリリースを踏まえた使い方をご紹介します。

AWS SAM と AWS SAM CLI

Serverless Application Model(SAM)は Lambda や API Gateway, DynamoDB のようなサービスを活用した
サーバーレスアプリケーションのデプロイに特化した、AWS CloudFormation の拡張機能です。
通常の CloudFormation テンプレートと同様に YAML/JSON でテンプレートを定義しますが、
素のテンプレートより簡潔に記載できるのが特徴です。

AWS SAM CLI は SAM を使用したサーバーレスアプリケーションの作成と管理を簡単に行うことができる
コマンドラインツールです。

SAM CLI で利用される Docker イメージについて

後述の sam local invoke 等のコマンドでは AWS Lmabda の実行環境をエミュレートするための
Docker イメージが使用され、起動するコンテナ内で Lambda 関数がローカル実行されます。
(あくまでエミュレートなので、完全な再現環境ではありません。)

GA 以前は lambci/docker-lambda で公開されている
Docker イメージが利用されていましたが、v1.0.0 のリリースを機に AWS からオフィシャルに
イメージも提供されるようになりました。

https://hub.docker.com/search?q=amazon%2Faws-sam-cli-&type=image
https://github.com/awslabs/aws-sam-cli/tree/master/build-image-src

AWS SAM CLIのインストール

AWS SAM CLI のすべての機能を活用するには、前提として AWS CLI と Git, Dockerの
インストールが必要ですが、本記事ではこれらのインストール手順は割愛します。

macOS

Homebrew を使用して AWS SAM CLI をインストールすることができます。

$ brew tap aws/tap
$ brew install aws-sam-cli
$ sam --version
SAM CLI, version 1.0.0

Windows

以下のURLからインストーラーをダウンロードできます。

https://github.com/awslabs/aws-sam-cli/releases/latest/download/AWS_SAM_CLI_64_PY3.msi

> sam --version
SAM CLI, version 1.0.0

その他の環境など

公式ドキュメントではなぜか Linux 環境でも Homebrew を使用したインストール方法が
案内されていますが、pip でもインストールできます。

$ pip install -U aws-sam-cli
$ sam --version
SAM CLI, version 1.0.0

ローカルでの開発とテスト

sam init

sam init コマンドを使用すると、アプリケーションのプロジェクトを初期化できます。
v0.30.0 以降では対話型にサンプルアプリケーションをセットアップしたり、
GitHubやローカル上のテンプレートを読み込んで初期化することもできるようになっています。

以下は対話型でnode.js12.xのランタイムを指定したサンプルアプリケーションを作成している例です。

$ sam init
Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

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

Project name [sam-app]:

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

AWS quick start application templates:
        1 - Hello World Example
        2 - Step Functions Sample App (Stock Trader)
        3 - Quick Start: From Scratch
        4 - Quick Start: Scheduled Events
        5 - Quick Start: S3
        6 - Quick Start: SNS
        7 - Quick Start: SQS
        8 - Quick Start: Web Backend
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: nodejs12.x
Dependency Manager: npm
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./sam-app/README.md

その他のバリエーション

# すべてのパラメータを指定
$ sam init --runtime nodejs12.x --dependency-manager npm --app-template hello-world --name sam-app

# GitHub 上のプロジェクトを指定
$ sam init --location gh:aws-samples/cookiecutter-aws-sam-python

# ZIP ファイルやローカルのテンプレートフォルダを指定
$ sam init --location /path/to/template.zip
$ sam init --location https://example.com/path/to/template.zip
$ sam init --location /path/to/template/folder

nodejs12.x でのサンプルアプリケーションの場合以下のようなファイル構成となります。

sam-app
│  .gitignore
│  README.md
│  template.yaml  # SAMテンプレート
│
├─events
│   event.json  # イベントソースが Lambda 関数に送信するサンプルペイロード
│
└─hello-world  # Lambda関数を配置
    │  .npmignore
    │  app.js
    │  package.json
    │
    └─tests #ユニットテストファイルを配置
        └─unit
            test-handler.js 

sam build

Lambda関数のソースコードをビルドし、デプロイ用のアーティファクトを作成することができます。

$ sam build
Building resource 'HelloWorldFunction'
Running NodejsNpmBuilder:NpmPack
Running NodejsNpmBuilder:CopyNpmrc
Running NodejsNpmBuilder:CopySource
Running NodejsNpmBuilder:NpmInstall
Running NodejsNpmBuilder:CleanUpNpmrc

Build Succeeded

Built Artifacts  : .aws-sam\build
Built Template   : .aws-sam\build\template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

--use-container オプションで、実際の AWS Lambda 環境をエミュレートした Docker コンテナ内で
ビルドを実行することが可能です。
ネイティブバイナリや複数のランタイムバージョンを扱っている場合に重宝します。

$ sam build --use-container
Starting Build inside a container
Building function 'HelloWorldFunction'

Fetching amazon/aws-sam-cli-build-image-nodejs12.x Docker container image......
Mounting C:\test\sam-app\.aws-sam\build\HelloWorldFunction  as /tmp/samcli/source:ro,delegated inside runtime container

sam build で Lambda Layers を作成することも可能です。
こちらについては以前、別の記事を書いたので参照いただければと思います。

AWS SAM CLI で Lambda Layers が ビルドできるようになったよ
https://qiita.com/hayao_k/items/f8c7ad5e35e29d590957

sam local invoke

前述の Docker イメージをベースに、ローカルで Lambda 関数を起動できます。
sam build で作成されたアーティファクトが存在する場合は、コンテナ起動時にマウントされ
Lambda 関数の実行がエミュレートされます。

$ sam local invoke
Invoking app.lambdaHandler (nodejs12.x)
Image was not found.
Building image.............
Failed to download a new amazon/aws-sam-cli-emulation-image-nodejs12.x:rapid-1.0.0 image. Invoking with the already downloaded image.
Mounting C:\sam-app\1.0.0\sam-app\.aws-sam\build\HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: 3a389491-7dd7-1276-297b-3964ae1b3795 Version: $LATEST
END RequestId: 3a389491-7dd7-1276-297b-3964ae1b3795
REPORT RequestId: 3a389491-7dd7-1276-297b-3964ae1b3795  Init Duration: 147.84 ms        Duration: 3.82 ms       Billed Duration: 100 ms Memory Size: 128 MBMax Memory Used: 39 MB

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}

sam local generate-event

特定のイベントソースのイベント情報を Lambda 関数に渡して処理したい場合
--event オプションで json ファイルを指定します。
もしくは sam local generate-event コマンドでさまざまなイベントソースのペイロードを
作成することができます。
その際、サービスごとに複数のイベントタイプを指定することができます。

DynamoDB ストリームのupdateイベント情報を生成し、Lambda関数を起動する例

$ sam local generate-event dynamodb update > ./events/dynamodb_event.json
$ sam local invoke HelloWorldFunction --event ./events/dynamodb_event.json

その他 v1.0.0 時点で生成に対応しているイベントソース

$ sam local generate-event --help
~省略~

Commands:
  alexa-skills-kit
  alexa-smart-home
  apigateway
  batch
  cloudformation
  cloudfront
  cloudwatch
  codecommit
  codepipeline
  cognito
  config
  connect
  dynamodb
  kinesis
  lex
  rekognition
  s3
  sagemaker
  ses
  sns
  sqs
  stepfunctions

sam local start-lambda

Lambda 関数の呼び出しをエミュレートするローカルンドポイントを起動することができます。
AWS CLI でローカルエンドポイントを指定したり、DynamoDB Local などの開発ツールと
連携させたりすることで開発、テストを便利におこなうことができます。

$  sam local start-lambda
Starting the Local Lambda Service. You can now invoke your Lambda Functions defined in your template through the endpoint.
2019-12-12 14:00:04  * Running on http://127.0.0.1:3001/ (Press CTRL+C to quit)

# AWSCLIから呼び出し
$  aws lambda invoke --function-name HelloWorldFunction  --endpoint http://127.0.0.1:3001/ outfile.txt
{
    "StatusCode": 200
}

Step Functions Local や Dynamodb Local との連携についても以前に
記事を書いたので参照いただければと思います。

Step Functions Local が出た!SAMやDynamoDB Localと一緒に使ってみる
https://qiita.com/hayao_k/items/14ff145a5d5c5191a18f

sam local start-api

API 呼び出しを含めたサーバーレスアプリケーション全体のテストを行うために
API Geteway のローカルインスタンスを起動することができます。
起動中に Lambda 関数への変更を 行った場合は自動的にリロードされるため
start-api を再実行する必要はありません。
SAMテンプレート自体を変更した場合はリスタートする必要があります。

$ sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2019-12-12 14:18:08  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

# 起動したエンドポイントに curl で接続すると正常に応答し、hello worldを返す
$ curl http://127.0.0.1:3000/hello
{"message":"hello world"}

sam validate

SAMテンプレートがSAMの仕様に沿った記述になっているか検証することができます。

$ sam validate
C:\test\sam-app\template.yaml is a valid SAM Template

AWSへのデプロイ

sam deploy

SAM で作成したアプリケーションのデプロイを行うことができます。
以前は AWS SAM CLI でデプロイを行うには複数のステップが必要だったのですが、v0.33.1 以降
単一の sam deploy コマンドでデプロイを操作できるようになりました。

具体的には必要な設定を事前にプロジェクトルートディレクトリにファイル(samconfig.toml)
として保続しておくか、-g, --guided オプションで対話的にデプロイをすすめることが可能です。
初回にこのオプションを使用してデプロイすることで、選択した構成を samconfig.toml
として保存させることもできます。
Lambda デプロイパッケージ用の S3 バケットも AWS SAM CLI が自動で作成し、管理します。


$ sam deploy -g

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

        Looking for samconfig.toml :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: mystack              ★CloudFormation スタック名の指定
        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     ★デプロイ前にCloudformationの変更セットを確認するか
        #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   ★SAM CLI に IAM ロールの作成を許可するか(CAPABILITY_IAM)
        HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y ★API イベントタイプの関数に認証が含まれていない場合、警告される
        Save arguments to samconfig.toml [Y/n]: y  ★この設定を samconfig.toml として保存するか

        Looking for resources needed for deployment: Found!

                Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxxx
                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

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

Initiating deployment
=====================

        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 mystack/6465dc636bb051f45abd5e903a356271  127334 / 127334.0  (100.00%)

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

Initiating deployment
=====================
HelloWorldFunction may not have authorization defined.
Uploading to mystack/c464e31927574f71da537a5cec342b9f.template  1091 / 1091.0  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
------------------------------------------------------------------------------------------------------------------------------------------------
Operation                                        LogicalResourceId                                ResourceType
------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                            HelloWorldFunctionHelloWorldPermissionProd       AWS::Lambda::Permission
+ Add                                            HelloWorldFunctionRole                           AWS::IAM::Role
+ Add                                            HelloWorldFunction                               AWS::Lambda::Function
+ Add                                            ServerlessRestApiDeployment47fc2d5f9d            AWS::ApiGateway::Deployment
+ Add                                            ServerlessRestApiProdStage                       AWS::ApiGateway::Stage
+ Add                                            ServerlessRestApi                                AWS::ApiGateway::RestApi
------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/samcli-deploy1576228579/a9ee2685-452f-47d0-851f-92e2ff217c9c


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y     ★変更セットを確認し、デプロイ実行

2019-12-13 18:16:38 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                       ResourceType                         LogicalResourceId                    ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------
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::RestApi             ServerlessRestApi                    -
CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    Resource creation Initiated
CREATE_COMPLETE                      AWS::ApiGateway::RestApi             ServerlessRestApi                    -
CREATE_IN_PROGRESS                   AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   Resource creation Initiated
                                                                          sionProd
CREATE_IN_PROGRESS                   AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   -
                                                                          sionProd
CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   -
                                                                          f9d
CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   Resource creation Initiated
                                                                          f9d
CREATE_COMPLETE                      AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   -
                                                                          f9d
CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           Resource creation Initiated
CREATE_COMPLETE                      AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
CREATE_COMPLETE                      AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   -
                                                                          sionProd
CREATE_COMPLETE                      AWS::CloudFormation::Stack           mystack                              -
-------------------------------------------------------------------------------------------------------------------------------------------------

Stack mystack outputs:
-------------------------------------------------------------------------------------------------------------------------------------------------
OutputKey-Description                                                    OutputValue
-------------------------------------------------------------------------------------------------------------------------------------------------
HelloWorldFunctionIamRole - Implicit IAM Role created for Hello World    arn:aws:iam::123456789012:role/mystack-
function                                                                 HelloWorldFunctionRole-1OUZSV1ENAMCB
HelloWorldApi - API Gateway endpoint URL for Prod stage for Hello        https://xxxxxxxxxx.execute-api.ap-
World function                                                           northeast-1.amazonaws.com/Prod/hello/
HelloWorldFunction - Hello World Lambda Function ARN                     arn:aws:lambda:ap-northeast-1:0123456789012:function:mystack-
                                                                         HelloWorldFunction-1IFZY75A4HM3V
-------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - mystack in ap-northeast-1

作成された samconfig.toml は以下のようになります。
toml とは設定ファイルを定義するためのフォーマットの1種で、CloudWatch Agent などでも採用されています。

samconfig.toml
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "mystack"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxxx"
s3_prefix = "mystack"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

samconfig.toml がプロジェクトのルートディレクトリに存在していれば
sam deploy コマンドだけでデプロイを行うことができます。

$ sam deploy

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

Initiating deployment
=====================
HelloWorldFunction may not have authorization defined.

Waiting for changeset to be created..
~以下省略~

OutputValue に出力された API Gateway のエンドポイントに接続すると、正常に応答が得られました。

$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
{"message":"hello world"}

sam package

SAM で作成したアプリケーションをパッケージ化できます。
具体的には以下のことを行っています。

  • Lambda 関数デプロイ用の ZIP ファイルを作成し、指定したS3バケットにアップロード
  • CodeUri の参照を、ローカルからアップロードしたS3のパスに書き換え

これらの処理は v0.33.1 以降であれば、sam deploy コマンド内で暗黙的実行されているため
個別に sam package コマンドを使用する必要はありません。
v0.33.1 以前のように sam package と sam deploy 個別に実行しデプロイすることも可能です。

$ sam package --template-file template.yaml \
  --s3-bucket <bucket-name> --output-template-file packaged.yaml
Uploading to 65113397247fb02f6ff4bad985a3240c  2421730 / 2421730.0  (100.00%)

Successfully packaged artifacts and wrote output template to file packaged.yaml.
Execute the following command to deploy the packaged template
sam deploy --template-file C:\test\sam-app\packaged.yaml --stack-name <YOUR STACK NAME>

$ sam deploy --template-file packaged.yaml --stack-name mystack --capabilities CAPABILITY_IAM

返されたSAMテンプレートを確認すると CodeUri が S3 のパスに書き換わっていることがわかります。

 Resources:
   HelloWorldFunction:
     Type: AWS::Serverless::Function
     Properties:
-      CodeUri: hello-world/
+      CodeUri: s3://<bucket-name>/65113397247fb02f6ff4bad985a3240c
       Handler: app.lambdaHandler
       Runtime: nodejs12.x

sam publish

SAMで作成したアプリケーションを AWS Serverless Application Repository に公開できます。
publish を実行するには SAMテンプレート内のMetadataに公開のために必要な情報を
定義する必要があります。LICENSE.txt および、README.md も用意しておく必要があります。

template.yaml
# 以下のメタデータが必要
Metadata:
  AWS::ServerlessRepo::Application:
    Name: my-app
    Description: hello world
    Author: user1
    SpdxLicenseId: Apache-2.0
    LicenseUrl: LICENSE.txt
    ReadmeUrl: README.md
    Labels: ['tests']
    HomePageUrl: https://github.com/user1/my-app-project
    SemanticVersion: 0.0.1
    SourceCodeUrl: https://github.com/user1/my-app-project

また Serverless Application Repository が アーティファクトが格納されている S3 バケットを
参照することができるように、対象のバケットに以下のようなポリシーの追加が必要です。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service":  "serverlessrepo.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<your-bucket-name>/*"
        }
    ]
}

テンプレートファイル内のLicenseUrl, ReadmeUrl, CodeUri は S3 上のファイルを指定する必要があるため
前述の sam package コマンドでパッケージ化後、publish を行います。

$ sam package --template-file template.yaml \
  --s3-bucket <bucket-name> --output-template-file packaged.yaml
~出力は省略~

LICENSE.txt および README.md も package コマンドにより S3にアップロードされ
Urlが書き換わっていることがわかります。

 Metadata:
   AWS::ServerlessRepo::Application:
     Name: my-app
     Description: hello world
     Author: user1
     SpdxLicenseId: Apache-2.0
-     LicenseUrl: LICENSE.txt
+     LicenseUrl: s3://<bukcet-name>/d41d8cd98f00b204e9800998ecf8427e
-     ReadmeUrl: README.md
+     ReadmeUrl: s3://<bukcet-name>/2a258235395cbaff804bbaab61a6d4ec
~以下略~

パッケージ後のテンプレートとリージョンを指定して publish します。
アプリケーションはプライベートアプリケーションとして SAR に登録されます。

$ sam publish --template packaged.yaml --region ap-northeast-1
Created new application with the following metadata:
{
  "Name": "my-app",
  "Description": "hello world",
  "Author": "user1",
  "SpdxLicenseId": "Apache-2.0",
  "LicenseUrl": "s3://<bucket-name>/d41d8cd98f00b204e9800998ecf8427e",
  "ReadmeUrl": "s3://<bucket-name/2a258235395cbaff804bbaab61a6d4ec",
  "Labels": [
    "tests"
  ],
  "HomePageUrl": "https://github.com/user1/my-app-project",
  "SemanticVersion": "0.0.1",
  "SourceCodeUrl": "https://github.com/user1/my-app-project"
}
Click the link below to view your application in AWS console:
https://console.aws.amazon.com/serverlessrepo/home?region=ap-northeast-1#/published-applications/arn:aws:serverlessrepo:ap-northeast-1:0123456789012:applications~my-app

SAR のコンソールを確認すると、正常にアプリケーションが登録され
プライベートアプリケーションとして利用可能になっています。
image.png
image.png

その他の機能

sam logs

デプロイ済みの Lambda 関数のログを取得できます。
--tail でログをたれ流したり、--filter "文字列" でフィルタリングすることもできます。
以下では CloudFormation のスタック名と関数名を指定しています。

$ sam logs -n HelloWorldFunction --stack-name mystack
2018/07/20/[$LATEST]c1e4c40fbbf2495aa91ecff5b21ce24d 2018-07-20T07:24:37.835000 START RequestId: f5664465-8bed-11e8-994b-8d4b4bdcc800 Version: $LATEST
2018/07/20/[$LATEST]c1e4c40fbbf2495aa91ecff5b21ce24d 2018-07-20T07:24:38.395000 END RequestId: f5664465-8bed-11e8-994b-8d4b4bdcc800
2018/07/20/[$LATEST]c1e4c40fbbf2495aa91ecff5b21ce24d 2018-07-20T07:24:38.395000 REPORT RequestId: f5664465-8bed-11e8-994b-8d4b4bdcc800  Duration: 542.93 ms     Billed Duration: 600 ms        Memory Size: 128 MB     Max Memory Used: 22 MB

もしくは関数名を直接指定してもよいので、AWS SAM CLI や CloudFormation で
デプロイされたかどうかは関係なく、全ての Lanmbda 関数に対して実行できます。
また フィルタリングした結果を tail するなどの組み合わせもできるので
トラブルシューティングを迅速に行うことができます。

$ sam logs -n ECRScanToSlack --tail --filter "INFO"
2019/12/12/[$LATEST]76c0c056a02541a8bf7b2568e9e8b06d 2019-12-12T08:32:26.793000 [INFO]  2019-12-12T08:32:26.792Z
        506de805-fb06-426f-b6b0-e89f2eb23660    Found credentials in environment variables.
2019/12/12/[$LATEST]76c0c056a02541a8bf7b2568e9e8b06d 2019-12-12T08:32:28.411000 [INFO]  2019-12-12T08:32:28.408Z
        506de805-fb06-426f-b6b0-e89f2eb23660    Message posted.
2019/12/12/[$LATEST]76c0c056a02541a8bf7b2568e9e8b06d 2019-12-12T08:34:32.572000 [INFO]  2019-12-12T08:34:32.572Z
        3dcde807-f150-4056-bb12-b791b77d0731    Message posted.
2019/12/12/[$LATEST]76c0c056a02541a8bf7b2568e9e8b06d 2019-12-12T08:34:35.812000 [INFO]  2019-12-12T08:34:35.811Z
        5ac31616-be63-4402-90ab-4d9b0b74a1a6    Message posted.

Lambda Layersへの対応

AWS SAM CLI は Labmda Layers を使用した関数のローカル実行にも対応しています。(v0.8.1以降)
以下は Lambda Layers を含む SAM テンプレートの例です。

template.yaml
# 該当箇所を抜粋
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Layers:
        - arn:aws:lambda:ap-northeast-1:123456789012:layer:python-boto3:1 # Layerの指定

ローカル実行時、AWS SAM CLI は対象の Layer のパッケージをダウンロードし、ローカルにキャッシュします。
その後、提供されている Docker イメージをベース に対象 Layer のキャッシュがオーバーレイされた
Docker イメージが自動でビルドされ、そのイメージを使用して実行が行われます。

$ sam local invoke
Invoking app.lambda_handler (python3.8)
Image was not found.
Building image......................................................
Requested to skip pulling images ...

Mounting C:\test\sam-app2\hello_world as /var/task:ro,delegated inside runtime container
START RequestId: bfee13e1-74be-1953-d236-aa7e0bc13d8e Version: $LATEST
END RequestId: bfee13e1-74be-1953-d236-aa7e0bc13d8e
REPORT RequestId: bfee13e1-74be-1953-d236-aa7e0bc13d8e     Init Duration: 310.57 ms        Duration: 4.80 ms      Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 23 MB

{"statusCode":200,"body":"{\"message\": \"hello world\"}"}

# samcli/lambda が Layer が展開された後の Docker イメージ
$ docker image ls
REPOSITORY                                    TAG                                   IMAGE ID       CREATED          SIZE
samcli/lambda                                 python3.8-a84bc9cd09799899970128014   99ac7e22ab97   13 seconds ago   548MB
amazon/aws-sam-cli-emulation-image-python3.8  latest                                0b8397b4f176   36 hours ago     490MB

AWS Toolkit と AWS SAM CLI によるデバッグ

各種 IDE に対応した AWS Toolkit は AWS SAM との親和性が高く、
SAM アプリケーションの作成、デバッグ、デプロイを行うことができます。
以下は AWS Toolkit for Visual Studio Code 拡張で Node.js ランタイムの
Lambda 関数のデバッグを行う例です。

デバッグの起動構成に以下のような構成を追加します。(.vscode/launch.json)

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach to SAM CLI",
            "type": "node",
            "request": "attach",
            "address": "localhost",
            "port": 5858,
            "localRoot": "${workspaceRoot}/hello-world",
            "remoteRoot": "/var/task",
            "protocol": "inspector",
            "stopOnEntry": false
        }
    ]
}

-d, --debug-port オプションを指定し、sam local invoke します。

$ sam local invoke -e ./events/event.json -d 5858
Invoking app.lambdaHandler (nodejs10.x)

Fetching lambci/lambda:nodejs10.x Docker container image......
Mounting C:\vscode\sam-app\hello-world as /var/task:ro,delegated inside runtime container
Debugger listening on ws://0.0.0.0:5858/3e80f80b-bbaa-4a6c-b087-7f2f3fd46b6b
For help, see: https://nodejs.org/en/docs/inspector

Lambda 関数がデバッグモードで起動しますので、Visual Studio Code 側で設定した
起動設定からデバッグを開始することができます。
image.png

参考

AWS Serverless Application Model - Developer Guide
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html
GitHub - aws-sam-cli Releases
https://github.com/awslabs/aws-sam-cli/releases

以上です。
参考になれば幸いです。

125
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hayao_k
2019 & 2020 APN AWS Top Engineers / AWS Community Builder に選出いただきました。 掲載内容は個人の見解であり、所属する企業を代表するものではありません。
saison_information_systems
モード1(守りのIT)・モード2(攻めのIT)を兼ね備えたバイモーダル・インテグレーターとしてデータ連携プラットフォームのHULFTシリーズ, リンケージサービス, 流通ITサービス, フィナンシャルITサービスを提供します。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
125
Help us understand the problem. What is going on with this article?