AWS SAM アプリケーションをデプロイする

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

AWS SAM (Serverless Application Model) は、AWS 上にサーバーレスアプリケーションを構築するためのオープンソースフレームワークで、CloudFormation のパッケージを簡単に作成、デプロイできるようにしたものです。

v0.33.1 でインタラクティブモード(`deploy --guided`)が実装され、サーバーレスアプリケーションの配布・デプロイが劇的にシンプルになったと思います。

## セットアップ

Docker, AWS CLI, AWS SAM CLI をインストールする必要があります。

### Docker

[Docker](https://www.docker.com/) をインストールします。

### AWS CLI

AWS アカウントを持っていればインストール済みだと思いますが一応。[AWS CLI](https://aws.amazon.com/jp/cli/) をインストールし、認証情報を設定しておきます。

例) brew を使ってインストールする場合 (macOS でシステムの Python を使用している場合)

```shell
$ brew install awscli
```

例) pip を使ってインストールする場合 (個別にインストールした Python を使用している場合)

```shell
$ pip install awscli
```

AWS 認証情報を設定する。

```shell
$ aws configure
```

### AWS SAM CLI

[AWS SAM CLI](https://aws.amazon.com/jp/serverless/sam/) をインストールします。

例) brew を使ってインストールする場合 (macOS でシステムの Python を使用している場合)

```shell
$ brew tap aws/tap
$ brew install aws-sam-cli
```

例) pip を使ってインストールする場合 (個別にインストールした Python を使用している場合)

```shell
$ pip install aws-sam-cli
```

## 開発

ここでは触れません。

## デプロイ

AWS SAM で構築されたアプリをデプロイする方法です。

### ビルド

```shell
$ sam build --use-container
```

`--use-container` を指定することで、必要なランタイム(Python, Node.jsなど)のイメージをダウンロードしてコンテナ上でビルドがおこなわれます。Docker が起動している必要がありますが、ローカルPCにそれらの開発環境がインストールされている必要はありません。`--use-container` を指定しない場合は、ローカルPCのランタイムを使ってビルドします。

ビルド結果は .aws-sam ディレクトリ配下に出力されます。

### デプロイ

初回は `--guided` オプションをつけて実行し、デプロイに必要な設定(スタック名、アプリのパラメタなど)を入力します。
ここで入力した設定は samconfig.toml に保存され、そのファイルを残しておけば次回以降は `sam deploy` だけで更新できます。

```shell
$ sam deploy --guided

        Looking for samconfig.toml :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: FooApp
        AWS Region [us-east-1]: ap-northeast-1
        Parameter Param1 []: hoge
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]:
        #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]:
        Save arguments to samconfig.toml [Y/n]:
```

- Stack Name : デプロイする CloudFormation のスタック名です。すでに存在する名前を指定すると上書きになってしまうので注意。
- AWS Region : デプロイ先リージョン。日本人なら黙って `ap-northeast-1`。
- Parameter : アプリケーション固有の設定です。
- Confirm changes before deploy : 実際にデプロイを実行する前に確認が求められます。
- Allow SAM CLI IAM role creation : デプロイで IAM ロールを作成できるようにします。有効にした場合、デプロイしようとしているアプリが不要な権限まで要求していないか注意しましょう。
- Save arguments to samconfig.toml : 入力した設定を samconfig.toml に保存します。

samconfig.toml は以下のようなフォーマットになっています。`sam deploy --guided` を再実行して作り直すこともできますが、設定を変えたい場合はこちらを直接編集すれば良いでしょう。

```
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "FooApp"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-XXXXXXXXXXXXX"
s3_prefix = "FooApp"
region = "ap-northeast-1"
confirm_changeset = false
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Param1=\"hoge\""
```

デプロイすると、CloudFormation 用の S3 バケット(aws-sam-cli-managed-default-samclisourcebucket-XXXXXXXXXXXXX という名前)が自動で作成され、パッケージをアップロードし、CloudFormation スタックが作成され、アプリを動作するのに必要なリソースが作成されます。

### 削除

アプリを削除する場合は、CloudFormation スタックを削除することで、作成されたリソースがすべて削除されます。(CloudFormation 用の S3 バケットは SAM の管理用なので残ります。)

AWS CLI の例)

```shell
aws cloudformation delete-stack --stack-name FooApp
```