AWS DVA無料問題集です。正解と解説を確認する際は右側のボタンを押下してください。
問題集の完全版は以下Udemyにて発売しているためお買い求めください。問題集への質問はUdemyのQA機能もしくはUdemyのメッセージにて承ります。Udemyの問題1から10問抜粋しております。
多くの方にご好評いただき、講師評価 4.5/5.0 を獲得できております。ありがとうございます。

特別価格: 通常2,600円 → 1,500円
講師クーポン適用で42%OFF
講師クーポン【全出題範囲を網羅+詳細な解説】AWS DVA-C02日本語実践問題集260問(ディベロッパーアソシエイト)
この資格を活かしたキャリア情報
DVA資格の取得後にどんなキャリアが開けるか、詳しくはこちら:
→ DVA合格者の転職市場価値と求人傾向
AWS資格全体のキャリア活用法:
→ AWS資格は転職・キャリアアップでどう活きる?資格別市場価値と実体験
問題文:
ある開発チームは、Amazon ECS on AWS Fargate で稼働する API を AWS CloudFormation で管理しています。チームは、新しいバージョンを利用者に公開する前に、社内の QA チームだけが専用のテスト用エンドポイント経由で新バージョンを検証できる状態を作り、検証が完了してから本番トラフィックを段階的に移行したいと考えています。移行中に Amazon CloudWatch アラームが発報した場合は、旧バージョンへ自動的に切り戻す必要があります。
この要件を満たすために、CloudFormation でどのように構成すべきですか?
選択肢:
A. テンプレートに AWS::CodeDeployBlueGreen 変換を宣言し、Hooks セクションのフックで本番リスナーとテストリスナーを段階的に切り替えます。
B. テンプレートの ECS サービスに UpdatePolicy 属性を追加し、AutoScalingRollingUpdate でテスト用のバッチサイズと一時停止時間を指定します。
C. テンプレートの ECS サービスのデプロイ設定を変更し、minimumHealthyPercent と maximumPercent で段階的な入れ替え幅を指定します。
D. テンプレートをデプロイするパイプラインに手動承認アクションを追加し、テストの完了を承認してからスタックの更新を実行します。
正解:A
A. テンプレートに AWS::CodeDeployBlueGreen 変換を宣言し、Hooks セクションのフックで本番リスナーとテストリスナーを段階的に切り替えます。
正解 テンプレートのTransformセクションにAWS::CodeDeployBlueGreen変換を宣言し、HooksセクションでAWS::CodeDeploy::BlueGreenフックを定義すると、スタック更新がそのままBlue/Greenデプロイとして実行されます。変換とフックはセットで記述する点に注意してください。フックには対象のECSサービス、本番リスナーとテストリスナー、2つのターゲットグループ、トラフィック移行方式を書きます。スタックを更新するとCodeDeployが新しいタスクセットを起動し、テストリスナー宛てのリクエストだけがそちらへ向かうため、利用者に公開する前にQAチームだけで検証できます。検証後は本番リスナーの割合をカナリアまたは線形で移していきます。自動の切り戻しは、スタック更新時のRollbackConfigurationにCloudWatchアラームをロールバックトリガーとして登録することで構成します(テンプレート本体ではなくスタック側の設定です)。
B. テンプレートの ECS サービスに UpdatePolicy 属性を追加し、AutoScalingRollingUpdate でテスト用のバッチサイズと一時停止時間を指定します。
不正解 UpdatePolicy属性を指定できるリソースは決まっており、AutoScalingRollingUpdateはAWS::AutoScaling::AutoScalingGroupの更新方法を制御するためのものです。AWS::ECS::Serviceはこの属性をサポートしていないため、ECSサービスの更新方法を制御する手段になりません。仮にAuto Scalingグループ側に指定したとしても、決められるのはインスタンスの入れ替え順序と一度に置き換える台数だけで、リクエストの宛先を検証用と本番用に分けることはできません。この属性が有効なのは、Auto Scalingグループ配下のインスタンスを無停止で入れ替えたい場合です。
C. テンプレートの ECS サービスのデプロイ設定を変更し、minimumHealthyPercent と maximumPercent で段階的な入れ替え幅を指定します。
不正解 この2つのパラメータはローリングアップデート専用の設定で、入れ替え中に維持する実行タスク数の下限と上限を決めます。設定自体は正しく適用されますが、入れ替え中は新旧のタスクが同じターゲットグループに登録され、ロードバランサーはリクエストをどちらへ振るかを区別しないため、特定のグループだけに新バージョンを見せることができません。この設定が適切なのは、切り替え中の可用性とタスク数の増減幅を調整したい場合です。
D. テンプレートをデプロイするパイプラインに手動承認アクションを追加し、テストの完了を承認してからスタックの更新を実行します。
不正解 手動承認アクションが制御できるのはスタックを更新するタイミングだけで、更新が始まれば全利用者のリクエストが一度に新バージョンへ向かい、段階的な移行にはなりません。承認前の段階では新バージョンが起動していないため、そもそも検証する対象が存在しません。アラームを条件とした切り戻しも働かず、問題が起きれば人が気付いてから手作業で戻すことになります。人による確認を挟みたい場合も、BeforeAllowTrafficライフサイクルイベントフックにLambda関数を割り当て、検証結果を返すまで移行を保留させる方法があります。
全体的な説明
問われている要件
- CloudFormationで管理するECS on Fargateサービスへの新バージョン適用
- 一般公開前にQAチームだけが専用エンドポイントで検証できる仕組み
- 検証後に本番トラフィックを段階的に移行するリリース戦略
- CloudWatchアラーム発報時に自動で切り戻す仕組み
前提知識
Blue/Greenデプロイとは
Blue/Greenデプロイは、現在稼働中の環境(Blue環境)と並行して新しい環境(Green環境)を構築し、検証完了後にトラフィックを切り替えるデプロイ手法です。トラフィックを段階的に移行することで、リスクを抑えながらリリースできます。
AWS CodeDeploy for ECS
CodeDeployはECSサービスのBlue/Greenデプロイをサポートしており、以下の機能を提供します:
- 自動的な新しいタスクセットの作成
- 本番リスナーとテストリスナーによる経路の分離
- 移行速度やテスト期間を指定できるデプロイ設定
- CloudFormationから実行する場合、切り戻しはスタックのロールバックとして行われる
CloudFormationのTransformセクションとHooksセクション
Transformセクションはテンプレートの前処理を行うマクロを指定する場所で、Blue/GreenデプロイではここにAWS::CodeDeployBlueGreen変換を宣言します。
- HooksセクションではAWS::CodeDeploy::BlueGreenフックを定義し、対象のECSサービス、本番リスナーとテストリスナー、ターゲットグループ、トラフィック移行方式を指定します
- 変換とフックはセットで記述する必要があり、片方だけではBlue/Greenデプロイになりません
- スタック更新をトリガーにCodeDeployが呼び出され、タスクセットの作成からトラフィック移行までが自動化されます
- アラームを条件とした自動の切り戻しは、フックではなくスタックのRollbackConfigurationにロールバックトリガーを登録して実現します
リソースごとの更新制御の違い
UpdatePolicy属性はAuto Scalingグループ、Lambdaエイリアス、ElastiCacheレプリケーショングループなど対応するリソースにのみ指定でき、ECSサービスのローリングアップデートはタスク数の下限と上限で調整しますが、いずれも経路の分離は行いません。
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、AWS CodeDeploy を使用した ECS on Fargate アプリケーションの Blue/Green デプロイの流れを表しています。
CloudFormation テンプレートに AWS::CodeDeployBlueGreen 変換と AWS::CodeDeploy::BlueGreen フックを記述することで、新しいタスクセット(Green 環境)が作成され、Application Load Balancer のテストリスナーが Green 環境だけを指すようになります。
QA チームがテストリスナー経由で検証を終えると、本番リスナーのトラフィックが段階的に Green 環境へ移行します。移行中に CloudWatch アラームが発報した場合は、スタックに登録したロールバックトリガーが働き、本番リスナーの向き先が Blue 環境へ戻されます。
解くための考え方
判断の軸は、検証用の経路を本番の経路から分離できるか、移行の比率を制御できるかの2点です。タスクの入れ替え幅を決めるだけの設定や、更新のタイミングを人が承認するだけの仕組みでは、どちらも満たせません。変換とフックを記述すれば、タスクセットの作成、テストリスナーによる経路の分離、本番リスナーでの段階的移行が自動化されます。
なお2025年7月からはAmazon ECS自体にも組み込みのBlue/Greenデプロイ機能が追加されましたが、本問のようにCodeDeployとCloudFormationによる構成を問われた場合は、変換とフックの組み合わせが解答になります。
参考資料
問題文:
ある企業のウェブアプリケーションは、Application Load Balancer の背後にある Amazon EC2 Auto Scaling グループで稼働しています。利用者が少ない深夜帯にスケールインが実行されると、終了したインスタンスにログイン状態と入力途中の一時データが残っていたため、利用者が再ログインを求められる事象が発生しました。担当の開発者は、どのインスタンスがリクエストを受けても同じセッション状態を参照できるようにしたいと考えています。セッションはリクエストのたびに参照されるため応答時間への影響を抑える必要がありますが、ノード障害時の永続性までは求められていません。
この要件を満たすための最適な方法を選んでください。
選択肢:
A. セッションを Amazon ElastiCache for Memcached のクラスターに保存し、各インスタンスから Memcached API で読み書きします。
B. セッションを EC2 インスタンスストアのボリュームに保存し、インスタンスの起動時に他のインスタンスと内容を同期します。
C. セッションを Amazon SQS の FIFO キューに送信し、各インスタンスがキューをポーリングして必要なセッションを取得します。
D. セッションを EC2 インスタンスのローカルに保存したまま、Application Load Balancer のスティッキーセッションで同じインスタンスへ振り分けます。
正解:A
A. セッションを Amazon ElastiCache for Memcached のクラスターに保存し、各インスタンスから Memcached API で読み書きします。
正解 セッションの置き場所をインスタンスの外に移すと、どのインスタンスがリクエストを受けても同じ内容を読み書きできるようになり、アプリケーション自体はステートレスになります。すべてのインスタンスが同じMemcachedクラスターを参照するため、Auto Scalingによる追加や終了はセッションの寿命に影響しません。インメモリ型なので読み書きはマイクロ秒単位で完了し、リクエストのたびに参照しても応答時間の負担になりません。なおノードベースのMemcachedクラスターはディスクへの保存もレプリケーションも行わないため、ノード障害時のセッション消失まで防ぎたい場合はValkeyやRedis OSS、DynamoDBをセッションストアにする構成を検討します。
B. セッションを EC2 インスタンスストアのボリュームに保存し、インスタンスの起動時に他のインスタンスと内容を同期します。
不正解 インスタンスストアはホストコンピュータに物理的に接続された一時的なブロックストレージで、インスタンスが停止または終了するとデータは失われます。スケールインで終了したインスタンスのセッションはその時点で消えるため、セッション喪失を防ぐという要件をストレージの寿命の面で満たせません。また、起動時の同期では稼働中に発生した更新が他のインスタンスへ伝わらないため、リクエストごとに異なるセッション内容が読まれることになります。インスタンスストアが適しているのは、キャッシュやスクラッチ領域のように失われても再作成できるデータです。
C. セッションを Amazon SQS の FIFO キューに送信し、各インスタンスがキューをポーリングして必要なセッションを取得します。
不正解 SQSはメッセージを順に受け渡すためのキューサービスで、キーを指定して特定のセッションを読み出す操作を提供していません。受信したメッセージは可視性タイムアウトの間ほかのコンシューマーから隠れ、削除すればキューから消えるため、同じセッションを複数のインスタンスが繰り返し参照する用途には設計上合いません。目的の利用者のセッションに行き当たるまでメッセージを取り出し続けることになり、参照のたびに待ち時間が発生します。SQSが適しているのは、処理を非同期に切り離して負荷を平準化したい場合です。
D. セッションを EC2 インスタンスのローカルに保存したまま、Application Load Balancer のスティッキーセッションで同じインスタンスへ振り分けます。
不正解 スティッキーセッションは同一クライアントのリクエストを同じターゲットへ送り続ける機能で、ルーティングの面ではセッションを維持できます。しかしセッションの実体はインスタンスのローカルに置かれたままなので、スケールインでそのインスタンスが終了すると保持していたセッションも失われ、利用者は再ログインを求められます。ヘルスチェックの失敗やデプロイによる入れ替えでも同じことが起こります。スティッキーセッションが有効なのは、セッションを外部に持ちながら接続の局所性を高めてキャッシュ効率を上げたい場合です。
全体的な説明
問われている要件
- Application Load BalancerとEC2 Auto Scalingで運用するウェブアプリケーションのセッション管理
- スケールインでインスタンスが終了してもセッションを失わない仕組み
- どのインスタンスがリクエストを受けても同じセッション状態を参照できること
- リクエストごとの参照でも遅延にならない高速なアクセス
前提知識
セッション管理の重要性
ウェブアプリケーションにおけるセッション管理は、利用者の状態(ログイン情報、入力途中のデータ、画面遷移状態など)を保持するために不可欠です。
- セッションデータは利用者の体験に直結する重要な情報
- Auto Scalingでインスタンスが削除されると、そのインスタンスのローカルセッションは失われる
- セッション喪失により、利用者は再ログインや入力のやり直しが必要になる
Amazon ElastiCache for Memcached
ElastiCache for Memcachedは、インメモリキャッシュサービスとして以下の特徴を持ちます:
- 高速性: メモリ上でデータを処理するため、マイクロ秒単位の応答時間でアクセスできます
- 分散型アーキテクチャ: 複数のノードにデータを分散して保存します
- スケーラビリティ: ノードの追加・削除でキャパシティを調整でき、ElastiCacheサーバーレスを使えばキャパシティ管理自体をAWSに任せられます
- マネージドサービス: AWSがパッチ適用や監視を行うため、運用負荷が軽減されます
- 永続化は行わない: ノードベースのMemcachedクラスターはディスクへの保存もレプリケーションも行わないため、失われても再作成できるデータに向いています
セッションを外部に置かない構成の限界
- インスタンスストア: インスタンスのライフサイクルと運命を共にする一時ストレージ
- Amazon SQS: キーを指定した読み出しを行わない、消費型のメッセージキュー
- スティッキーセッション: リクエストの宛先を固定するだけで、セッションの実体は移動しない
セッションストアとしては、耐久性やTTLによる自動失効を重視する場合にAmazon DynamoDB、レプリケーションによる可用性を重視する場合にElastiCache for ValkeyやRedis OSSも候補になります。
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、Amazon EC2 Auto Scaling でスケーリングするウェブアプリケーションにおいて、セッション喪失を防ぐ構成を示しています。
複数の EC2 インスタンスは Application Load Balancer 経由でリクエストを受け取り、セッション情報は共通の Amazon ElastiCache for Memcached に保存されて共有されます。
これにより、スケールインやスケールアウトが発生しても、利用者のセッションを維持したままアプリケーションを運用できます。
解くための考え方
セッション管理の要件を満たすには、セッション状態をEC2インスタンスの外部に切り出し、どのインスタンスからも同じデータを参照できるようにします。判断の軸は、複数インスタンスから同時にアクセスできるか、リクエストのたびに読み書きしても遅くならないか、インスタンスが入れ替わってもデータが残るかの3点です。
ElastiCache for Memcachedはインメモリ型で応答が速く、同じクラスターを共有することでどのインスタンスからも同じセッションを参照できるため、この3点を満たします。ただしノードベースのMemcachedクラスターはデータを永続化しないため、ノード障害時のセッション消失も避けたい要件が加わる場合は、レプリケーションに対応したValkeyやRedis OSS、あるいはDynamoDBを使う構成が適切になります。
一時ストレージはインスタンスと同時に消え、メッセージキューは任意のセッションを名指しで読み出せず、宛先を固定する機能はセッションの置き場所を変えないため、いずれもセッション共有の手段にはなりません。
参考資料
問題文:
ある企業では、領収書の画像が Amazon S3 バケットに保存されるたびに、明細を読み取る AWS Lambda 関数が実行されます。担当の開発者は読み取りロジックを改良した複数のバージョンを順に試す予定です。一度構成を組んだ後は、検証したいバージョンを切り替えるたびにバケット側の通知設定を書き換えなくても済むようにしたいと考えています。
この要件を満たす最適な方法を選択してください。
選択肢:
A. Lambda 関数のエイリアスを作成し、S3 のイベント通知の送信先としてそのエイリアスを登録します。
B. AWS AppConfig の設定プロファイルを切り替えて、S3 から呼び出された関数が参照する値を変更します。
C. Lambda 関数のレイヤーを新しいバージョンに差し替えて、S3 から呼び出される処理内容を切り替えます。
D. Lambda 関数にプロビジョニングされた同時実行を設定して、S3 の通知を受けるバージョンを常時初期化しておきます。
正解:A
A. Lambda 関数のエイリアスを作成し、S3 のイベント通知の送信先としてそのエイリアスを登録します。
正解 エイリアスは特定のバージョンを指す可変のポインタで、それ自体が独立したARNを持ちます。通知の送信先をこのエイリアスARNにしておけば、S3から見た宛先は常に同じままで、エイリアスの向き先を付け替えるだけで実際に動くコードが入れ替わります。たとえば「canary」エイリアスに通知を向けておき、検証したいバージョンを順にそのエイリアスへ割り当てれば、バケット側の設定に一度も触れずに比較でき、問題が出たときも以前のバージョンへ戻すだけで済みます。構成時は、エイリアスARNに対してAmazon S3からの呼び出しを許可するリソースベースのポリシーを付与し、aws:SourceArnとaws:SourceAccountで呼び出し元のバケットとアカウントを限定します。
B. AWS AppConfig の設定プロファイルを切り替えて、S3 から呼び出された関数が参照する値を変更します。
不正解 AppConfigはアプリケーションの設定値を外部で管理し、デプロイなしに切り替えるためのサービスです。関数の中で参照する値を変えることはできますが、通知の宛先がどのバージョンになるかには関与しないため、実行されるコードそのものは切り替わりません。読み取りロジックが異なる複数のバージョンを試すという要件では、比較したいコードがすべて同じ関数に同居していることが前提になってしまいます。AppConfigが適しているのは、機能フラグやしきい値を段階的に展開したい場合です。
C. Lambda 関数のレイヤーを新しいバージョンに差し替えて、S3 から呼び出される処理内容を切り替えます。
不正解 レイヤーは複数の関数で共有するライブラリや実行時の依存関係をまとめて配布するための仕組みで、差し替えるたびに関数の設定を更新する操作が必要になります。公開済みのバージョンはレイヤー構成を含めて固定されているため、差し替えが反映されるのは$LATESTだけです。検証したいバージョンを名指しで行き来することも、問題が出たときに以前の組み合わせへ即座に戻すこともできず、切り替えの単位が依存関係の側にずれています。レイヤーが役に立つのは、共通ライブラリの更新を複数の関数へまとめて配りたい場合です。
D. Lambda 関数にプロビジョニングされた同時実行を設定して、S3 の通知を受けるバージョンを常時初期化しておきます。
不正解 プロビジョニングされた同時実行は、指定した数の実行環境をあらかじめ初期化しておくことでコールドスタートを避ける機能です。バージョンやエイリアスに対して公開後も設定できますが、決められるのは待機させる実行環境の数だけで、イベントの送信先がどれになるかを制御する機能ではありません。初期化しておいたバージョンに通知が届く保証もありません。この機能が有効なのは、起動の遅延が許容できないワークロードで応答時間を安定させたい場合です。
全体的な説明
問われている要件
- Amazon S3への領収書画像の保存をトリガーとしたLambda関数の自動実行
- 読み取りロジックが異なる複数のバージョンを順に検証すること
- バージョンを切り替えるたびにバケット側の通知設定を書き換えずに済む仕組み
- 検証から本番適用までのバージョン管理の簡素化
前提知識
Amazon S3イベント通知
S3イベント通知は、S3バケット内で特定の操作(オブジェクトの作成、削除、復元など)が発生した際に、自動的に他のAWSサービスに通知を送る機能です。
- 対象とするイベントタイプを指定できます(s3:ObjectCreated:Put、s3:ObjectCreated:CompleteMultipartUpload、s3:ObjectRemoved:Delete など)
- 特定のプレフィックスやサフィックスを持つオブジェクトだけを対象にできます
- 通知先としてLambda関数、SQSキュー、SNSトピック、Amazon EventBridgeを指定できます
- 配信は通常数秒以内ですが1分以上かかる場合もあり、少なくとも1回の配信として設計されているため、重複を前提とした冪等な実装が必要です
Lambda関数のバージョニング
Lambda関数では、コードの変更履歴を管理するためのバージョニング機能があります。
- $LATEST: 常に最新の編集可能なバージョンを指す
- 番号付きバージョン: 公開時に作成されるバージョン(例:1、2、3…)
- 各バージョンは独立したARNを持つ
- 一度公開されたバージョンは、コードやレイヤーを含む大半の設定が不変(プロビジョニングされた同時実行やトリガーなど一部の運用設定は公開後も変更可)
Lambda エイリアス
エイリアスは特定のLambda関数バージョンに対して付けるラベル機能です。
- 人間が理解しやすい名前を使用(例:prod、staging、canary)
- エイリアス自体も独自のARNを持つ
- エイリアスが指すバージョンは変更可能
- 加重エイリアスのルーティング設定により、2つのバージョン間でトラフィックを比率配分でき、カナリアリリースに利用できます($LATESTは指定できません)
- S3イベント通知やAPI Gatewayなど、外部サービスからの呼び出し先として使用可能
呼び出し先を変えない設定項目
Lambda関数には多くの設定項目がありますが、イベントの送信先を決めるのはARNだけです。レイヤーは依存関係の配布単位、外部の設定管理サービスは関数の中で参照される値、プロビジョニングされた同時実行は初期化済みの実行環境の数を決めるもので、いずれも経路の選択には関与しません。
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、Lambda エイリアスを使用した S3 イベント通知とバージョン管理の構成を表しています。
S3 イベント通知の送信先を canary エイリアスの ARN にしておくことで、エイリアスが指すバージョンを変更するだけで、実行されるコードを切り替えられます。バケットの通知設定に手を入れることなく、複数のバージョンを順に検証できます。
本番用の prod エイリアスは別のバージョンを指したままなので、検証中も本番の呼び出し経路は影響を受けません。
解くための考え方
判断の軸は、通知の宛先となるARNを固定したまま、その先で動くコードを差し替えられるかどうかです。関数の設定項目をいくら変更しても、宛先が同じ実体を指している限り、実行されるコードは変わりません。
エイリアスだけが「宛先は変えずに中身を差し替える」という要求に応えられます。開発フローでは「dev」「canary」「prod」といったエイリアスを使い分けることで、段階的なデプロイメントも実現できます。
参考資料
問題文:
ある企業が、注文処理を担う Java アプリケーションを ap-northeast-1 リージョンの Amazon EC2 インスタンス群で稼働させています。開発チームのメンバーがソースコードに変更をコミットしたら、AWS CodePipeline がビルドを実行し、稼働中の EC2 インスタンス上のアプリケーションを新しいバージョンへ入れ替えるところまで自動化する必要があります。 この要件を満たすために最適なサービスの組み合わせを選んでください。
選択肢:
A. GitLab、AWS CodeBuild、AWS CodeArtifact
B. GitLab、AWS CodeBuild、Amazon Q Developer
C. GitLab、AWS CodeBuild、Amazon S3
D. GitLab、AWS CodeBuild、AWS CodeDeploy
正解:D
A. GitLab、AWS CodeBuild、AWS CodeArtifact
不正解 CodeArtifactはMaven、npm、PyPIなどのパッケージを保管して社内に配布するためのリポジトリです。ビルド時に依存ライブラリを取得する先としては有用で、バージョンを固定して再現性を高められますが、生成したアーティファクトをEC2インスタンスへ届けて稼働中のプロセスを入れ替える働きはありません。この組み合わせではパイプラインがアーティファクトを作った時点で終わり、リリース作業が人手に残ります。
B. GitLab、AWS CodeBuild、Amazon Q Developer
不正解 Amazon Q Developerは、コードの生成、リファクタリングの提案、レビュー、言語ランタイムのアップグレード支援を行う生成AIアシスタントです。開発の速度と品質には寄与しますが、パイプラインの中でアーティファクトを配布するステージを担う機能は備えていません。したがって、コミットからEC2上のアプリケーション入れ替えまでをつなぐ最後の一手が欠けたままになります。
C. GitLab、AWS CodeBuild、Amazon S3
不正解 S3はビルド成果物の保管先として妥当で、CodePipelineにもバケットへファイルを配置するデプロイアクションが用意されています。ただしその動作はオブジェクトを書き込むところまでで、EC2インスタンスに入って古いバージョンを停止し、新しいJARへ差し替えて起動し直す処理は行いません。配置そのものが公開作業になる静的ウェブサイトであれば完結しますが、稼働中のインスタンス上でアプリケーションを入れ替える今回の要件には届きません。
D. GitLab、AWS CodeBuild、AWS CodeDeploy
正解 3つのサービスが、パイプラインのソース、ビルド、デプロイの各ステージに1対1で対応します。GitLabはCodeConnectionsで接続され、リポジトリへのプッシュを検知してパイプラインを起動します。CodeBuildはbuildspecの記述に従ってJavaをコンパイルし、単体テストを通したうえでJARをアーティファクトとして出力します。CodeDeployはappspecの定義をもとに、稼働中のEC2インスタンスへそのJARを届け、停止・配置・起動のライフサイクルイベントを順に実行して入れ替えます。デプロイが失敗した場合は直前のリビジョンへ自動的に戻せます。
全体的な説明
問われている要件
- コミットを起点としたパイプラインの自動起動
- Javaソースコードのコンパイルとアーティファクトの生成
- 稼働中のEC2インスタンス上でのアプリケーションの入れ替え
- CodePipelineでこれらを1本のパイプラインとしてつなぐこと
前提知識
AWS CodeDeploy がEC2で行うこと
CodeDeployは、アーティファクトを配布して実行中のアプリケーションを入れ替える役割を担います:
- appspec.ymlにデプロイ先のパスとライフサイクルイベントのフックを記述する
- 対象のEC2インスタンスにCodeDeployエージェントを常駐させ、指示を受けて配置と再起動を行う
- ApplicationStop、BeforeInstall、AfterInstall、ApplicationStart といったフックでスクリプトを実行できる
- EC2ではインプレースとBlue/Greenのどちらも選べ、オンプレミスインスタンスはインプレースのみ
- LambdaとECSが対象の場合はBlue/Greenのみで、移行の速さをカナリア、線形、一括から指定する
- デプロイに失敗したときは直前に成功したリビジョンへ自動で戻せる
AWS CodeBuild がビルドで行うこと
CodeBuildはビルド環境をマネージドに払い出し、成果物を次のステージへ渡します:
- buildspec.ymlのフェーズ定義に沿ってコンパイル、テスト、パッケージングを実行
- Java、Python、Node.js、.NETなどに対応し、独自のDockerイメージも指定できる
- artifactsセクションで指定したファイルがパイプラインのアーティファクトになる
- ビルドの実行時間に対する従量課金で、待機中のコストは発生しない
GitLab をパイプラインのソースにする方法
コミットを検知する役割は、Gitリポジトリとその接続設定が担います:
- AWS CodeConnections(旧称 AWS CodeStar Connections)でGitLabへの接続を作成する
- 接続を作成したうえで、パイプラインのソースアクションにリポジトリとブランチを指定する
- プッシュとマージリクエストのどちらもパイプラインの起動条件にできる
- 新規のお客様へのAWS CodeCommitの提供は2024年7月25日に終了しており、外部のGitホスティングを接続する形が現在の標準的な構成
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、注文処理アプリケーションのソースコードがコミットされてからEC2インスタンス上で新しいバージョンに入れ替わるまでの流れを表しています。
GitLabのリポジトリへのプッシュは、CodeConnections経由でCodePipelineに伝わり、ソースステージがコードを取得します。ビルドステージではCodeBuildがJavaをコンパイルしてJARを生成し、アーティファクトとしてCodePipelineへ返します。デプロイステージではCodeDeployがそのJARを受け取り、稼働中のEC2インスタンスへ配置してアプリケーションを入れ替えます。
解くための考え方
判断の軸は、コミットの検知・ビルド・EC2上での入れ替えという3つの役割が、選択肢の中で欠けずに割り当てられているかどうかです。
パッケージを配布するリポジトリは依存ライブラリの取得先、オブジェクトストレージは成果物の保管先、生成AIアシスタントは開発作業の支援と、いずれもパイプラインに置く価値はありますが、稼働中のインスタンスに入ってプロセスを入れ替える役割は持ちません。3つ目の要素がその役割を果たすかどうかだけが分かれ目になります。
CodeDeployはエージェントを通じてインスタンス上のライフサイクルイベントを実行できる唯一の選択肢であり、GitLabとCodeBuildと並べることでコミットからリリースまでが1本のパイプラインになります。
参考資料
問題文:
ある企業の小規模な開発チームが、取引先企業の担当者向けに実績データを確認するモバイルアプリケーションを、限られた予算で開発しようとしています。担当者は自分でアプリに登録でき、かつ取引先企業が既に運用している SAML 2.0 ID プロバイダーの資格情報でサインインできる必要があり、利用者の増加にも自動的に追随できる仕組みが求められています。
この要件を満たす最適な AWS のサービスを選択してください。
選択肢:
A. Amazon API Gateway のオーソライザーによる検証
B. Amazon Elastic Container Service 上での自前実装
C. Amazon Cognito のユーザープール
D. AWS Security Token Service による認証情報の発行
正解:C
A. Amazon API Gateway のオーソライザーによる検証
不正解 オーソライザーは、リクエストに添えられたトークンや署名を受け取り、そのリクエストをバックエンドへ通してよいかを判定する仕組みです。判定の材料となる利用者を保管するディレクトリをAPI Gateway自身が持たないため、担当者の登録先にはなりません。取引先企業のSAML 2.0 IDプロバイダーとの連携も、オーソライザーが直接引き受けるものではなく、別のサービスが発行済みのトークンを検証する形になります。認証基盤そのものは別途用意する必要があります。
B. Amazon Elastic Container Service 上での自前実装
不正解 ECSはコンテナ化したアプリケーションを実行するためのオーケストレーションサービスであり、利用者の登録や認証を提供する機能は含まれていません。オープンソースのID基盤をコンテナとして載せれば認証は成立しますが、ユーザー属性の設計、SAMLアサーションの検証、トークンの発行と失効、多要素認証、脆弱性への追随までを自チームで背負うことになります。限られた予算という制約のもとでは、コンテナの運用と認証基盤の保守が二重の負担になります。
C. Amazon Cognito のユーザープール
正解 ユーザープールはアプリの利用者を保管するディレクトリとして働き、サインアップ、サインイン、パスワードのリセット、多要素認証といった画面と処理を設定だけで用意できます。ここに取引先企業のSAML 2.0 IDプロバイダーをメタデータURLまたはメタデータファイルで登録すると、Cognitoがホストするサインインページから相手のIDプロバイダーへ担当者をリダイレクトし、返送されたアサーションを検証したうえで、IDトークンとアクセストークンをアプリに渡します。担当者が自分で登録する経路と、取引先企業の資格情報でサインインする経路の両方を、同じユーザープールで受けられる点がこの要件に合致します。料金は月間アクティブユーザーに連動するため、利用者が少ない立ち上げ期の負担が小さく、利用が伸びてもプール側の増強作業は発生しません。
D. AWS Security Token Service による認証情報の発行
不正解 STSは一時的なセキュリティ認証情報を発行するサービスで、AssumeRoleWithSAMLのようにSAMLアサーションを引き換える操作も備えています。ただしSTSが払い出すのはAWSのAPIやリソースを操作するための認証情報であり、アプリケーション自身のサインアップ画面やサインイン画面、ユーザー属性を保持するディレクトリは提供しません。担当者が自分でアプリに登録するという要件も、パスワードのリセットや多要素認証といったユーザー管理機能も、STS単体では実現できません。
全体的な説明
問われている要件
- 限られた予算での実績データ確認アプリの開発
- 取引先企業が運用する既存のSAML 2.0 IDプロバイダーとの連携
- 担当者自身によるアプリへの登録とサインインの実現
- 利用者の増加に自動で追随できる構成
前提知識
エンドユーザー認証とAWSリソース認証の違い
同じ「認証」でも、対象が誰かによって使うサービスが分かれます:
- アプリの利用者を保管し、サインアップ・サインイン画面まで含めて提供するのがCognitoのユーザープール
- 認証済みの主体にAWSリソース操作用の一時的な認証情報を渡すのがSTSとCognitoのIDプール
- リクエストを通すかどうかを判定するだけの層がAPI Gatewayのオーソライザー
- 不特定多数の外部利用者をIAMユーザーとして作る運用は、アカウントあたりの上限もあり成立しません
ユーザープールへのSAML IDプロバイダーの登録
ユーザープールは外部のIDプロバイダーを取り込む窓口を持っています:
- AD FS、Shibboleth、Okta、Ping Identityなど、SAML 2.0に準拠していれば連携できる
- 登録はメタデータのURLまたはファイルの取り込みと、属性のマッピング設定で完了する
- サインインはCognitoがホストするページへのリダイレクトを伴うフローで行い、アプリが直接ユーザー名とパスワードを受け取る認証フローでは利用できない
- 連携で作られたユーザーもプール内のユーザーとして扱われ、自分で登録した担当者と同じアプリから利用できる
ユーザープールが標準で備える保護機能
自作を避けたい処理の多くが、設定項目として用意されています:
- 多要素認証はSMS、Eメール、時刻ベースのワンタイムパスワード(TOTP)から選べる
- パスワードレスのサインイン手段としてパスキーも利用できる
- 侵害された資格情報の検出やリスクベースの適応型認証をプランに応じて有効化できる
- トークンの有効期限、パスワードポリシー、サインアップ時の検証方法を個別に設定できる
費用と拡張性の考え方
- 課金は月間アクティブユーザー(MAU)に連動し、待機中の固定費は発生しない
- 機能プランはLite、Essentials、Plusの3段階から選び、新規作成時の既定はEssentials(2024年11月に導入)
- SAMLおよびOIDCフェデレーションの無料枠は月間50MAUまでで、超過分は別建ての単価になる
- 数百万規模の利用者まで自動的にスケールし、複数のアベイラビリティーゾーンで冗長化される
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、実績データ確認アプリの認証と、その後のAPI呼び出しまでの経路を表しています。
担当者はモバイルアプリからCognitoユーザープールへ認証を要求します。SAML連携が構成されているため、ユーザープールはフェデレーション機能を通じて取引先企業のSAML 2.0 IDプロバイダーへリダイレクトし、返ってきたアサーションを検証してトークンを発行します。
図の下側にあるAmazon API GatewayとAWS Lambdaは、実績データを返すバックエンドです。ここでAPI Gatewayが担うのは、アプリが添えたトークンを検証してリクエストを通すかどうかを判断する役割であり、担当者を登録して保管しているのは一貫してCognitoのユーザープールです。認証基盤とAPIの入り口が別の層であることが、この図から読み取れます。
解くための考え方
判断の軸は、利用者を保管するディレクトリと、外部IDプロバイダーとの連携を、どちらも作り込まずに手に入れられるかどうかです。
コンテナ基盤の上に認証を自作する構成では、ディレクトリも連携も自前で実装・保守することになり、限られた予算という制約と衝突します。一時的な認証情報を発行する仕組みや、リクエストの通過可否を判定する層は、いずれも認証済みの主体を前提に動くため、担当者の登録先にはなりません。
Cognitoのユーザープールであれば、登録・サインイン・パスワード管理が標準機能として使え、SAML 2.0 IDプロバイダーの登録も設定作業だけで完了します。マネージドサービスであるため、サーバー管理やスケーリング対応も不要です。
参考資料
問題文:
注文状況を照会する REST API を、ある企業が自社の AWS アカウントの Amazon API Gateway で公開しています。開発者は、パートナー企業が保有する別の AWS アカウントの IAM ユーザーだけに、この API の呼び出しを許可したいと考えています。
この要件を満たすための最適な手順を 2つ 選択してください。
選択肢:
A. API にリソースポリシーをアタッチし、Principal にパートナー企業の IAM ユーザー ARN を列挙して呼び出しを許可します。
B. Amazon Cognito ユーザープールを作成し、パートナー企業の各 IAM ユーザーをユーザープールのユーザーとして登録します。API のメソッド認証タイプを COGNITO_USER_POOLS に設定します。
C. API キーを発行してパートナー企業に配布し、メソッドで API キーを必須に設定して使用量プランに関連付けます。
D. Amazon Cognito ID プールを作成し、パートナー企業の各 IAM ユーザーを ID プールのアイデンティティとして追加します。API のメソッド認証タイプを COGNITO_USER_POOLS に設定し、リクエストヘッダーにアクセストークンを付与します。
E. 各 IAM ユーザーに execute-api:Invoke を許可する IAM ポリシーをアタッチし、メソッドの認証タイプを AWS_IAM にして署名バージョン 4 でリクエストに署名します。
正解:A、E
A. API にリソースポリシーをアタッチし、Principal にパートナー企業の IAM ユーザー ARN を列挙して呼び出しを許可します。
正解 リソースポリシーはAPI側に置くアクセス制御で、「誰からの呼び出しを受け入れるか」をAPIの所有者が決めるためのものです。Principalにパートナー企業のIAMユーザーARN(arn:aws:iam::111122223333:user/tanaka など)を並べ、Actionにexecute-api:Invoke、ResourceにAPIのARNを指定します。呼び出し元が別アカウントに属する場合、AWSは相手側のIAMポリシーだけでは呼び出しを認めず、API側のポリシーにも明示的な許可がなければ拒否として扱います。したがってこの設定は、パートナー企業側の準備とは別に必ず必要になります。リソースポリシーはREST APIの機能でHTTP APIには存在せず、内容を保存しただけでは実行時の挙動が変わらないため、変更後はステージへの再デプロイを行います。
B. Amazon Cognito ユーザープールを作成し、パートナー企業の各 IAM ユーザーをユーザープールのユーザーとして登録します。API のメソッド認証タイプを COGNITO_USER_POOLS に設定します。
不正解 IAMユーザーとユーザープールのユーザーは別々の場所で管理される独立した主体で、両者の間にアカウントを移送したり紐付けたりする仕組みは用意されていません。ユーザープールへのサインインはユーザー名とパスワード、ソーシャルログイン、SAMLやOIDCによるフェデレーションで行うため、IAMのアクセスキーとシークレットキーでサインインしてトークンを得ることもできません。結果としてパートナー企業のIAMユーザーは`COGNITO_USER_POOLS`の関門を通過できません。この方式が生きるのは、アプリのエンドユーザーをユーザープールで管理する場合です。
C. API キーを発行してパートナー企業に配布し、メソッドで API キーを必須に設定して使用量プランに関連付けます。
不正解 API GatewayのAPIキーは呼び出し元を識別してスロットリングやクォータを適用するための仕組みで、公式ドキュメントでもAPIへのアクセスを制御する認証または認可の手段としては使わないよう明記されています。同じ使用量プランに複数のAPIが含まれる場合、1つのAPIで有効なキーを持つ呼び出し元はそのプラン内のすべてのAPIを呼び出せてしまいます。さらにAPIキーは単なる文字列であり、どのアカウントのどのIAMユーザーが送信したのかを識別できないため、特定のIAMユーザーだけに限定するという要件を満たせません。
D. Amazon Cognito ID プールを作成し、パートナー企業の各 IAM ユーザーを ID プールのアイデンティティとして追加します。API のメソッド認証タイプを COGNITO_USER_POOLS に設定し、リクエストヘッダーにアクセストークンを付与します。
不正解 Cognito IDプールは、ユーザープールやGoogle、SAMLプロバイダーなど外部のアイデンティティプロバイダーで認証済みの主体に、一時的なAWS認証情報を払い出す仕組みです。IAMユーザーをIDプールのアイデンティティとして追加するという概念自体が存在しません。加えて`COGNITO_USER_POOLS`はユーザープールに対応する認証タイプであり、IDプールを指定するものではありません。仮にIDプールを使う構成にしても、最終的には払い出された一時認証情報でリクエストに署名して`AWS_IAM`認証を通す形になり、ヘッダーにアクセストークンを載せる方式にはなりません。
E. 各 IAM ユーザーに execute-api:Invoke を許可する IAM ポリシーをアタッチし、メソッドの認証タイプを AWS_IAM にして署名バージョン 4 でリクエストに署名します。
正解 こちらは呼び出し元側の準備にあたります。パートナー企業のアカウントで、対象APIのARNに対するexecute-api:Invokeを許可するアクセス許可ポリシーを作り、呼び出しを認めるIAMユーザーにだけアタッチします。API側ではメソッドの認証タイプを`AWS_IAM`に変更し、署名のないリクエストを受け付けない状態にします。呼び出し時はIAMユーザーのアクセスキーとシークレットキーからAWS Signature Version 4の署名を計算してリクエストに添えるため、API Gatewayは送信者がどのアカウントのどのIAMユーザーかを特定したうえで認可を判断できます。
全体的な説明
問われている要件
- Amazon API GatewayのREST APIへのアクセス制御
- パートナー企業のAWSアカウントにあるIAMユーザーのみに呼び出しを限定
- 最適な手順を2つ選択する必要がある
- クロスアカウントでのIAMベース認証の実装
前提知識
クロスアカウントで許可が二重に必要になる理由
同じアカウント内と別アカウントとでは、許可の判定ルールが変わります:
- 同一アカウント内なら、IAMアクセス許可ポリシーとリソースポリシーのどちらかが許可していれば呼び出せる
- 別アカウントからの呼び出しでは、両方が明示的に許可していなければ通らない
- どちらかが許可も拒否もしない状態は、暗黙的な拒否として扱われる
- そのため、API側の設定と呼び出し元側の設定を1つずつ揃える必要がある
呼び出し元を特定する仕組み(AWS_IAM と SigV4)
AWS_IAM認証は、リクエストの署名から送信者を割り出す方式です:
- 呼び出し元はアクセスキーとシークレットキーで、ヘッダーやペイロード、タイムスタンプを含む署名を生成する
- API Gatewayは署名を検証して、どのアカウントのどのプリンシパルからの要求かを確定する
- タイムスタンプが署名に含まれるため、傍受したリクエストの使い回しが効かない
- 特定された主体に対して、IAMポリシーとリソースポリシーによる認可判定が行われる
API Gateway が提供する他の認可方式との違い
要件に合う方式を選ぶには、それぞれが何を検証するのかを押さえます:
- Cognitoユーザープールのオーソライザーは、ユーザープールが発行したJWTを検証する(OAuthスコープを構成した場合はアクセストークンも扱える)
- Lambdaオーソライザーは、受け取ったトークンやヘッダーを自作の関数で判定し、許可内容を表すポリシードキュメントを返す
- APIキーは使用量プランと組み合わせた識別とスロットリングのための値で、認可の判断材料には使わない
- いずれもAWSの署名を検証するものではないため、IAMユーザーという主体の限定にはAWS_IAMを用いる
リソースポリシーを扱ううえでの注意点
- リソースポリシーはREST APIの機能で、HTTP APIには存在しない
- 保存しただけでは反映されず、ステージへ再デプロイして初めて有効になる
- Principalにワイルドカードを使うと意図しない呼び出し元まで通るため、ARNを列挙する
- Conditionでソースアカウントや送信元IPを併用すると、さらに絞り込める
解くための考え方
判別の軸は、許可を出す場所が1か所で足りるのか2か所必要なのかという点にあります。
同じアカウント内の呼び出しであれば、呼び出す側のポリシーとAPI側のポリシーのどちらかに許可があれば通ります。ところが今回のように呼び出し元が別のアカウントに属する場合、AWSは両方の許可が揃っていることを求め、片方が沈黙していれば拒否として扱います。選ぶべき手順が2つになるのはこのためで、片側だけを丁寧に設定しても注文状況照会APIには到達できません。
API側で行うのは、リソースポリシーのPrincipalにパートナー企業のIAMユーザーARNを書き並べ、保存後にステージへ再デプロイすることです。呼び出し元側で行うのは、同じアクションを許可するポリシーを対象のIAMユーザーにアタッチし、メソッドの認証タイプをAWS_IAMへ切り替えて、署名付きのリクエストを送ることです。
残る手順は、呼び出し元を文字列で見分けるだけの仕組みか、アプリのエンドユーザーを保管するディレクトリを前提とした仕組みのいずれかで、どちらも別アカウントのIAMユーザーという主体そのものを特定できません。
参考資料
問題文:
ある開発者が、各拠点に設置したセンサーの計測値を単一の Amazon DynamoDB テーブルに蓄積しています。データ取り込み、管理ダッシュボード、レポート生成という複数の内製アプリケーションが同じテーブルを読み書きしており、テーブルのデータが変更されるたびに、その変更を提携先のシステムが提供する外部 API へ送信する必要があります。
このタスクを達成するための最適な手順の組み合わせを選択してください。(2つ選択)
選択肢:
A. テーブルの項目変更を Amazon EventBridge のイベントバスへ直接発行するようにテーブルを構成し、ルールのターゲットに API 送信先 (API destination) を指定します。
B. DynamoDB Streams のレコードを Amazon SNS トピックへ配信し、外部 API の HTTPS エンドポイントをそのトピックにサブスクライブさせます。
C. ストリームをイベントソースとする AWS Lambda 関数を作成し、受け取ったレコードから外部 API を呼び出す処理を実装します。
D. テーブルで DynamoDB Streams を有効にし、変更前後の項目を含むストリームレコードが書き出されるようにします。
E. テーブルの更新をトリガーに AWS Step Functions のステートマシンが起動するよう DynamoDB に登録します。
正解:C、D
A. テーブルの項目変更を Amazon EventBridge のイベントバスへ直接発行するようにテーブルを構成し、ルールのターゲットに API 送信先 (API destination) を指定します。
不正解 DynamoDBが項目レベルの変更をEventBridgeへ直接発行する設定はテーブル側に存在しません。EventBridgeと組み合わせる場合はEventBridge Pipesを使い、そのソースとして指定するのはテーブルではなくDynamoDB Streamsです。API送信先はEventBridgeから外部のHTTPエンドポイントを呼ぶ機能として実在しますが、変更が届く経路が成立していないため呼び出されません。
B. DynamoDB Streams のレコードを Amazon SNS トピックへ配信し、外部 API の HTTPS エンドポイントをそのトピックにサブスクライブさせます。
不正解 ストリームのレコードをSNSトピックへ直接流し込む配信設定は用意されておらず、間にレコードを読み取ってトピックへ発行する処理が必要です。受信側にも制約があり、SNSのHTTPSサブスクリプションは購読開始時の確認リクエストへの応答とSNS固有のメッセージ形式の解釈を求めるため、提携先システムの既存APIをそのまま登録できません。
C. ストリームをイベントソースとする AWS Lambda 関数を作成し、受け取ったレコードから外部 API を呼び出す処理を実装します。
正解 イベントソースマッピングを作成すると、Lambdaサービスがシャードを定期的に読み取り、たまったレコードをバッチにまとめて関数へ渡します。開発者が用意するのは、レコードから計測値を取り出して提携先システムが求める形式に整え、HTTPSで送る処理だけです。関数の実行数はシャード数に追随し、並列化係数を1から10の範囲で指定すれば1シャードあたりの同時実行をさらに増やせます。送信に失敗したときの挙動は、再試行の上限、レコードを捨てるまでの経過時間、失敗時のバッチ分割、退避先のキューやトピックといった設定で細かく調整できます。配信は最低1回の保証であり同じレコードが再度届くため、送信処理はべき等に作ります。
D. テーブルで DynamoDB Streams を有効にし、変更前後の項目を含むストリームレコードが書き出されるようにします。
正解 センサーの計測値がどのアプリケーションから更新されても、テーブル自身が変更を捉えて時系列のレコードとして書き出すため、通知の起点をアプリケーション側に分散させずに済みます。有効化の際に選ぶビュータイプのうち、変更前後の両方を含む設定にしておくと、提携先システム側で差分を判断する材料まで渡せます。書き出されたレコードはシャードに分かれて並び、パーティションキーの単位では順序が保たれます。レコードが残るのは24時間で、それ以降は自動的に消えるため、受信側の障害が長引く場合に備えて再送の設計を考えておきます。なお同じシャードを同時に読む処理は2つまでに抑えることが推奨されています。
E. テーブルの更新をトリガーに AWS Step Functions のステートマシンが起動するよう DynamoDB に登録します。
不正解 テーブルに登録できる変更検知の仕組みはDynamoDB Streamsだけで、ステートマシンをトリガーとして直接結び付ける設定は用意されていません。Step Functionsは呼び出される側のオーケストレーターであり、データストアの変更を自ら検知する役割は持たないため、いずれにしてもストリームの有効化と、それを読み取る処理が前段に必要になります。
全体的な説明
問われている要件
- 複数のアプリケーションが読み書きするDynamoDBテーブルの変更監視
- データ変更時の外部APIへの自動通知機能
- 効率的で信頼性の高い変更検知とAPI連携の実装
- リアルタイムでの変更追跡システムの構築
前提知識
DynamoDBの変更を外部へ流す経路
項目レベルの変更を他のサービスへ届ける入口は1つに限られます:
- テーブルで有効にできる変更キャプチャの仕組みはDynamoDB Streamsで、INSERT、MODIFY、REMOVEの各イベントを記録する
- SNS、SQS、Step FunctionsなどへテーブルからPUSHする設定は存在しない
- EventBridgeへ流す場合もEventBridge Pipesのソースとして DynamoDB Streams を指定する
- したがって、どの構成を採るとしてもストリームの有効化が前提になる
ストリームレコードの中身と保持
書き出されるレコードには、後続の処理が必要とする情報が含まれます:
- イベントの種別、変更されたアイテムのプライマリキー、タイムスタンプ
- ビュータイプに応じた変更前後のアイテム値(KEYS_ONLY、NEW_IMAGE、OLD_IMAGE、NEW_AND_OLD_IMAGES)
- 保持期間は24時間で、経過したレコードは自動的に削除される
- 同一シャードを同時に読み取るコンシューマーは2つまでが推奨で、超えるとスロットリングが起きやすい
Lambdaのイベントソースマッピングによる読み取り
ストリームの読み取りはLambdaサービス側が代行します:
- シャードのポーリング、バッチ化、チェックポイントの管理は自動で行われる
- 既定では1シャードにつき1つの呼び出しだが、並列化係数 (ParallelizationFactor) に1〜10を指定すると同時実行を最大10まで増やせる
- 最大再試行回数 (MaximumRetryAttempts)、最大保持期間 (MaximumRecordAgeInSeconds)、バッチ二分割 (BisectBatchOnFunctionError)、失敗レコードの送信先 (OnFailure) を指定できる
- 部分的なバッチ応答 (ReportBatchItemFailures) を使うと、失敗したレコードだけを再処理できる
外部API呼び出しで気を付けること
- HTTPクライアントのタイムアウトは関数のタイムアウトより短く設定する
- 認証情報はコードに埋め込まず、Secrets ManagerやParameter Storeから取得する
- 送信先のレート制限に合わせて指数バックオフで再試行する
- 配信保証が最低1回であることを前提に、送信処理をべき等に設計する
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、センサーの計測値テーブルに加えられた変更が、提携先システムの外部 API へ届くまでの経路を表しています。
データ取り込みアプリ、管理ダッシュボード、レポート生成アプリはそれぞれ独立してテーブルを更新しますが、変更を記録するのはテーブル側の DynamoDB Streams であり、通知の仕組みを各アプリに実装する必要はありません。
イベントソースマッピングで結び付けられた Lambda 関数がストリームからレコードを受け取り、解析したうえで外部 API へ HTTPS リクエストを送信します。この経路をたどるため、どのアプリケーション経由の更新であっても漏れなく通知されます。
解くための考え方
判別の軸は、テーブルに加わった変更をどこで捕まえるかです。
DynamoDBが自ら変更を他のサービスへ押し出す設定はテーブルに用意されておらず、項目の作成・更新・削除を拾い上げる入口はStreamsに限られます。したがってどの構成を思い描いたとしても、最初の一手はストリームの有効化に固定されます。この点さえ押さえていれば、テーブルから別のサービスへ直接送ると書かれた手順はまとめて外せます。
捕まえた変更を提携先システムへ届けるには、レコードを読み取ってHTTPSリクエストを組み立てる処理が要ります。ここをLambdaに任せると、シャードの読み取りとバッチ化はLambdaサービスが引き受けるため、開発者は送信処理だけを書けば済みます。計測値の流量が増えてもシャードに追随して実行数が伸びるので、常駐する受信基盤を別に用意する必要もありません。
読み取り側をコードで書かずに済ませたい場合はEventBridge Pipesという手もありますが、その場合もソースに指定するのはストリームであり、最初の一手が変わるわけではありません。
参考資料
問題文:
ある企業が、iOS および Android 向けの新しいモバイルアプリを開発しています。このアプリは利用者のメモやお気に入りの設定を暗号化してデバイスのローカルに保存しますが、利用者がスマートフォンとタブレットを併用したり機種変更したりしても記録を引き継げるよう、バックエンドアプリケーションを利用してデバイス間でデータを同期させる必要があります。
この要件を達成するために最適な AWS のサービスまたは機能を選択してください。
選択肢:
A. Amazon API Gateway の WebSocket API
B. Amazon ElastiCache
C. AWS Amplify と AWS AppSync の組み合わせ
D. Amazon S3 と Amazon CloudFront の組み合わせ
正解:C
A. Amazon API Gateway の WebSocket API
不正解 WebSocket APIはクライアントとバックエンドの間で双方向のメッセージをやり取りする機能で、接続中のクライアントへサーバー側から通知を押し出せます。ただし扱うのは接続の管理とメッセージの中継までで、記録そのものを保持しません。切断中に書き込まれた内容を端末側で溜めて再接続時に送り直す処理も、同じ記録が2台で同時に書き換えられたときにどちらを採るかを決める処理も、すべて自前で実装することになります。この機能が向いているのは、リアルタイムの速報配信のように接続中の配信自体が目的の場合です。
B. Amazon ElastiCache
不正解 ElastiCacheはValkeyやRedis OSS、Memcached互換のインメモリキャッシュを提供するサービスで、データベースへのアクセスを高速化したりセッション情報を一時的に共有したりする用途に使います。データはメモリ上に保持されるため永続的な記録の保管先としては設計されておらず、オフライン中の操作の保持や再接続時の差分同期、競合解決といった機能も持ちません。またクラスターはVPC内に配置されるため、インターネット上のモバイルアプリから直接呼び出す構成にも向きません。
C. AWS Amplify と AWS AppSync の組み合わせ
正解 端末側とバックエンド側で役割を分担し、同期に必要な処理をどちらもコードを書かずに得られます。端末側ではAmplify(Gen 1)のクライアントライブラリに含まれるDataStoreがローカルのモデルを持ち、圏外で書き込まれたメモを保持したまま、通信が戻った時点で未送信分だけをまとめて送り出します。バックエンド側ではAppSyncがGraphQLのエンドポイントとして受け口になり、Delta Syncで前回同期以降の差分だけを返し、サブスクリプションでもう一方の端末へ変更を押し出します。書き込み先をバージョン管理されたDynamoDBのデータソースにしておくと、スマートフォンとタブレットが同じ記録を同時に更新したケースをAppSyncが競合として検出し、あらかじめ選んだ方式で決着させます。iOSとAndroidの双方に対応したライブラリが提供されるため、この2つを組み合わせるだけで要件を満たせます。
D. Amazon S3 と Amazon CloudFront の組み合わせ
不正解 利用者の記録をオブジェクトとしてS3に置き、CloudFront経由で配信する構成は、ファイルを取り出す速度の面では有効です。しかしオブジェクトへの書き込みは後から書いた内容が前の内容を丸ごと上書きするため、2台の端末が同じ記録を編集すると片方の変更が失われます。オフライン中の変更を端末に溜めて後から送り直す仕組みもなく、CloudFrontのキャッシュが残っている間は更新前の内容が返ることもあります。この構成が適しているのは、動画や画像のように読み取りが中心のコンテンツを配る場合です。
全体的な説明
問われている要件
- iOS・Android対応のモバイルアプリの開発
- 利用者データの暗号化とローカル保存機能
- 複数デバイス間でのシームレスなデータ同期
- バックエンドアプリケーションを通じたデータ管理
前提知識
デバイス間同期に必要な3つの機能
単なる読み書きのAPIでは足りず、次の3つが揃って初めて同期が成立します:
- 圏外でも操作を受け付け、変更を端末内に順番に保持しておくこと
- 通信が戻ったときに、全件ではなく前回以降の差分だけをやり取りすること
- 同じレコードが複数の端末で同時に変わったときの決着方法が決まっていること
端末側を担う AWS Amplify
Amplifyはフロントエンドとバックエンドをまたいだ開発を支援します:
- JavaScript、React Native、Swift、Android、Flutter 向けのクライアントライブラリを提供
- 認証、API、ストレージといったバックエンドの構成をコマンドから作成できる
- Gen 1ではDataStoreがローカルのモデルと未送信の変更を管理し、オフライン時の書き込みを引き受ける
- TypeScriptでバックエンドを定義するGen 2(ampx CLI)ではDataStoreが提供されないため、オフライン時の保持方法を別に設計する
- GitベースのCI/CDとホスティングも利用できる
バックエンド側を担う AWS AppSync
AppSyncはGraphQLのマネージドAPIとして同期の中継点になります:
- Delta Syncにより、前回同期以降に変わったレコードだけを返す
- サブスクリプションがWebSocketで接続中の端末へ変更を通知する
- リゾルバーの接続先はEventBridgeやHTTPエンドポイント、Lambda、RDS Data API経由のAurora、Amazon OpenSearch Service、そしてDynamoDBから選べる
- GraphQLを使わないパブリッシュ/サブスクライブ用途にはAppSync Eventsが別に用意されている
競合の検出と決着のさせ方
バージョン管理を有効にしたDynamoDBデータソースへの書き込みで働きます:
- オプティミスティック同時実行では、バージョンが食い違う書き込みを拒否してクライアントに再試行させる
- 自動マージでは、サーバー側でリストやマップの要素を突き合わせて統合する
- Lambdaによるカスタムロジックでは、アプリケーションに固有の優先順位を自分で書ける
- 検出されたバージョンの不一致は、結果としてクライアントへ返される
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、利用者の記録が iOS 端末からバックエンドを経て Android 端末へ届くまでの流れと、その途中で誰が何を担うのかを表しています。
左側の iOS 端末では、暗号化された記録がローカルストレージに置かれ、Amplify DataStore がそれを読み書きしながら圏外中の変更を溜めます。オンラインに戻ると、Amplify クライアントライブラリが Amazon Cognito から得たトークンを添えて AWS AppSync へ差分を送ります。
AppSync はバージョン付きの書き込みを Amazon DynamoDB に対して行い、DynamoDB が同時更新をバージョンの不一致として検出して結果を返します。決着のさせ方はオプティミスティック同時実行、自動マージ、Lambda によるカスタムロジックの3つから選びますが、これは図に描いた経路の上で働く設定であり、構成要素として別に存在するものではありません。
確定した変更は、サブスクリプションを通じて Android 端末の Amplify DataStore へ届き、ローカルストアが自動的に更新されます。利用者は再ログインすることなく、もう一方の端末で記録の続きを見られます。
解くための考え方
判断の軸は、オフライン中のローカル変更を保持して再接続時に差分だけ送れるか、複数デバイスの同時更新を競合として検出し解決できるかの2点です。
メッセージを中継するだけの仕組み、読み取りを速くするキャッシュ、オブジェクトを置いて配信する構成は、いずれも通信や読み取りの効率を上げるものであり、同期の状態管理そのものは担いません。これらを選ぶと、ローカルの変更履歴の保持、再送、競合判定をすべて自前で実装することになります。
AmplifyとAppSyncを組み合わせた構成では、端末側の保持と再送をAmplifyのクライアントライブラリが、差分配信とリアルタイム通知と競合の検出をAppSyncが引き受けるため、開発者はスキーマと解決方式を決めるだけで済みます。
参考資料
問題文:
ある開発チームは、外部から届くデータの集計処理を、Auto Scaling グループ data-agg-asg 上の Amazon EC2 インスタンスで実行しています。各インスタンスは未処理データの滞留件数を独自に算出し、Amazon CloudWatch のカスタムメトリクスとして送信します。
インスタンスからの PutMetricData リクエストを認証する方法として、最も安全なものを選択してください。
選択肢:
A. PutMetricData 権限を持つ IAM ユーザーのアクセスキーを含む設定ファイルを AMI に焼き込み、その AMI から起動するよう起動テンプレートを変更します。
B. Amazon CloudWatch 用のインターフェイス VPC エンドポイントをサブネットに作成し、エンドポイントポリシーで PutMetricData を許可します。
C. Auto Scaling グループのサービスにリンクされたロール AWSServiceRoleForAutoScaling に cloudwatch:PutMetricData を追加し、起動したインスタンスへ継承させます。
D. cloudwatch:PutMetricData のみを許可する IAM ロールを作成し、起動テンプレートの IAM インスタンスプロファイルにそのロールを指定します。
正解:D
A. PutMetricData 権限を持つ IAM ユーザーのアクセスキーを含む設定ファイルを AMI に焼き込み、その AMI から起動するよう起動テンプレートを変更します。
不正解 AMIに認証情報を埋め込むと、そのAMIから起動したすべてのインスタンス、コピーしたイメージ、作成したスナップショットに同じキーが複製されます。AMIを他アカウントへ共有した時点で社外にも渡り、どこまで露出したかを追跡できなくなります。キーを入れ替えるたびにAMIを作り直して起動テンプレートの新しいバージョンを発行する必要があり、運用負荷も高くなります。埋め込んだキーは既存のイメージから後から取り除けない点も問題です。
B. Amazon CloudWatch 用のインターフェイス VPC エンドポイントをサブネットに作成し、エンドポイントポリシーで PutMetricData を許可します。
不正解 インターフェイス VPC エンドポイントは、インスタンスからCloudWatchへの通信をインターネットに出さずにAWSネットワーク内で完結させるための経路であり、エンドポイントポリシーはその経路を通れるリクエストを絞り込むための追加のフィルターです。どちらも呼び出し元が誰かを証明する仕組みではないため、インスタンス側に認証情報がなければリクエストに署名できず、CloudWatchに到達しても拒否されます。経路の保護と認証は別の層の話であり、この構成だけではメトリクスを1件も書き込めません。
C. Auto Scaling グループのサービスにリンクされたロール AWSServiceRoleForAutoScaling に cloudwatch:PutMetricData を追加し、起動したインスタンスへ継承させます。
不正解 サービスにリンクされたロールは、Amazon EC2 Auto Scalingがインスタンスの起動やロードバランサーへの登録を利用者に代わって実行するために引き受けるロールであり、起動されたインスタンス上のアプリケーションへ渡ることはありません。またこのロールにアタッチされているAutoScalingServiceRolePolicyはAWSが管理しており、利用者が権限を追加する編集はできません。インスタンス上のアプリケーションへ権限を渡す経路はインスタンスプロファイルだけです。
D. cloudwatch:PutMetricData のみを許可する IAM ロールを作成し、起動テンプレートの IAM インスタンスプロファイルにそのロールを指定します。
正解 権限の受け渡しにロールを使えば、インスタンス側に秘密の値を一切置かずに済みます。集計ワーカー上のSDKは起動直後からインスタンスメタデータサービスを参照し、そこで受け取った期限付きの認証情報でリクエストに署名します。期限が近づけば新しい認証情報がEC2側から供給されるため、差し替えの作業も期限切れの監視も不要です。スケールアウトで増えた台数にも起動テンプレート経由でDataAggMetricsRoleが渡るので、台数が変動しても権限の付け忘れが起きません。許可はcloudwatch:PutMetricDataだけに限定し、cloudwatch:namespace条件キーで書き込み先をDataAgg/Ingestionに絞れば、与える権限の範囲も最小に保てます。メタデータへの参照をIMDSv2に限定しておけば、認証情報の取り出し口も保護できます。
全体的な説明
問われている要件
- data-agg-asg のインスタンスからCloudWatchへカスタムメトリクスを送信
- 長期的なアクセスキーを配布しない認証方式の採用
- cloudwatch:PutMetricDataに絞った最小権限の設計
- インスタンスの増減に自動で追従する権限付与
前提知識
EC2 上のアプリケーションが AWS API を呼ぶ経路
呼び出しが成立するには、署名に使える認証情報がインスタンス内に存在する必要があります:
- 署名付きリクエスト: SDKは取得した認証情報でリクエストに署名し、受け取ったCloudWatch側が署名を検証して呼び出し元を判定します
- IMDS からの取得: SDKは169.254.169.254から一時的な認証情報を読み出します。トークンを必須とするIMDSv2に限定すると取り出し口が保護されます
- 有効期限と更新: 一時的な認証情報には期限があり、失効前の再取得はEC2側が担うため利用者の更新作業は発生しません
- ネットワーク経路との違い: インターフェイスVPCエンドポイントとそのポリシーは通信経路とアクセス範囲を絞る仕組みで、呼び出し元の身元を証明する役割は持ちません
長期的なアクセスキーを配る方式の弱点
保管場所を工夫しても、次の問題は解消しません:
- 読み取れる者は同じ権限を得る: 平文で置かれたキーは、そこへ到達できるプロセスすべてが利用できます
- 取り出しの循環: 保管庫から取り出すには、そのための別の認証情報が改めて必要になります
- 複製の追跡不能: イメージやスナップショットに含めると、複製先や共有先を把握できなくなります
- 入れ替えの負担: 定期的な差し替えのたびに、全台への再配布と再起動が発生します
Auto Scaling グループにおけるロールの役割分担
グループには性質の異なる2種類のロールが関わります:
- 起動テンプレート: インスタンスプロファイル、セキュリティグループ、ユーザーデータなどをまとめた起動時の設定。変更のたびに新しいバージョンを発行します
- インスタンスプロファイル: IAMロールをEC2インスタンスへ結び付ける器で、アプリケーションへ権限を渡す唯一の経路です
- AWSServiceRoleForAutoScaling: EC2 Auto Scaling自身がインスタンスの起動やロードバランサーへの登録を代行するために使うロールです
- 編集の可否: サービスにリンクされたロールの権限はAWSが管理するため、利用者が独自のアクションを追加することはできません
メトリクス書き込みの許可を絞る方法
最小権限は次の3点で組み立てます:
- アクション: cloudwatch:PutMetricDataだけを許可します
- リソース指定: PutMetricDataはリソースレベルのアクセス許可に対応しないため、Resourceは全体を指す指定にします
- 条件キー: cloudwatch:namespaceで書き込み先をDataAgg/Ingestionに限定します
- 予約された名前空間: AWS/で始まる名前空間はAWSサービス用で、カスタムメトリクスには使えません
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、data-agg-asg が起動した集計ワーカーが、DataAggMetricsRole を通じて Amazon CloudWatch へ滞留件数を書き込むまでの経路を示しています。
起動テンプレートに指定したインスタンスプロファイルがロールをインスタンスへ結び付け、ロールの引き受けによって AWS STS が発行した一時的な認証情報がインスタンスメタデータサービスへ届きます。
集計アプリケーションはその認証情報でリクエストに署名し、名前空間 DataAgg/Ingestion に対して PutMetricData を呼び出します。
解くための考え方
EC2上のアプリケーションからAWSのAPIを呼ぶ場面では、IAMロールをインスタンスに結び付けるのが定石です。長期的なアクセスキーを使う方式は、保管先をどこに変えても、読み取られる危険と入れ替えの手間がそのまま残ります。
ロールを使えば、インスタンス内に置く秘密の値がなくなります。認証情報の取得はメタデータサービス経由で自動的に行われ、期限が近づけばEC2側が新しいものを供給します。
台数が絶えず変動するAuto Scaling環境では、起動テンプレートに設定を書いておくことの効果が特に大きくなります。増設されたインスタンスも同じ設定で立ち上がるため、追加のたびに権限を付けて回る作業が発生しません。
サービス側が代行動作のために使うロールに権限を足す方法は、権限の渡り先が違ううえに編集自体が認められておらず、実装の入り口で行き詰まります。通信経路を用意する構成も、経路が整うだけで呼び出し元を証明する材料は増えません。
参考資料
問題文:
ある企業は、社外の取引先に対して、案件ごとの画像と報告書を 7 日間だけ参照させる必要があります。これらの資料は、同社が管理する Amazon S3 バケット shared-evidence に保存されています。
この資料を取引先と共有する最も安全な方法を選択してください。
選択肢:
A. 対象の資料に限定した署名付き URL を 7 日間の有効期限で発行し、取引先へ URL のみを渡します。
B. Amazon CloudFront ディストリビューションを作成し、オリジンアクセスコントロールでバケットを配信元に設定します。配信 URL を取引先に共有し、7 日後に削除します。
C. バケットへの読み取り専用ポリシーを付与した案件用の IAM ユーザーを作成し、アクセスキーを取引先に渡します。7 日後に認証情報を無効化します。
D. 対象オブジェクトを 7 日後に削除する S3 ライフサイクルルールを設定し、バケット上のオブジェクト URL を取引先に共有します。
正解:A
A. 対象の資料に限定した署名付き URL を 7 日間の有効期限で発行し、取引先へ URL のみを渡します。
正解 渡すのはオブジェクトへの参照権だけであり、取引先の側でAWSの資格情報を用意する必要がありません。生成時に指定したバケット名、オブジェクトキー、許可する操作、期限が署名に織り込まれるため、そのURLで実行できるのは対象1件の取得に固定されます。7日という期限を実際に成立させられるかは、署名に使った認証情報で決まります。IAMユーザーの長期的なアクセスキーで署名すれば署名バージョン4の上限である7日をそのまま使えますが、AWS STSが発行した一時的な認証情報で署名した場合は、URLに7日と書いてもその認証情報が切れた時点で使えなくなります(EC2のインスタンスプロファイル経由なら通常6時間程度)。生成手段による上限の違いもあり、マネジメントコンソールでは最大12時間、AWS CLIやSDKでは最大7日です。
B. Amazon CloudFront ディストリビューションを作成し、オリジンアクセスコントロールでバケットを配信元に設定します。配信 URL を取引先に共有し、7 日後に削除します。
不正解 オリジンアクセスコントロールが保護するのは、CloudFrontからS3オリジンへ向かうアクセス経路です。バケットを非公開のまま配信できる一方、CloudFrontの配信URL自体は誰でも参照できる公開エンドポイントになるため、URLが転送されれば取引先以外も資料を取得できます。期限を課したいのであればCloudFrontの署名付きURLか署名付きCookieを別に構成する必要があり、ディストリビューションを消すことで期限の代わりにすると、その作業を実施するまで資料は公開されたままになります。案件ごとの資料を渡すために配信基盤を新設する点でも、管理対象が増えます。
C. バケットへの読み取り専用ポリシーを付与した案件用の IAM ユーザーを作成し、アクセスキーを取引先に渡します。7 日後に認証情報を無効化します。
不正解 IAMユーザーのアクセスキーを社外の相手に渡すことは、長期的な認証情報を組織の外へ持ち出す行為であり、重大なリスクを伴います。メールやチャットで受け渡す過程で第三者に渡り、取引先の端末での保管方法も自社では管理できません。キーが漏れれば、無効化するまでバケット内の資料へ自由にアクセスされます。さらに、取引先ごとにユーザーを作成し、期限が来たら確実に無効化するという運用が案件の件数だけ発生します。特定の資料を一時的に見せるという目的に対して、渡している権限も管理の手間も過大です。
D. 対象オブジェクトを 7 日後に削除する S3 ライフサイクルルールを設定し、バケット上のオブジェクト URL を取引先に共有します。
不正解 ライフサイクルルールはストレージクラスの移行やオブジェクトの削除を自動化する機能であり、アクセスを許可する仕組みではありません。バケットが非公開のままであれば、オブジェクトURLを渡しても取引先のリクエストは拒否されます。取得できるようにするにはパブリックアクセスブロックを解除して公開する必要があり、その時点でURLを知る誰もが資料を取得できる状態になります。加えて、期限が来ると資料そのものが削除されるため、社内で保管しておくべき案件の証跡まで失われます。
全体的な説明
問われている要件
- 社外の取引先に対する7日間限定の資料共有
- shared-evidence バケット上の画像と報告書の受け渡し
- 長期的な認証情報を社外に渡さない安全な共有方法の選択
- 期限が来たら自動的に無効化されるアクセス制御の実装
前提知識
期限付き共有で使える手段の切り分け
似た用途に見える機能でも、担っている役割は異なります:
- S3署名付きURL: 特定のオブジェクトに対する期限付きの参照権を、認証情報を渡さずに発行する仕組みです
- ライフサイクルルール: ストレージクラスの移行とオブジェクトの失効を自動化する機能で、アクセス許可には関与しません
- オリジンアクセスコントロール: CloudFrontからオリジンへの経路を保護する機能で、配信URLの公開範囲は制限しません
- CloudFront署名付きURL / 署名付きCookie: 配信側で期限や視聴条件を課したい場合に構成します
署名付きURLに織り込まれる要素
生成時に指定した内容が署名の対象になります:
- 対象の特定: バケット名とオブジェクトキー
- 操作の固定: 署名時に選んだHTTPメソッド(GETやPUTなど)だけが実行可能
- 権限の上限: 署名した主体が持つ権限を超えるアクセスは許可されない
- 期限: 有効秒数をクエリパラメータとして署名に含める
- 付加情報: Content-TypeやContent-Dispositionなどの制御
有効期限を左右する要素
7日という上限は、常に使えるわけではありません:
- 長期的なアクセスキーで署名: 署名バージョン4の上限である7日間をそのまま指定できます
- 一時的な認証情報で署名: その認証情報が失効した時点でURLも無効になります
- インスタンスプロファイル経由: EC2から署名した場合は通常6時間程度で切れます
- 生成手段による違い: マネジメントコンソールは最大12時間、AWS CLIやSDKは最大7日間
発行後の運用で押さえる点
配布したURLは取り消しが効きません:
- 個別の失効不可: 発行済みのURLだけを無効化する仕組みはありません
- 緊急時の対処: 署名に使った認証情報を無効化するか、バケットポリシーで明示的に拒否します
- アクセスの追跡: S3サーバーアクセスログとCloudTrailのデータイベントで記録できます
- アクセス元の制限: URL自体にIP制限は組み込めないため、必要な場合はaws:SourceIp条件で制御します
図による解説
アーキテクチャ図

