2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS SAM:API Gateway + Lambda + DynamoDB の基本構成を作ってみた

Posted at

はじめに

AWS SAM(Serverless Application Model)は、サーバーレスアプリケーションの構築・ローカルテスト・デプロイをシンプルにしてくれる便利なフレームワークです。

この記事では、API Gateway からリクエストを送信し、Lambda 関数(Python)を経由して DynamoDB のテストデータを取得し、レスポンスとして返すシンプルな構成を試してみた記録をまとめます。

書こうと思ったきっかけ

以前から SAM に強い関心があり、実際に手を動かして検証してみたいと思っていました。前回の記事では、シンプルな Hello World チュートリアルを実施した内容をまとめていますので、興味のある方はぜひ参考にしてみてください。

結構、簡単で驚いた。(SAMすごい!!)

サーバーレス構成やデプロイフローの理解を深めたかったこともあり、簡単な検証の記録として残していきます。

※内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです。

実際にやってみた

簡単な検証内容

API 経由で DynamoDB に保存されたテストデータを取得し、Lambda からレスポンスとして返す。

構成は以下のようになります:

[API Gateway] → [Lambda] → [DynamoDB]

こんな感じの簡単な構成

Screenshot 2025-06-07 at 16.08.20.png

引用画像: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(パッケージとして認識させるため)

こんな感じのディレクトリ構成で検証してみました

Screenshot 2025-06-07 at 16.40.56.png

■ 前提条件

以下のツールがインストール済みであること:

  • 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

実際のターミナル画面

Screenshot 2025-06-07 at 16.13.23.png

2. テストデータの投入(デプロイ後に実施)

aws dynamodb put-item \
  --table-name ItemsTable \
  --item '{"id": {"S": "test"}, "message": {"S": "Hello from DynamoDB!"}}'

問題なく、テストデータが投入されていることが確認できました!

Screenshot 2025-06-07 at 16.18.06.png

各リソース作成後の状況確認

Lambda 関数、API Gatewayも問題なく作成されていました!

Screenshot 2025-06-07 at 16.15.13.png

DynamoDB テーブルも問題なく作成されていました!

Screenshot 2025-06-07 at 16.15.55.png

3. デプロイ後に表示されるエンドポイントにアクセスして確認

API Gateway の URL は毎回探すのが大変で、つい迷子になってしまいがちですが、以下の画像の赤枠部分に表示されていますので、参考にしてみてください。

今回の例では、この URL の末尾に /hello を付けて、ブラウザからアクセスする形になります。

Screenshot 2025-06-07 at 16.31.35.png

curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello

テストデータの取得が問題なくできたため、今回の検証は成功です!

Screenshot 2025-06-07 at 16.20.06.png

まとめ

ここまで読んでいただき、ありがとうございました!

AWS SAM を使うことで、API Gateway + Lambda + DynamoDB の基本構成がとても簡単に試せることがわかりました。

次のステップでは、POST リクエストによるデータ登録や、複数件の取得、さらには Cognito や IAM による認証の追加などにも取り組んでみたいと思います!(SAMめちゃくちゃ便利...)

おまけ:アプリケーションを削除

以下のコマンドで削除できますので、不要になったタイミングで削除しておくことをおすすめします。

aws cloudformation delete-stack --stack-name sam-app

こちらもいい感じに削除されました!

Screenshot 2025-06-07 at 16.44.35.png

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?