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::Api | Amazon API Gateway リソースとメソッドのコレクションをデプロイ |
AWS::Serverless::Application | AWS Serverless Application Repository からアプリケーションをデプロイ |
AWS::Serverless::Function | AWS Lambda、IAMロール、イベントソースマッピングをデプロイ |
AWS::Serverless::HttpApi | Amazon API Gateway HTTP API をデプロイ |
AWS::Serverless::LayerVersion | Lambda Layer をデプロイ |
AWS::Serverless::SimpleTable | Amazon DynamoDB のテーブルをデプロイ |
AWS::Serverless::StateMachine | AWS 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