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

DevOpsエンジニア-プロフェッショナル

正解 B,D問題
分野1:SDLC の自動化 タスクステートメント1.3:アーティファクトのビルドと管理 タスクステートメント1.1:CI/CD パイプラインの実装
合格に向けて、もっと深く学習する
豊富な問題と詳細なAWSサービス解説を、24時間無料でお試しいただけます
プレミアム会員機能を無料で試す ❯
問題文と選択肢
ある保険会社は、Pythonアプリケーションの依存パッケージ管理にAWS CodeArtifactを使用し、社内向けのPyPI互換リポジトリで独自ライブラリを配布しています。CI/CDパイプラインはAWS CodePipeline、AWS CodeBuild、AWS CodeDeployで構成されており、厳格な情報セキュリティ基準に従い、CodeBuildプロジェクトはインターネットから完全に遮断された東京リージョン (ap-northeast-1) のプライベートサブネット内で実行されるようVPC構成されています。このVPCにはCodeArtifact用のインターフェイス型VPCエンドポイント (codeartifact.api および codeartifact.repositories) が作成済みです。ビルド定義ファイル (buildspec.yml) はAmazon S3に格納されており、この通信もインターネットを経由してはならないという規定があります。

先日、検証環境でこのパイプラインを実行したところ、CodeBuildのビルドフェーズでS3からのソース取得がタイムアウトし、さらにCodeArtifactからの依存パッケージのダウンロードが権限エラーで失敗し、パイプラインが失敗しました。

セキュリティ要件を維持したままこれらのエラーを解消するために、DevOpsエンジニアが実行すべきアクションの組み合わせはどれですか。(2つ選択)
  • CodeBuildプロジェクトのVPC設定でサブネットをパブリックサブネットに変更し、インターネットゲートウェイ経由でS3およびCodeArtifactへ到達できるようにする
  • 対象VPC内にAmazon S3向けのゲートウェイ型VPCエンドポイントを作成し、CodeBuildが使用するプライベートサブネットのルートテーブルにエンドポイント宛のルートを追加する
  • CodeArtifactのドメインポリシーを変更して認証なしの匿名アクセスを許可し、CodeBuildからのトークン取得処理そのものを省略する
  • CodeBuildプロジェクトのIAMサービスロールに、codeartifact:GetAuthorizationToken、sts:GetServiceBearerToken、およびcodeartifact:ReadFromRepositoryを許可するポリシーを追加する
  • CodeBuildのVPC設定を解除し、事前にダウンロードした依存パッケージ一式をアーカイブしたファイルをS3バケットに保管したうえで、それをCodePipelineの入力アーティファクトとしてビルドに渡す
解説 頻出度★★★★★
この問題は、「インターネット非経由の維持 × プライベートサブネットの CodeBuild × S3 はタイムアウト × CodeArtifact は権限エラー」という状況で、到達性の問題は VPC エンドポイント、認可の問題は IAM ポリシーと 2 つの原因に切り分けられるかがポイント

A. CodeBuildプロジェクトのVPC設定でサブネットをパブリックサブネットに変更し、インターネットゲートウェイ経由でS3およびCodeArtifactへ到達できるようにする

パブリックサブネットに移してインターネットゲートウェイ経由で到達させる案は、「インターネットを経由してはならない」という規定に真っ向から反します
さらに技術的にも成立しません。VPC 内で実行される CodeBuild のビルドコンテナにはパブリック IP が割り当てられないため、パブリックサブネットに置いてもインターネットゲートウェイ経由の通信はできず、結局 NAT ゲートウェイが必要になります。
要件違反と技術的な誤りが重なった選択肢です。

正解

B. 対象VPC内にAmazon S3向けのゲートウェイ型VPCエンドポイントを作成し、CodeBuildが使用するプライベートサブネットのルートテーブルにエンドポイント宛のルートを追加する

正解。Amazon S3 への通信はゲートウェイ型 VPC エンドポイントを作成し、サブネットに関連付いたルートテーブルへエンドポイント宛のルート(プレフィックスリスト)を追加することで、インターネットを経由せず AWS ネットワーク内で完結します。追加のインスタンスも料金も不要です。
これにより buildspec.yml やソースアーティファクトの取得タイムアウトが解消されます。
あわせて、CodeArtifact のパッケージアセットの実体も S3 から取得されるため、プライベート環境で CodeArtifact を使う場合は S3 のゲートウェイエンドポイントが必須である点も押さえておきましょう。

