SAM CLIでAWS Lambdaの開発とデプロイを効率化する - CloudFormationテンプレートによるサーバーレス開発

どうも、Shinyaです。この記事では、AWS SAM CLIを使用してCloudFormationテンプレートをベースにLambda関数の開発とデプロイを行う方法について解説します。SAM CLIのインストールからプロジェクトの作成、ビルド、デプロイまでの一連の流れを紹介します。
- AWS Lambdaのデプロイを自動化したい人
- SAM(Serverless Application Model)の使い方を知りたい人
- CloudFormationテンプレートでインフラを管理したい人
- サーバーレスアプリケーションの開発フローを効率化したい人
この記事では、HomebrewとAWS CLIがインストール済みで、IAMプロファイルが設定済みであることを前提としています。
AWS Lambdaとは
AWS Lambdaは、AWSが提供するサーバーレスコンピューティングサービスです。Amazon EC2とは異なり、インスタンスなどの実行基盤を自分で用意・管理する必要がなく、プログラムを作成してデプロイすればいつでも実行可能な状態になります。
SAM(Serverless Application Model)とは
AWS SAMは、AWSが公式に提供するサーバーレスアプリケーションの構築フレームワークです。AWS CloudFormationを基盤としており、YAMLテンプレートでLambda関数やAPI Gatewayなどのリソースを定義し、デプロイを自動化できます。
同様の仕組みとしてServerless Frameworkなどがありますが、SAMはAWS公式の仕組みであり、IAMをベースにAWSの各種サービスとシームレスに統合できる点が特徴です。
SAM CLIの役割
SAM CLIは、SAMの仕組みをローカル環境で使用するためのオープンソースのコマンドラインツールです。プロジェクトの初期化、ビルド、ローカルテスト、デプロイなどの操作を提供します。
SAM CLIのインストール
SAM CLIはHomebrew経由でインストールできます。
brew install aws-sam-cli
インストール後、以下のコマンドでバージョンを確認します。
sam --version
SAM CLI, version 1.154.0
プロジェクトの作成
sam initコマンドで対話形式のプロンプトが開始され、CloudFormationテンプレートとSAMの設定ファイルが生成されます。
sam init
SAMを使用した実装に慣れたら対象プロジェクトにsamconfig.tomlとtemplate.yamlを直接作成することも可能です。
対話形式の手順
以下の手順でHello World Exampleのプロジェクトを作成します。
1. テンプレートソースの選択
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
2. アプリケーションテンプレートの選択
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Data processing
3 - Hello World Example with Powertools for AWS Lambda
4 - Multi-step workflow
5 - Scheduled task
6 - Standalone function
7 - Serverless API
8 - Infrastructure event management
9 - Lambda Response Streaming
10 - GraphQLApi Hello World Example
11 - Full Stack
12 - Durable Functions
13 - Lambda EFS example
14 - Serverless Connector Hello World Example
15 - Multi-step workflow with Connectors
16 - Hello World Durable Function Example
17 - DynamoDB Example
18 - Machine Learning
Template: 1
3. ランタイムの選択
Use the most popular runtime and package type? (python3.14 and zip) [y/N]: y
4. X-Rayトレーシングの設定
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
5. CloudWatch Application Insightsの設定
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N
6. ログ形式の設定
Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]: y
7. プロジェクト名の設定
Project name [sam-app]: sam-app
プロジェクト構造
sam initが完了すると、以下の構造のプロジェクトが生成されます。
sam-app/
├── README.md
├── __init__.py
├── events/
│ └── event.json
├── hello_world/
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests/
├── __init__.py
├── integration/
│ ├── __init__.py
│ └── test_api_gateway.py
├── requirements.txt
└── unit/
├── __init__.py
└── test_handler.py
SAMを利用するうえで重要なファイルは以下の3つです。
| ファイル | 役割 |
|---|---|
samconfig.toml | SAMの動作に必要な設定(スタック名、リージョンなど) |
template.yaml | CloudFormationテンプレート(インフラ構成の定義) |
hello_world/app.py | Lambda関数の実装コード |
主要ファイルの解説
samconfig.toml
SAMの動作に必要な設定を定義するファイルです。stack_nameはCloudFormationに登録されるスタック名になります。デプロイ先のリージョンを指定する場合は、[default.deploy.parameters]にregion = "ap-northeast-1"などを追加します。
version = 0.1
[default.global.parameters]
stack_name = "sam-app"
[default.build.parameters]
cached = true
parallel = true
[default.validate.parameters]
lint = true
[default.deploy.parameters]
capabilities = "CAPABILITY_IAM"
confirm_changeset = true
resolve_s3 = true
[default.package.parameters]
resolve_s3 = true
[default.sync.parameters]
watch = true
[default.local_start_api.parameters]
warm_containers = "EAGER"
[default.local_start_lambda.parameters]
warm_containers = "EAGER"
template.yaml
CloudFormationテンプレートで、デプロイ時に作成されるAWSリソースを定義します。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
Globals:
Function:
Timeout: 3
LoggingConfig:
LogFormat: JSON
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.14
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Outputs:
HelloWorldApi:
Description: API Gateway endpoint URL for Prod stage for Hello World function
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/Prod/hello/"
HelloWorldFunction:
Description: Hello World Lambda Function ARN
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: Implicit IAM Role created for Hello World function
Value: !GetAtt HelloWorldFunctionRole.Arn
テンプレートの主要なポイントは以下の通りです。
- Resources: Lambda関数の定義。
CodeUriで関数のソースコードの場所、Handlerでエントリポイント(app.pyのlambda_handler関数)を指定 - Architectures: CPUアーキテクチャの指定。
x86_64またはarm64を選択可能 - Events: API Gatewayのエンドポイント定義。クイックスタートテンプレートではデフォルトで含まれる
- Outputs: デプロイ後に出力される情報(APIエンドポイントURL、Lambda関数のARNなど)
AWSは独自のARMベースプロセッサGravitonを開発しています。Architecturesにarm64を指定することで、Lambda関数でGravitonプロセッサを使用できます。x86_64と比較して実行効率が良く、料金も最大20%低くなります。
app.py
Lambda関数の実装コードです。クイックスタートテンプレートでは、HTTPリクエストを受けてステータス200でhello worldを返す関数が生成されます。
import json
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
}),
}
eventパラメータにはAPI Gatewayから転送されたリクエスト情報が、contextパラメータにはLambdaの実行環境に関する情報が渡されます。
ビルドとデプロイ
ビルド
sam buildコマンドでプロジェクトをビルドします。依存ライブラリのインストールとコードのパッケージングが行われます。
sam build
ビルドが成功すると以下のような出力が表示されます。
Starting Build use cache
Building codeuri: /hello_world runtime: python3.14 architecture: x86_64
functions: HelloWorldFunction
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
デプロイ
sam deployコマンドでAWSにデプロイします。
sam deploy
デプロイ時に作成・変更されるリソースの一覧(Changeset)が表示されます。内容を確認し、yを入力するとデプロイが開始されます。
CloudFormation stack changeset
-------------------------------------------------------------
Operation LogicalResourceId ResourceType
-------------------------------------------------------------
+ Add HelloWorldFunction AWS::Lambda::Function
+ Add HelloWorldFunctionRole AWS::IAM::Role
+ Add ServerlessRestApi AWS::ApiGateway::RestApi
+ Add ServerlessRestApiProdStage AWS::ApiGateway::Stage
-------------------------------------------------------------
Deploy this changeset? [y/N]: y
デプロイが完了すると、Outputsに定義した情報(APIエンドポイントURLなど)が表示されます。
スタックの削除
不要になったCloudFormationスタックは、AWS CLIで削除できます。スタックに関連するすべてのリソース(Lambda関数、API Gateway、IAMロールなど)が削除されます。
aws cloudformation delete-stack --stack-name sam-app
スタックを削除すると、関連するすべてのAWSリソースが削除されます。本番環境のスタックを削除する場合は、影響範囲を十分に確認してから実行します。
関連記事
- Homebrewの導入と基本操作 - macOSのパッケージ管理を効率化する
- HomebrewでAWS CLIをインストールする - AWSサービスをコマンドラインから操作する
- AWS CLIでIAMユーザーのプロファイルを設定する - 認証情報の管理と操作方法
- HomebrewでPythonをインストールする
- Amazon S3 + CloudFrontで静的サイトを配信する - CodePipelineによるCI/CD構築
まとめ
この記事では、SAM CLIを使用してAWS Lambda関数の開発とデプロイを行う方法について解説しました。SAMはCloudFormationを基盤としたAWS公式のフレームワークで、sam initでプロジェクトの雛形を作成し、sam buildでビルド、sam deployでデプロイという一連のワークフローを提供します。template.yamlでインフラ構成をコードとして管理できるため、手動デプロイと比較してヒューマンエラーの削減と再現性の向上が期待できます。
参考リンク:
