Amazon DynamoDB でテーブルを作り Lambda から読み書きする
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
準備 9 項目中 1 番目
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みで、DynamoDB・Lambda・IAM を操作できる権限があること
- 事前に作成しておくリソースはありません
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| DynamoDB テーブル | basics-orders | 注文データを保存するテーブル(オンデマンド) |
| Lambda 関数 | basics-orders-function | テーブルに PutItem / Query する関数(Python 3.14) |
| IAM ロール | (Lambda が自動作成) | Lambda 実行ロール |
| IAM インラインポリシー | basics-orders-table-access | 実行ロールに付ける、basics-orders テーブルだけを対象にした読み書き権限 |
手順 9 項目中 2 番目
DynamoDB テーブルを作成する
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
DynamoDBと入力し、表示された「DynamoDB」を選択します - 左側ナビゲーションの「テーブル」を選択し、「テーブルの作成」をクリックします
- 「テーブルの詳細」で以下を入力します
- テーブル名:
basics-orders - パーティションキー:
customer_id(型:文字列) - ソートキー:
order_date(型:文字列)
- テーブル名:
- 「テーブル設定」で「設定をカスタマイズ」を選択します
- 「読み込み/書き込みキャパシティーの設定」で、キャパシティーモードが「オンデマンド」になっていることを確認します(既定でオンデマンドが選択されています)
- その他の項目はデフォルトのままにします
- ページ下部の「テーブルの作成」をクリックします
- テーブル一覧で
basics-ordersのステータスが「作成中」から「アクティブ」に変わるまで待ちます
手順 9 項目中 3 番目
コンソールで項目を追加する
- テーブル一覧で
basics-ordersを選択し、右上の「テーブルアイテムの探索」をクリックします - 「返された項目」セクションで「項目を作成」をクリックします
- 「項目を作成」画面で、
customer_idにC001、order_dateに2026-10-01を入力します - 「新しい属性の追加」から「文字列」を選択し、属性名
item、値バナナを入力します - もう一度「新しい属性の追加」から「数値」を選択し、属性名
quantity、値3を入力します
item・quantity 属性を入力した状態)- 「項目を作成」をクリックします
- 同じ手順で、以下の 2 件も作成します
| customer_id | order_date | item | quantity |
|---|---|---|---|
C001 | 2026-10-05 | りんご | 2 |
C002 | 2026-10-03 | バナナ | 10 |
C001 の 2 件は、パーティションキーが同じでもソートキーが異なるため、別の項目として保存されます。
手順 9 項目中 4 番目
コンソールで Query を実行する
- 「テーブルアイテムの探索」画面の「項目のスキャンまたはクエリ」で「クエリ」を選択します
- 「customer_id(パーティションキー)」に
C001を入力します - 「order_date(ソートキー)」の条件で「次で始まる」を選択し、値に
2026-10を入力します - 「実行」をクリックします
customer_id = C001 の 2 件だけが order_date の順に返されている状態)C002 の項目は返されず、C001 の項目だけが order_date の昇順で表示されることが確認できます。
手順 9 項目中 5 番目
Lambda 関数を作成する
- 上部の検索バーに
Lambdaと入力し、表示された「Lambda」を選択します - 左側ナビゲーションの「関数」を選択し、「関数を作成」をクリックします
- 「一から作成」が選択されていることを確認し、以下を入力します
- 関数名:
basics-orders-function - ランタイム:
Python 3.14
- 関数名:
- 「その他の設定」を展開し、アーキテクチャが
x86_64(既定)のままで、「カスタム実行ロール」がオフ(既定の動作として、基本的な Lambda アクセス許可を持つ新しいロールが自動作成される)になっていることを確認します - その他の項目はデフォルトのままにし、「関数を作成」をクリックします
手順 9 項目中 6 番目
実行ロールに対象テーブルだけの権限を付ける
自動作成された実行ロールには CloudWatch Logs へのログ出力権限しかないため、DynamoDB への権限を追加します。権限は basics-orders テーブルに対する PutItem と Query だけに絞ります。
- まず、テーブルの ARN を確認します。DynamoDB コンソールの「テーブル」で
basics-ordersを選択し、画面上部の「一般的な情報」に表示される Amazon リソースネーム(ARN)をコピーします(arn:aws:dynamodb:ap-northeast-1:<アカウントID>:table/basics-ordersの形式です) - Lambda コンソールに戻り、
basics-orders-functionの「設定」タブ →「アクセス権限」を選択します - 「実行ロール」のロール名のリンクをクリックし、IAM コンソールでロールを開きます
- 「許可」タブで「許可を追加」→「インラインポリシーを作成」をクリックします
- ポリシーエディタで「JSON」を選択し、以下の内容に書き換えます(
<アカウントID>は自分のアカウント ID に置き換えます)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BasicsOrdersTableAccess",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:ap-northeast-1:<アカウントID>:table/basics-orders"
}
]
}
basics-orders テーブルの ARN に対して PutItem と Query だけを許可している状態)- 「次へ」をクリックし、ポリシー名に
basics-orders-table-accessを入力します - 「ポリシーの作成」をクリックします
- 「許可ポリシー」の一覧に、
AWSLambdaBasicExecutionRole-…とbasics-orders-table-accessの 2 つが表示されていることを確認します
手順 9 項目中 7 番目
関数コードを書いてデプロイする
- Lambda コンソールの
basics-orders-functionに戻り、「コード」タブを選択します lambda_function.pyの内容を以下に書き換えます
import json
import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('basics-orders')
def lambda_handler(event, context):
action = event.get('action')
if action == 'put':
item = {
'customer_id': event['customer_id'],
'order_date': event['order_date'],
'item': event['item'],
'quantity': int(event['quantity']),
}
table.put_item(Item=item)
print(f'PutItem: {item}')
return {'statusCode': 200, 'body': json.dumps({'put': item}, ensure_ascii=False)}
if action == 'query':
key_condition = Key('customer_id').eq(event['customer_id'])
if event.get('date_prefix'):
key_condition = key_condition & Key('order_date').begins_with(event['date_prefix'])
response = table.query(KeyConditionExpression=key_condition)
items = response['Items']
print(f'Query: {len(items)} items')
# 数値属性は Decimal 型で返るため、JSON にするときは文字列に変換する
return {'statusCode': 200, 'body': json.dumps({'items': items}, ensure_ascii=False, default=str)}
return {'statusCode': 400, 'body': json.dumps({'error': 'action は put か query を指定してください'}, ensure_ascii=False)}
- 「Deploy」をクリックし、関数が正常に更新されたことを示すメッセージが表示されることを確認します
SDK のクライアント(boto3.resource と Table)はハンドラーの外で初期化しています。関数の同じ実行環境で処理される後続の呼び出しではこれらが再利用されるため、実行時間の短縮につながります。
手順 9 項目中 8 番目
テストイベントで PutItem を実行する
- 「テスト」タブを選択し、「新しいイベントを作成」が選択されていることを確認します
- イベント名に
putOrderを入力し、イベント JSON を以下に書き換えます
{
"action": "put",
"customer_id": "C001",
"order_date": "2026-10-07",
"item": "みかん",
"quantity": 5
}
- 「保存」をクリックしてから「テスト」をクリックします
- 「実行中の関数: 成功」と表示されることを確認し、「詳細」を展開して、Response に
"put"と書き込んだ項目が含まれていることを確認します
手順 9 項目中 9 番目
テストイベントで Query を実行する
- 「テスト」タブで再び「新しいイベントを作成」を選択します
- イベント名に
queryOrdersを入力し、イベント JSON を以下に書き換えます
{
"action": "query",
"customer_id": "C001",
"date_prefix": "2026-10"
}
- 「保存」をクリックしてから「テスト」をクリックします
- 「実行中の関数: 成功」と表示されることを確認し、「詳細」を展開して、Response の
itemsにC001の 3 件(コンソールで作成した 2 件と、Lambda から書き込んだ 1 件)がorder_dateの順に含まれていることを確認します
C001 の 3 件が返されている状態)- DynamoDB コンソールの「テーブルアイテムの探索」でも、Lambda から書き込んだ
2026-10-07の項目が追加されていることが確認できます