はじめに
AWS SAM(Serverless Application Model)は、サーバーレスアプリケーションの構築・ローカルテスト・デプロイをシンプルにしてくれる便利なフレームワークです。
この記事では、API Gateway からリクエストを送信し、Lambda 関数(Python)を経由して DynamoDB のテストデータを取得し、レスポンスとして返すシンプルな構成を試してみた記録をまとめます。
書こうと思ったきっかけ
以前から SAM に強い関心があり、実際に手を動かして検証してみたいと思っていました。前回の記事では、シンプルな Hello World チュートリアルを実施した内容をまとめていますので、興味のある方はぜひ参考にしてみてください。
結構、簡単で驚いた。(SAMすごい!!)
サーバーレス構成やデプロイフローの理解を深めたかったこともあり、簡単な検証の記録として残していきます。
※内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです。
実際にやってみた
簡単な検証内容
API 経由で DynamoDB に保存されたテストデータを取得し、Lambda からレスポンスとして返す。
構成は以下のようになります:
[API Gateway] → [Lambda] → [DynamoDB]
こんな感じの簡単な構成
引用画像:https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-dynamo-db.html
ディレクトリ構成
sam-dynamodb-example/
├── template.yaml # インフラ構成を定義する SAM テンプレート
├── samconfig.toml # sam deploy --guided の設定内容(初回デプロイ後に生成)
├── hello_world/
│ ├── app.py # Lambda 関数本体(Python)
│ └── __init__.py # 空で OK(パッケージとして認識させるため)
こんな感じのディレクトリ構成で検証してみました
■ 前提条件
以下のツールがインストール済みであること:
-
AWS CLI(aws configure)
-
AWS SAM CLI(sam --version)
AWS CLIやSAMの設定がまだの方は、参考にしてみてください!
必要な構成(AWS SAM)
以下の2つの主要ファイルと1つのリソース定義で構築できます。
template.yaml
DynamoDB テーブル、Lambda 関数、API Gateway エンドポイントの 3 つを定義しています。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM + Lambda + API Gateway + DynamoDB
Resources:
ItemsTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: ItemsTable
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
BillingMode: PAY_PER_REQUEST
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.12
Environment:
Variables:
TABLE_NAME: !Ref ItemsTable
Policies:
- DynamoDBReadPolicy:
TableName: !Ref ItemsTable
Events:
HelloWorldApi:
Type: Api
Properties:
Path: /hello
Method: get
hello_world/app.py
DynamoDB から ID が "test" のデータを取得し、JSON 形式で返します。
import os
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['TABLE_NAME'])
def lambda_handler(event, context):
# テスト用のid = "test" のデータを取得
try:
response = table.get_item(Key={'id': 'test'})
item = response.get('Item', {})
except Exception as e:
return {
"statusCode": 500,
"body": json.dumps({"error": str(e)})
}
return {
"statusCode": 200,
"body": json.dumps(item)
}
AWS 環境にデプロイする手順
1. 初回デプロイ(対話形式で設定)
sam deploy --guided
例)対話での入力内容:
Stack Name: sam-dynamodb-example
AWS Region: ap-northeast-1
Confirm changes before deploy: n
Allow SAM CLI IAM role creation: y
Disable rollback: n
HelloWorldFunction may not have authorization defined, Is this okay? y
Save arguments to configuration file: y
SAM configuration file: samconfig.toml
SAM configuration environment: default
実際のターミナル画面
2. テストデータの投入(デプロイ後に実施)
aws dynamodb put-item \
--table-name ItemsTable \
--item '{"id": {"S": "test"}, "message": {"S": "Hello from DynamoDB!"}}'
問題なく、テストデータが投入されていることが確認できました!
各リソース作成後の状況確認
Lambda 関数、API Gatewayも問題なく作成されていました!
DynamoDB テーブルも問題なく作成されていました!
3. デプロイ後に表示されるエンドポイントにアクセスして確認
API Gateway の URL は毎回探すのが大変で、つい迷子になってしまいがちですが、以下の画像の赤枠部分に表示されていますので、参考にしてみてください。
今回の例では、この URL の末尾に /hello
を付けて、ブラウザからアクセスする形になります。
curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
テストデータの取得が問題なくできたため、今回の検証は成功です!
まとめ
ここまで読んでいただき、ありがとうございました!
AWS SAM を使うことで、API Gateway + Lambda + DynamoDB の基本構成がとても簡単に試せることがわかりました。
次のステップでは、POST リクエストによるデータ登録や、複数件の取得、さらには Cognito や IAM による認証の追加などにも取り組んでみたいと思います!(SAMめちゃくちゃ便利...)
おまけ:アプリケーションを削除
以下のコマンドで削除できますので、不要になったタイミングで削除しておくことをおすすめします。
aws cloudformation delete-stack --stack-name sam-app
こちらもいい感じに削除されました!