AWS DVA 無料サンプル

AWS DVA·DVA-C02AWS公式ドキュメントの出典リンク付き・AI作成の問題演習

登録なしで解ける良問。「正解・解説を見る」で解説とひっかけが開きます。

※ サンプルは実際の例題です。各問の「正解・解説を見る」を開くと、正解・詳細解説・ひっかけが表示されます。 全 30 問のうち 30 問を無料公開しています。
Q1実行環境/ライフサイクル難易度 標準無料

開発者が実装したLambda関数は、呼び出しのたびにハンドラー内でDB接続クライアントとAWS SDKクライアントを新規生成しており、トラフィックが多い時間帯にレイテンシとDB接続数の増大が問題になっている。呼び出し間で再利用可能なリソースを再利用し、パフォーマンスを改善する実装として最も適切なものを選べ。(単一選択)

  1. ADB接続クライアントとSDKクライアントの初期化コードをハンドラー関数の外(グローバルスコープ)に移動し、実行環境がウォーム状態で再利用される際にそのまま再利用されるようにする
  2. Bハンドラー関数内で毎回新しいクライアントを生成する実装のまま、関数のメモリ割り当てだけを増やしてCPU性能を上げる
  3. C関数のタイムアウト値を最大の15分に設定し、1回の呼び出しの中でより多くの処理時間を確保できるようにする
  4. D関数をVPCから切り離し、パブリックサブネットからのみアクセスできるように再設計する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaの実行環境(execution environment)はInit・Invoke・Shutdownの3フェーズからなるライフサイクルを持つ。 コールドスタート時にInitフェーズでランタイムの初期化・拡張機能の初期化・ハンドラーファイルのグローバルスコープのコード実行が行われ、 その後に実行環境は一定時間(ウォーム状態)維持され、後続の呼び出しで再利用される。

  • DB接続クライアントやAWS SDKクライアントをハンドラー関数の外(グローバルスコープ)で初期化しておくと、 Initフェーズで一度だけ生成され、後続のウォーム実行では再生成せずにそのまま再利用される。
  • これによりウォーム実行時のレイテンシが下がり、DBへの新規接続確立回数も抑えられ、接続枯渇のリスクを軽減できる。
  • ハンドラー関数内で毎回生成すると、ウォーム実行であっても呼び出しのたびに接続確立コストが発生し、この最適化の恩恵を受けられない。
各誤答が違う理由
  • Bメモリ増加でCPU割当は上がるが、毎回接続を生成するロジック自体は変わらず、接続確立コストとDB接続数増大の根本原因は解消しない。
  • Cタイムアウト値は1回の呼び出しあたりの最大実行時間の上限を変えるだけで、呼び出しごとの接続再生成という問題には無関係。
  • DVPC設定の有無は接続クライアントの再利用戦略とは別軸の話であり、ハンドラー内での再生成という実装上の問題を解決しない。
ひっかけ: 「コールドスタートを完全になくす」ことと「ウォーム実行時の再利用を最適化する」ことは別の話。本問は実行環境の再利用(execution context reuse)を活かす実装パターンが論点であり、 プロビジョンド同時実行(コールドスタート自体の排除)とは区別すること。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q2レイヤー難易度 標準無料

ある組織では10個のLambda関数がすべて同じサードパーティのロギングライブラリと共通の社内ユーティリティモジュールに依存している。現状は各関数のデプロイパッケージにこれらのコードを個別に同梱しており、ライブラリのバージョンアップのたびに10個すべての関数を再デプロイする必要があり運用負荷が高い。この状況を改善する設計として最も適切なものを選べ。(単一選択)

  1. Aロギングライブラリと社内ユーティリティを1つのLambdaレイヤーとして発行し、10個の関数それぞれにアタッチする。更新時はレイヤーの新バージョンを発行し、各関数のレイヤー参照を差し替える
  2. B10個の関数を1つの巨大なモノリシック関数に統合し、共通コードの重複自体をなくす
  3. C共通コードをS3バケットに配置し、各関数がハンドラー実行のたびにS3からダウンロードしてメモリ上に展開する
  4. D各関数のデプロイパッケージに共通ライブラリを同梱したまま、CI/CDパイプラインで10関数を並列デプロイして更新時間を短縮する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaレイヤーは、複数の関数間で共有したいライブラリ・カスタムランタイム・共通コードを 関数本体のデプロイパッケージとは別の.zipアーカイブとしてパッケージ化し、複数の関数にアタッチできる仕組みである。

  • 共通のロギングライブラリと社内ユーティリティを1つのレイヤーとして発行し、10個の関数それぞれにそのレイヤーをアタッチする。
  • ライブラリを更新する際はレイヤーの新しいバージョンを発行し、各関数の設定でアタッチするレイヤーのバージョンを更新するだけでよく、 関数本体のコードやデプロイパッケージ自体は変更不要(関数コードと依存関係を分離できる)。
  • 関数は最大5つのレイヤーをアタッチでき、関数コード+全レイヤーの展開後の合計サイズは250MB以内に収める必要がある。
各誤答が違う理由
  • B関数の責務が混在しコールドスタート時間や単一障害点のリスクが増大する。関数分割の設計原則に反し、共通ライブラリの共有問題の直接的な解決にもならない。
  • C呼び出しごとにS3からのダウンロードが発生しレイテンシとコストが増える。レイヤーであればデプロイ時に展開済みのため実行時ダウンロードは不要。
  • Dデプロイ時間は短縮できても、共通コードの重複同梱とバージョン管理の煩雑さという根本課題は解決していない。
ひっかけ: 「共通コードをS3に置いて関数から都度ダウンロードする(C)」は実行のたびにレイテンシとAPI呼び出しコストが発生し非効率。 レイヤーはデプロイ時に関数の実行環境の/opt配下へ展開され、実行時には追加のダウンロードなしで参照できる点が本質的な違い。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q3環境変数難易度 標準無料

Lambda関数の環境変数の暗号化・サイズ制約について、正しい記述を2つ選べ

  1. A環境変数はデフォルトでLambdaサービスが管理するAWS管理キーにより保存時暗号化(encryption at rest)されており、追加設定・追加費用は不要である
  2. Bカスタマー管理のCMKを指定して保存時暗号化を行うことで、キーポリシーによるアクセス制御やCloudTrailでのキー使用状況の監査が可能になる
  3. C環境変数は追加設定なしでも転送時に自動的にエンドツーエンド暗号化され、lambda:GetFunction権限を持つ者にも値は常にマスクされ平文では見えない
  4. D環境変数の合計サイズに上限はなく、アプリケーションの設定値はすべて環境変数に格納するのがベストプラクティスである
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaの環境変数は常にAWS KMSで暗号化されて保存される。追加設定をしなければ、Lambdaサービスが管理する デフォルトのAWS管理キー(aws/lambda)で自動的に暗号化されており、追加コストは発生しない。

  • より厳格な監査(CloudTrailでのキー使用履歴)やキーポリシーによるアクセス制御が必要な場合は、カスタマー管理のCMKを指定して暗号化できる。
  • ただし、環境変数の値はデフォルトでは lambda:GetFunction 等の権限を持つ者にはコンソール/API上で平文表示され得る。 値そのものを平文表示から保護したい場合は「転送時の暗号化ヘルパー」を有効化し、クライアント側で暗号化した値をコード側で復号する実装が必要になる。
  • 環境変数の合計サイズには4KBの上限があり、これを超える設定値はParameter StoreやSecrets Managerを参照する設計にする必要がある。
各誤答が違う理由
  • C値を平文表示から保護するには「転送時の暗号化ヘルパー」を明示的に有効化し、コード側で復号処理を実装する必要がある。デフォルトでは権限を持つ者に平文表示され得る。
  • D環境変数の合計サイズには4KBの上限がある。大きな設定値やシークレットはParameter StoreやSecrets Managerに格納し実行時に取得する設計が必要。
ひっかけ: 「環境変数は自動で転送時暗号化され、誰からも平文が見えない(C)」という思い込みが罠。平文非表示にするには明示的な暗号化ヘルパーの設定・コード側の復号処理が必要。 また「環境変数のサイズに上限はない(D)」も誤り。合計4KBの制約があるため、大きな設定はParameter Store/Secrets Manager等の外部ストアを使う設計が必要になる。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q4同時実行数(予約済み同時実行)難易度 標準無料

あるAWSアカウントには複数のLambda関数が存在し、アカウント全体の同時実行数の上限を共有している。決済処理を行う重要な関数PaymentFunctionが、他の関数の突発的なトラフィック急増(いわゆるnoisy neighbor)によって同時実行数を奪われスロットリングされる事態を防ぎたい。これを実現する設定として最も適切なものを選べ。(単一選択)

  1. APaymentFunctionに予約済み同時実行数(reserved concurrency)を設定し、アカウントの同時実行数プールから専用の枠を切り出して他の関数に使われないようにする
  2. BPaymentFunctionのメモリ割り当てを最大の10,240MBに設定し、1回の呼び出しあたりの処理能力を上げる
  3. Cすべての関数にDLQ(デッドレターキュー)を設定し、失敗したイベントを再処理できるようにする
  4. DPaymentFunctionのタイムアウト値を1分から15分に延長し、処理が打ち切られないようにする
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

予約済み同時実行数(reserved concurrency)PaymentFunctionに設定すると、 その値がアカウント全体の同時実行数プールから切り出され、他の関数からは使われない専用の枠として確保される。

  • これによりPaymentFunctionは、他の関数がどれだけ同時実行数を消費していても、設定した数までは常に実行を保証される。
  • 同時に、予約済み同時実行数はその関数が同時に実行できる上限(キャップ)としても働く。設定値を超える呼び出しはスロットリングされる。
  • 予約済み同時実行数を設定した分、アカウントの「未予約」同時実行プール(他の全関数が共有する枠)は減少するため、 他の関数への影響を考慮して値を決める必要がある。
各誤答が違う理由
  • Bメモリ設定は1回の実行あたりのCPU/メモリ性能を左右するだけで、アカウント全体の同時実行数の奪い合いという問題は解決しない。
  • CDLQはエラー処理の話であり、同時実行数の枠を確保する仕組みではない。noisy neighbor問題への対策にならない。
  • Dタイムアウト延長は1回の実行時間の上限を変えるだけで、同時実行数の枠の確保には無関係。むしろ長時間実行は同時実行数を長く占有するリスクもある。
