aws-vaultを使ってAWS SAMのデプロイを行ってみる

# はじめに
AWSのSAMを使うとlambda関数の開発がかなり楽になることを知りました。
本記事ではそんなsamのインストールからデモアプリのデプロイまでをまとめてみました。

# AWS SAMとは
SAMとは(Serverless Application Model)の略です。AWSのサーバーレスサービス、Lambdaの関数をローカルで開発する際に非常に便利なサービスとなっています。

## SAMを用いるメリット
SAMを用いてLambda関数を開発すると以下のような利点があります。
- ローカルのエディタを用いてLambda関数のコーディングが可能
- ローカル上でLambda関数に似た実行環境を用意できるためテストが簡単
- pythonのパッケージを用いる場合zipファイルなどにまとめレイヤー分けをする必要がなくなる

# 使ってみる
## 準備
### 前提
本記事はarm系cpuの搭載されたmacOSでまとめています。
```terminal
$ sw_vers
ProductName:	macOS
ProductVersion:	12.5
$ uname -m
arm64
```
本記事では以下のコマンドは使える前提となっていますので、未インストールの場合はインストールを行うことを推奨します。
- `brew`
- `Docker`
- `python3` <- 本記事ではpythonですが、好きな言語を使ってください

本記事執筆時には以下のようなバージョンを使っています。
```terminal
$ brew -v
Homebrew 3.5.9
$ Docker -v
Docker version 20.10.17, build 100c701
$ python3 -V
Python 3.10.6
```

### SAM CLIインストール
基本的には[aws公式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html)の手順を追ってインストールを行います。[windows](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-windows.html)のインストール方法も公式にあるのでwindowsを使っている方はそちらを参考にしてください。
```terminal
$ brew tap aws/tap
$ brew install aws-sam-cli
```
インストールが完了したら、以下のコマンドでsamコマンドが入っているかを確認します。
```terminal
$ sam --version
SAM CLI, version 1.55.0
```


### 認証設定
普段、aws-vaultを使っているのでその設定を行います。
aws-vaultを使わない認証方法については[公式ドキュメント](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started-set-up-credentials.html)に記載があります。

また、aws-vaultのインストールや設定については[別の記事](https://qiita.com/abemaru/items/9395dc75a7a74c94fc11)で紹介しているのでそちらを参照ください。

`.aws`配下の`config`ファイルを以下のように編集します。
```~/.aws/config
[default]
region = ap-northeast-1
credential_process = aws-vault exec --json default

[profile <profile_name>]
role_arn=arn:aws:iam::<account_id>:role/<role_name>
role_session_name=<iam_user_name>
mfa_serial=arn:aws:iam::<account_id>:mfa/<iam_user_name>
region=ap-northeast-1
```
不安な方は以下のコマンドでs3バケットのリストが返ることを確認してください。
```terminal
$ aws-vault exec <profile_name> -- aws s3 ls
```
:::note warn
aws-vaultを通して実行されるコマンドで権限が足りない場合は、iam_userではなく、roleに権限を付与してください。
:::


## デプロイしてみる
任意のディレクトリで以下のコマンドをうち、初期化を行います。今回はデモとして以下ような設定で初期化しました。
```terminal
$ sam init
 ...
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

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: y
X-Ray will incur an additional cost. View https://aws.amazon.com/xray/pricing/ for more details

Project name [sam-app]:
```
上記が成功したら、`sam-app`ディレクトリの中でビルドし、実際にデプロイしてみましょう。
```terminal
$ cd sam-app
$ sam build
```
ビルドが正常に行われたら、デプロイをやってみます。今回はテストなのですべてyesを選んでデプロイしてみます。
```terminal
$ aws-vault exec {profile名} -- sam deploy --guided
　...
	Stack Name [sam-app]:
	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
	#Preserves the state of previously provisioned resources when an operation fails
	Disable rollback [Y/n]: Y
	HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
	Save arguments to configuration file [Y/n]: Y
	SAM configuration file [samconfig.toml]:
	SAM configuration environment [default]:
```
最後に`Successfully created/updated stack - sam-app in ap-northeast-1`と返ってくればデプロイ成功です。

:::note warn
初期の権限ではデプロイができない可能性があるので、Role関係のエラーが出た場合は足りない権限をiam_userではなく、ロールに付与してください。
:::

最後にawsコンソールでsam-appがあることを確認もできます。
![スクリーンショット 2022-08-20 0.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326068/a8e5723a-4e1d-f2c8-1513-6c9bc9fe3c13.png)

# 参考
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html
- https://qiita.com/keisuke1223/items/1b2f40b8612bd9404dc4