AWS

AWS SAMとは? SAM仕様と使い方まとめ

AWS SAMとは

AWS SAM(Serverless Application Model)とは、AWS でサーバーレスアプリケーションを構築するために使用できるオープンソースのフレームワークです。

サーバーレスアプリケーション は、タスクを実行するために連動する Lambda 関数、イベントソース、およびその他のリソースの組み合わせのことを言います。単純に Lambda関数のみを指していることではないことには注意してください。

AWS SAM は、次のコンポーネントで構成されています。

  • AWS SAM テンプレート
    • サーバーレスアプリケーションを定義するファイル
  • AWS SAM コマンドラインインターフェイス (AWS SAM CLI)
    • AWS SAM テンプレートによって定義されたサーバーレスアプリケーションを構築するツール

AWS SAM テンプレート

AWS SAM 仕様

AWS SAM テンプレートファイルは、サーバーレスアプリケーションのデプロイに特化した AWS CloudFormation の拡張機能になります。そのため、CloudFormation 同様に YAML もしくは JSON 形式で記述が可能となります。

SAMを利用すると、本来のCloudFormationで記述するコード量よりも簡潔に省略されて形で定義することができます。スタック作成時にCloudFormationが自動的にコードを元の記述に変換して処理を行います。

AWS SAM テンプレート構造

AWS SAM テンプレートファイルは、AWS CloudFormation テンプレートファイルの形式に追随しています。CloudFormationでテンプレートを作成したことがある方はイメージが付きやすいと思います。

SAM テンプレートの構造は次の通りです。

Transform: AWS::Serverless-2016-10-31

Globals:
  set of globals

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Mappings:
  set of mappings

Conditions:
  set of conditions

Resources:
  set of resources

Outputs:
  set of outputs
セクション指定内容
Transform必須SAMテンプレートのバージョンを指定
2022/01/30 では、’AWS::Serverless-2016-10-31′ のみが許容される
AWS SAM に固有のセクション
Globals任意Lambda, API, DynamoDBに関する共通なプロパティを記載
AWS SAM に固有のセクション
Description任意このテンプレートに関する説明を記載
Metadata任意このテンプレートに関する追加情報を記載
Parameters任意スタック実行時にテンプレートに渡す値を記載
テンプレートの Resources および Outputs セクションから参照可能
Mappings任意キーと関連する値のマッピングを記載
テンプレートの Resources および Outputs セクションから参照可能
Fn::FindInMap 組み込み関数を使用して、キーに対応する値を取得
環境(Devl, Prodなど)ごとに異なる値の定義などに役に立つ
Conditions任意スタック実行時に特定のリソース・プロパティを
作成するかどうかを制御する条件を記載
Resources必須このテンプレートで作成するリソース情報を記載
AWS CloudFormation テンプレートの Resources セクションで
定義可能なリソースに加えて AWS SAM リソースが定義できる
Outputs任意スタックのプロパティに出力する値を記載

AWS SAM リソースタイプ

SAMテンプレートの Type に指定可能な値は次の7種類になります。(2022/01/30時点)

Type説明
AWS::Serverless::ApiAmazon API Gateway リソースとメソッドのコレクションをデプロイ
AWS::Serverless::ApplicationAWS Serverless Application Repository からアプリケーションをデプロイ
AWS::Serverless::FunctionAWS Lambda、IAMロール、イベントソースマッピングをデプロイ
AWS::Serverless::HttpApiAmazon API Gateway HTTP API をデプロイ
AWS::Serverless::LayerVersionLambda Layer をデプロイ
AWS::Serverless::SimpleTableAmazon DynamoDB のテーブルをデプロイ
AWS::Serverless::StateMachineAWS Step Functions ステートマシンをデプロイ

AWS SAM CLI

AWS SAM CLI とは

AWS SAM CLIは、サーバーレスアプリケーションの作成と管理を容易にするコマンドラインツールです。
使用するためには、事前にインストールと設定が必要になります。

