AWS認定資格 WEB問題集&徹底解説
デベロッパー–アソシエイト
問題文と選択肢
Lambda 関数のコード内でデータを暗号化してから S3 にアップロードするための、最も適切な実装方法はどれですか?
- AWS KMS の GenerateDataKey API を呼び出してデータキーを取得し、そのデータキーを使って Lambda のコード内でデータを暗号化する
- S3 バケットのデフォルトの暗号化設定を有効にし、バケットポリシーで暗号化されていないアップロードを拒否する
- AWS KMS の Encrypt API を呼び出し、KMS キー(旧称 カスタマーマスターキー)でデータ全体を直接暗号化する
- Amazon S3 マネージドキー(SSE-S3)を使用して S3 バケット側でサーバーサイド暗号化を適用する
A. AWS KMS の GenerateDataKey API を呼び出してデータキーを取得し、そのデータキーを使って Lambda のコード内でデータを暗号化する
GenerateDataKey は、平文のデータキーと、KMS キーで暗号化されたデータキーの 2 つを返す。Lambda はその平文キーでデータをローカル(コード内)で暗号化し、平文キーをメモリから破棄したうえで、暗号化データと暗号化済みデータキーをまとめて S3 に保存する。
これが エンベロープ暗号化で、AWS が推奨するアプリケーションレベル暗号化の定石。データサイズの制限も受けず、S3 に到達する前に暗号化が完了しているため要件を満たす。
B. S3 バケットのデフォルトの暗号化設定を有効にし、バケットポリシーで暗号化されていないアップロードを拒否する
バケットのデフォルト暗号化とバケットポリシーによる強制は、いずれもS3 側(サーバーサイド)で行う暗号化。データは平文のまま S3 へ送信され、受け取った S3 が暗号化する。
「S3 にアップロードされる前にアプリケーションレベルで暗号化する」という要件を満たさない。セキュリティ対策として有効でも、設問が要求している層が違う。
C. AWS KMS の Encrypt API を呼び出し、KMS キー(旧称 カスタマーマスターキー)でデータ全体を直接暗号化する
KMS の Encrypt API は最大 4KB(4096 バイト)までのデータしか暗号化できないため、医療データの JSON 全体を直接暗号化する用途には使えない。
また KMS を呼ぶたびに API リクエスト料金とスロットリング上限が効いてくるため、大きなデータやレコード単位の暗号化には不向き。だからこそデータキーだけを KMS で扱い、本体はローカルで暗号化するエンベロープ暗号化が用意されている。
D. Amazon S3 マネージドキー(SSE-S3)を使用して S3 バケット側でサーバーサイド暗号化を適用する
SSE-S3 は S3 がオブジェクトを受信した後にサーバー側で暗号化する方式であり、ネットワークを流れる時点のデータはアプリケーションから見て平文(TLS で保護されるのみ)。
クライアントサイド暗号化ではないため、「アップロード前にアプリケーションレベルで暗号化」という法規制上の要件を満たせない。
大きなデータは GenerateDataKey でエンベロープ暗号化。KMS の直接 Encrypt は4KB まで、SSE は「送った後」の暗号化。
正解への思考ルート
問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。| 要件 | 判断ポイント |
|---|---|
| S3 にアップロードされる「前に」暗号化する必要がある | サーバーサイド暗号化(SSE-S3・デフォルト暗号化)はS3 到達後の暗号化。層が違う →選択肢(B・D)を消す |
| Lambda 関数のコード内で暗号化する | クライアントサイド暗号化。鍵は KMS から取得し、暗号化処理自体はコードで行う →選択肢(A・C)は候補 |
| 対象は医療データの JSON(4KB を超え得るサイズ) | KMS の Encrypt API は最大 4KB。データ本体を直接投げる設計は破綻する →選択肢(C)を消す |
| 法規制対象データを安全かつ拡張性ある方式で暗号化 | GenerateDataKey で得たデータキーで本体を暗号化するエンベロープ暗号化が定石 →選択肢(A)が正解 |
ひっかけポイント
- 選択肢 B・D は「暗号化している」ので正しく見えるが、設問は「S3 にアップロードされる前に」と明記。SSE=サーバーサイド=送った後という時系列で切る
- 選択肢 C も「コード内で KMS を使って暗号化」なので一見要件を満たすが、KMS の Encrypt は 4KB 上限。KMS で直接暗号化してよいのは鍵やパスワードなど小さなデータだけ
- エンベロープ暗号化では 平文データキーは使用後に必ず破棄し、暗号化済みデータキーを暗号文と一緒に保存する。復号時は Decrypt でデータキーを戻す
- 実装を自前で書かず AWS Encryption SDK / Amazon S3 Encryption Client を使うのが実務の定石。DVA では「GenerateDataKey=エンベロープ暗号化」の紐付けが問われる
出題バリエーション
同じ知識が本番では条件を変えて出題されます。| 問題文がこう変わったら | 正解はこう変わる |
|---|---|
| 「4KB 未満の小さなシークレット(API キー等)を暗号化したい」 | KMS の Encrypt API を直接呼ぶ方式でよい(あるいは Secrets Manager / SSM SecureString)。 |
| 「暗号化は S3 側に任せてよいが、キーは自社で管理・監査したい」 | SSE-KMS(カスタマー管理キー)が正解軸に。CloudTrail でキー利用も追跡できる。 |
| 「暗号化されていないアップロードを拒否したい」 | バケットポリシーで s3:x-amz-server-side-encryption を条件に Deny が正解軸に。 |
| 「Lambda 環境変数に入れたDB 接続情報を保護したい」 | 環境変数の KMS による暗号化、または Secrets Manager からの取得が正解軸に。 |
Lambda 関数のコード内でデータを暗号化してから S3 にアップロードするための、最も適切な実装方法はどれですか?
- AWS KMS の GenerateDataKey API を呼び出してデータキーを取得し、そのデータキーを使って Lambda のコード内でデータを暗号化する
- S3 バケットのデフォルトの暗号化設定を有効にし、バケットポリシーで暗号化されていないアップロードを拒否する
- AWS KMS の Encrypt API を呼び出し、KMS キー(旧称 カスタマーマスターキー)でデータ全体を直接暗号化する
- Amazon S3 マネージドキー(SSE-S3)を使用して S3 バケット側でサーバーサイド暗号化を適用する