ひっかけ: 予約済み同時実行数は「保証」であると同時に「上限(キャップ)」でもある点に注意。プロビジョンド同時実行(コールドスタート排除のための事前初期化)と混同しないこと。 本問はコールドスタートの話ではなく、他関数からの同時実行数の“横取り”を防ぐ話である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q5プロビジョンド同時実行難易度 標準無料

API Gatewayの背後で動くLambda関数がJVMベースのランタイムを使用しており、コールドスタート時の初期化に数秒かかるため、レイテンシに敏感なユーザー向けAPIでp99レイテンシが悪化している。トラフィックパターンは平日日中に集中している。コールドスタートの影響を排除するために最も適切な対応を選べ。(単一選択)

  1. A対象バージョン/エイリアスにプロビジョンド同時実行を設定し、平日日中はApplication Auto Scalingのスケジュールで数を増やし夜間・休日は減らす
  2. B関数に予約済み同時実行数を設定すれば、実行環境が事前初期化されコールドスタートは発生しなくなる
  3. CLambda関数をLambda@Edgeとして再デプロイし、CloudFrontのエッジロケーションで実行することでコールドスタートを解消する
  4. D関数のタイムアウトを最大値の15分に設定し、初期化にかかる時間分の余裕を持たせる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

プロビジョンド同時実行(provisioned concurrency)を設定すると、Lambdaは指定した数の実行環境を 事前に初期化(Initフェーズを事前実行)した状態で待機させる。呼び出しが来た時点ですでにInitフェーズが完了しているため、 コールドスタートに起因するレイテンシが発生しない

  • 特定のバージョン/エイリアスに対して設定し、API GatewayからそのエイリアスのARNを呼び出す構成にする。
  • トラフィックが平日日中に偏っているのであれば、Application Auto Scalingのスケジュールベースのスケーリングで、 日中はプロビジョンド同時実行数を増やし、夜間・休日は減らすことでコストを最適化できる。
  • プロビジョンド同時実行は設定した容量分、呼び出しの有無に関わらず課金されるため、トラフィックパターンに応じたスケジューリングが重要になる。
各誤答が違う理由
  • B予約済み同時実行数は同時実行の保証/上限を定めるだけで、実行環境を事前初期化する機能ではない。コールドスタート対策にはプロビジョンド同時実行が必要。
  • CLambda@Edgeへの移行はユースケース(エッジでの軽量処理)が異なり、JVMベースの重い初期化を伴う関数の一般的なコールドスタート対策として適切ではない。
  • Dタイムアウトの延長は初期化にかかる時間そのものを短縮せず、レイテンシ悪化という問題を解決しない。
ひっかけ: 「予約済み同時実行数を設定すればコールドスタートが無くなる(B)」という混同が典型的な誤り。予約済み同時実行数は同時実行数の保証/上限であり、実行環境の事前初期化は行わない。 コールドスタート自体を無くしたいならプロビジョンド同時実行が正しい選択。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q6同時実行/プロビジョンド同時実行の違い難易度 標準無料

予約済み同時実行数(reserved concurrency)とプロビジョンド同時実行(provisioned concurrency)に関する正しい記述を2つ選べ

  1. Aプロビジョンド同時実行は、設定した容量分について呼び出しの有無に関わらず時間課金が発生する
  2. Bプロビジョンド同時実行はApplication Auto Scalingと統合でき、スケジュールベースやターゲット追跡(利用率)で自動的に容量を増減できる
  3. C予約済み同時実行数を設定すると、その数だけ実行環境が事前に初期化されコールドスタートが発生しなくなる
  4. Dプロビジョンド同時実行を設定すると、アカウント全体のLambda同時実行数の上限(クォータ)自体が自動的に引き上げられる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

両者はどちらも「同時実行数」に関わる設定だが、目的とコスト特性が全く異なる

  • 予約済み同時実行数:アカウントの同時実行数プールから専用枠を確保/上限を設けるだけであり、 実行環境の事前初期化は行わない。設定自体に追加課金は無い(通常の実行時間課金のみ)。
  • プロビジョンド同時実行:指定数の実行環境を事前に初期化して待機させる。 呼び出しの有無に関わらず、設定した容量分の時間課金が発生する(未使用でも課金対象)。
  • プロビジョンド同時実行はApplication Auto Scalingと統合でき、スケジュールベース(時間帯指定)や ターゲット追跡(利用率メトリクスに基づく自動調整)でスケーリングできる。
  • プロビジョンド同時実行を設定してもアカウント全体の同時実行数上限そのものが引き上がるわけではない。あくまで既存の上限の中で確保される容量である。
各誤答が違う理由
  • C予約済み同時実行数は同時実行の保証/上限を定めるだけで、実行環境の事前初期化は行わない。事前初期化はプロビジョンド同時実行の役割。
  • Dプロビジョンド同時実行は既存のアカウント同時実行数上限の中から容量を確保する仕組みであり、上限自体を引き上げるものではない。上限引き上げは別途Service Quotasの申請が必要。
ひっかけ: 「予約済み同時実行数を設定すると実行環境が事前初期化される(C)」はプロビジョンド同時実行との典型的な混同。 「プロビジョンド同時実行を設定するとアカウントの同時実行数上限自体が自動的に引き上がる(D)」も誤り。上限引き上げが必要な場合は別途Service Quotasでの引き上げ申請が要る。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q7エラーハンドリング(非同期呼び出しの自動再試行)難易度 標準無料

S3のイベント通知をトリガーに非同期起動されるLambda関数が、一時的な下流サービスの障害により実行時エラーを返した。DLQ・on-failure destinationはまだ設定していない。このときのLambdaの挙動として最も適切なものを選べ。(単一選択)

  1. ALambdaは自動的に最大2回まで再試行する(初回呼び出しと合わせ最大3回の試行)。すべて失敗しDLQ/on-failure destinationが未設定の場合、失敗イベントは自動保存されない
  2. B非同期呼び出しであっても、Lambdaは同期呼び出しと同様に自動的な再試行を一切行わない。呼び出し元(S3)が独自に再試行を実装する必要がある
  3. Cエラーが発生すると即座に無限に再試行を続け、成功するかイベントの経過時間の上限(既定6時間)に達するまで止まらない
  4. Dエラーが発生すると自動的に関数のコンカレンシー設定が0に変更され、それ以上の呼び出しがすべて拒否されるようになる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

非同期呼び出し(S3、SNS、EventBridge等がトリガーとなるケース)でハンドラーがエラーを返す(または関数が異常終了する)と、 Lambdaは自動的に最大2回まで再試行する(初回呼び出し+既定で2回のリトライ=合計最大3回の試行)。

  • 再試行の間には遅延(バックオフ)が設けられる。再試行回数はMaximumRetryAttempts(0〜2)で減らすことができ、 MaximumEventAgeInSecondsでイベントが再試行対象となる最大経過時間を制御できる。
  • すべての試行が失敗し、かつDLQやon-failure destinationが未設定の場合、そのイベントは(設定によっては)破棄され、 自動的な失敗イベントの保存は行われない。運用上はDLQまたはDestinationsの設定が強く推奨される。
  • これに対し、API Gateway経由などの同期呼び出しではLambda自身は自動リトライを行わない点と対比して押さえておく。
各誤答が違う理由
  • B非同期呼び出しにはLambda組み込みの自動再試行(既定で最大2回)が存在する。呼び出し元の実装に依存する話ではない。
  • C再試行回数は既定で最大2回(MaximumRetryAttemptsで0〜2に調整可能)であり、無限リトライではない。また、イベントの経過時間の上限(MaximumEventAgeInSeconds)は既定で6時間(21600秒、設定可能範囲は60秒〜21600秒)であり、7日間ではない。
  • Dエラー発生によって同時実行数の設定が自動変更されることはない。これは関数のkill switchとして手動で行う操作である。
ひっかけ: 「同期呼び出しと同じくLambdaは再試行しない(B)」は誤り。非同期呼び出しには既定で自動再試行(最大2回)がある。 呼び出しタイプ(同期/非同期/ポーリングベース)によってエラー時の挙動が異なることを混同しないこと。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q8エラーハンドリング(DLQとDestinationsの比較)難易度 標準無料

非同期起動されるLambda関数について、失敗したイベントだけでなく、成功時にも呼び出し結果(レスポンスペイロードや実行コンテキスト)を後続処理へ連携したい。追加のLambda関数を挟まずにこれを実現する設計として最も適切なものを選べ。(単一選択)

  1. A関数の非同期呼び出し設定でon-success destinationとon-failure destinationの両方を設定し、それぞれSQS/SNS/EventBridge/別のLambda関数へ、レスポンスペイロードを含む実行コンテキストごと送信する
  2. BDLQ(SQSキュー)を設定する。DLQは失敗イベントだけでなく成功時のレスポンスペイロードも自動的に保存してくれる
  3. C関数の最後に別のLambda関数を明示的に呼び出すコードを追加し、その中で成功/失敗の分岐処理を実装する
  4. D関数をすべて同期呼び出しに変更し、呼び出し元が成功/失敗のレスポンスを直接受け取れるようにする
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

従来のデッドレターキュー(DLQ、SQS/SNSのみ対応)は、失敗したイベントの元のペイロードのみを保存する仕組みであり、 成功時の情報連携や、呼び出し結果・エラー詳細などの実行コンテキストの付加情報は持たない

  • これに対しLambda Destinationsは、非同期呼び出しの「成功時(on-success)」「失敗時(on-failure)」の両方について、 SQS・SNS・EventBridge・別のLambda関数のいずれかへ結果を送信できる。
  • Destinationsが送る情報には、元のイベント・呼び出しのレスポンスペイロード・タイムスタンプ・呼び出し回数などの実行コンテキストが含まれ、 DLQより豊富な情報を後続の処理(監査ログ、通知、リカバリ処理等)で活用できる。
  • DLQとDestinationsは併用も可能だが、新規実装ではDestinationsの利用が推奨されている。
各誤答が違う理由
  • BDLQは失敗したイベントの元ペイロードのみを保存する仕組みであり、成功時の情報連携やレスポンスペイロードの保存はサポートしない。
  • C実装可能ではあるが「追加のLambda関数を挟まずに実現する」という要件に反し、Destinationsというマネージド機能を使わず車輪の再発明になる。
  • D呼び出し方式(同期/非同期)自体の変更はトリガー元の設計に影響し、要件(非同期のまま結果連携)を満たす直接的な解決にならない。