AWS SAM CLI インストール

インストール手順は公式ドキュメントをご参照ください。

AWS SAM CLI コマンド集

初期化

サーバレスアプリケーションを構築する SAM テンプレートを生成します。
また、Lambdaへデプロイするコードや、単体テストのコードも同時に生成されます。

$ sam init [OPTIONS]
# パラメータ指定でSAMプロジェクトを開始
$ sam init --runtime python3.9 --dependency-manager pip --app-template hello-world --name sam-app

検証

AWS SAM テンプレートファイルが有効かどうかを検証します。

$ sam validate [OPTIONS]
# template.yamlの内容を検証
$ sam validate 
2022-02-07 13:44:50 Loading policies from IAM...
2022-02-07 13:44:55 Finished loading policies from IAM.
/home/ec2-user/environment/sam-app/template.yaml is a valid SAM Template

ビルド

サーバレスアプリケーションをビルドします。
ビルドされたアプリケーションは .aws-sam/build ディレクトリ内に作成されます。

$ sam build [OPTIONS] [RESOURCE_LOGICAL_ID]
# LambdaのようなDockerコンテナ内にビルド
$ sam build --use-container
Starting Build inside a container
Building codeuri: /home/ec2-user/environment/sam-app/hello_world 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-app/hello_world 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
    
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

パッケージング

AWS SAM アプリケーションをパッケージ化します。

$ sam package [OPTIONS] [ARGS]...
# アプリケーションをZIP形式にパッケージング
$ sam package --s3-bucket xxxx --output-template-file output.yml

デプロイ

AWS SAM アプリケーションをデプロイします。

$ sam deploy [OPTIONS] [ARGS]...
# AWS クラウド上へデプロイする
$ sam deploy --template-file output.yml --stack-name SamAppStack

イベントデータ作成

Lambda関数の入力に使うテスト用JSONデータを出力します。

$ sam local generate-event [OPTIONS] COMMAND [ARGS]...
# S3バケットのPUTイベント
$ sam local generate-event s3 put
{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "example-bucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::example-bucket"
        },
        "object": {
          "key": "test/key",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

ローカル実行

ローカル AWS Lambda 関数を一回呼び出して、呼び出し完了後に終了します。

$ sam local invoke [OPTIONS] [FUNCTION_LOGICAL_ID]
# ローカル実行
$ sam local invoke "HelloWorldFunction" -e events/event.json
Invoking app.lambda_handler (python3.9)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.9:rapid-1.33.0-x86_64.

Mounting /home/ec2-user/environment/sam-app/hello_world as /var/task:ro,delegated inside runtime container
END RequestId: 1e230d49-90ae-4ced-9a23-c2e775277916
REPORT RequestId: 1e230d49-90ae-4ced-9a23-c2e775277916  Init Duration: 0.69 ms  Duration: 122.02 ms     Billed Duration: 123 ms Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}

クリーンアップ

デプロイした AWS CloudFormation スタックを削除する。

# スタック削除コマンド
$ aws cloudformation delete-stack --stack-name SamAppStack

参考ページ

AWS公式:AWS Serverless Application Model (AWS SAM) とは
AWS公式:AWS SAM CLI コマンドリファレンス
チュートリアル: Hello World アプリケーションのデプロイ
(YouTube)【AWS Black Belt Online Seminar】AWS Serverless Application Model

ABOUT ME
湖山 貴裕
はじめまして。 二児のお父さんプログラマーです。最近キャンプにも興味あり。夏には庭でキャンプしようともくろみ中。ボドゲ好き。チョコ好き。茶道経験者。 2012年大学卒業→IT企業就職 Java,VB.NET, C#, javascript等の企業向けシステム開発/主にバックエンドを担当/AWSを少しかじる→2020年フリーランスエンジニアへ転身 広島でAWS案件にて楽しく活動中