AWS SAM: 役割と機能をざっくりまとめてみた

こんにちは！Xyeerです
今日は、SAMの役割と機能について説明します。

## 経緯
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749163/d52c05cc-4442-a7af-270d-dea05d3673fc.png)

現在、上記のようなシステムを使っています。
Lambdaには、[Amazon Elastic Container Registry](https://aws.amazon.com/jp/ecr/)経由でアップロードしています。

**問題点**
・Lambdaにアップロードするまで、システムが問題なく動くかわからない。
・何度もソースコード修正するのに、毎回アップロードして確認するのが手間である。
### →ローカル環境で、Lambdaを使えるようにしたい

そんな思いで色々と調べていたら、サーバレスアプリケーションを簡単に定義、デプロイ、管理できるフレームワークであるSAMに出会いました。

## そもそも AWS SAMって何？
イベント駆動型のサーバレスアプリケーション(ex.Lambda,API Gateway,S3)のデプロイに特化しているツールキット

### 使い方
・**SAMテンプレート**(YAMLもしくはJSON形式)で、インフラストラクチャを定義
・**AWSCLI**で、サーバーレスアプリケーションを構築して実行 

### 特徴
・[AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)より、**シンプルに記述できる**
・開発とクラウドテストのワークフローを**高速化**

## AWS SAM CLIって何？
ローカル環境で、Lambda,APIのエンドポイントを叩き、実行することができるユーザインターフェース

:::note warn
注意
Dockerコンテナを利用するため、事前にDockerのインストールが必要
:::

### SAM CLIで使うコマンド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749163/b1bdd276-6afe-644a-5166-cd7a8d4b739e.png)
↑実際に自分が使用しているSAMのワークフロー

**1.雛形の作成**(--runtimeで言語を指定)
```
sam init
```

**2.SAM テンプレートの検証**(文法に問題があれば、エラーが出る）
```
sam validate
```

**3.Lambda 関数のbuild**(--use-containerで、Lambdaの動作環境と同等のコンテナでbuild)
```
sam build
```

**4.Lambda関数のローカル実行**(-eventで、入力として渡すJSONファイル名を指定)
```
sam local invoke
```

**5.テスト用イベントの生成**(Lambda関数の入力に使うテストJSONをサービスごとに出力)
```
sam local generate-event
```

**6.ローカルエンドポイントの作成**(Lambda関数を実行するエンドポイントを立ち上げる)
→外部ツールと連携してテストしたい時などに利用可能
```
sam local start-lambda
```

**7.API エンドポイントの作成**(API Gatewayをイベントソースにして起動するLambda関数を試すことができる / SAMテンプレートをもとに、関数へアクセスするパスが生成)
```
sam local start-api
```

**8.デプロイ**(CloudFormationへデプロイする)
```
sam deploy
```

そのほかのコマンドに関しては、[AmazonBlackBelt](https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-serverless-application-model-2019/)の資料をご覧ください


## SAMテンプレートの書き方
ここでは、どのような構成でテンプレートが書かれているかをざっくり説明します。

**・ヘッダー(SAMテンプレートのVersion,デプロイする中身の説明を記載）**
**・リソース(実際にデプロイするリソースの配置や詳細を定義）**

### リソースのタイプ
**1.AWS::Serverless::Function**
・Lambda関数をデプロイすると同時に、Lambdaを起動するイベントの設定
→イベントの発生源となるリソースも同時にデプロイ

**2.AWS::Serverless::Api**
・API Gatewayをデプロイ
→より詳細なAPI Gatewayの設定

**3.AWS::Serverless::SimpleTable**
・DynamoDBのテーブルをデプロイ

**4.AWS::Serverless::LayerVersion**
・Lambdaレイヤーのデプロイ

**5.AWS::Serverless::Application**
・Serverless Application RepositoryのアプリケーションやSAMテンプレートから、アプリケーションをデプロイ

それぞれのリソースのプロパティに関しては、[AmazonBlackBelt](https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-serverless-application-model-2019/)の資料をご覧ください

## 最後に
最後まで見ていただきありがとうございました！
SAMはどういったサービスなのか、 SAMテンプレートの中身がどういった内容なのかをなんとなくでも理解していただけたら幸いです。この記事を見た後に、AmazonBlackBeltを見ていただけるとより理解が深まると思います。

## 参考文献
[1] [AWS Black Belt Online Seminar(AWS SAM)](https://www.slideshare.net/slideshow/20190814-aws-black-belt-online-seminar-aws-serverless-application-model-165314501/165314501)

[2] [AWS Serverless Application Model （AWS SAM) とは](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html)

[3] [AWS SAM (Serverless Application Model) の始め方](https://zenn.dev/k_tana/articles/2023-08_how-to-use-of-aws-sam)

[4][AWS CloudFormation の概要](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)