C. CodeArtifactのドメインポリシーを変更して認証なしの匿名アクセスを許可し、CodeBuildからのトークン取得処理そのものを省略する

CodeArtifact には認証なしの匿名アクセスを許可する設定そのものが存在しません。ドメインポリシーやリポジトリポリシーで許可できるのは AWS のプリンシパルであり、リポジトリの利用には常に認証トークンが必要です。
仮に似た緩和ができたとしても、認証を捨てる案は「厳格な情報セキュリティ基準」に反するため、DevOps の解答としては真っ先に消える選択肢です。
「エラーが出たら認証を外す」という方向の選択肢は、試験では原則として誤答です。

正解

D. CodeBuildプロジェクトのIAMサービスロールに、codeartifact:GetAuthorizationToken、sts:GetServiceBearerToken、およびcodeartifact:ReadFromRepositoryを許可するポリシーを追加する

正解。CodeArtifact からパッケージを取得するには、codeartifact:GetAuthorizationToken で認証トークンを取得し、sts:GetServiceBearerToken でそのトークンの発行を許可し、codeartifact:ReadFromRepository でリポジトリを読み取るという 3 つの権限が必要です。
いずれかが欠けるとまさに「権限エラー」で失敗するため、CodeBuild プロジェクトの IAM サービスロールにこれらを付与するのが直接の解決策です。
ネットワーク到達性(選択肢 B)とは独立した原因であり、両方を直して初めてパイプラインが通ります。

E. CodeBuildのVPC設定を解除し、事前にダウンロードした依存パッケージ一式をアーカイブしたファイルをS3バケットに保管したうえで、それをCodePipelineの入力アーティファクトとしてビルドに渡す

VPC 設定を解除すると、ビルドは VPC 外のマネージドなネットワークで実行されることになり、「プライベートサブネットで実行する」というセキュリティ構成そのものを放棄することになります。
さらに、依存パッケージを事前にダウンロードしてアーカイブを配る運用は、CodeArtifact でバージョンを一元管理する目的を捨てて手作業を増やすもので、運用オーバーヘッドが大きく増えます。
エラーの原因(経路と権限)を直さずに構成を後退させる案であり、適切ではありません。

これだけ覚える(記憶フック)
タイムアウトは経路、権限エラーは IAM。S3 はゲートウェイ型エンドポイント、CodeArtifact はトークン取得権限。
正解への思考ルート 問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。
要件 判断ポイント
インターネットから完全に遮断された構成を維持する パブリックサブネット化や VPC 設定の解除は要件そのものを崩す。CodeBuild の VPC 実行ではパブリック IP も付かない
→選択肢(A・E)を消す
S3 からのソース取得がタイムアウトした タイムアウトは経路(到達性)の問題。S3 だけはゲートウェイ型エンドポイントを作り、ルートテーブルに反映する
→選択肢(B)が正解
CodeArtifact のダウンロードが権限エラーで失敗した 到達はしているので認可(IAM)の問題。トークン取得と読み取りの権限をサービスロールへ付与する
→選択肢(D)が正解
厳格な情報セキュリティ基準に従う 匿名アクセスの許可はそもそも CodeArtifact に存在せず、あっても基準違反
→選択肢(C)を消す
CodeArtifact による依存パッケージの一元管理を続ける 事前ダウンロードしたアーカイブの受け渡しはバージョン管理を人手に戻す後退案
→選択肢(E)を消す
ひっかけポイント
  • 「タイムアウト」と「権限エラー」は原因の層が違う。エンドポイントだけ、あるいは IAM だけを直しても、もう一方の失敗が残る。2 つ選ばせる設問の意図はこの切り分けにある
  • VPC エンドポイントは、S3 と DynamoDB だけがゲートウェイ型で、ルートテーブルへのルート追加が必要(追加料金なし)。ほかはインターフェイス型(ENI + 時間課金)。選択肢 B が「ルートテーブルに追加」まで書いている点が正しさの目印
  • 「パブリックサブネットに変更すれば外に出られる」は誤り。VPC 内で動く CodeBuild のビルドにはパブリック IP が付かないため、インターネットへ出るには NAT ゲートウェイが要る(そして本問ではそれ自体が要件違反)
  • 選択肢 D の sts:GetServiceBearerToken は見落としやすい。CodeArtifact の認証トークン発行は STS のベアラートークンを伴うため、codeartifact 系の権限だけでは通らない
