AWS SAM
# AWS Serverless Application Model (AWS SAM)
https://d1.awsstatic.com/webinars/jp/pdf/services/20190814_AWS-Blackbelt_SAM_rev.pdf
## AWS SAM とは
サーバレスをとりまく主なコンポーネントは以下のものがある
- API Gateway: REST API
- AWS AppSync: GraphQL
- Amazon Kinesis Data Streams
- Lambda
- DynamoDB; NoSQL
- SQS: Queue
- S3: File
- SAM
- イベント駆動の性質を持つサーバレスアプリケーションのデプロイに特化した、CloudFormationの拡張機能
- CloudFormation と同一の内容を書いたとしても簡潔に記述できる
- CloudFormation にデプロイする際にCloudFormation の文法に変換される
- 動作としてはTransformというマクロがCloudFormation に実装してあり、この変換方式を選択することでCloudFormation の文法に変換される
- なのでCloudFormation の記述と共存できる
## SAMの機能と文法
- ヘッダー
- AWSTemplateFormatVersion
- Transform
- Description
- リソース
- AWS::Serverless::Function
- Lambda をデプロイ
- Lambda の実装や設定値と起動するイベントを設定
- AutoPublishAlias プロパティ
- Lambda関数にデプロイする内容が変化すると、新しいバージョンを発行して、設定したエイリアスを最新版に更新してくれる
- DeploymentPreference プロパティ
- Policies プロパティ
- IAM のポリシーを簡単にせってできるようにプリセットが用意されている
- AWS::Serverless::Api
- API Gateway をデプロイ
- プロパティ
- StageName
- CanarySetting
- DefinitionUri, DefinitionBody
- Swagger やAPIの定義
- Auth
- オーソライザの設定
- これを利用した場合DefinitionUri は利用できない
- AWS::Serverless::SimpleTable
- DynamoDB をデプロイ
- AWS::Serverless::LayerVersion
- Lambda Layer をデプロイ
- AWS::Serverless::Application
- Sererless Application Repository に存在するアプリケーション
- 実際のデプロイはNested Stackの中で行われる
- グローバルセクション
- 各リソースタイプに適用するプロパティのデフォルト値を定義することができる
- 開発者のローカル環境でLambda やAPIのエンドポイントを起動し、実行をテストすることができる(Dockerを利用)
- SAMのアプリケーションの雛形を作成できる
- Validation もできる
- ビルド、パッケージング、デプロイができる
## SAMのベストプラクティス
- ライフサイクルが同じものは同じテンプレートにまとめる
- Lambdaとその呼び出し元のリソースは同じテンプレートにまとめる
- Dev/Test/Prod といった環境はスタックで分離する
- カナリアリリースを活用する
- 汎用的な部分はServerless Application Repository を利用する
## 雑感
SAM はCloudFormation の拡張ということは知っていたが、これはCloudFormation のマクロを利用したものだということは初耳だった。
競合するツールとして
があるが、現状だとServerless Framework の方が事例が多かったり、癖が少なかったりするみたい。
Hello world 自体はすでにしていて雰囲気は知っているが、パラメータが多いのでこれについては必要になった時に見ていくという感じでいいか。