AWS SAM (Serverless Application Model)について(基本編)
こんにちは。フクロウラボの真米です。
AWS認定資格を受けた時に AWS SAM を学ぶ機会があったので、備忘録としてまとめておきたいと思います。
AWS SAM(Serverless Application Model)とは
AWS SAMは、サーバレスアプリケーション(Lambda、API Gateway、DynamoDB、S3など)の構築を簡単かつ効率的に行うためのフレームワークです。
SAMの主な役割は以下の2つです。
-
CloudFormationテンプレートの拡張
CloudFormationテンプレートをより簡潔に記述できる -
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の公式ドキュメントにわかりやすくまとめられているので、気になる方はこちらを参照して下さい。
今回設定した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は使用前にインストールが必要です。インストール方法は以下に詳しく記載されています。
コマンド | 説明 | 使用例 |
---|---|---|
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