ひっかけ: 「DLQを設定すれば成功時の情報も保存される(B)」は誤り。DLQは失敗したイベントの元ペイロードのみを保存する仕組みであり、 成功時の連携やリッチな実行コンテキストが必要な場合はDestinationsを使う、という使い分けが問われている。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q9エラーハンドリング(同期呼び出しの再試行責任)難易度 標準無料

API Gatewayのプロキシ統合経由で同期呼び出しされるLambda関数が、下流のデータベースへの一時的な接続エラーにより例外をスローした。この場合の再試行に関する正しい理解を選べ。(単一選択)

  1. ALambda自体は同期呼び出しの失敗を自動的に再試行しない。エラーは即座に呼び出し元へ返され、再試行の実装は呼び出し元(クライアントやAPI Gateway側)の責任である
  2. B同期呼び出しであっても非同期呼び出しと同様に、Lambdaが内部で自動的に最大2回まで再試行してから呼び出し元へ結果を返す
  3. C同期呼び出しのエラーは自動的にDLQへ送信され、DLQに設定したLambda関数が再試行のトリガーとなる
  4. D同期呼び出しのエラーはKinesisのストリームベース呼び出しと同様に、成功するかレコードの経過時間上限に達するまで自動的に再試行され続ける
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

同期呼び出し(API Gateway、ALB、SDKのInvokeInvocationType=RequestResponse)等)では、 Lambda自体は失敗した呼び出しを自動的に再試行しない。エラーは即座に呼び出し元へ返される。

  • 再試行が必要な場合は、呼び出し元(クライアントアプリケーション、SDKのリトライ設定、API Gateway側の設計)が責任を持って実装する必要がある。
  • これは非同期呼び出し(既定で最大2回の自動再試行)ストリームベースのポーリング呼び出し(Kinesis/DynamoDB Streams、 エラー時にバッチ全体を再試行し続ける)とは明確に異なる挙動である。
  • 設計上は、下流の一時的なエラーに備えて呼び出し元側で指数バックオフ付きの再試行やサーキットブレーカーを実装するのが定石。
各誤答が違う理由
  • B自動再試行は非同期呼び出しの挙動。同期呼び出しではLambdaは再試行せず、エラーを即座に呼び出し元へ返す。
  • CDLQは非同期呼び出しの失敗イベントを保存する仕組みであり、同期呼び出しには適用されない。
  • Dそれはポーリングベース(ストリーム)呼び出しの挙動。同期呼び出しにはそのような自動リトライループは存在しない。
ひっかけ: 「非同期呼び出しと同様にLambdaが自動で2回再試行する(B)」は誤り。再試行の自動化は呼び出しタイプによって異なるのが本問の核心。 同期呼び出しでは再試行の責任は呼び出し元側にある。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q10エラーハンドリング(冪等性設計)難易度 高無料

あるLambda関数はイベントを受け取り、注文レコードをDynamoDBに書き込んだ後に決済APIを呼び出す処理を行う。開発者は「関数コードを冪等(idempotent)に設計する必要はない」と主張している。この主張が誤りである根拠として正しいものを2つ選べ

  1. A非同期呼び出しでは既定で最大2回の自動再試行が行われるため、1回目の試行の一部処理(DB書き込み等)が成功した後にエラーが起きると、再試行により処理が重複実行され得る
  2. BSQS標準キューのイベントソースマッピングはat-least-once配信を前提としており、まれに同一メッセージが複数回Lambdaに配信され重複処理が起こり得る
  3. CLambdaはすべての呼び出しタイプ(同期・非同期・ポーリングベース)についてexactly-once(厳密に1回)の実行を保証しているため、重複処理は原理的に起こり得ない
  4. DDynamoDB Streamsをイベントソースとするイベントソースマッピングは常にexactly-onceで処理されるため、DynamoDBが関わる場合に限り冪等設計は不要である
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaの呼び出しモデルの多くは「少なくとも1回(at-least-once)」の実行を保証するものであり、 「厳密に1回(exactly-once)」を保証するものではない。これが冪等設計が必要とされる根本理由である。

  • 非同期呼び出しでは、下流エラーや関数の異常終了時に既定で最大2回の自動再試行が行われる。 1回目の試行でDynamoDBへの書き込みが成功した後に決済API呼び出しでエラーが発生すると、再試行によりDynamoDBへの書き込みや決済APIの呼び出しが重複実行され得る
  • SQS標準キューをイベントソースとするイベントソースマッピングat-least-once配信を前提としており、 まれに同一メッセージが複数回Lambdaへ配信されることがある。関数側が冪等でなければ、同じ注文が二重処理される可能性がある。
  • 冪等性を担保する実装パターンとしては、リクエストごとの一意な冪等キーを条件付き書き込み(ConditionExpression)でチェックする、 AWS Lambda Powertoolsの冪等性ユーティリティを使う、などが挙げられる。
各誤答が違う理由
  • C事実に反する。Lambdaの多くの呼び出しモデルはat-least-onceであり、exactly-onceを保証しない。重複実行を前提に冪等設計をすべきである。
  • D誤り。ストリームベースの呼び出しもエラー時にバッチ単位で再試行が行われるため、同一レコードが複数回処理される可能性があり、冪等設計は必要。
ひっかけ: 「Lambdaは全呼び出しタイプでexactly-onceを保証する(C)」「DynamoDB Streamsのイベントソースマッピングはexactly-onceだから冪等設計は不要(D)」は いずれも典型的な誤解。ストリームベースの呼び出しもエラー時のバッチ再試行によって同一レコードが複数回処理され得るため、冪等性は呼び出しタイプを問わず設計すべき前提である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q11バージョン難易度 標準無料

開発チームは、本番環境で稼働中のLambda関数のコードと設定を、後から誰かが誤って$LATESTを更新しても影響を受けない形で「スナップショット」として固定し、いつでもそのスナップショットへロールバックできるようにしたい。この要件を満たす機能として最も適切なものを選べ。(単一選択)

  1. A関数のコードと設定を更新するたびにバージョンを発行(publish)し、発行済みの各バージョンを不変なスナップショットとしてARNで参照する。ロールバック時は目的のバージョン番号を参照先にする
  2. B本番トラフィックは常に$LATESTのARNを直接参照するようにし、変更の都度$LATEST自体を注意深く更新して固定運用する
  3. C関数のデプロイパッケージのZIPファイルをS3の別バケットへ手動でバックアップし、ロールバック時にそのZIPを新規関数として作り直す
  4. DCloudFormationのスタックを更新するたびに新しいスタックを作成し、常に複数のスタックを並行稼働させることでロールバックに備える
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaで関数コードと設定を更新すると、常に$LATESTという可変(mutable)なバージョンが更新される。 $LATESTは常に最新の変更を反映するため、単体では「固定されたスナップショット」にはならない。

  • バージョンを発行(publish)すると、その時点の$LATESTのコード・設定(メモリ・環境変数・レイヤー参照等)を 不変(immutable)なスナップショットとして、一意な番号(1, 2, 3...)付きのARNで固定できる。
  • 発行済みバージョンのコード・設定はその後変更されることがないため、そのバージョンのARNを参照している限り、 誰かが$LATESTを更新しても影響を受けない。
  • 過去の任意のバージョンへ切り戻す(ロールバック)際は、そのバージョン番号(またはそれを指すエイリアス)を参照先として設定し直すだけでよい。
各誤答が違う理由
  • B$LATESTは常に最新の変更を反映する可変ポインタであり、「後から誰かが誤って更新しても影響を受けない固定スナップショット」という要件を満たせない。
  • C手動バックアップと関数の作り直しは運用が煩雑で即時性に欠け、Lambdaが標準機能として提供するバージョン管理の代替として非効率。
  • Dインフラ全体を並行稼働させるのは過剰な複雑性とコストを伴い、Lambda関数単体のコード/設定の不変スナップショットという要件には直接対応しない。
ひっかけ:$LATESTそのものを本番用の固定参照として使う(B)」は要件に反する。$LATESTは常に変化し得るため、 固定・不変なスナップショットが必要な場面ではバージョンの発行が必須である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q12エイリアス難易度 標準無料

複数のクライアントアプリケーションが本番用Lambda関数のARNを直接呼び出している。新しいバージョンをリリースするたびに、全クライアントの設定を新しいバージョン番号のARNへ書き換えるのは運用上非現実的である。クライアント側の設定を変更せずに、参照先のバージョンだけを切り替えられるようにする設計を選べ。(単一選択)

  1. Aprodという名前のエイリアスを作成して現行バージョンを指すよう設定し、クライアントはエイリアスのARNを呼び出すようにする。新バージョンのリリース時はエイリアスの参照先バージョンだけを更新する
  2. B新しいバージョンを発行するたびに、そのバージョン番号を含むARNを全クライアントへ周知し、各クライアントのアプリケーション設定を手動で更新してもらう
  3. C$LATESTのARNを全クライアントに使わせ、常に最新のコードが呼ばれるようにする
  4. D関数ごとにAPI Gatewayのカスタムドメインを新規に作成し直し、ドメインを切り替えることでバージョンを更新する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

エイリアス(alias)は、特定のバージョン(または複数バージョンへの加重)を指す名前付きの安定したポインタであり、 それ自体が固有のARNを持つ。

  • クライアントはエイリアスのARN(例:...function:MyFunction:prod)を呼び出すように設定しておく。
  • 新しいバージョンをリリースする際は、エイリアスが指すバージョン番号を更新するだけでよく、クライアント側の設定・呼び出し先ARNは一切変更不要。
  • これにより、バージョンのリリース/切り戻しをエイリアスの参照先変更だけで完結させられ、クライアントとバージョン管理を疎結合にできる。
各誤答が違う理由
  • Bクライアント側の設定変更を伴う運用であり、「クライアント側の設定を変更せずに切り替える」という要件に反する。エイリアスが解決したい課題そのもの。
  • C$LATESTは開発中の変更を即座に反映する可変ポインタであり、意図しない未検証コードが本番に流れるリスクがある。段階的なリリース制御ができない。
  • DAPI Gatewayのドメイン管理はLambda関数のバージョン切り替えとは別レイヤーの話であり、要件を満たす直接的な解決策ではない。
