[AWS] Serverless Application Model (SAM) の基本まとめ

# SAM
## SAMとは
サーバレスアプリケーションを構築するためのオープンソースなフレームワークで、イベント駆動の性質を持つサーバレスアプリケーションのデプロイに特化したCloudFormationの拡張機能として提供されています。
SAMは、YAML、またはJSON形式によるテンプレートへの記述により

- 関数
- API
- データベース
- イベントソースマッピング

を表現することができます。

## SAMを利用するメリット
Lambdaを作成する場合、Lambdaの実行に関する権限を付与する必要がありますが、こ

## 対応言語
SAMでは、Lambdaがサポートされている任意のランタイムを使用するサーバレスアプリケーションを構築することができます。
ユーザが任意で追加するランタイム以外で、Lambdaが標準でサポートされている言語は、下記の通り（2020年7月時点）です。

- Node.js (12/10)
- Python (3.8/3.7/3.6/2.7)
- Ruby (2.7/2.5)
- Java (11/8)
- Go (1.x)
- .NET (3.1/2.1)

## 対応リージョン
SAMでは、Lambdaがサポートされているリージョンで利用することができます。利用可能なリージョンは、下記の通り（2020年7月時点）です。

- バージニア北部（us-east-1）
- オハイオ（us-east-2）
- 北カリフォルニア（us-west-1）
- オレゴン（us-west-2）
- ケープタウン（af-south-1）
- 香港（ap-east-1）
- ムンバイ（ap-south-1）
- ソウル（ap-northeast-2）
- シンガポール（ap-southeast-1）
- シドニー（ap-southeast-2）
- 東京（ap-northeast-1）
- カナダ中部（ca-central-1）
- フランクフルト（eu-central-1）
- アイルランド（eu-west-1）
- ロンドン（eu-west-2）
- ミラノ（eu-south-1）
- パリ（eu-west-3）
- ストックホルム（eu-north-1）
- バーレーン（me-south-1）
- サンパウロ（sa-east-1）

## デプロイ
SAM自体は、もともとCloud Formationを拡張したものであるため、SAMの中でCloud Formationのリソースを定義することができるとともに、デプロイの中でリソースのプロビジョニングを行うこともできます。
そのため、関連するコンポーネントの定義も含めて一元的に管理できるようになります。
## 料金
SAM自体は追加料金なしで使用することができます。
デプロイしたアプリケーションや、プロビジョニングされたリソースについてのみ、それぞれの利用に応じた料金が請求されます。
# SAM CLI
SAMを操作するためのコマンドラインで、SAMの本体とともに、オープンソースとして公開されています。
SAM CLIは、ローカルにLambdaに似た実行環境を構築することができ、ローカル環境でテストやデバッグすることが可能となります。

