AWS認定資格 WEB問題集&徹底解説
ソリューションアーキテクト-プロフェッショナル
問題文と選択肢
ブラウザ上のフォームが API エンドポイントに正常にポストされ、有効な応答を受け取れるようにするために、チームが完了すべき 2 つのステップの組み合わせはどれですか。
(1) クロスオリジンリソース共有 (CORS) を許可するように S3 バケットを設定する。
(2) Amazon S3 ではなく Amazon EC2 でフォームをホストする。
(3) API Gateway のクォータ引き上げをリクエストする。
(4) API Gateway でクロスオリジンリソース共有 (CORS) を有効にする。
(5) S3 バケットをウェブホスティング用に設定する。
- (1),(2)
- (3),(4)
- (1),(5)
- (4),(5)
A. (1),(2)
(1) の S3 バケットの CORS 設定は「S3 が他オリジンから呼ばれるとき」のためのもので、API Gateway への POST は一切許可しない。
(2) の EC2 へのホスティング変更も的外れで、ホスト先を変えてもフォームのオリジンと API のオリジンが異なる事実は変わらないため、CORS エラーは解消しない。
どちらも症状の原因に触れていないため誤り。
B. (3),(4)
(4) の API Gateway での CORS 有効化は正しいが、(3) のクォータ引き上げは的外れ。
問題文の症状はトラフィック過多による 429 Too Many Requests ではなく、ブラウザの同一オリジンポリシーによるブロックである。
さらに、S3 の静的ウェブサイトホスティング設定が無ければフォーム自体をブラウザに配信できないため、組み合わせとして不足している。
C. (1),(5)
(5) の S3 のウェブホスティング設定は必要だが、(1) の S3 側の CORS 設定では API Gateway のレスポンスに Access-Control-Allow-Origin ヘッダーは付かない。
ブラウザは呼び出し先(API Gateway)が返すヘッダーで可否を判断するため、呼び出し元バケットに CORS を設定しても POST はブロックされたままとなり、要件を満たさない。
D. (4),(5)
(4) API Gateway で CORS を有効化すると、プリフライトの OPTIONS メソッドと Access-Control-Allow-Origin などのレスポンスヘッダーが設定され、別オリジンであるフォームからの POST がブラウザに許可される。
(5) S3 バケットを静的ウェブサイトホスティング用に設定することで、HTML フォームがブラウザから正しく配信・表示される。
API Gateway コンソールのテストが成功していたのは、コンソールのテストがブラウザの同一オリジンポリシーを経由しないためであり、この 2 つの設定でブラウザ経由の呼び出しも成立する。
構成図
ブラウザ │ (1) HTML フォームを取得 ──▶ Amazon S3(静的ウェブサイトホスティング) │ (2) 別オリジンへ POST(プリフライト OPTIONS) ▼ Amazon API Gateway(CORS を有効化)──▶ AWS Lambda
CORS は「呼ばれる側」で有効化。API を叩かれる API Gateway に設定する。呼び出し元の S3 側ではない。
正解への思考ルート
問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。| 要件 | 判断ポイント |
|---|---|
| フォームは S3 でホストし、ブラウザの JavaScript から API Gateway を呼ぶ(別オリジン) | 別オリジンへの POST はブラウザがブロックする。呼び出される側の API Gateway で CORS を有効化する必要がある →選択肢(B・D)は候補 |
| API Gateway コンソールのテストは成功していた | コンソールのテストはブラウザの同一オリジンポリシーを通らない。API 自体は正常=原因は CORS であってバックエンドやクォータではない →選択肢(B)を消す |
| HTML フォームを S3 からブラウザに配信する必要がある | 静的ウェブサイトホスティングの設定が必要。S3 の CORS 設定は「S3 自身が他オリジンから呼ばれる」場合の設定で、本問には効かない →選択肢(A・C)を消す |
| 症状は「有効なリクエストがブラウザから通らない」(トラフィック過多ではない) | クォータ引き上げが効くのは 429 Too Many Requests の場合。EC2 への移設も解決策にならない →選択肢(A・B)を消す |
| CORS の有効化+ウェブホスティング設定の 2 つで要件を満たす | (4) API Gateway で CORS 有効化+(5) S3 のウェブホスティングの組み合わせが最小の解 →選択肢(D)が正解 |
ひっかけポイント
- 最大のひっかけは (1) の「S3 バケットに CORS を設定する」。CORS という単語につられて選びがちだが、CORS は呼び出される側に設定するもので、ここで呼び出されるのは API Gateway
- 「API Gateway コンソールでテストして有効な応答を受け取った」の一文は「API とバックエンドは正常」と読ませるためのヒント。原因をブラウザ側(CORS)に絞り込ませる意図がある
- (3) のクォータ引き上げは「トラフィックが多い」記述が問題文に無いのに選ばせる典型的な誤答。スロットリングなら 429 が返る
- (2) の「EC2 でホストする」はオリジンが変わるだけで CORS 問題は残る。サーバーレス構成をわざわざ EC2 に戻す発想自体が試験的にも誤り
出題バリエーション
同じ知識が本番では条件を変えて出題されます。| 問題文がこう変わったら | 正解はこう変わる |
|---|---|
| 「フォームと API を同一オリジンに統合したい」 | Amazon CloudFront で S3 と API Gateway を同一ドメインの別パスに束ねる構成が正解軸に(CORS 設定自体が不要になる)。 |
| 「API Gateway は Lambda プロキシ統合を使っている」 | コンソールで CORS を有効にするだけでは足りず、Lambda のレスポンスに Access-Control-Allow-Origin ヘッダーを含める必要がある。 |
| 「アクセス急増で 429 Too Many Requests が返る」 | 使用量プラン・スロットリング設定の見直しやクォータ引き上げが正解軸に。 |
| 「S3 上の静的コンテンツが別サイトの JavaScript から読み込めない」 | 今度は呼び出される側が S3 なので、S3 バケットの CORS 設定が正解になる。 |
| 「バケットを公開せずにコンテンツを配信したい」 | CloudFront + OAC(オリジンアクセスコントロール)が正解軸に。 |
ブラウザ上のフォームが API エンドポイントに正常にポストされ、有効な応答を受け取れるようにするために、チームが完了すべき 2 つのステップの組み合わせはどれですか。
(1) クロスオリジンリソース共有 (CORS) を許可するように S3 バケットを設定する。
(2) Amazon S3 ではなく Amazon EC2 でフォームをホストする。
(3) API Gateway のクォータ引き上げをリクエストする。
(4) API Gateway でクロスオリジンリソース共有 (CORS) を有効にする。
(5) S3 バケットをウェブホスティング用に設定する。
- (1),(2)
- (3),(4)
- (1),(5)
- (4),(5)