ひっかけ: 「バージョンのARNを都度クライアントに周知して更新してもらう(B)」は要件が求める運用改善の否定であり本末転倒。 エイリアスの目的はまさに「クライアントに影響を与えずにバックエンドの参照先を切り替えること」である点を押さえる。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q13バージョン/エイリアス(加重ルーティング)難易度 標準無料

本番稼働中のバージョン5(prodエイリアスが100%指している)に対し、新しいバージョン6を段階的に検証しながらリリースしたい。まずトラフィックの10%だけを新バージョンへ流し、エラー率に問題がなければ徐々に100%へ引き上げる、というカナリアリリースを実現する設定として最も適切なものを選べ。(単一選択)

  1. Aprodエイリアスのルーティング設定で、プライマリをバージョン5、追加バージョンとしてバージョン6に10%の重みを設定する。問題が無ければ重みを段階的に引き上げ、最終的にプライマリをバージョン6へ切り替える
  2. Bエイリアスは1つのバージョンしか指せないため、10%のトラフィック分岐を実現するにはprodとは別に新しいエイリアスを作り、クライアント側のコードで10%だけ新エイリアスを呼ぶよう乱数分岐を実装する
  3. Cバージョン6を$LATESTとして保存し、$LATESTへの呼び出しを10%だけAPI Gateway側でルーティングする
  4. D本番用の関数をもう1つ複製して新バージョンを別関数としてデプロイし、Route 53の加重レコードでALB経由のトラフィックを振り分ける
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

エイリアスの加重ルーティング(weighted alias)を使うと、1つのエイリアスに対して 2つのバージョンとその重み(パーセンテージ)を設定でき、呼び出しトラフィックをその比率で振り分けられる。

  • prodエイリアスの追加バージョン設定でバージョン6に10%の重みを割り当てると、 呼び出しの約10%がバージョン6へ、残り90%がバージョン5(プライマリバージョン)へルーティングされる。
  • CloudWatchメトリクス(エラー率・レイテンシ等)を監視しながら、問題なければ重みを段階的に引き上げ、最終的に100%を新バージョンへ切り替える。
  • この手動での重み調整に加え、AWS CodeDeployと連携すると、Canary(一定割合を流し一定時間後に残りを一括切替)・ Linear(一定間隔で均等に切替)といった設定済みパターンで自動化し、CloudWatchアラームと連動した自動ロールバックも組める。
各誤答が違う理由
  • Bエイリアスは最大2バージョンに重みを設定して振り分けられるため、クライアント側で乱数分岐ロジックを自前実装する必要はない。運用と一貫性の観点でも劣る。
  • C$LATESTは発行されたバージョンではなく常に可変であるため加重ルーティングの対象にできない。加重の対象は発行済みバージョンである。
  • D別関数への複製はバージョン管理の考え方から外れ、運用が複雑化する。Lambdaのエイリアス加重ルーティングという標準機能で完結できる要件に対し過剰な設計。
ひっかけ: 「エイリアスは1つのバージョンしか指せない(B)」という誤解に注意。エイリアスは最大2つのバージョンに重みを付けて割り当てられる点が カナリア/線形デプロイを実現する鍵である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q14バージョン/エイリアス(CodeDeployによる自動トラフィックシフト)難易度 高無料

AWS CodeDeployを使ってLambda関数の新バージョンへのトラフィックシフトを自動化したい。CodeDeployのLambdaデプロイに関する正しい記述を2つ選べ

  1. ACodeDeployはLambda向けにCanary(一部トラフィックを流した後に残り全部を切替)、Linear(段階的に均等割合で切替)、AllAtOnce(即時全量切替)のデプロイ設定を提供する
  2. BデプロイにCloudWatchアラームと検証用フック(BeforeAllowTraffic/AfterAllowTraffic)を関連付けておくと、問題検知時にCodeDeployが自動的にエイリアスを旧バージョンへロールバックできる
  3. CCodeDeployのトラフィックシフトは$LATESTを直接の対象にでき、発行済みバージョンやエイリアスを介さずに切り替えられる
  4. DCanary/Linearのいずれの設定でも、重みの移行は必ず人手による承認アクションを都度行わない限り一切進まない
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