アーキテクチャ図の解説
この図は、shared-evidence バケットに保存された資料を、社外の取引先へ 7 日間だけ渡す構成を示しています。
資料の管理担当者は自社の認証情報を使い、対象のオブジェクトキーと有効期限を署名に含めた署名付き URL を生成します。生成された URL には、どのオブジェクトへどの操作をいつまで許すかがすべて含まれています。
取引先に渡るのはこの URL だけで、AWS アカウントも専用のツールも必要ありません。取引先はブラウザから HTTPS で対象オブジェクトを取得します。
解くための考え方
判断の分かれ目は、社外の相手に何を手渡すかです。資格情報そのものを渡す案は、渡した瞬間に自社の管理が及ばなくなり、回収も相手の保管状況の確認もできません。手渡すべきなのは、対象の資料1件に紐付いた期限付きの参照権です。
署名付きURLであれば、取引先の側にAWSアカウントも専用のツールも要求せず、受け取ったリンクをブラウザで開くだけで済みます。7日を過ぎたリクエストは署名の検証段階で弾かれるため、期限を管理するための作業も発生しません。
実装で見落としやすいのは署名者の選び方です。7日という長さを使い切れるのはIAMユーザーの長期的なアクセスキーで署名した場合に限られ、一時的な認証情報を使うとその寿命に引きずられて短くなります。
残る案は、社外へ資格情報を出す、期限をリソースの削除作業に置き換える、そもそも取得できる許可を与えていない、のいずれかに当てはまります。資料を7日間見せるという目的に対して、どれも過不足があります。
参考資料
スポンサーリンク
以下スポンサーリンクです。
この記事がお役に立ちましたら、コーヒー1杯分(300円)の応援をいただけると嬉しいです。いただいた支援は、より良い記事作成のための時間確保や情報収集に活用させていただきます。