出題バリエーション 同じ知識が本番では条件を変えて出題されます。
問題文がこう変わったら 正解はこう変わる
「CodeArtifact への通信そのものがタイムアウトする」 codeartifact.api / codeartifact.repositories のインターフェイス型 VPC エンドポイント(+S3 ゲートウェイ)の作成が正解軸に。
「ビルドが Secrets Manager から DB 認証情報を取得できない」 secretsmanager のインターフェイス型エンドポイントと、サービスロールへの GetSecretValue 権限が正解軸に。
「ビルドログが CloudWatch Logs に出力されない」 logs のインターフェイス型エンドポイントとサービスロールのログ書き込み権限が正解軸に。
「社内ライブラリだけでなく PyPI の公開パッケージも同じリポジトリから取りたい」 CodeArtifact の外部接続(アップストリームリポジトリ)の設定が正解軸に。
特定の VPC エンドポイント経由からのみ CodeArtifact の利用を許可したい」 リポジトリポリシーや IAM ポリシーの aws:SourceVpce 条件による制限が正解軸に。
関連サービスの解説 Amazon Simple Storage Service (Amazon S3)
Amazon VPC
AWS CodeArtifact
AWS CodeBuild
リファレンス この問題を解くために必要な知識を扱う公式ドキュメントです。
知識項目 公式ドキュメント
プライベート環境から CodeArtifact を使う際に必要な VPC エンドポイント Amazon VPC エンドポイントの使用
CodeArtifact が利用できる AWS リージョン(エンドポイント一覧) AWS CodeArtifact endpoints and quotas
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 0%
No.2 解説
ある保険会社は、Pythonアプリケーションの依存パッケージ管理にAWS CodeArtifactを使用し、社内向けのPyPI互換リポジトリで独自ライブラリを配布しています。CI/CDパイプラインはAWS CodePipeline、AWS CodeBuild、AWS CodeDeployで構成されており、厳格な情報セキュリティ基準に従い、CodeBuildプロジェクトはインターネットから完全に遮断された東京リージョン (ap-northeast-1) のプライベートサブネット内で実行されるようVPC構成されています。このVPCにはCodeArtifact用のインターフェイス型VPCエンドポイント (codeartifact.api および codeartifact.repositories) が作成済みです。ビルド定義ファイル (buildspec.yml) はAmazon S3に格納されており、この通信もインターネットを経由してはならないという規定があります。

先日、検証環境でこのパイプラインを実行したところ、CodeBuildのビルドフェーズでS3からのソース取得がタイムアウトし、さらにCodeArtifactからの依存パッケージのダウンロードが権限エラーで失敗し、パイプラインが失敗しました。

セキュリティ要件を維持したままこれらのエラーを解消するために、DevOpsエンジニアが実行すべきアクションの組み合わせはどれですか。(2つ選択)
  • CodeBuildプロジェクトのVPC設定でサブネットをパブリックサブネットに変更し、インターネットゲートウェイ経由でS3およびCodeArtifactへ到達できるようにする
  • 対象VPC内にAmazon S3向けのゲートウェイ型VPCエンドポイントを作成し、CodeBuildが使用するプライベートサブネットのルートテーブルにエンドポイント宛のルートを追加する
  • CodeArtifactのドメインポリシーを変更して認証なしの匿名アクセスを許可し、CodeBuildからのトークン取得処理そのものを省略する
  • CodeBuildプロジェクトのIAMサービスロールに、codeartifact:GetAuthorizationToken、sts:GetServiceBearerToken、およびcodeartifact:ReadFromRepositoryを許可するポリシーを追加する
  • CodeBuildのVPC設定を解除し、事前にダウンロードした依存パッケージ一式をアーカイブしたファイルをS3バケットに保管したうえで、それをCodePipelineの入力アーティファクトとしてビルドに渡す

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