AWS SAM

AWS のサーバーレスアプリケーションを定義・デプロイするためのフレームワーク

AWSサーバーレス

SAM とは

AWS SAM (Serverless Application Model) は、Lambda、API Gateway、DynamoDB などのサーバーレスリソースを簡潔な YAML で定義し、デプロイするフレームワークである。CloudFormation の拡張で、サーバーレスに特化した省略記法を提供する。

CloudFormation との比較

# CloudFormation: 50行以上
# SAM: 10行で同等の定義
MyFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    Runtime: nodejs22.x
    Events:
      Api:
        Type: Api
        Properties:
          Path: /users/{id}
          Method: GET
    Policies:
      - DynamoDBCrudPolicy:
          TableName: !Ref UsersTable

SAM は AWS::Serverless::Function を CloudFormation の AWS::Lambda::Function + AWS::IAM::Role + AWS::ApiGateway::* に自動展開する。

SAM リソースタイプ

タイプ 説明
AWS::Serverless::Function Lambda 関数
AWS::Serverless::Api API Gateway (REST)
AWS::Serverless::HttpApi API Gateway (HTTP API)
AWS::Serverless::SimpleTable DynamoDB テーブル
AWS::Serverless::LayerVersion Lambda Layer

コマンド

sam init          # プロジェクトの初期化
sam build         # ビルド
sam local invoke  # ローカルで Lambda を実行
sam local start-api  # ローカルで API Gateway を起動
sam deploy        # デプロイ
sam logs -t       # ログのテール
sam delete        # スタックの削除

ローカル開発

# Lambda をローカルで実行
sam local invoke MyFunction --event event.json

# API Gateway をローカルで起動
sam local start-api
# → http://localhost:3000 でテスト

ポリシーテンプレート

Policies:
  - DynamoDBCrudPolicy:
      TableName: !Ref UsersTable
  - S3ReadPolicy:
      BucketName: !Ref DataBucket
  - SQSSendMessagePolicy:
      QueueName: !GetAtt OrderQueue.QueueName

最小権限の IAM ポリシーを 1 行で定義できる。

Terraform との使い分け

ケース 推奨
Lambda + API Gateway SAM
VPC + RDS + ECS Terraform
サーバーレス + 一部 EC2 SAM + CloudFormation
マルチクラウド Terraform

AWS SAM の理解を深めるには関連書籍が参考になる。

関連用語