メインコンテンツまでスキップ

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

· 約9分
Shinya Kato
DayoneLabs管理人、ソフトウェア開発者、OSS開発者

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

どうも、Shinyaです。この記事では、AWS SAM CLIを使用してCloudFormationテンプレートをベースにLambda関数の開発とデプロイを行う方法について解説します。SAM CLIのインストールからプロジェクトの作成、ビルド、デプロイまでの一連の流れを紹介します。

この記事はこんな人にオススメ
  • AWS Lambdaのデプロイを自動化したい人
  • SAM(Serverless Application Model)の使い方を知りたい人
  • CloudFormationテンプレートでインフラを管理したい人
  • サーバーレスアプリケーションの開発フローを効率化したい人

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.tomltemplate.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.tomlSAMの動作に必要な設定(スタック名、リージョンなど)
template.yamlCloudFormationテンプレート(インフラ構成の定義)
hello_world/app.pyLambda関数の実装コード

主要ファイルの解説

samconfig.toml

SAMの動作に必要な設定を定義するファイルです。stack_nameはCloudFormationに登録されるスタック名になります。デプロイ先のリージョンを指定する場合は、[default.deploy.parameters]region = "ap-northeast-1"などを追加します。

samconfig.toml
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リソースを定義します。

template.yaml
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.pylambda_handler関数)を指定
  • Architectures: CPUアーキテクチャの指定。x86_64またはarm64を選択可能
  • Events: API Gatewayのエンドポイント定義。クイックスタートテンプレートではデフォルトで含まれる
  • Outputs: デプロイ後に出力される情報(APIエンドポイントURL、Lambda関数のARNなど)
AWS Gravitonプロセッサ

AWSは独自のARMベースプロセッサGravitonを開発しています。Architecturesarm64を指定することで、Lambda関数でGravitonプロセッサを使用できます。x86_64と比較して実行効率が良く、料金も最大20%低くなります。

app.py

Lambda関数の実装コードです。クイックスタートテンプレートでは、HTTPリクエストを受けてステータス200でhello worldを返す関数が生成されます。

hello_world/app.py
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リソースが削除されます。本番環境のスタックを削除する場合は、影響範囲を十分に確認してから実行します。

関連記事

まとめ

この記事では、SAM CLIを使用してAWS Lambda関数の開発とデプロイを行う方法について解説しました。SAMはCloudFormationを基盤としたAWS公式のフレームワークで、sam initでプロジェクトの雛形を作成し、sam buildでビルド、sam deployでデプロイという一連のワークフローを提供します。template.yamlでインフラ構成をコードとして管理できるため、手動デプロイと比較してヒューマンエラーの削減と再現性の向上が期待できます。


参考リンク:

免責事項:
当記事は管理人の開発時に書き留められたメモをもとにAIを活用して編纂されたものです。 管理人は記事の公開前に内容の校正・校閲を行い、記事の信頼性と正確性の向上に務めますが、それらを保証するものではありません。 また、当記事の編集時の誤字やコード例の不具合等によって読者が何らかの損害等を被った場合でも、管理人は一切の責任を負いません。 当記事に掲載したコンテンツの利用については自己責任でお願い致します。