AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～

# 概要

前のLambda投稿に続き今回もAWS Lambdaネタになります。
今回はLambda構築・設定・イベントソースマッピングからソースコードを管理・編集しやすいようにAWS サーバーレスアプリケーションモデル (Serverless Application Model)、AWS SAMにチャレンジします。

https://aws.amazon.com/jp/serverless/sam/

サンプルコードなどの簡単なプログラミングであればAWSコンソールで設定、ソースコードの直接編集すれば良いのですが、ちょっと規模が大きくなるとLambdaの設定・ソースコードをしっかり管理したい、しっかりテストしたいという状況が出てきます。

その時にかなり便利なのがAWS サーバーレスアプリケーションモデル（AWS SAM）になります。

Lambdaを使って本格的にLambdaのサービスを運用したい人、興味がある方は読んでみて下さい。

資格試験の勉強法は記事は以下を参照。

[AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/e5284a4ed3c3466ffd41 "AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法")
[AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/17fa401f4e46ecd00675 "AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法")

## 想定読者
* LambdaでSAMを使ってみたい人
* Lambdaの知識をレベルアップしたい人
* Lambdaを実運用で使っている人

## 参考書籍

[AWS Lambda実践ガイド 第2版 impress top gearシリーズ](https://www.amazon.co.jp/dp/B09TVG5H17?tag=blog_lambda_books_001-22&linkCode=ogi&th=1&psc=1 "AWS Lambda実践ガイド 第2版 impress top gearシリーズ")
<a href="https://www.amazon.co.jp/dp/B09TVG5H17?tag=blog_lambda_books_001-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="noopener"><img border="0" src="https://m.media-amazon.com/images/I/51vlB3JskRL._SL160_.jpg" ></a>


ほぼほぼこの本を参考にさせて頂きました。
Lambdaに特化した本はあまりないので現時点で唯一の専門書と思います。
2022年になって第2版となり内容が最新化されています。

Lambdaの良書が増えてきたので、おすすめ本5冊を以下で紹介しています。Lambdaについて本格的に勉強したい方はぜひ読んでみてください。

[AWS Lambdaおすすめ書籍5冊の紹介](https://www.studycloudtech.com/aws/aws-lambda-books/ "AWS Lambdaおすすめ書籍5冊の紹介")

## 目次

* SAM環境（Cloud9環境）準備
* SAM初期設定
* SAMビルド／デプロイ

SAMを使って簡単なLambda関数を作っていきます。
作業時間、たったの **30分！**

## SAM環境（Cloud9環境）準備

SAMを使うためには **SAM CLI** がインストールされている必要があります。
ローカル環境でインストールしても良いのですが、AWS の Cloud9 を使うのが一番簡単なので今回はCloud9の環境準備から説明します。

Cloud9の作成は非常に簡単で、AWSコンソールのCloud9のサービスメニュに行き、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/0ed12cd9-beb8-b4d5-9e4d-575fb2d0f69e.png)


**Create environment**をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/ad42879f-887c-8844-e8fc-16a211ed6c48.png)


**Name**に任意の名前を入力
**Next step**をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/f8d6f6a6-8119-8ee7-f85a-cbf1915b7631.png)


環境設定は、基本的には任意のものを選択していいのですが、ブラウザからそのままアクセスが出来て簡単なのが **direct access** 、料金が安く済むものが **t2.micro** になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/ad5db68c-7c2c-bdf8-dde6-c0248199f822.png)

料金節約のため無操作30分後に自動停止するよう **After 30 minutes(default)** のままにしておきます。
**Network settingd(advanced)** はデフォルトVPC以外に作りたい時（Cloud9へのアクセスをしっかりアクセス制御したい時）に選択します。
**Next step** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/350306d7-7696-957a-fe9a-6038749d5081.png)

設定内容を最終確認して問題なければ、**Create environment** クリック

![memo_2022-05-01-11-46-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/12ca147b-e69a-86d5-6ed8-9cfc8ec489ca.png)

数分待つとこんな感じのCloud9のトップ画面が表示されます。
実際の操作は左メニューから編集したいファイルを選択し画面中央部で編集する操作と、画面下部のコンソール部分に直接コマンドを実行する大きく2パターンの操作があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/1073e066-5dfb-bcb6-1299-a4e8a7a7c0ff.png)




## SAM初期設定（sam init）

それでは実際にSAMの初期設定をしていきます。
画面下部のコンソールに **sam init** のコマンドを実行して初期設定します。

