AWS認定資格 WEB問題集&徹底解説

ソリューションアーキテクト-プロフェッショナル

正解 D問題
要復習(もう一度解きたい問題) 1 2 3 4
合格に向けて、もっと深く学習する
豊富な問題と詳細なAWSサービス解説を、24時間無料でお試しいただけます
プレミアム会員機能を無料で試す ❯
問題文と選択肢
あるチームが、パブリック Amazon S3 バケットでホストされる HTML フォームを作成しています。 このフォームでは、ブラウザ上の JavaScript を使用して Amazon API Gateway API エンドポイントにデータをポストします。API エンドポイントは AWS Lambda 関数と統合されています。チームは API Gateway コンソールで各メソッドをテストし、有効な応答を受け取りました。しかし、ブラウザからフォームを開いて送信するとエラーになります。

ブラウザ上のフォームが 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)
解説 頻出度★★★★★
この問題は、「S3 でホストした静的フォーム × ブラウザの JavaScript から別ドメインの API Gateway を呼ぶ」構成で、CORS は呼び出される側(API Gateway)で有効化することと、フォームをブラウザに配信するには S3 の静的ウェブサイトホスティング設定が要ることを押さえられるかがポイント

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(オリジンアクセスコントロール)が正解軸に。
関連サービスの解説 Amazon API Gateway
Amazon EC2
Amazon Simple Storage Service (Amazon S3)
AWS Lambda
Elastic Load Balancing (ELB)
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 63%
No.3 解説
あるチームが、パブリック Amazon S3 バケットでホストされる HTML フォームを作成しています。 このフォームでは、ブラウザ上の JavaScript を使用して Amazon API Gateway API エンドポイントにデータをポストします。API エンドポイントは AWS Lambda 関数と統合されています。チームは API Gateway コンソールで各メソッドをテストし、有効な応答を受け取りました。しかし、ブラウザからフォームを開いて送信するとエラーになります。

ブラウザ上のフォームが 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)

(会員限定)当問題の評価をお願いします。改善に活用します。