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

Lab Overview and Learning Objectives
開始前の注意
本ラボは、カバーの図のようなサーバーレス構成で注文 API を構築します。ユーザーが API Gateway を呼び出し、request が対応する Lambda 関数(POST で作成、GET で参照)へ振り分けられ、データは DynamoDB Orders テーブルで読み書きされます。すべてサンドボックスアカウントで実施し、本番システムでは操作しません。
- DynamoDB、IAM、Lambda、API Gateway を利用できる AWS アカウントを準備します。
- 4 つのサービスでリージョンを統一し、ラボ中は変更しません。
- API クライアントを用意します: Postman、cURL、または reqbin.com。
- サンプルの注文に実データや個人情報を入れないでください。
1. DynamoDB の Orders テーブルを作成
DynamoDB は注文を保存する場所です。各注文を識別する partition key が必要で、ここでは文字列型の orderId を使います。
- AWS Console で DynamoDB を開き、Create table を選びます。
- Table name: Orders と入力します。
- Partition key: orderId と入力し、データ型は String を選びます。
- Default settings のまま Create table を押します。

2. Lambda 用の IAM ロールを作成
Lambda 関数には、DynamoDB の読み書きと CloudWatch へのログ送信を許可する execution role が必要です。関数作成時に割り当てられるよう、先にこのロールを作成します。
- IAM → Roles → Create role を開き、trusted entity で AWS service → Lambda を選びます。
- managed policy を 2 つ付与します: AmazonDynamoDBFullAccess と AWSLambdaBasicExecutionRole。
- ロール名を LambdaOrderRole にして作成を完了します。

3. Create Order Lambda(POST)を作成
この関数は注文の JSON body を受け取り、Orders テーブルへそのまま書き込みます。作成時は、Lambda が既定のロールを自動生成するのではなく、手順 2 の execution role を割り当てます。
- Lambda → Create function → Author from scratch を開きます。
- Function name: CreateOrderFunction。Runtime: Python 3.14(または最新版)。
- Additional settings を開き、Custom execution role で Use an existing role を選び、LambdaOrderRole を指定します。
- Create function を押します。
- コードエディターで既定コードをすべて下記に置き換え、Deploy を押します。
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!')
}
4. Get Order Lambda(GET)を作成
この関数は query string から orderId を読み取り、DynamoDB を照会して注文を返します。DecimalEncoder は DynamoDB の Decimal 型を JSON 生成時に数値へ変換します。
- 手順 3 と同じ Create function の流れを、名前を GetOrderFunction にして繰り返します。
- Runtime は Python、Custom execution role は LambdaOrderRole を選びます。
- Create function を押します。
- 既定コードを下記に置き換え、Deploy を押します。
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.")
}
5. REST API と /orders リソースを作成
API Gateway は Lambda の前段にある公開の入口です。まず REST API を作成し、注文用の method をまとめる /orders リソースを追加します。
- API Gateway を開き、REST API(Private ではない方)を見つけて Build を押します。
- New API を選び、API name を OrderAPI にして Create API を押します。
- Resources 画面で Create resource を押します。
- Resource name に orders と入力し、Create resource を押します。

6. POST と GET の method を Lambda に接続
各 method は HTTP 動詞を Lambda 関数に結び付けます。Lambda proxy integration を有効にすると、API Gateway が request 全体(body、query string)を Lambda の event に渡します。
- /orders リソース → Create method → POST を選びます。
- Lambda proxy integration をチェックし、Lambda function 欄に CreateOrderFunction と入力して保存します。
- 続けて /orders → Create method → GET を選びます。
- Lambda proxy integration をチェックし、GetOrderFunction と入力して保存します。

7. API を Deploy して Invoke URL を取得
API は stage へ deploy して初めて外部からアクセスできます。stage は動作確認用の Invoke URL が生成される場所でもあります。
- Deploy API を押します。
- Stage で New stage を選び、Stage name を dev にします。
- Deploy を押します。
- Invoke URL(https://xxxx.execute-api.<region>.amazonaws.com/dev の形)を控えます。

8. POST と GET をテスト
Postman、cURL、または reqbin.com で API を呼び出します。まず POST で注文を作成し、次に GET で参照して全体の流れを確認します。
- https://<INVOKE_URL>/orders に、下記の JSON Body を付けて POST を送ります。
- レスポンスは 'Order created successfully!'、ステータス 200 になります。
- https://<INVOKE_URL>/orders?orderId=123 に GET を送ります。
- GET のレスポンスとして、作成した注文の JSON が返ります。
{ "orderId": "123", "item": "Laptop", "price": 1500 }
9. DynamoDB でデータを確認
実データが書き込まれたことの最終確認として、Orders テーブルを開いて item を見ます。
- DynamoDB → Explore items → Orders テーブルを選びます。
- Run を押して全 item を Scan します。
- 作成した注文が正しい orderId、item、price で表示されることを確認します。

10. クリーンアップ
コストや不要なリソースを残さないよう、逆順で削除します。
- API Gateway で REST API OrderAPI を削除します。
- Lambda で CreateOrderFunction と GetOrderFunction を削除します。
- DynamoDB で Orders テーブルを削除します。
- IAM で不要になった LambdaOrderRole を削除します。