```sh
$ pwd
/home/ec2-user/environment
$ sam init

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

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 - Lambda EFS example
        9 - Machine Learning
Template: 1

 Use the most popular runtime and package type? (Python and zip) [y/N]: y

Project name [sam-app]: sam-example

Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)

    -----------------------
    Generating application:
    -----------------------
    Name: sam-example
    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-example/README.md
        

    Commands you can use next
    =========================
    [*] Create pipeline: cd sam-example && sam pipeline init --bootstrap
    [*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
    

SAM CLI update available (1.53.0); (1.40.1 installed)
To download: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
$
```

実際の入力値は以下の４つ
* Choice: **1**(1 - AWS Quick Start Templates)
* Template: **1**(1 - Hello World Example)
* Use the most popular runtime and package type? (Python and zip) [y/N]: **y**
* Project name [sam-app]: **sam-example**

**sam-example** というプロジェクト名で、実行環境 **python3.9**、samテンプレート **Hello World Example** を選択（テンプレートはすぐに自分で編集するのでなんでも構いません）しています。

sam init コマンドが完了するとひと通り必要なフォルダ・ファイル群が作成されます。

![IMG_0358.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/505696a2-adfc-13dd-42b3-1a987ef98c22.jpeg)

この中で重要なのが、

* **app.py**：Lambdaのソースプログラムが記載されているファイル
* **template.yml**：Lambdaの設定が記載されているファイル

の二つになります。

![IMG_0357.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/a182a34b-1d66-4a71-ef68-3e1b13c43939.jpeg)

それぞれ中身を簡単に見てみます。
まずは **template.yml** から。

```template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-example

  Sample SAM Template for sam-example

# 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
```

**Hello World Example** のテンプレートの場合、LambdaとAPIGatewayが含まれています。
**Resources:** 部がそれらの記述に該当しますが

* **Type: AWS::Serverless::Function**：Lambdaであることを示しています
* **Type: Api**：APIGatewayであることを示しています

今回は、最小限のLambdaだけの設定にしたいので以下に書き換えます。（ついでにコメントも消してすっきりさせます）

```template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-example

  Sample SAM Template for sam-example

Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: app.lambda_handler
      Runtime: python3.9

Outputs:
  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
```

**Description** と **Outputs** は無くても良い設定のため必要なのは、**Globals** と **Resources** 部だけになり、たった **9行** です。

次は **app.py** です。
**このファイルがLambdaの本体のプログラムになります。**
今後、自分でプログラムを書き換えるときはこのファイルを編集します。


```app.py
import json

# import requests


def lambda_handler(event, context):
    """Sample pure Lambda function

    Parameters
    ----------
    event: dict, required
        API Gateway Lambda Proxy Input Format

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: dict

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    # try:
    #     ip = requests.get("http://checkip.amazonaws.com/")
    # except requests.RequestException as e:
    #     # Send some context about this error to Lambda Logs
    #     print(e)

    #     raise e

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }

```

こちらはシンプルですね。
コメントがたくさんありますが、戻り値にjson形式の **hello world** も返却しているだけになってます。



## SAMビルド／デプロイ（sam build／sam deploy）

### ビルド

では、ビルド／デプロイをやっていきましょう。
**template.yml** を編集したため、シンプルに **Lambda関数1つ** を作成するsamテンプレートになっています。

