🐙

AWS SAM (Serverless Application Model)について(基本編)

に公開

こんにちは。フクロウラボの真米です。

AWS認定資格を受けた時に AWS SAM を学ぶ機会があったので、備忘録としてまとめておきたいと思います。

AWS SAM(Serverless Application Model)とは

AWS SAMは、サーバレスアプリケーション(Lambda、API Gateway、DynamoDB、S3など)の構築を簡単かつ効率的に行うためのフレームワークです。
SAMの主な役割は以下の2つです。

  1. CloudFormationテンプレートの拡張
    CloudFormationテンプレートをより簡潔に記述できる

  2. SAM CLIを使ったデプロイのサポート
    ローカルでのテストやデプロイを効率的に行える

以下でそれぞれ詳しく見ていきます。

1. CloudFormationテンプレートの拡張(SAM テンプレート)

SAMとCloudFormationでのテンプレートファイルの記述を比べてみます。
以下はLambda関数を定義した例です。

CloudFormationテンプレートでの記述

通常のCloudFormationテンプレートでは、AWSリソースを宣言的に定義しますが、サーバレスアプリケーションの記述は冗長になることが多いです。

AWSTemplateFormatVersion: '2010-09-09'
Description: Sample CloudFormation template for Lambda function with execution role

Parameters:
  Stage:
    Type: String
    Default: staging
    AllowedValues:
      - production
      - staging

Resources:
  MyLambdaExecutionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: arn:aws:logs:*:*:*

  MyLambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: index.handler
      Role: !GetAtt MyLambdaExecutionRole.Arn
      Code:
        S3Bucket: my-bucket
        S3Key: function.zip
      Runtime: python3.12
      MemorySize: 128
      Timeout: 60
      Environment:
        Variables:
          STAGE: !Ref Stage

Outputs:
  MyLambdaFunctionArn:
    Description: 'ARN of the Lambda function'
    Value: !GetAtt MyLambdaFunction.Arn
  MyLambdaExecutionRoleArn:
    Description: 'ARN of the Lambda execution role'
    Value: !GetAtt MyLambdaExecutionRole.Arn

SAMテンプレートでの記述

上記をSAMで記述すると、IAMロールの自動生成やAWS::Serverless::Functionなどを利用できるため、冗長なコードを削減できて、Lambda関数のプロパティを簡潔に記述できます。
AWS::Serverless::Functionを使用することで、自動的に基本的な実行ロールが設定され、必要な部分をSAMが補完してくれます。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample SAM template for Lambda function with execution role

Globals:
  Function:
    Timeout: 60
    MemorySize: 128
    Runtime: python3.12

Parameters:
  Stage:
    Type: String
    Default: staging
    AllowedValues:
      - production
      - staging

Resources:
  MyLambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      CodeUri: s3://my-bucket/function.zip
      Environment:
        Variables:
          STAGE: !Ref Stage
      Policies:
        - AWSLambdaBasicExecutionRole

Outputs:
  MyLambdaFunctionArn:
    Description: 'ARN of the Lambda function'
    Value: !GetAtt MyLambdaFunction.Arn

テンプレートの構造に関しては、AWSの公式ドキュメントにわかりやすくまとめられているので、気になる方はこちらを参照して下さい。
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html

今回設定したLambdaのオプションは以下になります。

オプション 説明
Handler Lambda関数のエントリーポイントを指定
Runtime Lambda関数の実行ランタイム(今回の例ではpython3.12)を指定
CodeUri 関数コードが格納されているS3バケットまたはローカルディレクトリを指定
Policies Lambda関数に関連付けるポリシー(今回の例ではAWSLambdaBasicExecutionRole)を指定
MemorySize メモリの割り当て量を指定(単位: MB)
Timeout タイムアウト時間を指定(単位: 秒)
Environment 環境変数を指定

このようにSAMを使うことで、CloudFormationよりも簡潔にリソースを定義でき、サーバレスアプリケーションの構築をより容易に行うことができます。

2. SAM CLIを使ったデプロイ

SAM CLIは、サーバレスアプリケーションのデプロイやローカルテストを簡単に行うための強力なコマンドラインツールです。
主要なコマンドを以下にまとめました。
SAM CLIは使用前にインストールが必要です。インストール方法は以下に詳しく記載されています。
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html

コマンド 説明 使用例
sam init 新しいSAMアプリケーションの初期化を行います。テンプレートとランタイムを選択し、SAMテンプレートファイルを作成できます。 sam init
sam validate SAMテンプレートを検証し、エラーをチェックします。 sam validate
sam build アプリケーションをビルドし、デプロイ可能な状態に整えます。依存関係のインストールやテンプレートの変換を行います。 sam build
sam local invoke ローカル環境でLambda関数を実行し、指定したイベントデータを使用してテストします。 sam local invoke MyLambdaFunction --event event.json
sam local start-api ローカル環境でAPI Gatewayをシミュレートし、APIエンドポイントのテストを行います。debugオプションを使用するとデバッグ情報を詳細に出力できます。 sam local start-api
sam local start-api --debug
sam deploy アプリケーションをAWSにデプロイし、スタックの作成や更新を行います。オプションでプロファイルやリージョンの指定も可能です。 sam deploy --guided
sam deploy --profile my-aws-profile
sam deploy --region ap-northeast-1

SAM CLIを活用することで、サーバレスアプリケーションの開発、テスト〜デプロイまでを効率的に行うことができます。

まとめ

今回AWS SAMについてまとめました。
SAMテンプレートとCLIを活用することで、サーバレスアプリケーションの構築を容易に行うことができます。
実践編は別の記事でまとめられればと思います!

参考文献

フクロウラボ エンジニアブログ

Discussion