- [AWS SAM on GitHub](https://github.com/awslabs/serverless-application-model)
- [AWS SAM CLI on GitHub](https://github.com/awslabs/aws-sam-cli)

## SAM CLIインストール手順
ローカル環境でテスト・デバッグするために、Dockerの環境が必要となります。

### Mac
1. Docker Desktopをインストールする
    - [Install Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/install/)
2. Homebrewをインストールする
    - [Homebrew](https://brew.sh/index_ja)
3. SAM CLIをインストール

    ```bash
    brew tap aws/tap
    brew install aws-sam-cli
    ```

### Windows(64bit)
1. Dockerをインストールする
    - [Windows に Docker Desktop をインストール](http://docs.docker.jp/docker-for-windows/install.html)
2. SAM CLIのインストーラをダウンロードし、インストールする
    - [64bit](https://github.com/awslabs/aws-sam-cli/releases/latest/download/AWS_SAM_CLI_64_PY3.msi)

### Linux
1. Dockerをインストールする
    - [Docker Engine を Linux にインストール](http://docs.docker.jp/engine/installation/linux/index.html)
2. pipをインストールする

    ```bash
    curl -kL https://bootstrap.pypa.io/get-pip.py | python
    ```

3. SAM CLIをインストール

    ```bash
    pip install -U aws-sam-cli
    ```

## SAM CLIコマンドリファレンス
### ローカルでの開発・テスト
#### sam init
SAM テンプレートを使用してサーバーレスアプリケーションを初期化します。テンプレートはLambda関数のフォルダ構造を提供し、API、S3バケット、DynamoDBテーブルなどのイベントソースに接続できます。
このアプリケーションには、使用を開始し、最終的には本番規模のアプリケーションに拡張するために必要なものがすべて含まれています。

**構文**

```bash
sam init [OPTIONS]
```

**オプション**

| Option | Description |
| :-- | :-- |
| --no-interactive | `init`パラメータの対話型プロンプトを無効にし、必要な値がない場合は失敗します。 |
| -l, --location TEXT | テンプレートまたはアプリケーションの場所 (Git、Mercurial、HTTP/HTTPS、ZIP、パス)。このパラメータは、`--no-interactive`が指定され、`--runtime`、`--name`、`--app-template`が指定されていない場合に必要です。Gitリポジトリの場合は、リポジトリのルートの場所を使用する必要があります。 |
| -r, --runtime [python2.7 / nodejs6.10 / ruby2.5 / java8 / python3.7 / nodejs8.10 / dotnetcore2.0 / nodejs10.x / dotnetcore2.1 / dotnetcore1.0 / python3.6 / go1.x] | アプリケーションのLambdaランタイム。このパラメータは、`--no-interactive`が指定され、`--location`が指定されていない場合に必要です。 | 
| -d, --dependency-manager [gradle / mod / maven / bundler / npm / cli-package / pip] | Lambdaランタイムの依存関係マネージャ |
| -o, --output-dir PATH | 初期化されたアプリケーションが出力される場所。 |
| -n, --name TEXT | フォルダとして生成されるプロジェクトの名前。このパラメータは、`--no-interactive`が指定され、`--location`が指定されていない場合に必要です。 |
| --app-template TEXT | 使用するマネージドアプリケーションテンプレートの識別子。不明な場合は、対話型ワークフローのオプションを指定せずに「`sam init`」を呼び出します。このパラメータは、`--no-interactive`が指定され、`--location`が指定されていない場合に必要です。このパラメータは、SAM CLIバージョン0.30.0以降でのみ使用できます。以前のバージョンでこのパラメータを指定すると、エラーが発生します。 |
| --no-input | Cookiecutterのプロンプトを無効にし、テンプレート設定で定義されているデフォルト値を受け入れます。 |


#### sam build
このコマンドを使用して、Lambdaソースコードを構築し、Lambdaの実行環境をターゲットとするデプロイアーティファクトを生成します。これにより、ローカルで構築する関数は、AWSクラウド内の同様の環境で実行されます。
`sam build`コマンドは、アプリケーション内の関数を反復処理し、依存関係を含むマニフェストファイル (`requirements.txt`など) を検索し、`sam package`および`sam deploy`コマンドを使用してLambdaにデプロイできるデプロイアーティファクトを自動的に作成します。
また`sam build`を`sam local invoke`のような他のコマンドと組み合わせて使用して、アプリケーションをローカルでテストすることができます。

**構文**

````bash
sam build [OPTIONS] [RESOURCE_LOGICAL_ID]
```

**オプション**

| Option | Description |
| :-- | :-- |
| -b, --build-dir DIRECTORY | 構築されたアーティファクトが格納されるフォルダへのパス。このオプションを使用すると、このディレクトリとそのすべてのコンテンツが削除されます。|
| -s, --base-dir DIRECTORY | このフォルダに関する関数のソースコードへの相対パスを解決します。AWS SAM テンプレートとソースコードが同じ囲みフォルダにない場合は、これを使用します。デフォルトでは、相対パスはテンプレートの場所に関して解決されます。 | 
| -u, --use-container | 関数がネイティブにコンパイルされた依存関係を持つパッケージに依存する場合、このフラグを使用してLambdaに似たDockerコンテナ内で関数を構築します。 |
| -m, --manifest PATH | デフォルトの依存関係マニフェストの代わりに使用するカスタム依存関係マニフェスト (例:`package.json`) へのパス。 |
| -t, --template PATH | SAM テンプレートファイル [デフォルト: template.[yaml / yml]]。 |
| --parameter-overrides | 省略可能。キーと値のペアとしてエンコードされた、AWS CloudFormation パラメータオーバーライドを含む文字列。AWS CLI と同じ形式を使用します — 例:「ParameterKey=KeyPairName、ParameterValue=MyKey ParameterKey=InstanceType、ParameterValue=t1.micro」。 |
| --skip-pull-image | コマンドがLambdaランタイムの最新のDockerイメージのプルダウンをスキップするかどうかを指定します。 |
| --docker-network TEXT | Lambda Dockerコンテナに接続する既存のDockerネットワークの名前またはIDを、デフォルトのブリッジネットワークとともに指定します。指定しない場合、Lambdaコンテナはデフォルトのブリッジ Docker ネットワークにのみ接続します。 |
| --profile TEXT | 認証情報ファイルから特定のプロファイルを選択して、AWS認証情報を取得します。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など)を設定します。

#### sam local invoke
ローカル Lambda 関数を一度呼び出し、呼び出しが完了した後に終了します。
これは、非同期イベント(S3またはKinesisイベントなど)を処理するサーバーレス関数を開発する場合に便利で、テストケースのスクリプトを作成する場合にも便利です。
イベント本体は、stdin(デフォルト)によって、または`--event`パラメータを使用して渡すことができます。ランタイム出力 (ログなど)はstderrに出力され、Lambda関数の結果はstdoutに出力されます。

**構文**

```bash
sam local invoke [OPTIONS] [FUNCTION_IDENTIFIER]
```

**オプション**

| Option | Description |
| :-- | :-- |
| -e, --event PATH | 呼び出されたときにLambda関数に渡されるイベントデータを含むJSONファイル。このオプションを指定しない場合、イベントは想定されません。stdinからJSONを入力するには、値「-」を渡す必要があります。 |
| --no-event | 空のイベントを使用して関数を呼び出します。 |
| -t, --template PATH | SAM テンプレートファイル [デフォルト: template.[yaml / yml]]。|
| -n, --env-vars PATH | Lambda関数の環境変数の値を含むJSONファイル。環境変数ファイルの詳細については、「[環境変数ファイル](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-using-invoke.html#serverless-sam-cli-using-invoke-environment-file)」を参照してください。 |
| --parameter-overrides | 省略可能。キーと値のペアとしてエンコードされたCloudFormation パラメータオーバーライドを含む文字列。AWS CLIと同じ形式を使用します — 例: 「ParameterKey=KeyPairName, ParameterValue=MyKey ParameterKey=InstanceType,ParameterValue=t1.micro」。 |
| -d, --debug-port TEXT | 指定すると、Lambda関数コンテナをデバッグモードで起動し、このポートをローカルホストに公開します。 |
| --debugger-path TEXT | Lambdaコンテナにマウントされるデバッガーへのホストパス。 |
| --debug-args TEXT | デバッガーに渡される追加の引数。 |
| -v, --docker-volume-basedir TEXT | SAMファイルが存在するベースディレクトリの場所。Dockerがリモートマシンで実行されている場合は、Dockerマシン上に AWS SAMファイルが存在するパスをマウントし、この値をリモートマシンと一致するように変更する必要があります。 |
| --docker-network TEXT | Lambda Dockerコンテナが接続する必要のある既存のDockerネットワークの名前またはID、およびデフォルトのブリッジネットワークです。これを指定しない場合、LambdaコンテナはデフォルトのブリッジDockerネットワークにのみ接続します。 |
| -l, --log-file TEXT | ランタイムログを送信するログファイル。 |
| --layer-cache-basedir DIRECTORY | テンプレートで使用するレイヤーがダウンロードされる場所 basedirを指定します。 |
| --skip-pull-image | CLIがLambdaランタイムの最新のDockerイメージのプルダウンをスキップするかどうかを指定します。 |
| --force-image-build | CLIがレイヤーを使用して関数を呼び出すために使用されるイメージを再構築するかどうかを指定します。 |
| --profile TEXT | 使用するAWS認証情報プロファイル。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など)を設定します。 |

#### sam local generate-event
S3、API Gateway、SNS などのさまざまなイベントソースからサンプルペイロードを生成します。
これらのペイロードには、イベントソースがLambda関数に送信する情報が含まれています。

**構文**

```bash
sam local generate-event COMMAND [ARGS]...
```

COMMANDに指定できるものは以下の通りです。

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

#### sam local start-lambda
AWS CLIまたはSDKを使用して、プログラムでLambda関数をローカルで呼び出すことができます。
このコマンドは、Lambdaをエミュレートするローカルエンドポイントを起動します。
このローカルLambdaエンドポイントに対して自動テストを実行できます。
AWS CLIまたはSDKを使用してこのエンドポイントに呼び出しを送信すると、リクエストで指定された Lambda関数がローカルで実行されます。

**構文**

```bash
sam local start-lambda [OPTIONS]
```

**オプション**

| Option | Description |
| :-- | :-- |
| --host TEXT | バインド先のローカルホスト名または IPアドレス(デフォルト:「127.0.0.1」)。 |
| -p, --port INTEGER | リッスンするローカルポート番号(デフォルト:「3001」)。 |
| -t, --template PATH | SAMテンプレートファイル [デフォルト: template.[yaml / yml]]。 |
| -n, --env-vars PATH | Lambda関数の環境変数の値を含むJSONファイル。 |
| --parameter-overrides | 省略可能。キーと値のペアとしてエンコードされたCloudFormation パラメータオーバーライドを含む文字列。AWS CLIと同じ形式を使用します — 例: 「ParameterKey=KeyPairName、ParameterValue=MyKey ParameterKey=InstanceType、ParameterValue=t1.micro」。 |
| -d, --debug-port TEXT | 指定すると、Lambda関数コンテナをデバッグモードで起動し、このポートをローカルホストに公開します。 |
| --debugger-path TEXT | Lambdaコンテナにマウントされるデバッガーへのホストパス。 |
| --debug-args TEXT | デバッガーに渡される追加の引数。 |
| -v, --docker-volume-basedir TEXT | SAMファイルが存在するベースディレクトリの場所。Dockerがリモートマシンで実行されている場合は、Dockerマシン上にSAMファイルが存在するパスをマウントし、この値をリモートマシンと一致するように変更する必要があります。 |
| --docker-network TEXT | Lambda Dockerコンテナが接続する必要のある既存のDockerネットワークの名前またはID、およびデフォルトのブリッジネットワークです。これを指定しない場合、LambdaコンテナはデフォルトのブリッジDockerネットワークにのみ接続します。 |
| -l, --log-file TEXT | ランタイムログを送信するログファイル。 |
| --layer-cache-basedir DIRECTORY | テンプレートが使用するレイヤーがダウンロードされる場所basedirを指定します。 |
| --skip-pull-image | CLIがLambdaランタイムの最新のDockerイメージのプルダウンをスキップするかどうかを指定します。 |
| --force-image-build | CLIがレイヤーを使用して関数を呼び出すために使用されるイメージを再構築するかどうかを指定します。 |
| --profile TEXT | 使用するAWS認証情報プロファイル。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など)を設定します。 | 

#### sam local start-api
サーバーレスアプリケーションをローカルで実行して、開発とテストを迅速に行うことができます。
サーバーレス関数とSAMテンプレートを含むディレクトリでこのコマンドを実行すると、すべての関数をホストするローカルHTTPサーバーが作成されます。
(ブラウザ、CLIなどを介して)アクセスされると、Dockerコンテナをローカルで起動して関数を呼び出します。AWS::Serverless::FunctionリソースのCodeUriプロパティを読み取り、Lambda関数コードを含むファイルシステム内のパスを検索します。これは、Node.jsやPythonなどの解釈された言語用のプロジェクトのルートディレクトリ、またはコンパイルされたアーティファクトやJavaアーカイブ(JAR)ファイルを格納するビルドディレクトリです。
解釈された言語を使用している場合は、すべての呼び出しでローカルの変更をDockerコンテナですぐに使用できます。さらにコンパイルされた言語や複雑なパッキングサポートを必要とするプロジェクトについては、独自のビルドソリューションを実行し、SAMをポイントして、ビルドアーティファクトを含むディレクトリまたはファイルを指定することを推奨しています。

**構文**

```bash
sam local start-api [OPTIONS]
```

**オプション**

| Option | Description |
| :-- | :-- |
| --host TEXT | バインド先のローカルホスト名または IPアドレス(デフォルト:「127.0.0.1」)。 |
| -p, --port INTEGER | リッスンするローカルポート番号(デフォルト:「3000」)。 |
| -s, --static-dir TEXT | このディレクトリにある静的アセット(CSS / JavaScript / HTML など)ファイルは、/ に表示されます。 |
| -t, --template PATH | SAM テンプレートファイル [デフォルト: template.[yaml / yml]]。 |
| -n, --env-vars PATH | Lambda関数の環境変数の値を含むJSONファイル。 |
| --parameter-overrides | 省略可能。キーと値のペアとしてエンコードされたCloudFormation パラメータオーバーライドを含む文字列。AWS CLIと同じ形式を使用します — 例: 「ParameterKey=KeyPairName、ParameterValue=MyKey ParameterKey=InstanceType、ParameterValue=t1.micro」。 |
| -d, --debug-port TEXT | 指定すると、Lambda関数コンテナをデバッグモードで起動し、このポートをローカルホストに公開します。 |
| --debugger-path TEXT | Lambdaコンテナにマウントされるデバッガーへのホストパス。 |
| --debug-args TEXT | デバッガーに渡される追加の引数。 |
| -v, --docker-volume-basedir TEXT | SAMファイルが存在するベースディレクトリの場所。Dockerがリモートマシンで実行されている場合は、Dockerマシン上にSAMファイルが存在するパスをマウントし、この値をリモートマシンと一致するように変更する必要があります。 |
| --docker-network TEXT | Lambda Dockerコンテナが接続する必要のある既存のDockerネットワークの名前またはID、およびデフォルトのブリッジネットワークです。これを指定しない場合、LambdaコンテナはデフォルトのブリッジDockerネットワークにのみ接続します。 |
| -l, --log-file TEXT | ランタイムログを送信するログファイル。 |
| --layer-cache-basedir DIRECTORY | テンプレートが使用するレイヤーがダウンロードされる場所basedirを指定します。 |
| --skip-pull-image | CLIがLambdaランタイムの最新のDockerイメージのプルダウンをスキップするかどうかを指定します。 |
| --force-image-build | CLIがレイヤーを使用して関数を呼び出すために使用されるイメージを再構築するかどうかを指定します。 |
| --profile TEXT | 使用するAWS認証情報プロファイル。 |
| --region TEXT | サービスのAWS リージョン(`us-east-1`など)を設定します。 | 

#### sam validate
SAMテンプレートを検証します。

**構文**

```bash
sam validate [OPTIONS]
```

**オプション**

| Option | Description |
| :-- | :-- |
| -t, --template PATH | SAMテンプレートファイル [デフォルト: template.[yaml / yml]]。 |
| --profile TEXT | 認証情報ファイルから特定のプロファイルを選択して、AWS認証情報を取得します。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など)を設定します。 |

### デプロイ
#### sam deploy
SAMアプリケーションをデプロイします。
ガイド付きインタラクティブモード（--guidedパラメータを指定することで有効にできる）では、デプロイに必要なパラメータが順番に示され、デフォルトのオプションが提供され、これらのオプションがプロジェクトフォルダの設定ファイルに保存されます。
`sam deploy`を実行するだけで、アプリケーションの後続のデプロイを実行でき、必要なパラメータが SAM CLI設定ファイルから取得されます。
CloudFormationを使用してLambda関数をデプロイするには、Lambdaデプロイパッケージ用のS3バケットが必要です。SAM CLIは、このS3バケットを作成して管理します。

**構文**

```bash
sam deploy [OPTIONS] [ARGS]...
```

**オプション**

| Option | Description |
| :-- | :-- |
| -g, --guided | このフラグを指定して、SAMでガイド付きプロンプトを使用してデプロイをガイドできるようにします。このパラメータの指定時に、必要に応じて保存される設定の詳細については、「[SAM CLI設定](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html)」を参照してください。 |
| --template-file PATH | SAM テンプレートが配置されているパス。デフォルト: template.[yaml / yml]。 |
| --stack-name TEXT | デプロイ先のCloudFormation スタックの名前。既存のスタックを指定すると、コマンドはスタックを更新します。新しいスタックを指定すると、コマンドはスタックを作成します。必須。 |
| --s3-bucket TEXT | テンプレートで参照されるアーティファクトがある S3バケットの名前。これは、51,200バイトを超えるサイズのテンプレートをデプロイする場合に必要です。 |
| --s3-prefix TEXT | S3バケットにアップロードされるアーティファクト名に追加されたプレフィックス。プレフィックス名は、S3バケットのパス名 (フォルダ名) です。 |
| --capabilities LIST | CloudFormationが特定のスタックを作成できるように指定する必要がある機能の一覧。一部のスタックテンプレートには、新しいIAMユーザーを作成する場合などで、AWSアカウントのアクセス権限に影響を与える可能性のあるリソースが含まれている場合があります。このようなスタックの場合は、このパラメータを指定して、それらの機能を明示的に認識する必要があります。有効な値は、CAPABILITY_IAMとCAPABILITY_NAMED_IAMのみです。IAMリソースがある場合、どちらの機能でも指定できます。カスタム名を持つIAMリソースがある場合は、CAPABILITY_NAMED_IAMを指定する必要があります。このパラメータを指定しない場合、このアクションはInsufficientCapabilitiesエラーを返します。 |
| --region TEXT | デプロイ先の AWS リージョン(`us-east-1`など)。 |
| --profile TEXT | 認証情報ファイルから特定のプロファイルを選択して、AWS認証情報を取得します。 |
| --kms-key-id TEXT | S3バケットに保存されているアーティファクトを暗号化するために使用される AWS KMSキーのID。 |
| --force-upload | S3バケット内の既存のファイルを上書きします。S3バケット内の既存のアーティファクトと一致する場合でも、アーティファクトをアップロードするには、このフラグを指定します。 |
| --no-execute-changeset | 変更セットを実行するかどうかを示します。変更セットを実行する前にスタックの変更を表示する場合は、このフラグを指定します。このコマンドは、CloudFormation変更セットを作成し、変更セットを実行せずに終了します。変更セットを実行する場合は、このフラグを指定せずに同じコマンドを実行することで、スタックの変更を行うことができます。 |
| --role-arn TEXT | 変更セットの実行時にCloudFormationが引き受けるIAMロールのAmazon リソースネーム (ARN)。 |
| --fail-on-empty-changeset / --no-fail-on-empty-changeset | スタックに変更を加えていない場合に0以外の終了コードを返すかどうかを指定します。デフォルトの動作では、ゼロ以外の終了コードが返されます。 |
| --confirm-changeset | 計算された変更セットをデプロイする前に確認を求めます。 |
| --use-json | CloudFormationテンプレートのJSONを出力します。デフォルトでYAMLが使用されます。 |
| --metadata | テンプレートで参照されているすべてのアーティファクトに添付するメタデータのマップ。省略可能。 |
| --notification-arns LIST | CloudFormationがスタックに関連付けるSNSトピックAmazon リソースネーム (ARN)。 |
| --tags | 作成または更新されたスタックに関連付けるタグの一覧。CloudFormationでは、リソースがスタックをサポートしている場合、これらのタグをスタックのリソースにも伝達します。 |
| --parameter-overrides | key=value のペアとしてエンコードされたCloudFormationパラメータオーバーライドを含む文字列。AWS CLIと同じ形式を使用します。たとえば、ParameterKey=KeyPairName, ParameterValue=MyKey ParameterKey=InstanceTy pe,ParameterValue=t1.microと指定します。 |

#### sam package
SAMアプリケーションをパッケージします。
コードと依存関係のZIPファイルを作成し、S3にアップロードを行います。
次に、SAMテンプレートのコピーを返し、ローカルのアーティファクトへの参照を、コマンドがアーティファクトをアップロードしたS3の場所に置き換えます。
`sam deploy`を実行する場合は、暗黙的に`sam package`が呼びだされます。

**構文**

```bash
sam package [OPTIONS] [ARGS]...
```

**オプション**

| Option | Description |
| :-- | :-- |
| --template-file PATH | SAM テンプレートが置かれているパス。デフォルト: template.[yaml / yml]。 |
| --s3-bucket TEXT | このコマンドがテンプレートで参照されるアーティファクトをアップロードするS3バケットの名前。必須。 |
| --s3-prefix TEXT | S3バケットにアップロードされるアーティファクト名に追加されたプレフィックス。プレフィックス名は、S3バケットのパス名 (フォルダ名) です。 |
| --kms-key-id TEXT | S3バケットに保管されているアーティファクトを暗号化するために使用される AWS KMSキーのID。 |
| --output-template-file PATH | コマンドがパッケージ化されたテンプレートを書き込むファイルへのパス。パスを指定しない場合、コマンドはテンプレートを標準出力に書き込みます。 |
| --use-json | CloudFormationテンプレートのJSONを出力します。デフォルトでは、YAMLが使用されます。 |
| --force-upload | S3バケット内の既存のファイルを上書きします。S3バケット内の既存のアーティファクトと一致する場合でも、アーティファクトをアップロードするには、このフラグを指定します。 |
| --metadata | テンプレートで参照されているすべてのアーティファクトにアタッチするメタデータのマップ。省略可能。 |
| --profile TEXT | 認証情報ファイルから特定のプロファイルを選択して、AWS認証情報を取得します。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など)を設定します。 |

#### sam publish
SAMアプリケーションServerless Application Repositoryに公開します。
このコマンドは、パッケージ化されたSAMテンプレートを受け取り、指定されたリージョンにアプリケーションの公開を行います。
このコマンドは、SAMテンプレートに、公開に必要なアプリケーションメタデータを含むMetadataが含まれていることを想定してます。さらに、これらのプロパティには、LicenseUrlおよびReadmeUrlの値のS3バケットへのリファレンスを含め、ローカルファイルへのリファレンスは含まれていない必要があります。
SAMテンプレートのMetadataセクションの詳細については、「[AWS SAM CLI を使用してサーバーレスアプリケーションを公開する](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html)」を参照してください。

**構文**

```bash
sam publish [OPTIONS]
```

**オプション**

| Option | Description |
| :-- | :-- |
| -t, --template PATH | SAM テンプレートファイル [デフォルト: template.[yaml / yml]]。 |
| --semantic-version TEXT | 省略可能。このパラメータによって提供されるアプリケーションのセマンティックバージョンは、テンプレートファイルのMetadataセクションのSemanticVersionをオーバーライドします。
| --profile TEXT | 認証情報ファイルから特定のプロファイルを選択して、AWS認証情報を取得します。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など) を設定します。 |

### その他
#### sam logs
Lambda関数によって生成されたログを取得します。
関数がCloudFormationスタックの一部である場合、スタック名を指定するときに、関数の論理IDを使用してログを取得することができます。

**構文**

```bash
sam logs [OPTIONS]
```

**オプション**

| Option | Description |
| :-- | :-- |
| -n、--name TEXT | Lambda関数の名前。この関数がCloudFormationスタックの一部である場合、CloudFormation/SAMテンプレート内の関数リソースの論理IDになります。[必須] |
| --stack-name TEXT | 関数が一部であるCloudFormation スタックの名前。 |
| --filter TEXT | 式を指定して、ログイベントの用語、フレーズ、または値に一致するログをすばやく検索できます。これは、単純なキーワード (「error」など) またはCloudWatch Logsでサポートされるパターンです。構文については、「CloudWatch Logsのドキュメント」を参照してください。 |
| -s、--start-time TEXT | この時刻からログを取得します。時刻には、「5分前」、「昨日」などの相対的な値、または「2018-01-01 10:10:10」のような形式のタイムスタンプを指定できます。デフォルトは「10分前」です。 |
| -e、--end-time TEXT | この時刻までのログを取得します。時刻には、「5分前」、「明日」などの相対的な値、または「2018-01-01 10:10:10」のような形式のタイムスタンプを指定できます。 |
| -t、--tail | ログ出力の末尾を表示します。これにより、終了時間引数は無視され、ログが使用可能になった時点で引き続き取得されます。 |
| --profile TEXT | 認証情報ファイルから特定のプロファイルを選択して、AWS認証情報を取得します。 |
| --region TEXT | サービスのAWSリージョン(`us-east-1`など)を設定します。 |

## その他の便利な機能

### 線形デプロイとカナリアリリース

```yaml:例
Resources:
  DemoFunction:
    Type: AWS::Serverless::Function
    Properties:
      AutoPublishAlias: live
      DeploymentPreference:
        Type: Linear10PercentEvery1Minute
```

DeploymentPreferenceのTypeに指定可能なのは以下の文字列で、それぞれデプロイ戦略を指定することができます。

- Linear10PercentEvery1Minute
- Linear10PercentEvery2Minute
- Linear10PercentEvery3Minute
- Linear10PercentEvery10Minute
- Canary10Percent5Minutes
- Canary10Percent10Minutes
- Canary10Percent15Minutes
- Canary10Percent30Minutes
- AllAtOnce

#### Linear10PercentEvery*Minute
Lambda関数の実行のうち、10%を最新のバージョンで実行し、*分毎に10%ずつ最新のバージョンで実行される範囲を増加していく方式です。

#### Canary10Percent*Minutes
Lambda関数の実行のうち、10%は最新のバージョンで実行し、*分後にすべてが最新のバージョンで実行されるようにする方式です。

#### AllAtOnce
すべてのLambda関数の実行を最新のバージョンで行う方式です。

# まとめ
今回は、機能の説明や、コマンドラインのリファレンスなどまでとします。
~~実際にコマンドを使ってのサンプルの解説は、別の投稿にてまとめたいと思います。~~
実践編は「[[AWS] Serverless Application Model (SAM) でAPI Gateway + Lambda + DynamoDBなサンプルを作成してみる](https://qiita.com/herohit-tool/items/5b0fe520f6f28fb5b4bc)」を参照ください。