では、ここからはコンソール操作になるので、Cloud9画面下部のコンソール部分でコマンド実行します。
まず、カレントフォルダを **~/environment/sam-example/** （自身で入力したプロジェクトフォルダ）に移動して、ビルドコマンド **sam build --use-container** を実行します。

実際の実行コマンドは以下の2つ

**cd ~/environment/sam-example/**
**sam build --use-container**

では、やってみます。

```sh
$ cd ~/environment/sam-example/
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-example runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']

Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/ec2-user/environment/sam-example as /tmp/samcli/source:ro,delegated inside runtime container
Traceback (most recent call last):
  File "samcli/__main__.py", line 12, in <module>
  File "click/core.py", line 829, in __call__
  File "click/core.py", line 782, in main
  File "click/core.py", line 1259, in invoke
  File "click/core.py", line 1066, in invoke
  File "click/core.py", line 610, in invoke
  File "click/decorators.py", line 73, in new_func
  File "click/core.py", line 610, in invoke
  File "samcli/lib/telemetry/metric.py", line 153, in wrapped
  File "samcli/lib/telemetry/metric.py", line 122, in wrapped
  File "samcli/lib/utils/version_checker.py", line 42, in wrapped
  File "samcli/cli/main.py", line 90, in wrapper
  File "samcli/commands/build/command.py", line 228, in cli
  File "samcli/commands/build/command.py", line 318, in do_cli
  File "samcli/lib/build/app_builder.py", line 172, in build
  File "samcli/lib/build/build_strategy.py", line 42, in build
  File "samcli/lib/build/build_strategy.py", line 53, in _build_functions
  File "samcli/lib/build/build_strategy.py", line 129, in build_single_function_definition
  File "samcli/lib/build/app_builder.py", line 572, in _build_function
  File "samcli/lib/build/app_builder.py", line 705, in _build_function_on_container
  File "samcli/local/docker/container.py", line 308, in wait_for_logs
RuntimeError: Container does not exist. Cannot get logs for this container
[19020] Failed to execute script __main__
```

おそらく、 **RuntimeError: Container does not exist. Cannot get logs for this container** エラーが発生します。
ビルドコマンドのオプションで **--use-container**（実行環境をコンテナ上に作成するオプション）を付けているのですが、Cloud9の初期ディスクだと足りません。。。
（非常にわかりにくいエラーメッセージですね。。。）

なぜなら、、、

```sh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  468K  491M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       10G  8.2G  1.9G  82% /
tmpfs            99M     0   99M   0% /run/user/1000
```

すでにディスク容量の **82%** しており、 **1.9G** しか残りがないからです。。。
（sam init で大量にディスクを消費したのではなく、Cloud9は最初からディスクが少ないようです。。。）

### Cloud9ディスク拡張

では、Cloud9のディスクを増やしましょう。
Cloud9はEC2のLinux上で実現されているのでEC2のメニューからLinuxのディスク拡張操作を行います。
Linuxの場合、ディスク拡張は簡単で、Cloud9を作成すると自動的にEC2のメニューに専用のEC2が出来上がっているので、そのEC2を止めた状態で、EC2のボリュームのメニューのディスクの変更からサイズを増やすだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/7c746a71-c2f8-819c-f648-eadfdc54c638.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/9b5de769-7538-7f11-8c9a-5a20fde441a7.png)

以上です。

再度EC2を起動し、Cloud9のコンソールからディスクが増えていることを確認します
 
```sh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  464K  491M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       15G  8.2G  6.9G  55% /
tmpfs            99M     0   99M   0% /run/user/1000
```

使用率 **55%** 残り **6.9GB** になりました。
では、改めてビルドしましょう。

### 再ビルド

```sh
$ cd ~/environment/sam-example/
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-example runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']

Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/ec2-user/environment/sam-example as /tmp/samcli/source:ro,delegated inside runtime container

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
    
requirements.txt file not found. Continuing the build without dependencies.
Running PythonPipBuilder:CopySource
$
```

今度は成功しました。
ビルド後のディスク容量も確認しておきましょう。

```sh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        484M     0  484M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  464K  491M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       15G   11G  4.6G  70% /
tmpfs            99M     0   99M   0% /run/user/1000
$ 
```

使用率 **70%** 残り **4.6GB** になりました。
ビルド前と比較すると **2.3GB** 使用するようですね。結構使いますね。。。

### デプロイ

では、いよいよデプロイです。
**sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND** デプロイ時のガイド付き、ロール等は自動で作成するオプションを付けています。

実行コマンドは以下の１つ。

**sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND**

実行します。

```sh
$ sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND

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

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

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: sam-sample
        AWS Region [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
        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-bncdmvrv3w3n
         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-sample/1c2f1111422c1a9a068bc3d12653d3c4  7913 / 7913  (100.00%)

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

Initiating deployment
=====================
Uploading to sam-sample/cc7378c1e1ecf6a93a04bc81b3006223.template  768 / 768  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                               LogicalResourceId                       ResourceType                            Replacement                           
-------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                   HelloWorldFunctionRole                  AWS::IAM::Role                          N/A                                   
+ Add                                   HelloWorldFunction                      AWS::Lambda::Function                   N/A                                   
-------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:changeSet/samcli-deploy1651456975/245e03ef-407d-b1c6-43702e5cd1b3-e61b


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2022-05-02 02:03:09 - 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_COMPLETE                         AWS::CloudFormation::Stack              sam-sample                              -                                     
-------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                      
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                
Description         Implicit IAM Role created for Hello World function                                                                                       
Value               arn:aws:iam::XXXXXXXXXXXX:role/sam-sample-HelloWorldFunctionRole-11AUZUABC6ASS                                                           

Key                 HelloWorldFunction                                                                                                                       
Description         Hello World Lambda Function ARN                                                                                                          
Value               arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:sam-sample-HelloWorldFunction-y2SU9rABc52s                                           
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-sample in ap-northeast-1
$ 
```

ガイド付きなので何回か質問があるので確認して選択しましょう。
**Stack Name** は、自分で決める任意の名称になります。

ちなみに次回以降の更新の時は選択内容が保持されるため **sam deploy** コマンドでサクッとデプロイできます。

```sh
$ sam deploy
Uploading to sam-sample/287342c7c37cb1d8020451b36647bd1f  452838 / 452838  (100.00%)

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

Initiating deployment
=====================
Uploading to sam-sample/17c228278a608cc7c3f55da042cf1ae7.template  768 / 768  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                               LogicalResourceId                       ResourceType                            Replacement                           
-------------------------------------------------------------------------------------------------------------------------------------------------------------
* Modify                                HelloWorldFunction                      AWS::Lambda::Function                   False                                 
-------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:changeSet/samcli-deploy1651457546/3cc5876f-4d81-a290-7cbc821840ed-5d26


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2022-05-02 02:12:41 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                          ResourceType                            LogicalResourceId                       ResourceStatusReason                  
-------------------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS                      AWS::Lambda::Function                   HelloWorldFunction                      -                                     
UPDATE_COMPLETE                         AWS::Lambda::Function                   HelloWorldFunction                      -                                     
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS     AWS::CloudFormation::Stack              sam-sample                              -                                     
UPDATE_COMPLETE                         AWS::CloudFormation::Stack              sam-sample                              -                                     
-------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                      
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                
Description         Implicit IAM Role created for Hello World function                                                                                       
Value               arn:aws:iam::XXXXXXXXXXXX:role/sam-sample-HelloWorldFunctionRole-11AUZUANR6ASS                                                           

Key                 HelloWorldFunction                                                                                                                       
Description         Hello World Lambda Function ARN                                                                                                          
Value              arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:sam-sample-HelloWorldFunction-yrJDo52s2SU9                                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-sample in ap-northeast-1
$ 
```

**Outputs** に作成されたLambda関数のARNが表示されているので確認して、AWSコンソールからLambdaを確認してみましょう。今回の例だとLambda関数名は **sam-sample-HelloWorldFunction-yrJDo52s2SU9** になります。

デプロイされたLambdaの設定を画面を確認すると **--capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND** オプションのおかげで必要なロールが自動作成されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/049d3c8a-cd22-f1ab-8f55-9c584dd51be2.png)

もちろん **app.py** の内容がLambdaの **コードソース** 部分で確認できると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/54f7937e-e930-2abc-7227-09b6569e4f65.png)

あとは通常のコンソール操作のtestから動作確認可能です。簡単ですね。


## まとめ
お疲れ様でした！

今回はLambdaでsamを使って作成してみました。簡単なLambdaであれば、AWSコンソールで十分なのですが、Lambdaと連携するAWSサービスが増えてくれるとAWSコンソールだけではどこに何を設定したか把握しきれず限界が来ると思います。
そこでプログラムを **app.py** に、環境設定を **template.yml** にしておけば非常に管理しやすくなりますね。（テキストなのでGitでバージョン管理したり差分比較したり簡単になります）
samを使ってプログラムに集中出来るサーバーレスLambdaがもっと便利になって、開発者はより業務ロジックに集中出来る世の中になれば良いなと思います(^^)

本投稿が少しでも皆さんの良いサーバーレスライフの助けになればと思います(_ _)

## 資格取得に向けてAWSサービスを実際に利用してみるシリーズの投稿一覧

[とりあえず30分でAWS利用料金の高額請求に備える～予算アラート設定・MFA・料金確認～](https://qiita.com/fkooo/items/67c53c997508e25605ea "とりあえず30分でAWS利用料金の高額請求に備える～予算アラート設定・MFA・料金確認～")
[AWS ECSでDocker環境を試してみる](https://qiita.com/fkooo/items/d7d98e16e91921508450 "AWS ECSでDocker環境を試してみる")
[Amazon Cognitoを使ってシンプルなログイン画面を作ってみる](https://qiita.com/fkooo/items/660cab0090a80861155b "Amazon Cognitoを使ってシンプルなログイン画面を作ってみる")
[AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする](https://qiita.com/fkooo/items/a474db0f3c2e72448d36 "AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする")
[API GatewayをPrivateで作成してみる](https://qiita.com/fkooo/items/577831abd9803eb91b16 "API GatewayをPrivateで作成してみる")
[AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる](https://qiita.com/fkooo/items/10f75bafd08c60fc0a66 "AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる")
[AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる](https://qiita.com/fkooo/items/1b24e01252e145a378db "AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる")
[AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～](https://qiita.com/fkooo/items/2dc5ded5149379d7305a "AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～")（本記事）
[AWS SAMを使って最もシンプルにLambda × APIGatewayのWebAPIを構築する](https://qiita.com/fkooo/items/e08cdea0f73f60dabd3d "AWS SAMを使って最もシンプルにLambda × APIGatewayのWebAPIを構築する")
[AWS SAMを使って最もシンプルにLambda × S3 のS3イベント駆動プログラムを構築する](https://qiita.com/fkooo/items/fa1d03c1d9e532956e2d "AWS SAMを使って最もシンプルにLambda × S3 のS3イベント駆動プログラムを構築する")
[Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる](https://qiita.com/fkooo/items/84f8f57e2317b0973496 "Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる")