awslambdadynamodbapi-gatewayserverless

Lambda、DynamoDB、API Gateway でサーバーレス CRUD API を構築する

TPThuanPD2026年9月3日75分新着
AWS

完全サーバーレスの注文 REST API を構築します。API Gateway が request を受け、2 つの Lambda 関数が作成と参照を処理し、データは DynamoDB テーブルに保存します。

アーキテクチャ図: USERS → API Gateway → 2 つの Lambda(Get Order GET、Create Order POST)→ DynamoDB Orders テーブル

Lab Overview and Learning Objectives

開始前の注意

本ラボは、カバーの図のようなサーバーレス構成で注文 API を構築します。ユーザーが API Gateway を呼び出し、request が対応する Lambda 関数(POST で作成、GET で参照)へ振り分けられ、データは DynamoDB Orders テーブルで読み書きされます。すべてサンドボックスアカウントで実施し、本番システムでは操作しません。

  1. DynamoDB、IAM、Lambda、API Gateway を利用できる AWS アカウントを準備します。
  2. 4 つのサービスでリージョンを統一し、ラボ中は変更しません。
  3. API クライアントを用意します: Postman、cURL、または reqbin.com。
  4. サンプルの注文に実データや個人情報を入れないでください。
目的:ラボ完了後、POST /orders と GET /orders?orderId=... の 2 つの endpoint を持つ公開 REST API が、Lambda と DynamoDB を背後に動作します。
1

1. DynamoDB の Orders テーブルを作成

DynamoDB は注文を保存する場所です。各注文を識別する partition key が必要で、ここでは文字列型の orderId を使います。

  1. AWS Console で DynamoDB を開き、Create table を選びます。
  2. Table name: Orders と入力します。
  3. Partition key: orderId と入力し、データ型は String を選びます。
  4. Default settings のまま Create table を押します。
DynamoDB で Active 状態の Orders テーブル
DynamoDB で Active 状態の Orders テーブル
完了条件:Orders テーブルが Tables 一覧に表示され、Status が Active、partition key が orderId (S) になります。
2

2. Lambda 用の IAM ロールを作成

Lambda 関数には、DynamoDB の読み書きと CloudWatch へのログ送信を許可する execution role が必要です。関数作成時に割り当てられるよう、先にこのロールを作成します。

  1. IAM → Roles → Create role を開き、trusted entity で AWS service → Lambda を選びます。
  2. managed policy を 2 つ付与します: AmazonDynamoDBFullAccess と AWSLambdaBasicExecutionRole。
  3. ロール名を LambdaOrderRole にして作成を完了します。
DynamoDB と Lambda basic execution の 2 policy を持つ LambdaOrderRole
DynamoDB と Lambda basic execution の 2 policy を持つ LambdaOrderRole
注意:AmazonDynamoDBFullAccess は広い権限で、学習用サンドボックスでのみ適切です。本番では対象テーブルに権限を絞ってください。
完了条件:LambdaOrderRole が、AmazonDynamoDBFullAccess と AWSLambdaBasicExecutionRole のちょうど 2 つの permissions policy を持って作成されます。
3

3. Create Order Lambda(POST)を作成

この関数は注文の JSON body を受け取り、Orders テーブルへそのまま書き込みます。作成時は、Lambda が既定のロールを自動生成するのではなく、手順 2 の execution role を割り当てます。

  1. Lambda → Create function → Author from scratch を開きます。
  2. Function name: CreateOrderFunction。Runtime: Python 3.14(または最新版)。
  3. Additional settings を開き、Custom execution role で Use an existing role を選び、LambdaOrderRole を指定します。
  4. Create function を押します。
  5. コードエディターで既定コードをすべて下記に置き換え、Deploy を押します。
CreateOrderFunction · Python
import json
import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Orders')

def lambda_handler(event, context):
    body = json.loads(event.get('body', '{}'))
    table.put_item(Item=body)
    return {
        'statusCode': 200,
        'body': json.dumps('Order created successfully!')
    }
Custom execution role を LambdaOrderRole にして CreateOrderFunction を作成
Custom execution role を LambdaOrderRole にして CreateOrderFunction を作成
完了条件:CreateOrderFunction が作成され、LambdaOrderRole を使用し、DynamoDB へ注文を書き込むコードが Deploy されます。
4

4. Get Order Lambda(GET)を作成

この関数は query string から orderId を読み取り、DynamoDB を照会して注文を返します。DecimalEncoder は DynamoDB の Decimal 型を JSON 生成時に数値へ変換します。

  1. 手順 3 と同じ Create function の流れを、名前を GetOrderFunction にして繰り返します。
  2. Runtime は Python、Custom execution role は LambdaOrderRole を選びます。
  3. Create function を押します。
  4. 既定コードを下記に置き換え、Deploy を押します。
GetOrderFunction · Python
import json
import boto3
from decimal import Decimal

class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Decimal):
            if obj % 1 == 0:
                return int(obj)
            return float(obj)
        return super(DecimalEncoder, self).default(obj)

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Orders')

def lambda_handler(event, context):
    try:
        order_id = event['queryStringParameters']['orderId']
        response = table.get_item(Key={'orderId': order_id})
        return {
            'statusCode': 200,
            'body': json.dumps(response.get('Item', {}), cls=DecimalEncoder)
        }
    except Exception as e:
        print(f"Error: {str(e)}")
        return {
            'statusCode': 500,
            'body': json.dumps("ERROR.")
        }
Python 3.14 ランタイムで GetOrderFunction を作成
Python 3.14 ランタイムで GetOrderFunction を作成
完了条件:GetOrderFunction が作成・Deploy され、orderId で注文を返せる状態になります。
5

5. REST API と /orders リソースを作成

API Gateway は Lambda の前段にある公開の入口です。まず REST API を作成し、注文用の method をまとめる /orders リソースを追加します。

  1. API Gateway を開き、REST API(Private ではない方)を見つけて Build を押します。
  2. New API を選び、API name を OrderAPI にして Create API を押します。
  3. Resources 画面で Create resource を押します。
  4. Resource name に orders と入力し、Create resource を押します。
REST API OrderAPI 作成後に /orders リソースを作成
REST API OrderAPI 作成後に /orders リソースを作成
完了条件:REST API OrderAPI が作成され、method を付ける /orders リソースができます。
6

6. POST と GET の method を Lambda に接続

各 method は HTTP 動詞を Lambda 関数に結び付けます。Lambda proxy integration を有効にすると、API Gateway が request 全体(body、query string)を Lambda の event に渡します。

  1. /orders リソース → Create method → POST を選びます。
  2. Lambda proxy integration をチェックし、Lambda function 欄に CreateOrderFunction と入力して保存します。
  3. 続けて /orders → Create method → GET を選びます。
  4. Lambda proxy integration をチェックし、GetOrderFunction と入力して保存します。
CreateOrderFunction への Lambda proxy integration で POST method を作成
CreateOrderFunction への Lambda proxy integration で POST method を作成
完了条件:/orders リソースに 2 つの method ができます: POST は CreateOrderFunction、GET は GetOrderFunction。
7

7. API を Deploy して Invoke URL を取得

API は stage へ deploy して初めて外部からアクセスできます。stage は動作確認用の Invoke URL が生成される場所でもあります。

  1. Deploy API を押します。
  2. Stage で New stage を選び、Stage name を dev にします。
  3. Deploy を押します。
  4. Invoke URL(https://xxxx.execute-api.<region>.amazonaws.com/dev の形)を控えます。
Stage name を dev にした Deploy API ダイアログ
Stage name を dev にした Deploy API ダイアログ
完了条件:API が dev stage に deploy され、動作確認用の公開 Invoke URL が得られます。
8

8. POST と GET をテスト

Postman、cURL、または reqbin.com で API を呼び出します。まず POST で注文を作成し、次に GET で参照して全体の流れを確認します。

  1. https://<INVOKE_URL>/orders に、下記の JSON Body を付けて POST を送ります。
  2. レスポンスは 'Order created successfully!'、ステータス 200 になります。
  3. https://<INVOKE_URL>/orders?orderId=123 に GET を送ります。
  4. GET のレスポンスとして、作成した注文の JSON が返ります。
POST body · JSON
{ "orderId": "123", "item": "Laptop", "price": 1500 }
reqbin で POST /orders を呼び出し Order created successfully と 200 OK が返る
reqbin で POST /orders を呼び出し Order created successfully と 200 OK が返る
完了条件:POST は成功メッセージを返し、GET は orderId に応じた正しい注文データを返します。
9

9. DynamoDB でデータを確認

実データが書き込まれたことの最終確認として、Orders テーブルを開いて item を見ます。

  1. DynamoDB → Explore items → Orders テーブルを選びます。
  2. Run を押して全 item を Scan します。
  3. 作成した注文が正しい orderId、item、price で表示されることを確認します。
DynamoDB の Orders テーブルを Scan すると作成した注文が返る
DynamoDB の Orders テーブルを Scan すると作成した注文が返る
完了条件:Orders テーブルに API 経由で作成した item が存在し、API Gateway → Lambda → DynamoDB の流れが端から端まで動作していることを確認できます。
10

10. クリーンアップ

コストや不要なリソースを残さないよう、逆順で削除します。

  1. API Gateway で REST API OrderAPI を削除します。
  2. Lambda で CreateOrderFunction と GetOrderFunction を削除します。
  3. DynamoDB で Orders テーブルを削除します。
  4. IAM で不要になった LambdaOrderRole を削除します。
完了条件:本ラボのリソースがアカウントに残っていない状態です。

参考ドキュメント