AWS SAM

# AWS Serverless Application Model (AWS SAM)

https://d1.awsstatic.com/webinars/jp/pdf/services/20190814_AWS-Blackbelt_SAM_rev.pdf

## AWS SAM とは

サーバレスをとりまく主なコンポーネントは以下のものがある

 

  • SAM
    • イベント駆動の性質を持つサーバレスアプリケーションのデプロイに特化した、CloudFormation拡張機能
    • CloudFormation と同一の内容を書いたとしても簡潔に記述できる
    • CloudFormation にデプロイする際にCloudFormation の文法に変換される
    • 動作としてはTransformというマクロがCloudFormation に実装してあり、この変換方式を選択することでCloudFormation の文法に変換される
    • なのでCloudFormation の記述と共存できる

 

## SAMの機能と文法

  • ヘッダー
    • AWSTemplateFormatVersion
    • Transform
    • Description
  • リソース
    • AWS::Serverless::Function
      • Lambda をデプロイ
      • Lambda の実装や設定値と起動するイベントを設定
      • AutoPublishAlias プロパティ
        • Lambda関数にデプロイする内容が変化すると、新しいバージョンを発行して、設定したエイリアスを最新版に更新してくれる
      • DeploymentPreference プロパティ
        • CodeDeploy と連携し、カナリアリリースが可能
          • 徐々に新しいバージョンに変更
          • 最初に数パーセントのトラフィックを最新版に流し、数分後に全てを新しいバージョンに流す
      • 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の中で行われる
  • グローバルセクション
    • 各リソースタイプに適用するプロパティのデフォルト値を定義することができる

 

## AWS SAM CLI

  • 開発者のローカル環境でLambda APIのエンドポイントを起動し、実行をテストすることができる(Dockerを利用)
  • SAMのアプリケーションの雛形を作成できる
  • Validation もできる
  • ビルド、パッケージング、デプロイができる

 

## SAMのベストプラクティス

  • ライフサイクルが同じものは同じテンプレートにまとめる
  • Lambdaとその呼び出し元のリソースは同じテンプレートにまとめる
  • Dev/Test/Prod といった環境はスタックで分離する
    • SAMでは複数のAPI Gatewayステージを利用することはできない
    • テンプレートは共通化しておき、パラメータで環境を切り替える
  • カナリアリリースを活用する
  • 汎用的な部分はServerless Application Repository を利用する

 

## 雑感

SAM CloudFormation の拡張ということは知っていたが、これはCloudFormation のマクロを利用したものだということは初耳だった。

競合するツールとして

serverless.com

があるが、現状だとServerless Framework の方が事例が多かったり、癖が少なかったりするみたい。

Hello world 自体はすでにしていて雰囲気は知っているが、パラメータが多いのでこれについては必要になった時に見ていくという感じでいいか。