CodeDeployはLambdaのデプロイにおいて、エイリアスが指す新旧バージョン間のトラフィック移行を自動化する。

  • あらかじめ用意されたデプロイ設定として、Canary(一定割合を流した後、一定時間経過で残り全部を切替)Linear(一定間隔で均等な割合ずつ段階的に切替)AllAtOnce(即時に全トラフィックを切替)がある。
  • デプロイ前後のフック(BeforeAllowTraffic/AfterAllowTrafficとして検証用Lambda関数を設定でき、 さらにCloudWatchアラームを関連付けておくと、アラームが発報した場合にCodeDeployが自動的にエイリアスを旧バージョンへロールバックする。
  • トラフィックシフトの対象は発行済みバージョンを指すエイリアスであり、常に可変な$LATESTを直接のシフト対象にすることはできない。
各誤答が違う理由
  • Cトラフィックシフトの対象は発行済みバージョンを指すエイリアスであり、常に変化し得る$LATESTを直接の対象にはできない。
  • D誤り。Canary/Linearは設定した時間間隔・増分に従いCodeDeployが自動的に重みを進める。人手の承認ステップは必須要件ではない。
ひっかけ: 「トラフィックシフトの対象は$LATESTにできる(C)」「重みの移行は手動承認のたびにしか進まない(D)」はいずれも誤り。 CodeDeployのLambdaデプロイは発行済みバージョンを指すエイリアスに対して、設定した時間間隔で自動的に重みを進めるのが基本動作である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q15エラーハンドリング(ストリームのイベントソースマッピング)難易度 標準無料

Kinesis Data Streamsをトリガーに動くLambda関数で、あるシャード内の特定の1レコード(不正なフォーマットの「毒レコード」)が原因で処理が常にエラーになり、そのシャードの後続レコードの処理まで滞留してしまっている。この問題レコードを迅速に切り分け、後続処理の滞留を最小化する設定として最も適切なものを選べ。(単一選択)

  1. Aイベントソースマッピングで「バッチをバイセクト(bisect batch on function error)」を有効にし、あわせて最大再試行回数・最大レコード経過時間を設定して問題レコードを迅速に切り分け・スキップできるようにする
  2. Bイベントソースマッピングの関数レスポンスタイプでReportBatchItemFailuresを有効化し、失敗したレコードのシーケンス番号だけを個別に返す
  3. C関数のタイムアウト値を1秒に短縮し、処理が長引く前に強制終了させることで滞留を防ぐ
  4. DKinesisストリームのシャード数を増やし、並列度を上げることで問題レコードの影響を緩和する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Kinesis/DynamoDB Streamsのイベントソースマッピングは、既定ではバッチ処理が失敗すると同じバッチ全体を再試行し、 成功するか設定した保持期間・再試行回数の上限に達するまでそのシャードの後続レコードの処理をブロックする。

  • 「バッチをバイセクト(bisect batch on function error)」を有効にすると、エラー発生時にバッチを半分に分割して再試行し、 それでも失敗すればさらに半分に分割……と繰り返すことで、問題のあるレコードを迅速に特定・分離できる。
  • あわせて最大再試行回数(maximum retry attempts)や最大レコード経過時間(maximum record age)を設定しておくと、 特定・分離された問題レコードを一定回数/時間で見切ってスキップし、残りの正常なレコードの処理を先に進められる。
  • 問題レコードはon-failure destination(設定していれば)へ送信し、後で個別に調査・再処理することも可能。
  • なおReportBatchItemFailures(部分的バッチ失敗報告)は2020年12月にKinesis Data Streams・DynamoDB Streams向けに提供が始まっており(SQS向けの提供は2021年11月)、バイセクトと併用可能な別軸の機能である。ただしこれは関数コード側が失敗したレコードのシーケンス番号を自ら識別してitemIdentifierとして返すことが前提の仕組みであり、本問のように関数が個々のレコードを識別できずバッチ全体に対して例外をスローするだけの状況では、有効化しても問題レコードの自動切り分けにはつながらない。
各誤答が違う理由
  • BReportBatchItemFailuresは2020年12月からKinesis/DynamoDB Streamsのイベントソースマッピングで利用でき(SQS向けの提供は2021年11月)「SQS専用」ではない(バイセクトと併用可能な別軸の機能)。ただし本機能は関数コードが失敗したレコードのシーケンス番号を明示的に識別してitemIdentifierとして返すことが前提であり、本問のように関数が個々のレコードを識別できずバッチ全体に対して例外をスローするだけの状況では、有効化しても問題レコードの自動切り分けにはつながらない。コード変更なしに問題レコードを特定・スキップできるのはバイセクト(A)である。
  • Cタイムアウト短縮はエラーの原因(不正フォーマットのレコード)自体を解決せず、正常なレコードまで処理が完了しなくなるリスクを高める。
  • Dシャード分割は別のシャードへの影響を減らす効果はあるが、当該シャード内の毒レコードによる滞留そのものを解消しない。バイセクトによる切り分けが直接的な対策になる。
ひっかけ: 「ReportBatchItemFailuresを有効にする(B)」は、2020年12月からKinesis/DynamoDB Streamsのイベントソースマッピングでも利用できる(SQS専用ではない。SQS向けの提供は2021年11月)が、 本問の状況(関数が個々のレコードを識別できずバッチ全体でエラーになる)では、コード変更なしに問題レコードを自動的に切り分けられるバイセクト(A)が直接的な解決策になる。 両機能は排他ではなく併用可能な別軸の機能である点を混同しないこと。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q16エラーハンドリング(SQSのイベントソースマッピング)難易度 高無料

SQS標準キューをイベントソースとするLambda関数が、10件のメッセージからなるバッチを受け取って処理している。現状は1件でも処理に失敗すると、成功した9件も含めてバッチ全体が失敗扱いとなり、可視性タイムアウト後に10件すべてが再度キューに現れて重複処理されてしまう。成功した9件を再処理対象から除外し、失敗した1件だけを再試行させたい。この要件を満たす実装として最も適切なものを選べ。(単一選択)

  1. ASQSのイベントソースマッピングで関数レスポンスタイプReportBatchItemFailuresを有効化し、ハンドラーが失敗したメッセージIDのみをbatchItemFailuresとして返すように実装する
  2. Bイベントソースマッピングで「バッチをバイセクト(bisect batch on function error)」を有効化し、バッチを再帰的に半分に分割して問題のメッセージを切り分ける
  3. Cバッチサイズを1に設定し、常に1件ずつメッセージを処理することで部分失敗の問題自体を回避する
  4. DSQSキューをFIFOキューに変更すれば、失敗した1件だけが自動的に再試行対象となり成功分は除外される
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

SQSのイベントソースマッピングで関数レスポンスタイプReportBatchItemFailuresを有効化すると、 Lambda関数は処理結果として失敗したメッセージのIDだけを含むレスポンス(batchItemFailuresを返せるようになる。

  • これにより、Lambdaのイベントソースマッピングはレスポンスで報告された失敗メッセージのみを可視性タイムアウト後に再度キューへ戻し、 成功した残りのメッセージはキューから正常に削除される(重複再処理を防ぐ)。
  • この機能を有効化しない場合、既定の挙動としてバッチ内の1件でもエラーになるとバッチ全体が失敗扱いとなり、 成功したメッセージも含めて全件が再度可視化されてしまう(重複処理・非効率の原因)。
  • 実装としては、関数がハンドラーの戻り値で{"batchItemFailures": [{"itemIdentifier": "<失敗メッセージID>"}]}形式のレスポンスを返すようにする。
各誤答が違う理由
  • BバイセクトはKinesis/DynamoDB Streamsのイベントソースマッピング向けの機能であり、SQSのイベントソースマッピングには適用されない。SQSではReportBatchItemFailuresが該当機能。
  • C実現可能ではあるがスループットが著しく低下し、コスト・レイテンシの観点で非効率。マネージドの部分的バッチ失敗報告機能を使う方が適切。
  • DFIFOキューへの変更は順序保証・重複排除の性質を変えるものであり、部分的バッチ失敗の報告機能(ReportBatchItemFailures)の代替にはならない。
ひっかけ: 「Kinesisと同様にバッチをバイセクトする設定を有効にすればよい(B)」は取り違え。SQSのイベントソースマッピングにおける部分的バッチ失敗の 標準的な解決策はReportBatchItemFailuresであり、バイセクトはKinesis/DynamoDB Streams向けの仕組みである。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q17同時実行数(バースト制限とスロットリング)難易度 標準無料

ECサイトのフラッシュセール開始直後、API Gateway経由で同期呼び出しされるLambda関数への同時リクエスト数が急増し、一部のリクエストが429 TooManyRequestsExceptionエラーとなった。この現象の説明として最も適切なものを選べ。(単一選択)

  1. Aトラフィック急増により利用可能な同時実行数(アカウント上限や予約枠)を使い切り、それ以上の同期呼び出しがスロットリングされ429が返された。対策として同時実行数上限の引き上げやプロビジョンド同時実行の確保が有効
  2. BLambdaは同時実行数について事実上無制限に瞬時スケールするため、アカウントやリージョンの上限に達してスロットリングされることは起こり得ない
  3. C429エラーはLambda関数のコード内で発生した未処理例外が原因であり、インフラの同時実行数の制約とは無関係である
  4. D429はAPI Gateway側のスロットリング設定のみに起因し、Lambda側の同時実行数制約が原因になることはない
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaは急激なトラフィック増加に対して、関数ごとに10秒あたり1,000実行環境(=10秒あたり10,000リクエスト/秒)のペースでスケールできる。 このスケーリングレートは関数単位の制限であり、各関数は他の関数と独立して、アカウント(リージョン)の同時実行数クォータに達するまでスケールする。

  • アカウントの同時実行数の上限(またはそのタイミングで利用可能な未予約の同時実行数)に達すると、それ以上の同期呼び出しは 429 TooManyRequestsExceptionでスロットリングされる。
  • これに対し非同期呼び出しがスロットルされた場合は、Lambda側で自動的に再試行される。 ポーリングベース(Kinesis/SQS等)のイベントソースは、スロットル時にポーリング頻度を落として自動調整する。
  • 対策としては、プロビジョンド同時実行の事前確保やアカウントの同時実行数上限の引き上げ申請、 重要な関数への予約済み同時実行数の割り当てなどが挙げられる。
各誤答が違う理由
  • B事実に反する。アカウント/リージョン単位の同時実行数上限とバーストの増加ペースが存在し、それを超えると同期呼び出しは429でスロットリングされる。
  • C429 TooManyRequestsExceptionはLambdaサービス側のスロットリングを示すエラーであり、関数コード内の未処理例外(通常は500系や関数固有のエラー形式で返る)とは異なる。
  • DAPI Gateway自体にもスロットリング設定はあるが、本問のようにLambda側の同時実行数上限に達したことも429系エラーの発生要因になり得る。両者は独立した制約であり混同しないこと。
ひっかけ: 「Lambdaは無制限に瞬時スケールできるので同時実行数の上限に達することはない(B)」は誤り。アカウント/リージョン単位の同時実行数上限とバースト制限が存在し、 それを超えると同期呼び出しはスロットリング(429)される。この上限の存在を前提に容量計画(Well-Architectedの信頼性の柱)を行う必要がある。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q18レイヤー/実行環境(Lambda拡張機能)難易度 標準無料

開発チームは、Lambda関数のログとメトリクスをサードパーティのオブザーバビリティSaaSへ転送したいが、既存の関数ハンドラーのビジネスロジックには一切手を入れたくない。また、関数の実行環境がシャットダウンされる直前にバッファ中のデータを確実にフラッシュしてから送信を完了させたい。この要件を満たす実装として最も適切なものを選べ。(単一選択)

  1. AサードパーティのオブザーバビリティエージェントをLambda拡張機能(外部拡張機能)としてレイヤー経由で関数にアタッチする。拡張機能はShutdownイベントを購読し、実行環境の終了直前にバッファをフラッシュしてから送信を完了する
  2. Bハンドラー関数のコードの最後に、サードパーティAPIへログ・メトリクスを同期的に送信する処理を追加する
  3. CCloudWatch Logsのサブスクリプションフィルタで別のLambda関数を起動し、そこから都度サードパーティAPIへログを転送する。この構成であればシャットダウン時のフラッシュ制御が可能である
  4. D関数のメモリを増やしてCPU性能を上げ、ハンドラー内でのログ転送処理を高速化することで、ビジネスロジックへの影響を最小化する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambda拡張機能(Lambda extensions)は、関数の実行環境内でランタイムとは別プロセスとして動作し、 Lambda Extensions APIを通じてInit・Invoke・Shutdownの各ライフサイクルイベントを購読できる仕組みである。

  • 外部拡張機能(external extension)として、サードパーティのオブザーバビリティエージェントをレイヤーとしてパッケージ・配布し、 関数にアタッチするだけでログ・メトリクス転送機能を追加できる。ハンドラーのビジネスロジックのコード変更は不要
  • 拡張機能はShutdownイベントを購読できるため、実行環境が破棄される直前の通知を受け取り、 バッファ中のデータを確実にフラッシュしてから終了する処理を実装できる。
  • 関数コード側で毎回同期的にログ転送APIを呼ぶ実装(B)は、ハンドラーの実行時間・レイテンシに転送処理の待ち時間が上乗せされ、 かつビジネスロジックとの結合度が高くなる。
各誤答が違う理由
  • B要件の「ビジネスロジックに手を入れない」に反する。また同期送信はハンドラーの実行時間・レイテンシに転送処理の待ち時間が上乗せされる。
  • Cサブスクリプションフィルタ経由の転送自体は成立するが、元の関数の実行環境のShutdownイベントに連動したフラッシュ制御はできない。要件のタイミング制御を満たさない。
  • Dハンドラー内にログ転送処理を実装している時点で要件の「ビジネスロジックに手を入れない」を満たしておらず、メモリ増強は根本的な解決にならない。
ひっかけ: 「サードパーティ連携なので必ずハンドラーコードの変更が要る(B・D)」という思い込みに注意。Lambda拡張機能はハンドラーコードを変更せずに 横断的関心事(ロギング、セキュリティエージェント、シークレット取得等)を追加できる仕組みであり、Shutdownイベントの購読によるグレースフルな終了処理もポイント。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q19実行環境/ライフサイクル(VPC内Lambdaのネットワーキング)難易度 高無料

開発者が「VPC内で動作するLambda関数は、呼び出しのたびに新しいENI(Elastic Network Interface)をアタッチ・デタッチするため、VPC外の関数に比べて常に大きなコールドスタート遅延が発生し続ける」と主張している。この主張の妥当性について最も適切な説明を選べ。(単一選択)

  1. A現行のVPC Lambdaは、同一のサブネット/セキュリティグループの組み合わせを持つ実行環境間でENIを共有・再利用する仕組み(共有ENIプール)を採用しており、呼び出しのたびに新規ENIを作成するわけではないため、ENI起因のコールドスタート遅延は大幅に軽減されている
  2. B開発者の主張どおり、VPC内Lambdaは現行の仕様でも呼び出しのたびに新しいENIを作成・アタッチしており、常に大きなコールドスタート遅延が発生し続ける
  3. C共有ENIプールの導入により、VPC内Lambdaのコールドスタート遅延は完全にゼロになり、VPC外の関数と全く同じ初期化時間になった
  4. DENIの共有・再利用の仕組みにより、VPC内LambdaはNATゲートウェイを経由しなくても直接インターネット上のリソースへアクセスできるようになった
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

2019年以前は、VPC内Lambdaはセキュリティグループ/サブネットの組み合わせごとに呼び出し時にENIを都度作成する設計であり、 これが大きなコールドスタート要因になっていた。しかし現行のVPC Lambdaのネットワーキングモデル(Hyperplane ENIによる共有ENIプール)では、 同一のVPC設定(サブネット・セキュリティグループの組み合わせ)を持つ実行環境間でENIが共有・再利用されるようになっている。

  • 同じVPC設定の関数・実行環境がスケールしても、呼び出しのたびに新規ENIを作成するわけではなく、共有ENIプールから割り当てるため、 ENI作成に起因するコールドスタート遅延は大幅に削減されている。
  • ただし、そのVPC設定(サブネット/セキュリティグループの組み合わせ)に対する初回のENI準備や、 関数自体の初期化(ランタイム初期化・ハンドラーのグローバルスコープ処理)に起因するコールドスタートは依然として発生し得る。
  • また、ENIはプライベートIPのみを持つため、VPC内Lambdaがインターネット上のリソースへアクセスするには NATゲートウェイ等を経由するルーティング設計が別途必要である点は変わらない。
各誤答が違う理由
  • B古いモデル(2019年以前)の説明であり現行仕様と異なる。現行は共有ENIプールによりENI起因のコールドスタートは大幅に軽減されている。
  • C過大な解釈。ENI起因の遅延は大幅に軽減されたが、ランタイム初期化やハンドラーのグローバルスコープ処理に起因するコールドスタートは依然として発生し得る。
  • DENI共有はコールドスタート対策の仕組みであり、ネットワーク経路の設計とは別の話。ENIはプライベートIPのみを持つため、インターネットアクセスには依然としてNATゲートウェイ等の経路設計が必要。
ひっかけ: 「VPC内Lambdaは呼び出しのたびに必ずENIを新規作成する(B)」は現行の仕組みでは正しくない古い前提に基づく誤解。 共有ENIプールの導入によりENI起因のコールドスタートは大幅軽減されたが、「コールドスタートが完全にゼロになる」わけではない点(C)も過大解釈であり両極端な選択肢に注意する。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q20実行環境/ライフサイクル(コールドスタート対策)難易度 標準無料

レイテンシに敏感な同期API向けLambda関数のコールドスタート影響を軽減するための施策として、有効なものを2つ選べ

  1. Aレイテンシ要件が特に厳しい関数にプロビジョンド同時実行を設定し、実行環境のInitフェーズを事前に完了させておく
  2. Bデプロイパッケージから不要な依存関係を削除してサイズを小さくし、SDKクライアントなど再利用可能なリソースの初期化をハンドラー関数の外(グローバルスコープ)で行う
  3. C関数のタイムアウト値を最大の15分に延長すれば、Initフェーズの所要時間が短縮されコールドスタートの影響が軽減される
  4. D関数のメモリ割り当てを最大の10,240MBに設定すれば、コールドスタートは確実にゼロになることが保証される
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

コールドスタート対策は「Initフェーズの所要時間を短くする」設計・実装上の工夫と、 「Initフェーズを事前に済ませておく」インフラ側の仕組みの2軸で考えると整理しやすい。

  • プロビジョンド同時実行は、指定数の実行環境のInitフェーズを呼び出し前に完了させて待機させる、後者の代表的な対策。
  • デプロイパッケージのサイズを小さくする(不要な依存関係を減らす)ことと、SDKクライアント等の再利用可能なリソースの初期化をハンドラー外(グローバルスコープ)で行うことは、 前者(Initフェーズ自体の所要時間短縮とウォーム実行での再利用の最大化)に効く実装上のベストプラクティス。
  • 一方、タイムアウト値の延長は1回の実行が許される最大時間を延ばすだけで、Initフェーズの所要時間そのものには影響しない。
  • メモリ割り当ての増加はCPU割当も比例して増えるため実行時間の短縮に寄与し得るが、 「コールドスタートを確実にゼロにする」保証を与えるものではなく、対策として過信すべきではない。
各誤答が違う理由
  • Cタイムアウト値は1回の実行が許される最大時間の上限であり、Initフェーズ(初期化)の所要時間そのものには影響しない。
  • Dメモリ増加はCPU割当の増加を通じてInit時間の短縮に多少寄与し得るが、コールドスタートを確実にゼロにする保証はない。根絶を狙うならプロビジョンド同時実行が本筋。
ひっかけ: 「タイムアウトを延ばせばコールドスタートの影響が消える(C)」「メモリを増やせばコールドスタートは確実にゼロになる(D)」は いずれも過大評価。タイムアウトはInitフェーズの所要時間に無関係。メモリ増加はCPU割当増によりInit時間短縮に多少寄与し得るが、コールドスタートの根絶を保証しない。 根絶が必要ならプロビジョンド同時実行を選ぶ、という使い分けを押さえる。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q21REST API と HTTP API の使い分け難易度 標準無料

開発者が、Lambda関数をバックエンドにしたシンプルなプロキシ統合のAPIを新規構築する。要件は次の通り。

  • コストとレイテンシを最小化したい(リクエスト単価を抑えたい)
  • JWTベースの認可(OIDC/OAuth 2.0)をAPI Gateway側で直接検証したい
  • リクエスト/レスポンスのマッピングテンプレートによる複雑な変換やAPIキーによる使用量プランは不要

最も適切なAPI Gatewayのタイプを選べ。(単一選択)

  1. AREST APIを作成し、Lambdaプロキシ統合とCognitoオーソライザーを設定する
  2. BHTTP APIを作成し、Lambdaプロキシ統合とJWTオーソライザー(Cognito/OIDC)を設定する
  3. CWebSocket APIを作成し、$connect/$disconnect/$defaultルートでLambdaを呼び出す
  4. DREST APIを作成し、リクエスト単位でAPIキーを必須にして使用量プランでアクセスを制御する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BAI作成・独立検証済

解説

API GatewayにはREST APIHTTP APIWebSocket APIの3種類があり、 要件次第で最適なタイプが変わる。

  • HTTP API:Lambdaプロキシ統合やHTTPバックエンドへのシンプルなプロキシに最適化されており、 REST APIよりも低レイテンシ・低コスト(最大で約70%安価)である。 JWTオーソライザーをネイティブでサポートし、Cognito/Auth0等のOIDC/OAuth 2.0トークンを追加のLambdaコードなしで検証できる。
  • REST API:マッピングテンプレート(VTL)による詳細なリクエスト/レスポンス変換、APIキー・使用量プラン、 リクエスト単位のキャッシュ、AWS WAF直接統合など高度な機能が必要な場合に選ぶ。その分コスト・レイテンシは高め。
  • WebSocket API:双方向のリアルタイム通信(チャット等)向けで、本設問の要件(シンプルなプロキシ+JWT認可)には過剰。

本設問はマッピングテンプレートもAPIキーも不要でコスト最小化・JWT認可が要件のため、HTTP APIが最適解となる。

各誤答が違う理由
  • AREST APIはHTTP APIより高コスト・高レイテンシであり、マッピングテンプレートやAPIキーが不要な本要件にはオーバースペック。
  • CWebSocket APIは双方向のリアルタイム通信向け。今回は通常のリクエスト/レスポンス型プロキシであり用途が異なる。
  • D要件はAPIキー・使用量プランを不要としており、JWT認可でのユーザー単位の検証が目的。APIキーはクライアント識別・スロットリング用途でありユーザー認可の代替にはならない。
ひっかけ: 「API GatewayといえばREST API」という思い込みで安易にREST APIを選ぶのが典型的な誤り。 マッピングテンプレート・APIキー・リクエストキャッシュなど高度機能が不要でコスト最小化が優先ならHTTP APIという判断基準を押さえる。 またWebSocket APIは双方向リアルタイム通信専用であり、通常のリクエスト/レスポンス型APIには使わない。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q22統合タイプ(Lambdaプロキシ統合 vs カスタム統合)難易度 標準無料

REST APIのバックエンドをLambda関数にする際、「Lambdaプロキシ統合(AWS_PROXY)」を選んだ。開発者が実装で意識すべき最も重要な違いを選べ。(単一選択)

  1. ALambda関数はイベント全体(メソッド・パス・ヘッダー・クエリ・ボディ等)を自分でパースし、statusCodeheadersbodyを含む決まった形式のJSONを自分で返す必要がある。マッピングテンプレートによる変換は行われない
  2. Bプロキシ統合ではマッピングテンプレートが自動的に適用され、Lambda関数はリクエストボディの中身だけを引数として受け取れる
  3. Cプロキシ統合を使うとLambda関数の戻り値の形式は自由で、API Gatewayが自動的に適切なHTTPレスポンスへ変換してくれる
  4. Dプロキシ統合とカスタム統合はいずれもマッピングテンプレートが必須であり、書き方が異なるだけで挙動は同じである
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Lambdaプロキシ統合(AWS_PROXYを使うと、API Gatewayはリクエストの変換を行わず、 HTTPメソッド・パス・ヘッダー・クエリ文字列・ボディなどリクエスト全体をそのままイベントオブジェクトとしてLambdaに渡す

  • Lambda側は event.bodyevent.headersevent.queryStringParameters 等を自分でパースする必要がある。
  • レスポンスも、Lambda関数が {"statusCode": 200, "headers": {...}, "body": "..."} という決まった形式のJSONを返さなければならない。API Gatewayはこれをそのままクライアントへ返す(変換しない)。
  • 対してカスタム統合(AWSでは、統合リクエスト/統合レスポンスのマッピングテンプレート(VTL)で API Gateway側がリクエスト/レスポンスを変換でき、Lambda側は素のペイロードだけを扱えばよい。

プロキシ統合は設定がシンプルな反面、リクエスト解析・レスポンス整形の責務がLambda関数のコード側に寄る点が最大の違いである。

各誤答が違う理由
  • B逆。プロキシ統合ではマッピングテンプレートによる変換は行われず、リクエスト全体がそのままLambdaのイベントとして渡される。
  • C自由ではない。Lambdaプロキシ統合ではLambdaが規定のレスポンス形式(statusCode/headers/body)を返さないと、クライアントへ正しくレスポンスされない(500エラー等になる)。
  • Dプロキシ統合ではマッピングテンプレートは使用されない(統合リクエスト/レスポンスの変換ステップがスキップされる)。カスタム統合とは根本的に責務分担が異なる。
ひっかけ: 「プロキシ統合でもAPI Gateway側でマッピングテンプレートによる変換が効く」という誤解が罠。 プロキシ統合ではマッピングテンプレートは使われず(統合リクエスト/レスポンスの変換をスキップ)、 Lambda関数が生のイベントを受け取り、規定形式のレスポンスを自分で組み立てる必要がある。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q23マッピングテンプレート(VTL)難易度 標準無料

REST APIで、クライアントから受け取るリクエストボディの形式({"user_name": "..."})と、バックエンドのLambda関数が期待するペイロード形式({"userName": "..."})が異なる。Lambda関数のコードは変更したくない。カスタム統合(非プロキシ)で、この差異をAPI Gateway側で吸収する方法として最も適切なものを選べ。(単一選択)

  1. A統合リクエストのマッピングテンプレート(VTL)で、user_nameuserNameに変換するテンプレートを定義する。これはカスタム統合でのみ機能する
  2. Bプロキシ統合のまま、統合リクエストのマッピングテンプレートでuser_nameuserNameへ変換する
  3. CAPI Gatewayのステージ変数でフィールド名のマッピングルールを定義し、実行時に自動的に変換させる
  4. DLambda関数の環境変数にフィールド名のマッピングルールをJSONとして設定し、Lambda側で読み込んで変換する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

API Gatewayのカスタム統合では、統合リクエスト側にマッピングテンプレートを設定でき、 Velocity Template Language(VTL)を使ってクライアントからのリクエストボディを バックエンドが期待する形式へ変換できる。

#set($inputRoot = $input.path('$'))
{
  "userName": "$inputRoot.user_name"
}

このように Content-Typeごとにマッピングテンプレートを定義し、 $input.path()$input.json()等のVTL変数でリクエストボディを参照・変換して、 Lambda関数が期待するJSON構造を組み立てる。レスポンス側にも同様に統合レスポンスのマッピングテンプレートを設定できる。

なお、この仕組みはプロキシ統合(AWS_PROXY)では使えない(プロキシ統合はリクエスト/レスポンスをそのまま素通しするため)。 Lambda関数のコードを変更せずに済ませたい場合は、カスタム統合+マッピングテンプレートの組み合わせが適切である。

各誤答が違う理由
  • Bマッピングテンプレートはプロキシ統合では適用されない(リクエストがそのままLambdaへ渡される)。カスタム統合に切り替える必要がある。
  • Cステージ変数は環境ごとの設定値(Lambda ARNの切替等)を保持する仕組みであり、リクエストボディのフィールド変換機能ではない。
  • D結局Lambda関数側にロジックを実装することになり「Lambda関数のコードは変更したくない」という制約に反する。
ひっかけ: 「プロキシ統合のままLambda関数の前段でリクエストを変換できる」という誤解に注意。 マッピングテンプレートはカスタム統合(非プロキシ)でのみ機能する。プロキシ統合を使い続けたいなら、 変換ロジックはLambda関数コード側に実装する必要がある。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q24認可(Lambdaオーソライザー・Cognitoオーソライザー・IAM認可)難易度 標準無料

API Gateway(REST API)で利用できる主な認可方式に関する記述として正しいものを2つ選べ

  1. ALambdaオーソライザーは、独自ロジックでトークンやリクエスト内容を検証し、IAMポリシードキュメントを返すことで認可を制御できる。判定結果はデフォルトでキャッシュ可能(TTL設定可)
  2. BCognitoオーソライザーは、Cognitoユーザープールに限らず任意のOIDC準拠のIDプロバイダーが発行したJWTを検証できる汎用的な機能である
  3. CIAM認可(AWS_IAM)は、呼び出し元がSigV4でリクエストに署名し、そのIAMプリンシパルの権限に基づいてアクセス可否を判定する方式である
  4. DLambdaオーソライザーはリクエストのたびに必ずLambda関数を実行する必要があり、判定結果をキャッシュする機能は存在しない
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

REST APIでは主に3種類の認可方式が使える。

  • Lambdaオーソライザー(TOKEN/REQUEST型):任意のトークン形式・独自ロジックで認可判定でき、 IAMポリシードキュメントを返すことでリクエストの許可/拒否を制御する柔軟な方式。判定結果は既定でキャッシュ可能(TTL設定)。
  • Cognitoオーソライザー:Cognitoユーザープールが発行したJWT(IDトークン)を検証する組み込み方式で、 独自のLambdaコードを書かずにユーザープールのグループ/スコープに基づく認可が行える。
  • IAM認可(AWS_IAM:SigV4署名されたリクエストのIAM権限を検証する。呼び出し元がAWS内部のサービス/IAMプリンシパルである場合に向く。

Lambdaオーソライザーの判定結果はデフォルトで最大3600秒(1時間)までキャッシュ可能で、同一の認可トークンに対する繰り返し呼び出しのレイテンシとコストを削減できる。

各誤答が違う理由
  • BCognitoオーソライザーはCognitoユーザープール専用。他のOIDCプロバイダーのJWTを検証したい場合はHTTP APIのJWTオーソライザーかLambdaオーソライザーを使う。
  • D誤り。Lambdaオーソライザーは既定で認可結果のキャッシュ(最大3600秒)が有効であり、同一キーの呼び出しではLambda実行をスキップできる。
ひっかけ: 「Lambdaオーソライザーは毎回必ずLambdaを呼び出す(キャッシュ不可)」という誤解に注意。既定でキャッシュが有効かつ設定可能であり、 キャッシュキー(Authorizationヘッダー等)が同一ならLambdaを再実行せず結果を再利用できる。また「Cognitoオーソライザーは任意のOIDCプロバイダーのトークンを検証できる」というのも誤り (CognitoオーソライザーはCognitoユーザープールのトークン専用。他のOIDCプロバイダーはHTTP APIのJWTオーソライザーかLambdaオーソライザーで対応する)。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q25Lambdaオーソライザー(TOKEN型 vs REQUEST型)難易度 標準無料

開発者が、クエリ文字列パラメータ・複数のヘッダー・ステージ変数など複数の値を組み合わせて認可判定を行うLambdaオーソライザーを実装したい(単一のBearerトークンのみでは判定できない)。選ぶべきLambdaオーソライザーのタイプを選べ。(単一選択)

  1. ATOKEN型のLambdaオーソライザーを作成し、identitySourceAuthorizationヘッダーのみを指定する
  2. BREQUEST型のLambdaオーソライザーを作成し、identitySourceに必要な複数のヘッダー・クエリ文字列パラメータを指定する
  3. CCognitoオーソライザーを作成し、複数のヘッダーとクエリ文字列パラメータをすべてスコープとして登録する
  4. DIAM認可(AWS_IAM)を有効化し、SigV4署名にクエリ文字列パラメータとヘッダーの値を埋め込んで判定させる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BAI作成・独立検証済

解説

Lambdaオーソライザーには2つのタイプがある。

  • TOKEN型:単一のトークン値(例:Authorizationヘッダー)だけをLambdaオーソライザーに渡す。単純なBearerトークン検証に向く。
  • REQUEST型:ヘッダー・クエリ文字列パラメータ・パスパラメータ・ステージ変数・リクエストコンテキストなど、 複数の入力値を組み合わせてLambdaオーソライザーに渡せる。identitySourceで参照する値を指定する。

本設問のように複数の情報源を組み合わせた認可判定が必要な場合はREQUEST型を選ぶ。 なお、いずれのタイプでもLambdaオーソライザーはIAMポリシードキュメント(およびオプションでコンテキスト)を返す点は共通である。

各誤答が違う理由
  • ATOKEN型は単一の値(通常は1つのヘッダー)のみを渡す設計であり、複数の入力を組み合わせた判定には対応しない。
  • CCognitoオーソライザーは組み込みでCognitoユーザープールのJWTのみを検証する仕組みであり、任意の複数値を組み合わせる自由な判定ロジックは実装できない。
  • DIAM認可はIAMプリンシパルの権限に基づく判定でありSigV4署名の検証はAPI Gateway/IAM側の仕組みに委ねられる。任意のカスタムロジックで複数値を組み合わせる用途には向かない。
ひっかけ: 「Lambdaオーソライザーは常にTOKEN型(Authorizationヘッダーのみ)」という思い込みに注意。 複数の値(クエリ文字列・複数ヘッダー等)を使いたい場合はREQUEST型を選ぶ必要がある。TOKEN型では単一の値しかidentitySourceに指定できない。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q26使用量プラン・APIキー難易度 標準無料

複数の外部パートナー企業に同じREST APIを提供する。パートナーごとに「1秒あたりのリクエスト数上限」と「1か月あたりの総リクエスト数上限(クォータ)」を個別に設定し、パートナーを識別できるようにしたい。この要件を満たす最も適切な設計を選べ。(単一選択)

  1. AパートナーごとにAPIキーを発行し、使用量プランでパートナーごとのレート・バースト・クォータを設定してAPIキーを紐付ける
  2. BAPI Gatewayのアカウントレベルのスロットリング設定を1つだけ変更し、全パートナー共通の上限を1つ適用する
  3. CLambdaオーソライザー内でDynamoDBにリクエスト回数を記録し、閾値を超えたら拒否するカウンターを自前実装する
  4. Dパートナーごとに完全に別のAWSアカウントでAPIをホストし、アカウント単位のサービスクォータで制御する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

パートナーごとに異なるレート制限・クォータを課しつつ識別可能にする標準的な仕組みは、APIキー+使用量プラン(usage plan)である。

  • パートナーごとにAPIキーを発行し、リクエストヘッダー(x-api-key)で送らせることでクライアントを識別する。
  • 使用量プランで、レート(steady-state のリクエスト/秒)・バースト(トークンバケットの容量)・クォータ(日/週/月あたりの総リクエスト数)を設定し、 各APIキーを該当のプランに関連付ける。
  • 使用量プランはステージ単位で紐付けるため、パートナーA用プラン・パートナーB用プランのようにパートナーごとに異なる上限を個別設定できる。

なお、使用量プランのスロットリング/クォータはAPI全体の既定のアカウントレベル・ステージレベルのスロットリングとは別レイヤーで、APIキー単位にきめ細かく制御する点が特長である。

各誤答が違う理由
  • Bアカウントレベル/ステージレベルのスロットリングはAPI全体(または特定メソッド)に対する一律の上限であり、パートナーごとに個別の上限を設定する仕組みではない。
  • C実現は可能だが、車輪の再発明でありレース条件やスケーリングの考慮が必要になる。APIキー+使用量プランという標準機能で同じ要件を満たせる。
  • D運用が煩雑でコストも増大する。サービスクォータはAWSサービス自体の上限管理であり、パートナー向けAPIのレート制限・クォータ設計には使わない。
ひっかけ: 「Lambdaオーソライザーでリクエスト数をカウントして自前で制限する」という自作発想(C)は車輪の再発明であり運用負荷が高い。 クライアント(パートナー)ごとのレート制限・クォータはAPIキー+使用量プランが標準機能として提供されていることを押さえる。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q27スロットリング(トークンバケットアルゴリズム)難易度 高無料

あるREST APIのアカウントレベルのスロットリング設定は「レート:1,000リクエスト/秒、バースト:2,000」である。クライアントが一瞬で2,500リクエストを送信した場合に起きる挙動として最も適切なものを選べ。(単一選択)

  1. A最初の2,000リクエストはバースト容量の範囲内で処理され、残り500リクエストは429 Too Many Requestsとしてスロットリングされる
  2. B最初の1,000リクエストのみ処理され、残り1,500リクエストがすべて429としてスロットリングされる
  3. C2,500リクエストすべてが受理され、API Gateway内部のキューに蓄積されてから順次処理される
  4. Dバースト設定はキャッシュ容量を意味し、リクエスト数の制御には無関係。2,500リクエストはすべてレート1,000/秒の制限のみで処理される
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

API Gatewayのスロットリングはトークンバケットアルゴリズムで実装されている。

  • バースト(burst)=バケットの容量(トークンの最大保持数)。本設問では2,000トークンまで即座に消費可能。
  • レート(rate)=バケットへトークンが補充される速度(1秒あたり1,000トークン)。
  • 2,500リクエストが一瞬で来た場合、最初の2,000リクエストはバースト容量の範囲内で処理される。 残りの500リクエストはバケットにトークンが無いため 429 Too Many RequestsThrottlingException)でスロットリングされる
  • その後はレート(1,000/秒)でトークンが補充されるペースに応じて、後続のリクエストが順次処理される。

レートとバーストは別々のパラメータであり、瞬間的な超過に対する許容量(バースト)と、継続的な処理能力(レート)を分けて理解することが重要である。

各誤答が違う理由
  • Bレート(1,000/秒)はトークンの補充速度であり、瞬間的な処理可能数の上限ではない。瞬間的にはバースト容量(2,000)まで処理される。
  • CAPI Gatewayのスロットリングはリクエストをキューイングするのではなく、上限を超えた分は即座に429で拒否する仕組みである。
  • Dバーストはキャッシュ容量ではなく、トークンバケットの容量(瞬間的に処理できる上限)を意味する。レートとは別の独立したパラメータである。
ひっかけ: 「レート1,000/秒を超えた分だけ全て拒否される(2,500-1,000=1,500件拒否)」という誤解が典型的な罠。 バースト(トークンバケットの容量)分は瞬間的に許容されるため、まずバースト2,000件分が処理され、それを超えた分だけが429になる。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q28APIキャッシュ(TTL・無効化)難易度 標準無料

REST APIのステージにAPI Gatewayのキャッシュを有効化した。キャッシュに関する正しい記述を2つ選べ

  1. AステージキャッシュのTTLは0〜3600秒の範囲で設定でき、0に設定すると実質的にキャッシュを無効化できる
  2. Bキャッシュのサイズ(容量)に関わらず追加コストは一切発生せず、ステージのキャッシュ有効化は常に無料である
  3. C権限のあるクライアントはCache-Control: max-age=0ヘッダーを送ることで、そのリクエストに限りキャッシュをバイパスして最新のレスポンスを取得できる
  4. DキャッシュはAPI全体で1つのTTLしか設定できず、メソッドごとに異なるTTLや無効化タイミングを指定することはできない
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

API Gatewayのステージキャッシュは、バックエンド(Lambda等)への呼び出し回数を減らし、レイテンシとコストを削減する機能である。

  • キャッシュはステージ単位で有効化し、TTL(0〜3600秒、既定300秒)を設定できる。TTLを0にするとキャッシュを一時的に無効化(保存はするが即時失効)できる。
  • キャッシュキーには、メソッド/統合リクエストのパラメータ(URLパス・クエリ文字列・カスタムヘッダー)のうち、明示的に指定したものだけが含まれる。 クエリ文字列やヘッダーは既定ではキャッシュキーに入らない(リソースにキャッシュを設定する際はキャッシュキーが必須で、最低1つを指定する)。 指定しなかったパラメータは区別されないため、条件の違うリクエストへ同じレスポンスが返る点に注意。
  • クライアントは Cache-Control: max-age=0 ヘッダーを送ることでキャッシュをバイパスして最新データを取得できる(ただし呼び出し元にキャッシュ無効化権限=IAMポリシーの許可が必要な場合がある)。
  • コンソール/APIから明示的にキャッシュ全体をフラッシュ(invalidate)することも可能。
  • キャッシュはリージョンエンドポイントの場合API Gateway自体が管理し、キャッシュサイズ(0.5GB〜237GB)に応じて追加コストが発生する。
各誤答が違う理由
  • B誤り。キャッシュは選択したキャッシュクラスターのサイズ(0.5GB〜237GB)に応じた時間課金が発生する。
  • D誤り。メソッド単位でキャッシュのTTLを上書きしたり、キャッシュキーに含めるパラメータを個別設定することができる。
ひっかけ: 「キャッシュは無料機能でコストが発生しない」という誤解に注意。キャッシュサイズに応じた時間課金が発生する。 また「TTLは最大でも300秒固定」という誤解もあるが、実際は最大3600秒まで設定可能(既定値が300秒なだけ)である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q29ステージ・デプロイ・カナリアリリース難易度 標準無料

本番稼働中のREST API(prodステージ)に新しいLambda統合ロジックをデプロイしたい。全トラフィックを一斉切替する前に、本番トラフィックの5%だけを新バージョンへ流し、CloudWatchメトリクスで問題が無いことを確認してから段階的に100%へ引き上げたい。この要件を実現する最も適切な方法を選べ。(単一選択)

  1. Aprodステージでカナリアリリース設定を有効化し、カナリアトラフィックパーセンテージを5%に設定して新しいデプロイをカナリアへ適用する。問題なければ段階的に引き上げ最終的にベースラインへ昇格する
  2. B新しいステージprod-v2を作成し、クライアント側のアプリケーションコードで5%の確率でエンドポイントをprod-v2に切り替えるロジックを実装する
  3. CLambda関数のエイリアスの重み付けルーティングだけを使い、API Gateway側の設定は変更しない
  4. DRoute 53の加重ルーティングポリシーで2つの異なるカスタムドメイン名(api.example.comapi-v2.example.com)へ5%:95%でトラフィックを振り分ける
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

API Gatewayのカナリアリリース(canary release deployment)機能を使うことで、 同一ステージ内で新しいデプロイ(カナリア)と既存の本番デプロイ(ベースライン)にトラフィックを指定した比率で振り分けることができる。

  • prodステージでカナリア設定を有効化し、カナリアトラフィックパーセンテージを5%に設定して新しいデプロイをカナリアへ適用する。
  • 残り95%のトラフィックは既存のベースラインデプロイのまま処理される。カナリア用のCloudWatchメトリクス(Latency5XXError等)は ベースラインと分離して監視できるため、新ロジックの影響を切り分けて評価できる。
  • 問題がなければカナリアパーセンテージを段階的に引き上げ、最終的にベースラインへ昇格(promote)させて全トラフィックを新バージョンにする。 問題があればカナリア設定を削除するだけで即座にロールバックできる。

ステージ変数と組み合わせれば、カナリア側だけ異なるLambdaエイリアス/バージョンを参照させることも可能である。

各誤答が違う理由
  • Bクライアント側実装への依存は運用が煩雑でロールバックも遅い。API Gatewayのカナリア機能はサーバー側で一元管理でき、メトリクスも自動分離される。
  • CLambdaエイリアスの重み付けだけでは実現できるが、API Gateway側のカナリア機能ならメトリクスの分離やステージ変数のオーバーライドなど統合的な管理が可能。カナリアリリース機能を使わない設計は本設問が意図する解ではない。
  • DDNSレベルの加重ルーティングはTTLやクライアント側キャッシュの影響で正確な比率にならず、また2つの別APIを維持する運用コストも増える。API Gatewayネイティブのカナリア機能の方が適切。
ひっかけ: 「新しいステージ(例:prod-canary)を別途作成してRoute 53の重み付けルーティングで振り分ける」という発想は実現不可能ではないが、 API Gatewayが同一ステージ内でネイティブにサポートするカナリアリリース機能を使う方がシンプルかつメトリクス分離・ロールバックが容易であり、本問の意図する正解である。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q30ステージ変数難易度 標準無料

開発者は同じREST API定義を使い回し、devprodの各ステージで異なるLambda関数のエイリアス(devエイリアス/prodエイリアス)を呼び出したい。API定義自体を複製せずにこれを実現する方法として最も適切なものを選べ。(単一選択)

  1. A各ステージにステージ変数(例:lambdaAlias)を設定し、Lambda統合のARNに${stageVariables.lambdaAlias}を埋め込んで、ステージごとに異なるエイリアスを参照させる
  2. Bdev用とprod用でAPI定義を完全に複製し、それぞれのAPIの統合設定に固定のLambdaエイリアスARNを直接記述する
  3. CLambda関数側で環境変数STAGEを読み取り、実行時にステージ名に応じて呼び出す内部ロジックを分岐させる(API Gateway側の設定は変更しない)
  4. Dカスタムドメイン名のベースパスマッピングでステージごとに異なるLambda関数ARNを直接指定する
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

ステージ変数(stage variables)は、API Gatewayのステージごとに設定できるキー・バリューのペアで、 統合のARNやHTTPエンドポイントなど、ステージによって変えたい値をテンプレート化できる。

  • Lambda統合のARNに ${stageVariables.lambdaAlias} のようにステージ変数を埋め込むことで、 同じAPI定義のまま、ステージごとに異なるLambdaエイリアス(例:devステージはdevエイリアス、prodステージはprodエイリアス)を呼び分けられる。
  • ステージ変数はマッピングテンプレート内や、一部のログ設定・VPCリンク先の指定でも参照できる。
  • これによりAPI定義そのものを複製せず、ステージのデプロイ設定だけを切り替えることで環境差分を吸収できる。
各誤答が違う理由
  • B動作はするがAPI定義の二重管理になり、仕様変更のたびに両方を修正する必要が生じ運用負荷が高い。ステージ変数を使えば1つの定義で済む。
  • C要件は「異なるLambdaエイリアスを呼び出す」ことであり、単一のLambda関数内で分岐させる方式では別々にデプロイされたエイリアス(バージョン)を使い分ける要件を満たさない。
  • DベースパスマッピングはカスタムドメインのパスとAPI/ステージを紐付ける機能であり、Lambda ARNを直接指定する機能ではない。
ひっかけ: 「環境ごとにAPI定義を丸ごと複製する」という発想(B)は動くには動くが、API定義の二重管理という運用負荷を生む。 ステージ変数はまさにこの「同じAPI定義でステージごとに変数だけ変える」ためのAPI Gatewayの機能であることを押さえる。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)

無料サンプルはここまでです。全問に挑戦するには6ヶ月アクセスパス(1回払い・自動更新なし)をご利用ください。ログインすると、間違えた問題だけを集めて復習できます。

料金プランを見る