CHAPTER 01 / 基礎 / D1
全体像と開発の基礎
サービスの役割、SDK、リトライ、冪等性をつなげる。
01 / まず、アプリの流れをつかむ
DVAは、AWS上のアプリをコードで開発し、安全に動かし、更新し、調査するための試験です。サービス名だけでなく「誰が呼ぶか」「どの権限を使うか」「失敗したら誰が再試行するか」を説明できる状態を目指します。
ここでは小さな注文アプリを共通の例にします。APIで注文を受け付け、DynamoDBへ保存し、時間のかかる通知をキューに分離します。
| 役割 | サービスの例 | 考えること |
|---|---|---|
| 処理を実行する | Lambda / ECS / EC2 | 実行時間、依存関係、状態の置き場所 |
| データを保存する | DynamoDB / S3 / RDS | 検索方法、整合性、トランザクション |
| 処理をつなぐ | API Gateway / SQS / SNS / EventBridge | 同期か非同期か、再試行、順序 |
| 安全に呼ぶ | IAM / STS / Cognito / KMS | 認証、認可、暗号化 |
| 変更して調べる | SAM / Code系 / CloudWatch / X-Ray | テスト、切り戻し、原因の特定 |
02 / リージョン・ARN・状態の置き場所
リージョンはAWSの地理的なサービス提供単位、AZはリージョン内の障害分離の単位です。SDKでは接続先リージョンを意識します。東京のテーブルを別リージョンで検索すると、同名のテーブルが存在せず失敗することがあります。
ARNはAWSリソースを識別する名前です。IAMポリシーのResourceで「どのテーブル・どのバケットか」を指定するときに使います。
arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders
# partition / service / region / account-id / resourceLambdaの実行環境は再利用されることがありますが、いつ破棄されるかは保証されません。注文やログイン状態など、失いたくない状態はDynamoDBなどへ保存します。/tmpやグローバル変数は、キャッシュには使えても永続的な正本にはできません。
03 / SDKは何をしているか
SDKは、APIリクエストの組み立て、認証情報の取得、署名、レスポンスのデコード、一定のエラーの再試行を支援します。アプリはSDKに認証情報を渡す代わりに、通常はデフォルトの認証情報プロバイダーチェーンを使います。
Lambdaは実行ロール、ECSはタスクロール、EC2はインスタンスプロファイルで一時認証情報を取得します。ローカル開発では設定済みのプロファイルやIAM Identity Centerを使います。長期アクセスキーをコードへ埋め込む必要はありません。
import os
import boto3
# 実行環境が持つ一時認証情報とリージョン設定を利用
table = boto3.resource("dynamodb").Table(os.environ["TABLE_NAME"])
def load_order(order_id):
result = table.get_item(Key={"orderId": order_id}, ConsistentRead=True)
return result.get("Item")多くのAWS APIではSignature Version 4(SigV4)でリクエストに署名します。一時認証情報はアクセスキーID・シークレットアクセスキー・セッショントークンの組です。SDKが署名できても、そのロールに操作権限がなければAccessDeniedになります。
公式資料:SDK の認証情報プロバイダーチェーン
04 / 再試行と冪等性はセット
タイムアウトしたとき、サーバー側では書き込みが成功している場合があります。「失敗と表示されたから、処理は実行されていない」と決めつけて再送すると、注文や決済が二重になります。
冪等性(べきとうせい)は、同じ要求を繰り返しても、業務上の結果が重複しない性質です。注文IDや冪等キーを保存し、DynamoDBの条件付き書き込みなどで重複を検出します。業務更新と処理済み記録を原子的に行うには、同じトランザクションに含めるなどの工夫が必要です。
| エラー・状況 | 対応の方向 |
|---|---|
| 一時的なスロットリング、短い通信障害 | 上限回数・総時間を決め、指数バックオフとジッターで再試行 |
| 入力形式の不正、権限不足 | 入力や権限を修正。待つだけの再試行では解決しない |
| 非同期イベントの重複 | 冪等キー・条件付き更新・トランザクションを検討 |
| 依存サービスの障害が継続 | サーキットブレーカーや縮退動作で負荷と障害の連鎖を抑える |
指数バックオフは待ち時間を段階的に増やす方法です。ジッターは待ち時間に乱数を加え、一斉に再試行が集中することを避けます。SDKの再試行と自作ループを重ねすぎると、呼び出し回数が掛け算で増える点にも注意します。
考えてみよう:タイムアウトした注文
注文APIの応答が途切れた。利用者が「注文する」をもう一度押しても、注文を一件にしたい。何をキーに、どこで重複を防ぐ?
考え方・解答例
クライアントで一つの注文意図に同じ冪等キーを付け、サーバーでそのキーの記録を条件付きで作成します。保存済みなら既存の注文結果を返します。外部決済がある場合は決済先の冪等性機能も使い、記録と決済の途中失敗を考えます。
05 / 確認問題
06 / この章の到達点
上のチェックは、このページでの振り返り用です。章単位の進捗は下のボタンで記録できます。
公式資料
内容確認日:2026年11月8日。仕様の詳細や更新情報は、各公式資料で確認できます。
理解を確認できたら、章の進捗を記録できます。