🐙

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

2024/09/27に公開

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

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