AWS SAMでサーバレスアプリケーションをつくる!
概要
AWS SAM(Serverless Application Model)は、AWS Lambda・API Gateway・DynamoDB などを使ったサーバレスアプリケーションを、少ないコードで定義・デプロイできるフレームワークです。
AWSの公式ツールであり、AWS認定試験(SAA、DVA、SOA)でも頻出のテーマです。
この記事では、AWS SAMの基本、CloudFormationとの違い、そして実際にHello Worldアプリケーションを構築する手順を紹介します。
1. AWS SAMとは?
AWS SAM(Serverless Application Model)は、CloudFormationをベースにしたサーバレス特化の拡張フレームワークです。
通常のCloudFormationでは、LambdaやAPI Gatewayを定義する際に数十行のYAMLが必要ですが、SAMを使えば数行で済みます。
SAMを使うとできること
- ✅ サーバレスアプリをYAMLで簡潔に定義
- ✅ ローカルでLambda/APIを実行・デバッグ
- ✅ 1コマンドでAWSへデプロイ
2. CloudFormationとの違い
| 項目 | AWS CloudFormation | AWS SAM |
|---|---|---|
| 定義対象 | すべてのAWSリソース | サーバレス特化(Lambda, API Gateway, DynamoDBなど) |
| 記述量 | 多い(リソースを詳細に記述) | 少ない(専用構文で省略可) |
| ローカルテスト | 非対応 |
sam local コマンドで可能 |
| CLI | aws cloudformation |
sam |
| 構文 | 詳細なCloudFormation形式 |
AWS::Serverless::*構文で簡潔に |
SAMはCloudFormationの拡張仕様(Transform)で動作しており、
「サーバレス構成に特化したCloudFormationテンプレート」 と言えます。
SAMで利用できる主なリソース
AWS SAMは、CloudFormationの上に構築された抽象化レイヤーとして、サーバレス開発で頻出するリソースを簡潔に定義できる構文を提供します。
以下はSAMで利用できる代表的なリソースです。
| リソース名 | 概要 |
|---|---|
| AWS::Serverless::Api | Amazon API Gatewayを定義。Lambdaとの統合が容易。 |
| AWS::Serverless::Function | AWS Lambda関数を定義。最も基本的なSAMリソース。 |
| AWS::Serverless::HttpApi | HTTP APIを簡単に構築するためのリソース。 |
| AWS::Serverless::SimpleTable | DynamoDBテーブルを簡単に作成できる。 |
| AWS::Serverless::Application | 他のSAMアプリケーションをスタック内に統合可能。 |
| AWS::Serverless::LayerVersion | Lambdaレイヤーを定義。コードの再利用に便利。 |
| AWS::Serverless::StateMachine | AWS Step Functionsのステートマシンを定義。 |
| AWS::Serverless::Connector | リソース間のアクセス権限を簡潔に定義可能。 |
詳細はAWS公式ドキュメントを参照してください。
👉 AWS SAM リソースとプロパティ
AWS SAMでアプリ構築
ここからは、実際にAWS SAMを使って「Hello World API」を構築してみます!
1. 開発環境の準備
🔧 必要なもの
- AWSアカウント
- AWS CLI(設定済み)
- Python 3.9以上
- AWS SAM CLI
SAM CLIのインストール
AWS SAM CLI のインストールを参考に各環境にSAM CLIをインストールしてください。
2. プロジェクトの作成
以下のコマンドでSAMプロジェクトを作成します。
sam init
対話形式で進めます👇
Which template source would you like to use?
1 - AWS Quick Start Templates
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
Template: 1
Use the most popular runtime and package type? (python3.13 and zip) [y/N]: y
Would you like to enable X-Ray tracing on the function(s)? [y/N]: N
Would you like to enable monitoring using CloudWatch Application Insights? [y/N]: y
Would you like to set Structured Logging in JSON format? [y/N]: y
Project name [sam-app]: hello-sam
完了後、次のようなディレクトリができます。
hello-sam/
├── README.md
├── __init__.py
├── events/
├── hello_world/
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests/
3. Lambda関数のコードを記載
hello_world/app.py を開くと、次のようなコードがあります。
import json
def lambda_handler(event, context):
message = "Hello World!"
return {
"statusCode": 200,
"body": json.dumps({"message": message})
}
この関数は、HTTP GETリクエストを受け取ると {"message": "Hello World!"} を返すシンプルなAPIです。
4. SAMテンプレートの確認
template.yaml の中身を見てみましょう👇
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A simple AWS SAM app
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Events:
HelloWorldApi:
Type: Api
Properties:
Path: /hello
Method: get
このテンプレートは「Lambda関数」と「API Gateway」を定義しています。
5. ローカルで動作確認
次のコマンドでAPI Gatewayイベントをシミュレートして実行できます。
sam local invoke HelloWorldFunction`
またはローカルサーバーを立ち上げてAPIをテスト:
sam local start-api
ブラウザで http://127.0.0.1:3000/hello にアクセスすると、以下のようなJSONが返ります。
{"message": "hello world"}`
6. AWSへデプロイ
AWS上にデプロイします。
sam build
sam deploy --guided
対話形式でスタック名やリージョンを入力します
Stack Name [sam-app]: hello-sam-stack
AWS Region [ap-northeast-1]: ap-northeast-1
Confirm changes before deploy [y/N]: y
Allow SAM CLI IAM role creation [Y/n]: Y
Save arguments to configuration file [Y/n]: Y
完了後、出力にAPI Gateway Endpointが表示されます。
Outputs
---------------------------------------------------------------------------
Key HelloWorldApi
Description API Gateway endpoint URL
Value https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
---------------------------------------------------------------------------
7. 後片付け(削除)
もう使わない場合は、次のコマンドで削除します。
sam delete
まとめ
AWS SAMを使うことで、サーバレスアプリケーションを短いコードで簡単に開発・デプロイできます。
CloudFormationの力をそのまま活かしつつ、LambdaやAPI Gatewayなどサーバレスに特化した構文で記述できるのが大きな利点です。
Discussion