模擬問題集一覧

GCP-PCD 模擬問題集(練習問題)

Professional Cloud Developer 合格に向けた本番形式の模擬問題集。すべての問題に詳しい解説と、ドメイン別の弱点分析つき。

4 練習テスト 200 問 合格ライン 70% 各 120 分

この模擬問題集で身につくこと

  • 本番と同じ形式・難易度の問題で実力を確認
  • 制限時間つきの試験モードで時間配分を体得
  • 演習モードで1問ずつ解説を読みながら学習
  • すべての問題に正解の根拠つきの詳しい解説
  • ドメイン別スコアで弱点分野をひと目で把握
  • 完了後も何度でも復習して本番前に仕上げ

練習テストの内容

4 テスト · 全 200 問
1
模擬問題集①先頭 15 問 無料
50 問 120 分 合格 70%
2
模擬問題集② プラン限定
50 問 120 分 合格 70%
3
模擬問題集③ プラン限定
50 問 120 分 合格 70%
4
模擬問題集④ プラン限定
50 問 120 分 合格 70%

説明

GCP-PCD(Professional Cloud Developer)の合格に向けた、本番形式の模擬問題集です。全 200 問を4 回の練習テストに分割し、 試験モード/演習モードで受験できます。各問題には正解の根拠と誤答の理由を記した詳しい解説が付き、受験後はドメイン別のスコアで弱点を把握できます。 各試験は先頭の問題から無料でお試しいただけます。

月額 ¥980 で全 200 問+全解説が受け放題

模試プラン(¥980/月)なら、ロックされた練習テストと詳しい解説、ドメイン別の弱点分析がすべて使い放題。本番に向けて実力を仕上げましょう。

GCP-PCD の出題範囲(カバーしている分野)

全 200 問を、本番の試験ガイドに沿った次の分野から出題しています。 受験後はドメイン別の正答率が表示され、弱点が特定できます。 難易度・学習時間・合格までの進め方はGCP-PCD の学習ガイドにまとめています。

GCP-PCD の無料練習問題(15 問・解説つき)

会員登録なしで、全 200 問のうち 15 問を正解と解説つきでご覧いただけます。 問題をクリックすると選択肢と解説が開きます。

問題 1それぞれのデータ型にどのデータ ストレージを選択すべきですか?スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計
問題
あなたは、一連のマイクロサービスとして GKE と Cloud Run にデプロイされる新しいモバイル ゲームを開発しています。現時点では、ゲームのユーザー数の見込みはありません。次のデータ型を保存する必要があります。 ・データ型 1: リーダーボード(ランキング)データ ・データ型 2: プレイヤーのプロフィール、チャット、ニュースフィード ・データ型 3: BI(ビジネス インテリジェンス)用のプレイヤーのクリックストリーム データ 使いやすく、費用対効果が高く、スケーラブルで、ユーザーのデバイス上でのオフライン キャッシュをサポートするデータ ストレージ ソリューションを特定する必要があります。それぞれのデータ型にどのデータ ストレージを選択すべきですか?

選択肢と解説

  • 1
    ・データ型 1: Memorystore ・データ型 2: Firestore ・データ型 3: BigQuery
  • 2
    ・データ型 1: Memorystore ・データ型 2: Spanner ・データ型 3: Bigtable
  • 3
    ・データ型 1: Firestore ・データ型 2: Cloud SQL ・データ型 3: BigQuery
  • ✓
    ・データ型 1: Firestore ・データ型 2: Firestore ・データ型 3: BigQuery

解説

【正解】D

【0からの解説】
①前提知識
・Firestore:フルマネージドでサーバーレスの NoSQL ドキュメント データベース。使った分だけ課金され、ゼロから大規模まで自動でスケールします。モバイル / ウェブ向け SDK にはオフライン永続化(デバイス上へのデータのキャッシュ)機能があり、オフライン中も読み書きでき、オンライン復帰時に自動同期されます。リアルタイム リスナーで変更を即座にクライアントへ配信できるため、チャットやフィード、スコアの更新表示にも向いています。
・Memorystore:Redis などのフルマネージドなインメモリ データストア。ソート済みセットによるランキング処理は高速ですが、容量(インスタンス サイズ)を事前にプロビジョニングして常時課金され、VPC 内からアクセスするサーバー側のキャッシュであり、ユーザーのデバイスでのオフライン キャッシュ機能はありません。
・BigQuery:サーバーレスなデータ ウェアハウス。大量のクリックストリームを取り込み、SQL で集計して BI ツールで可視化する用途に最適です。
・Spanner / Cloud SQL / Bigtable:それぞれグローバル RDB、マネージド RDB、大規模ワイドカラム NoSQL です。いずれもインスタンス(ノード)単位の容量計画が必要で、デバイス側のオフライン キャッシュは提供しません。

②要件と制約の整理
・ユーザー数の見込みがない → 事前の容量計画が不要で、使った分だけ払うサーバーレスが望ましい(費用対効果・スケーラビリティ)。
・使いやすい → 扱うサービスの種類が少なく、運用が簡単なほど良い。
・ユーザーのデバイス上でのオフライン キャッシュをサポート → アプリ側に表示するデータ(ランキング、プロフィール、チャット、フィード)は Firestore の SDK で実現できる。
・クリックストリームは BI 用 → 分析用ストアが必要。

③正解がどう満たすか
データ型 1(リーダーボード)とデータ型 2(プロフィール・チャット・ニュースフィード)をともに Firestore に置けば、1 つのサーバーレス データベースでアプリが表示するデータをすべて扱え、デバイス上のオフライン キャッシュとリアルタイム同期もそのまま使えます。ユーザー数が読めなくても自動でスケールし、使用量に応じた課金なので費用対効果も高くなります(Firebase のドキュメントでも Firestore によるリーダーボードの構築方法が紹介されています)。データ型 3 のクリックストリームは BigQuery に取り込み、BI 分析に使います。
・注意:リーダーボードといえば「Memorystore for Redis のソート済みセット(Sorted Set)で作る」のが定番で、場面の異なる類題ではそれが正解になることもあります。Redis はスコア順の並べ替えや順位の取得をミリ秒以下で行えるため、「大量のスコア更新をサーバー側で超低レイテンシに処理したい」ことが主眼の問題では Memorystore が最適です。
・この問題でリーダーボードを Firestore に置く決め手は、「ユーザーのデバイス上でのオフライン キャッシュをサポートする」という要件です。この要件はデータ型 1 にもかかっており、デバイス側のオフライン キャッシュを提供できるのは選択肢の中で Firestore(のクライアント SDK)だけです。さらに「ユーザー数の見込みがない」「使いやすい」という要件も、容量を事前確保する Memorystore より、サーバーレスで 1 つのデータベースにまとめられる Firestore に有利に働きます。問題文の要件を 1 つずつ各データ型に当てはめて確認することが大切です。

【誤りの選択肢】
A:データ型 2 と 3 は適切ですが、リーダーボードを Memorystore に置くと、この問題の決め手であるデバイス上のオフライン キャッシュの要件を満たせません(Memorystore は VPC 内のサーバー側からアクセスするキャッシュで、モバイル端末に直接データを持たせる機能はありません)。ランキング処理の速さは Memorystore の長所ですが、この要件を満たせない以上、選ぶことはできません。また Memorystore はインスタンス容量を事前に確保して常時課金されるため、ユーザー数の見込みがない段階では費用対効果が下がり、管理するサービスも 1 つ増えて「使いやすさ」でも D に劣ります。
B:Memorystore・Spanner・Bigtable はいずれもデバイス上のオフライン キャッシュを提供しません。Spanner と Bigtable はノード / 処理容量単位の課金で最低コストも高く、ユーザー数が不明な新規ゲームには過剰です。Bigtable は BI 用の SQL 分析には BigQuery ほど向いていません。
C:プロフィール・チャット・ニュースフィードを Cloud SQL に置くと、デバイス上のオフライン キャッシュやリアルタイム同期をアプリ側で自前実装する必要があり、インスタンスのサイズ管理も必要です。チャットのような書き込みの多いデータの大規模スケールにも向きません。

【参考】
オフライン データを有効にする | Firestore in Native mode
Firestore の概要 | Firestore in Native mode
BigQuery の概要
この問題のページを開く →
問題 2クラウドネイティブ アプリケーションのデプロイ構成クラウドネイティブ アプリケーションのデプロイ構成
問題
あなたは、Cloud Run にデプロイする必要がある新しい Python 3 の API を開発しています。Cloud Run サービスは Apigee プロキシの背後に配置されます。Cloud Run サービスが、すでにデプロイ済みの Apigee プロキシと連携して動作することを確認する必要があります。このテストをできるだけ迅速に行いたいと考えています。どうすればよいですか?

選択肢と解説

  • 1
    サービスのコードを zip ファイルとして Cloud Storage バケットに保存する。gcloud run deploy --source コマンドを使用してアプリケーションをデプロイし、Apigee が Cloud Run を指すようにして統合をテストする。
  • 2
    Cloud Run エミュレータを使用してアプリケーションをローカルでテストする。Apigee がローカルの Cloud Run エミュレータを指すようにして統合をテストする。
  • 3
    コンテナ イメージをローカルでビルドし、そのイメージを Artifact Registry に push する。イメージを Cloud Run にデプロイし、Apigee が Cloud Run を指すようにして統合をテストする。
  • ✓
    gcloud run deploy --source コマンドを使用して、現在のディレクトリからアプリケーションを直接デプロイし、Apigee が Cloud Run を指すようにして統合をテストする。

解説

【正解】D

【0からの解説】
①前提知識
・Cloud Run の「ソースからのデプロイ」:gcloud run deploy --source . を実行すると、ローカル ディレクトリのソースコードがアップロードされ、Cloud Build が(Dockerfile があればそれを、なければ Google Cloud のビルドパックを使って)コンテナ イメージを自動でビルドし、Artifact Registry に保存したうえで Cloud Run にデプロイします。Python などの対応言語なら Dockerfile を書く必要すらなく、1 コマンドでデプロイが完了します。
・Apigee は Google Cloud のフルマネージドな API 管理プラットフォームで、API プロキシがクライアントからのリクエストを受け、認証・レート制限などを適用してからバックエンド(ここでは Cloud Run)へ転送します。Apigee のランタイムはクラウド上で動作しています。

②要件と制約の整理
・すでにデプロイ済みの Apigee プロキシと、新しい Cloud Run サービスの連携を確認したい。
・「できるだけ迅速に」テストしたい。

③正解がどう満たすか
カレント ディレクトリで gcloud run deploy --source . を実行するだけで、コンテナのビルド・保存・デプロイがまとめて行われ、すぐに Cloud Run サービスの URL が得られます。Apigee プロキシのターゲットをその URL に向ければ、実際のクラウド環境で Apigee 経由の統合をそのままテストできます。手作業のステップが最も少なく、最速でテストに入れる方法です。

【誤りの選択肢】
A:gcloud run deploy --source はローカルのソース ディレクトリ(またはソースファイル)を指定して使うもので、事前にコードを zip にして Cloud Storage バケットへ置くという手順は不要です。余計な作業が増えるだけで、「できるだけ迅速に」に反します。
B:Apigee のランタイムはクラウド上で動いているため、開発者のマシン上で動くローカルのエミュレータには通常到達できません(公開されたエンドポイントではないため)。また、gcloud には Pub/Sub や Firestore などのエミュレータはありますが、Apigee と連携させる「Cloud Run エミュレータ」でクラウドの統合テストを行うことは想定されておらず、実際の Cloud Run 上での連携確認にもなりません。
C:ローカルでのイメージのビルド、Artifact Registry への push、デプロイと手動のステップが多く、ローカルに Docker 環境も必要です。最終的な結果は D と同じですが、ソースからのデプロイ 1 コマンドで済む D に比べて時間がかかります。

【参考】
ソースコードからサービスをデプロイする | Cloud Run
この問題のページを開く →
問題 3アプリケーションのビルドとテストアプリケーションのビルドとテスト
問題
あなたは開発用に VM インスタンスをカスタマイズしており、その VM に SSD Persistent Disk と Standard Persistent Disk のどちらを使用するかを選択する必要があります。チームのクラウド アーキテクトには現在相談できません。SSD と Standard のストレージを使用した場合の利点と欠点を、すばやく把握する必要があります。どうすればよいですか?

選択肢と解説

  • ✓
    Gemini Cloud Assist を使用し、「What is the difference between SSD and Standard Persistent Disks?」(SSD Persistent Disk と Standard Persistent Disk の違いは何ですか?)とプロンプトを入力する。
  • 2
    Reddit や Stack Overflow などのインターネット フォーラムで助けを求める。
  • 3
    Persistent Disk に関する Google Cloud のドキュメントを確認する。
  • 4
    Cloud Architecture Center で、自分のアプリケーションに合致するリファレンス アーキテクチャを確認する。

解説

【正解】A

【0からの解説】
①前提知識
・Persistent Disk は Compute Engine VM にアタッチするブロック ストレージです。「SSD Persistent Disk(pd-ssd)」は IOPS・スループットが高く低レイテンシですが GB 単価が高く、「Standard Persistent Disk(pd-standard)」は HDD ベースで安価ですが性能は低い、というトレードオフがあります(現在は Balanced PD や Hyperdisk などの選択肢もあります)。
・Gemini Cloud Assist は、Google Cloud コンソールなどから自然言語で質問すると、Google Cloud の製品や構成について文脈に沿った回答・説明・推奨を返してくれる AI アシスタント(Gemini for Google Cloud の一部)です。試験ガイドでも、開発環境の構築で利用するツールとして Gemini Cloud Assist が明記されています。

②要件と制約の整理
・相談相手(クラウド アーキテクト)が不在。
・「すばやく(quickly)」利点と欠点を把握したい。
・判断対象は「SSD と Standard の Persistent Disk の違い」という一般的な製品比較です。

③正解がどう満たすか
Gemini Cloud Assist に「SSD と Standard Persistent Disk の違いは?」と質問すれば、性能・コスト・ユースケースの違いを要約した回答がその場で得られ、続けて「開発用 VM ならどちらが良いか」といった追加質問もできます。複数のドキュメントを自分で読み比べるよりも速く、アーキテクトに相談する代わりとして Google が想定している使い方です。
・この問題の決め手は「すばやく(quickly)」という一語です。「正確な一次情報を確認する」ことが求められていれば公式ドキュメント(C)も有力ですが、ここで求められているのは「利点と欠点をすぐに把握すること」です。Gemini Cloud Assist は、ドキュメントの複数ページに散らばった性能・料金・用途の情報を、質問 1 回で「利点 / 欠点」の形に整理して返してくれるため、この要件に最も直接に応えます。
・ただし、生成 AI の回答には誤りが含まれる可能性もあるため、重要な判断の前には回答に示された内容を公式ドキュメントで裏付けると安心です(C は「代わり」ではなく「補完」の位置づけです)。

【誤りの選択肢】
B:インターネット フォーラムは回答がいつ得られるか分からず、内容の正確性や最新性も保証されません。「すばやく」把握する要件に合わず、公式の情報源でもありません。
C:公式ドキュメントは正確な一次情報であり、内容の面では間違った情報源ではありません。しかし Persistent Disk のドキュメントは、ディスクの種類ごとの説明・性能(IOPS / スループット)の表・料金ページ・制限事項などが別々のページに分かれており、自分で探して読み比べ、利点と欠点を整理する作業が必要です。AI アシスタントに 1 回質問すれば要約が得られる A に比べて時間がかかるため、「すばやく」という制約に対しては A に劣ります(回答の裏付けとしてドキュメントを参照するのは良い習慣です)。
D:Cloud Architecture Center のリファレンス アーキテクチャはシステム全体の設計パターンを示す資料であり、2 種類のディスクの利点・欠点を直接比較するためのものではありません。目的に合う情報にたどり着くまで時間もかかります。

【参考】
Gemini を使用した Google Cloud の概要 | Gemini for Google Cloud
この問題のページを開く →
問題 4中断を最小限に抑え、アプリケーションの安定性を確保するために、Redis インスタンスからのクライアントの切断をアプリケ…アプリケーションと Google Cloud サービスの統合
問題
あなたは、頻繁にアクセスされるデータを Memorystore for Redis Cluster インスタンスに保存するアプリケーションを構築しています。アプリケーションをネットワークの問題に対して回復性のあるものにしたいと考えています。中断を最小限に抑え、アプリケーションの安定性を確保するために、Redis インスタンスからのクライアントの切断をアプリケーションが適切に処理できるようにする必要があります。どうすればよいですか。

選択肢と解説

  • 1
    Redis の切断を検出したら直ちにアプリケーション インスタンスを終了して再起動を強制し、アプリケーションが利用可能になり次第クライアントがキャッシュに再接続するのを待つ。
  • 2
    固定の 60 秒の遅延の後に再接続するよう Redis クライアントを構成する。
  • 3
    Memorystore の自動フェイルオーバー メカニズムを使用して、Redis キャッシュをセカンダリ ゾーンで利用できるようにする。
  • ✓
    切断後に再接続する際に、ジッター付きの指数バックオフを実装する。短時間の停止中にデータを提供できるよう、クライアントサイド キャッシュを構成する。

解説

【正解】D

【0からの解説】
①前提知識:Memorystore for Redis Cluster は、Google Cloud が運用するフルマネージドの Redis(インメモリ キー・バリュー ストア)で、複数のシャードにデータを分散して高いスループットを得るサービスです。マネージド サービスであってもメンテナンス、フェイルオーバー、スケーリング、ネットワークの一時的な瞬断などで、クライアントとの接続が切れることは避けられません。そのため「接続が切れたときにアプリ側でどう振る舞うか」はアプリケーション開発者の責任範囲です。
・指数バックオフ(exponential backoff):再試行の待ち時間を 1 秒、2 秒、4 秒…と失敗のたびに倍々で延ばしていく方式です。障害直後にサーバーへ再接続要求が殺到するのを防ぎます。
・ジッター(jitter):待ち時間にランダムな揺らぎを加えることです。多数のクライアントが同じタイミングで一斉に再接続する「サンダリング ハード(thundering herd)」を防ぎます。Google Cloud は API 呼び出しやデータストアへの接続の再試行で、ジッター付き指数バックオフを推奨しています。
・クライアントサイド キャッシュ:アプリケーション プロセス内のメモリに、直近に読んだ値を短時間保持しておく仕組みです。Redis に一時的に届かない間も、ローカルにある値で読み取りに応答できます。

②要件の整理:「ネットワークの問題に対して回復性がある」「クライアントの切断を適切に(gracefully)処理する」「中断を最小限に」「アプリの安定性を確保」。つまり、アプリ側で自動的かつ過負荷を起こさない形で再接続し、その間もサービスをできるだけ継続することが求められています。

③正解の理由:D は、(1) ジッター付き指数バックオフで、瞬断なら素早く、長引く障害ならサーバーを圧迫しないペースで自動再接続し、(2) クライアントサイド キャッシュで再接続を待つ短い間も読み取りに応答できるため、ユーザーへの影響(中断)を最小化できます。これは Google Cloud のドキュメントが再試行のベスト プラクティスとして示す考え方そのものであり、要件をすべて満たします。

【誤りの選択肢】
A:切断を検出するたびにアプリケーション インスタンスを終了・再起動するのは、一時的な瞬断を「アプリの停止」という大きな障害に拡大させる対応です。再起動中はリクエストを処理できず、多数のインスタンスが同時に再起動すると再接続の集中も起こります。「中断を最小限に」「安定性を確保」という要件に真っ向から反します。
B:固定 60 秒の遅延は、数百ミリ秒〜数秒で回復する瞬断でも必ず 60 秒待つため、不必要に長い中断を生みます。また全クライアントが同じ間隔で再試行するため、ジッターがなく一斉再接続(thundering herd)を防げません。指数バックオフ+ジッターに比べて応答性・安定性の両面で劣ります。
C:自動フェイルオーバー(レプリカを使ったゾーン障害時の切り替え)はサーバー側の可用性を高める機能で、それ自体は有用です。しかし、フェイルオーバーの最中やネットワークの瞬断時にはクライアントの接続はやはり切断されるため、「クライアントの切断をアプリケーションが適切に処理する」という問われている課題の解決策になっていません。アプリ側の再接続ロジックは別途必要です。

【参考】
Memorystore for Redis の高可用性
再試行の方法 | Cloud Storage
この問題のページを開く →
問題 5スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計
問題
あなたのチームはクラウド費用の削減に取り組んでおり、あなたは GKE Autopilot クラスタのコストを評価したいと考えています。マニフェストを確認したところ、現在リソース リクエストが指定されていないことがわかりました。アプリケーションはステートレスかつフォールト トレラントで、ノードに対する特定のハードウェア要件やメモリ要件はありません。十分なコンピューティング リソースを備えたクラスタを維持しながら、スケーラブルで費用対効果の高いクラスタになるよう、できるだけ早く変更したいと考えています。どうすればよいですか?

選択肢と解説

  • ✓
    Pod を Spot Pod として実行するようリクエストし、YAML マニフェストで cloud.google.com/gke-spot=true ラベルを使用する。
  • 2
    YAML マニフェストで Balanced コンピューティング クラスをリクエストする。
  • 3
    YAML のデプロイ構成マニフェストで、最大 CPU を 5 vCPU にリクエストして設定する。
  • 4
    Cloud Trace と Cloud Monitoring を設定し、過去 30 日間に使用された最大メモリを特定して、その量のメモリをリクエストするよう YAML マニフェストを設定する。

解説

【正解】A

【0からの解説】
①前提知識
・GKE Autopilot は、ノードの作成・スケーリング・管理を Google が行うモードで、課金はノード単位ではなく Pod がリクエストした CPU・メモリなどのリソースに対して行われます。リソース リクエストを指定しない Pod には、コンピューティング クラスごとのデフォルト値(汎用クラスでは 0.5 vCPU・2 GiB など)が自動的に適用されます。
・Spot Pod は、Spot VM(Google Cloud の余剰容量)上で実行される Pod です。通常の Pod より大幅に安い料金で実行でき、その代わりに Google Cloud が容量を必要とした際に Pod が終了(プリエンプト)されることがあります。そのため、ステートレスでフォールト トレラント(途中で止まっても再実行・再スケジュールで回復できる)なワークロード向けとされています。Autopilot では、マニフェストの nodeSelector(またはノード アフィニティ)で cloud.google.com/gke-spot: "true" を指定するだけで Spot Pod をリクエストでき、Autopilot が自動で Spot ノードを用意します。
・コンピューティング クラス(Balanced・Scale-Out・Performance など)は、汎用クラスより高い性能や特定のマシン特性が必要な場合に選ぶもので、通常は汎用クラスより単価が高くなります。

②要件と制約の整理
・目的はコスト削減(費用対効果)とスケーラビリティ。
・アプリはステートレスでフォールト トレラント、特別なハードウェア / メモリ要件なし。
・「できるだけ早く」変更したい。
・十分なコンピューティング リソースは維持したい。

③正解がどう満たすか
ワークロードの性質(ステートレス・フォールト トレラント)はまさに Spot Pod の想定ユースケースです。マニフェストに cloud.google.com/gke-spot="true" の nodeSelector を 1 行追加するだけで、同じリソース量(=十分なコンピューティング リソース)を維持したまま、Pod あたりの単価を大きく下げられます。Pod がプリエンプトされても Deployment が再作成し、Autopilot が自動でノードを用意するので、スケーラビリティも保たれます。分析作業を必要とせず即座に適用できる点で「できるだけ早く」にも合致します。

【誤りの選択肢】
B:Balanced コンピューティング クラスは、汎用クラスより高い CPU 性能や大きなリソース量が必要なワークロード向けで、料金は汎用クラスより高くなります。特別なハードウェア要件がないこのアプリで選ぶと、コスト削減どころかコスト増になります。
C:Autopilot の課金はリクエストしたリソース量に基づくため、CPU を 5 vCPU という根拠のない大きな値でリクエストすると、デフォルト(0.5 vCPU)よりはるかに高額になります。実際の使用量に基づかない設定で、費用対効果の要件に反します。
D:実使用量に基づいてリクエストを適正化(ライトサイジング)するのは長期的には有効ですが、30 日分のデータを集めて分析する必要があり「できるだけ早く」に反します。また Cloud Trace はリクエストのレイテンシ分析用でメモリ使用量の把握には不要であり、ピーク時の最大メモリでリクエストするとかえって過剰確保になりがちです。

【参考】
Spot Pod でフォールト トレラントなワークロードを低コストで実行する | Google Kubernetes Engine (GKE)
Autopilot でのリソース リクエスト | Google Kubernetes Engine (GKE)
Autopilot クラスタの Balanced と Scale-Out の ComputeClass について | Google Kubernetes Engine (GKE)
この問題のページを開く →
問題 6Arm アーキテクチャの CPU を使用するノードに Pod がスケジュールされるようにする必要があります。クラウドネイティブ アプリケーションのデプロイ構成
問題
あなたは GKE Autopilot モードのクラスタに新しいワークロードをデプロイしようとしています。Arm アーキテクチャの CPU を使用するノードに Pod がスケジュールされるようにする必要があります。クラスタには現在、Arm ベースの CPU はありません。クラスタの運用作業は最小限に抑えたいと考えています。GKE クラスタ上のワークロードが Arm ベースの CPU ノードを使用するようにするには、どうすればよいですか。

選択肢と解説

  • 1
    Arm ベースの CPU を持たないノードに Pod をスケジュールしないよう GKE に要求するため、Pod の toleration を適用する。
  • 2
    Arm ベースの CPU ノードにのみワークロードをスケジュールするよう GKE に指示するため、ノードプールに node taint を適用する。
  • 3
    GKE Standard モードで新しいクラスタをデプロイし、Arm ベースの CPU ノードを含むノードプールを設定する。マニフェストで nodeSelector を使用して、Pod がこのノードプールにスケジュールされるようにする。
  • ✓
    マニフェストで Scale-Out コンピューティング クラスと arm64 アーキテクチャをリクエストする。

解説

【正解】D

【0からの解説】
①前提知識:GKE Autopilot は、ノードやノードプールの作成・管理を Google が行うモードです。利用者は Pod のマニフェストで必要なリソースやハードウェアの種類を宣言するだけで、それに合うノードを GKE が自動でプロビジョニングします。
・コンピューティング クラス(ComputeClass):Autopilot で Pod が実行されるノードのハードウェア特性を選ぶ仕組みです。例えば Scale-Out クラスは、シングルスレッドのスケールアウト型ワークロード向けで、arm64 を指定すると Arm ベースの Tau T2A マシンシリーズのノードが使われます(Performance クラスや autopilot-arm クラスなどでも Arm を選べます)。
・Arm を要求する方法:Pod の nodeSelector(またはノード アフィニティ)に cloud.google.com/compute-class: Scale-Out と kubernetes.io/arch: arm64 を指定します。Autopilot はこれを見て Arm ノードを自動作成し、そのノードに taint を、Pod に対応する toleration を自動で付与します(なお、コンテナ イメージは Arm 用にビルドされている必要があります)。

②要件の整理:「Autopilot クラスタ」「Arm CPU のノードで Pod を実行」「現在 Arm ノードはない」「クラスタの運用作業を最小限に」。

③正解の理由:D のようにマニフェストで Scale-Out コンピューティング クラスと arm64 アーキテクチャをリクエストするだけで、Autopilot が Arm ノードを自動で用意して Pod を配置します。ノードプールの作成や taint の管理は不要で、運用作業は最小です。GKE の公式ドキュメント「Arm アーキテクチャに Autopilot ワークロードをデプロイする」で示されている方法そのものです(新しい GKE バージョンでは kubernetes.io/arch: arm64 のみの指定や autopilot-arm クラスでも要求できるようになっていますが、選択肢の中で正しく Arm ノードを要求できるのは D だけです)。

【誤りの選択肢】
A:toleration は「taint の付いたノードにも配置されてよい」と許可するだけの設定で、「特定のノード以外に配置しない」と要求する機能ではありません。Arm ノードがまだ存在しない状況で toleration を付けても、Arm ノードは作成されず、Pod が Arm ノードに配置される保証もありません。
B:Autopilot ではノードプールを利用者が管理しないため、ノードプールに taint を付けるという操作自体が前提に合いません。また taint は「その他の Pod を締め出す」仕組みであり、そもそも Arm ノードが無ければ意味がありません。
C:Standard モードの新クラスタを作り、Arm ノードプールを自分で用意すれば技術的には動きますが、クラスタの新規作成、ノードプールの設計・運用(アップグレード、スケーリング)といった作業が大幅に増えます。「クラスタの運用作業を最小限に」という要件に反し、既存の Autopilot クラスタでマニフェストに数行加えるだけで済む D に劣ります。

【参考】
Arm アーキテクチャに Autopilot ワークロードをデプロイする | Google Kubernetes Engine (GKE)
Autopilot Pod のコンピューティング クラスを選択する | Google Kubernetes Engine (GKE)
この問題のページを開く →
問題 7チームの開発者は、同じワークステーション上で、あるクラスタから別のクラスタへ定期的に切り替える必要があります。アプリケーションのビルドとテスト
問題
あなたは大企業の開発者です。3 つの GKE クラスタを管理しています。チームの開発者は、同じワークステーション上で、あるクラスタから別のクラスタへ定期的に切り替える必要があります。Google が推奨するプラクティスに従いながら、これら複数のクラスタへの個別のアクセスを安全に構成したいと考えています。どうすればよいですか。

選択肢と解説

  • 1
    開発者に Cloud Shell を使用してもらい、gcloud container clusters get-credentials コマンドを実行して別のクラスタに切り替えてもらう。
  • 2
    開発者にワークステーション上で 3 つのターミナルを開いてもらい、kubectl config set コマンドを使用して各クラスタへのアクセスを構成してもらう。
  • ✓
    開発者にワークステーションに gcloud CLI をインストールしてもらい、gcloud container clusters get-credentials コマンドを実行して別のクラスタに切り替えてもらう。
  • 4
    テキスト ファイルにクラスタ、ユーザー、コンテキストを定義する。そのファイルを開発者にメールで送り、kubectl config set コマンドを使用してクラスタ、ユーザー、コンテキストの詳細をファイルに追加してもらう。

解説

【正解】C

【0からの解説】
①前提知識:kubectl は Kubernetes クラスタを操作するコマンドライン ツールで、接続先の情報を kubeconfig ファイル(通常 ~/.kube/config)から読みます。kubeconfig には「cluster(API サーバーのエンドポイントと CA 証明書)」「user(認証方法)」「context(cluster と user の組み合わせ)」が登録され、kubectl config use-context で接続先を切り替えられます。
GKE では、gcloud container clusters get-credentials コマンドを実行すると、そのクラスタのエンドポイント・証明書と、gke-gcloud-auth-plugin を使った認証設定が kubeconfig に自動で追加され、現在のコンテキストがそのクラスタに切り替わります。認証は開発者本人の Google アカウント(gcloud auth login でログインした ID)で行われ、有効期間の短いアクセス トークンが都度取得されます。つまり、パスワードや長期間有効な秘密情報を kubeconfig に書き込まずに、開発者ごとに個別の ID で IAM/RBAC に基づくアクセス制御が効きます。

②要件の整理:「同じワークステーション上で」「3 クラスタを定期的に切り替える」「個別のアクセス(開発者ごとの ID)」「安全に」「Google 推奨のプラクティス」。

③正解の理由:C は、各開発者のワークステーションに gcloud CLI を入れ、本人の ID でログインした上で get-credentials を使う方法です。3 クラスタ分のエントリが kubeconfig に正しく作られ、以後は get-credentials の再実行や kubectl config use-context で簡単に切り替えられます。認証情報は本人の Google ID に紐づく短期トークンなので安全で、これが GKE ドキュメントで案内されている標準的な kubectl のアクセス構成方法です。

【誤りの選択肢】
A:Cloud Shell でも get-credentials は使えますが、Cloud Shell はブラウザから使う Google Cloud 上の一時的な VM であり、「同じワークステーション上で」切り替えるという要件を満たしません。開発者のローカルのツールやエディタ、ソースコードとも分かれてしまい、日常的な開発環境としての要件に合致しません。
B:ターミナルを 3 つ開いても kubeconfig は同じファイルを共有するため、ターミナルごとに接続先が分かれるわけではありません。また kubectl config set で cluster・user・認証情報を手作業で組み立てると、証明書やトークンを手で扱うことになり、誤設定や認証情報の漏えいのリスクが増えます。gcloud が自動で正しく構成してくれる方法に比べ、手間と安全性の両面で劣ります。
D:クラスタ・ユーザー・コンテキスト(認証情報を含み得る)をテキスト ファイルにまとめてメールで配布するのは、認証情報の共有・平文送信にあたり、安全ではありません。共通のファイルを配ると「個別のアクセス」にもならず、Google が推奨するやり方とは正反対です。

【参考】
クイックスタート: Google Cloud CLI をインストールする SDK
クラスタ管理の概要 | Google Kubernetes Engine (GKE)
Cloud Code for VS Code で kubeconfig ファイルを操作する
この問題のページを開く →
問題 8Cloud Run インスタンスあたり 100 を超える接続を可能にする必要があります。アプリケーションと Google Cloud サービスの統合
問題
デフォルトの Cloud SQL 接続を使用して Cloud SQL Enterprise エディションのデータベース インスタンスに接続する Cloud Run サービスがあります。Cloud Run インスタンスあたり 100 を超える接続を可能にする必要があります。どうすればよいですか。

選択肢と解説

  • 1
    Cloud SQL Admin API の 1 分あたりのクエリ数の割り当て上限を引き上げる。
  • 2
    Cloud SQL for PostgresSQL の max_connection フラグの値を増やす。
  • 3
    Cloud SQL Enterprise Plus エディションにアップグレードする。
  • ✓
    サイドカーで Cloud SQL Auth Proxy を使用する。

解説

【正解】D

【0からの解説】
①前提知識:Cloud Run から Cloud SQL に接続する最も簡単な方法は、Cloud Run サービスに Cloud SQL 接続(--add-cloudsql-instances)を設定する「デフォルトの(組み込みの)Cloud SQL 接続」です。これを設定すると、Cloud Run が内部で Unix ソケット経由の接続を用意してくれます。ただし、Cloud SQL の公式ドキュメント(割り当てと上限、Cloud Run からの接続)には「Cloud Run のコンテナ インスタンスは Cloud SQL データベースへの接続が 100 に制限される」と明記されており、この上限は「Cloud SQL Auth Proxy をサイドカーで使用する」など他の接続方法では適用されない、とも記載されています(Cloud SQL 言語コネクタやインスタンスの IP アドレスへの直接接続も同様に対象外です)。
・Cloud SQL Auth Proxy:IAM による認証と TLS 暗号化を自動で行い、アプリからは localhost の DB ポートに接続するだけで Cloud SQL に安全につながるプロキシです。Cloud Run ではマルチコンテナ(サイドカー)機能で、アプリ コンテナと一緒に Auth Proxy コンテナを動かせます。

②要件の整理:「デフォルトの Cloud SQL 接続を使っている」「Cloud Run インスタンスあたり 100 を超える接続が必要」。つまり、組み込み接続方式に固有の上限をどう回避するかが問われています。

③正解の理由:100 接続の上限はデフォルトの Cloud SQL 接続方式による制限なので、接続方式を Cloud SQL Auth Proxy のサイドカーに切り替えれば、この上限は適用されなくなります。認証・暗号化の安全性も維持され、要件を満たします(なお、Cloud SQL インスタンス側の最大接続数も十分である必要があります)。

【誤りの選択肢】
A:Cloud SQL Admin API の割り当て(1 分あたりのリクエスト数)は、接続の確立時に使われる API 呼び出し回数の上限であり、Cloud Run インスタンスあたりの同時接続数 100 の上限とは別物です。引き上げても 100 接続の制限は解消されません。
B:max_connections フラグは Cloud SQL インスタンス全体が受け付ける最大接続数を決める設定です。インスタンス側の上限を上げても、Cloud Run の組み込み接続による「インスタンスあたり 100 接続」の制限は Cloud Run 側の制約なので変わりません(なお原文の max_connection / PostgresSQL は表記ゆれで、正式には max_connections / PostgreSQL です)。
C:Enterprise Plus エディションは、より高い性能・可用性(データ キャッシュ、99.99% の SLA など)を提供するエディションですが、Cloud Run の組み込み接続のインスタンスあたり 100 接続の上限を解除する機能ではありません。コストも上がるのに課題は解決しません。

【参考】
Cloud Run から接続する | Cloud SQL for MySQL
Cloud SQL Auth Proxy について | Cloud SQL for MySQL
この問題のページを開く →
問題 9Google が推奨するベスト プラクティスに従って、このサービスへのアクセスをどのように構成すべきですか?スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計
問題
あなたの会社はグローバルなイベントを計画しています。あなたはそのイベントの参加登録ポータルを構成する必要があります。登録サービスは Cloud Run を使用してデプロイすることに決めました。会社のマーケティング チームは、Cloud Run サービスの URL を宣伝したくありません。マーケティング チームは、登録ポータルに、カスタム ドメインの URL パターン(例: .example.com)でパーソナライズされたホスト名またはパスを使用してアクセスできるようにしたいと考えています。Google が推奨するベスト プラクティスに従って、このサービスへのアクセスをどのように構成すべきですか?

選択肢と解説

  • 1
    Cloud Armor を構成して Cloud Run サービス URL へのトラフィックをブロックし、カスタム ドメインの URL パターンからの再ルーティングのみを許可する。
  • 2
    Compute Engine 上に HAProxy をセットアップし、カスタム ドメインから Cloud Run サービス URL へのルーティング ルールを追加する。
  • ✓
    サービスの前段にグローバル外部アプリケーション ロードバランサを追加し、ロードバランサの IP アドレスを指す DNS レコードを構成する。
  • 4
    Cloud Run サービス URL を指す CNAME レコードを作成する。

解説

【正解】C

【0からの解説】
①前提知識
・Cloud Run にデプロイしたサービスには、自動的に https://<サービス名>-<ハッシュ>.a.run.app のような URL が割り当てられます。独自ドメインで公開するには、公式ドキュメント上 3 つの方法があります:(1) グローバル外部アプリケーション ロードバランサ(推奨)、(2) Cloud Run ドメイン マッピング(プレビュー段階で、本番環境向けには推奨されない)、(3) Firebase Hosting。
・グローバル外部アプリケーション ロードバランサは、世界中の Google のエッジで HTTP(S) トラフィックを受ける L7 ロードバランサです。Cloud Run をバックエンドにするにはサーバーレス ネットワーク エンドポイント グループ(サーバーレス NEG)を使います。サーバーレス NEG の「URL マスク」を使うと、.example.com や example.com/ のようなパターンからサービス名を取り出して、対応する Cloud Run サービスへ振り分けることもできます。Google マネージド SSL 証明書、Cloud CDN、Cloud Armor なども組み合わせられます。

②要件と制約の整理
・Cloud Run の既定 URL は宣伝せず、カスタム ドメイン(パーソナライズされたホスト名またはパス)でアクセスさせたい。
・グローバルなイベント → 世界中から低レイテンシでアクセスできると望ましい。
・「Google が推奨するベスト プラクティス」に従う。

③正解がどう満たすか
Cloud Run の前段にグローバル外部アプリケーション ロードバランサ(バックエンドはサーバーレス NEG)を置き、example.com の DNS の A レコード(またはワイルドカード レコード)をロードバランサの IP アドレスに向ければ、カスタム ドメインのホスト名やパスで登録ポータルにアクセスできます。これは公式ドキュメントで「推奨」とされている方法で、マネージド証明書による HTTPS、URL マスクによるホスト名 / パス ベースの振り分け、Google のグローバル エッジでの受信といったグローバル イベント向けの利点も得られます。

【誤りの選択肢】
A:Cloud Armor はロードバランサに付けるセキュリティ ポリシー(WAF・IP 制限など)であり、それ自体でカスタム ドメインから Cloud Run への「再ルーティング」を行う機能はありません。カスタム ドメインでのアクセス自体を実現できません。
B:Compute Engine 上に HAProxy を自前で構築すると、VM のパッチ適用・スケーリング・冗長化・証明書管理などをすべて自分で行う必要があり、運用負荷が大きくなります。単一の VM はボトルネック・単一障害点にもなり、マネージドなロードバランサを使う Google 推奨の方法ではありません。
D:run.app の URL へ単純に CNAME を向けても、Cloud Run 側はそのホスト名を自分のサービスとして認識せず、TLS 証明書もカスタム ドメイン用に発行されないため、正しく接続できません(Cloud Run ドメイン マッピングを使う場合に必要な DNS レコードは ghs.googlehosted.com を指すもので、しかもドメイン マッピング自体がプレビューで本番向けには推奨されていません)。

【参考】
カスタム ドメインのマッピング | Cloud Run
Cloud Run、App Engine、または Cloud Run functions を使用してグローバル外部アプリケーション ロードバランサを設定する。 | Cloud Load Balancing
この問題のページを開く →
問題 10Google が推奨するプラクティスに従いながら、適切な認証でコードをデプロイしたいと考えています。クラウドネイティブ アプリケーションのデプロイ構成
問題
あなたは、Cloud Storage にアップロードされたファイルから情報を取得し、その情報を Bigtable に書き込む Python スクリプトを開発しました。ローカル環境でのテストを完了し、Bigtable ユーザーの IAM ロールを持つ python-script サービス アカウントを作成しました。Google が推奨するプラクティスに従いながら、適切な認証でコードをデプロイしたいと考えています。どうすればよいですか。

選択肢と解説

  • ✓
    1. コードを Cloud Functions にデプロイする。Cloud Storage トリガーを作成する。2. 認証のために IAM バインディングを構成する。
  • 2
    1. コードを Cloud Functions にデプロイする。Cloud Storage トリガーを作成する。2. 認証のためにサービス アカウント キーを作成する。
  • 3
    1. イメージを Cloud Run にデプロイする。サービスを 1 分ごとにトリガーするトリガーを Cloud Scheduler に作成する。2. 認証のために IAM バインディングを構成する。
  • 4
    1. イメージを Cloud Run にデプロイする。サービスを 1 分ごとにトリガーするトリガーを Cloud Scheduler に作成する。2. 認証のためにサービス アカウント キーを作成する。

解説

【正解】A

【0からの解説】
①前提知識:
・Cloud Functions(現 Cloud Run functions):関数単位のコードをデプロイすると、イベントに応じて自動実行されるサーバーレス サービスです。Cloud Storage トリガー(Eventarc 経由の「オブジェクトのファイナライズ」イベントなど)を設定すれば、バケットにファイルがアップロードされた瞬間に関数が起動します。
・サービス アカウントの関連付けと IAM バインディング:Google Cloud 上で動くコードは、リソース(関数や Cloud Run サービス)にサービス アカウントを「関連付ける(ランタイム サービス アカウントとして指定する)」ことで、そのサービス アカウントとして Google Cloud API を呼び出せます。認証情報はメタデータ サーバー経由で自動的に短期トークンとして提供され、アプリケーションのデフォルト認証情報(ADC)がそれを使うため、コード内に鍵を持つ必要がありません。必要な権限は、そのサービス アカウントに IAM ロール(ここでは Bigtable ユーザー)をバインドして与えます。
・サービス アカウント キー:長期間有効な秘密鍵(JSON ファイル)で、漏えいすると悪用されるリスクが高いため、Google は「他に手段がない場合を除き使用しない」ことを推奨しています。

②要件の整理:「Cloud Storage にアップロードされたファイルを処理」=アップロードをきっかけに処理するのが自然。「python-script サービス アカウント(Bigtable ユーザー)を使う」「適切な認証」「Google 推奨のプラクティス」。

③正解の理由:A は、(1) Cloud Functions に Cloud Storage トリガーを設定してアップロードのたびに即座に処理するイベント駆動構成で、ファイルを取りこぼさず無駄な起動もありません。(2) 関数に python-script サービス アカウントを関連付け、IAM バインディングで権限を付与するため、鍵ファイルを使わない安全な認証になります。どちらも Google の推奨に沿っています。

【誤りの選択肢】
B:トリガーの選択は適切ですが、サービス アカウント キーを作成して認証するのは推奨されません。関数にサービス アカウントを関連付ければ鍵なしで認証できるのに、漏えいリスクのある長期鍵を作る理由がなく、鍵のローテーションなどの管理負担も増えます。
C:認証方法(IAM バインディング)は適切ですが、Cloud Scheduler で 1 分ごとにサービスを起動するポーリング方式は、ファイルが無いときも無駄に起動し、アップロードから処理まで最大 1 分の遅延も生じます。さらに、どのファイルが新しく処理済みかを自前で管理する必要があります。Cloud Storage のイベントで直接起動できる A に比べて非効率です(Cloud Run でも Eventarc の Cloud Storage トリガーは使えますが、この選択肢はポーリング方式です)。
D:Cloud Scheduler による 1 分ごとのポーリングという非効率な起動方法と、推奨されないサービス アカウント キーによる認証の両方が問題で、最も不適切です。

【参考】
Cloud Storage イベントからトリガーを作成する | Cloud Run
サービスのサービス ID を構成する | Cloud Run
サービス アカウント キーを管理するためのベスト プラクティス | Identity and Access Management (IAM)
この問題のページを開く →
問題 11Docker イメージのビルド プロセスをどのように最適化すべきですか。アプリケーションのビルドとテスト
問題
あなたはコンテナ化されたアプリケーションを GKE にデプロイしようとしています。Cloud Build を使用して、Java アプリケーションをビルドし、アプリケーションのコンテナ イメージを Artifact Registry に push するビルド パイプラインを設定しました。ビルド パイプラインは、同じレイヤを持つ Docker コンテナ イメージを参照する複数の連続したステップを実行します。Cloud Build パイプラインの実行の完了に予想以上に時間がかかっていることに気付きました。Docker イメージのビルド プロセスをどのように最適化すべきですか。

選択肢と解説

  • 1
    Docker ビルドステップに --squash パラメータを追加して、新しくビルドされたレイヤを 1 つのレイヤに結合する。
  • 2
    パイプラインの実行に VPC 内のプライベート プールを使用するよう Cloud Build を構成する。
  • ✓
    ビルド構成ファイルに --cache-from 引数を追加し、そのイメージをキャッシュのソースとして指定して、キャッシュされたイメージを指定する。
  • 4
    コンテナ アーティファクトを Cloud Storage に保存する。Cloud Storage バケットで Cloud CDN を構成し、エッジ ロケーションでのキャッシュを有効にする。

解説

【正解】C

【0からの解説】
①前提知識:Docker イメージは、Dockerfile の各命令ごとに作られる「レイヤ」の積み重ねでできています。ローカルの Docker では、変更のないレイヤは前回のビルド結果(レイヤ キャッシュ)を再利用するため、2 回目以降のビルドが速くなります。しかし Cloud Build では各ビルドが新しい使い捨ての環境で実行されるため、前回のレイヤ キャッシュが残っておらず、毎回すべてのレイヤを最初から作り直すことになります。
・--cache-from:docker build に「このイメージのレイヤをキャッシュとして使ってよい」と指示する引数です。Cloud Build の公式ドキュメント「ビルドを高速化する際のベスト プラクティス」では、前回ビルドして Artifact Registry に push したイメージを最初のステップで docker pull し、docker build に --cache-from でそのイメージを指定する方法が紹介されています(他の方法として Kaniko キャッシュもあります)。

②要件の整理:「同じレイヤを持つイメージを参照する複数の連続したステップ」「パイプラインの実行に時間がかかる」「Docker イメージのビルド プロセスを最適化したい」。同じレイヤを何度もビルドし直していることが遅さの原因と考えられます。

③正解の理由:C のように --cache-from でキャッシュ元のイメージを指定すれば、変更のないレイヤ(ベースイメージや依存ライブラリのレイヤなど)は再ビルドせずに再利用され、Java のビルドを含むビルド時間を大幅に短縮できます。Cloud Build が公式に推奨している高速化手法です。

【誤りの選択肢】
A:--squash は新しく作ったレイヤを 1 つにまとめてイメージを小さくする(実験的な)オプションです。レイヤが 1 つにまとまると、むしろ一部の変更でもレイヤ全体を作り直すことになり、キャッシュによる再利用が効きにくくなります。ビルド時間の短縮にはつながりません。
B:プライベート プールは、VPC 内のリソースへのアクセスや、より大きなマシンタイプ、ネットワークの制御が必要な場合に使う専用のワーカー プールです。マシンを大きくすれば多少速くなる可能性はありますが、同じレイヤを毎回作り直すという根本原因は解消されず、コストも増えます。
D:Cloud CDN は Web コンテンツをエンド ユーザーに近いエッジでキャッシュして配信する仕組みで、Docker ビルドのレイヤ キャッシュとは無関係です。また、コンテナ イメージの保存先としては Artifact Registry を使うのが推奨であり、Cloud Storage に移しても Cloud Build のビルドは速くなりません。

【参考】
ビルドを高速化する際のベスト プラクティス | Cloud Build
この問題のページを開く →
問題 12スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計
問題
あなたは、アプリケーションの複雑なデータ分析を処理するためのワークフローを Workflows で構築しています。Google が推奨するベスト プラクティスに従いながら、ワークフローを使用して Cloud Run ジョブを実行する予定です。どうすればよいですか?

選択肢と解説

  • 1
    Pub/Sub トピックを作成し、Cloud Run ジョブをそのトピックにサブスクライブする。
  • 2
    Cloud Run ジョブを呼び出す Eventarc トリガーを構成し、そのトリガーをワークフローのステップに含める。
  • ✓
    Cloud Run Admin API コネクタを使用して、ワークフロー内で Cloud Run ジョブを実行する。
  • 4
    Cloud Run ジョブのエントリ ポイントを特定し、ワークフローから HTTP リクエストを送信する。

解説

【正解】C

【0からの解説】
①前提知識
・Workflows は、Google Cloud のサービスや HTTP API の呼び出しを YAML / JSON で定義した順序で実行するサーバーレスのオーケストレーション サービスです。
・Workflows の「コネクタ」は、Google Cloud の各 API を呼び出すための組み込み機能です。認証、リトライ、長時間実行オペレーションの完了待ち(ポーリング)を自動的に処理してくれるため、API の URL や認証ヘッダーを自分で組み立てる必要がありません。
・Cloud Run ジョブは、HTTP リクエストを受け付ける「サービス」とは異なり、処理を最後まで実行して終了するバッチ型のワークロードです。ジョブは HTTP エンドポイントを持たず、Cloud Run Admin API の jobs.run(実行)メソッドなどで起動します。

②要件と制約の整理
・ワークフローの中から Cloud Run ジョブを実行したい。
・Google 推奨のベスト プラクティスに従う。

③正解がどう満たすか
公式ドキュメントでは「ワークフローから Cloud Run ジョブを実行するには、Cloud Run Admin API コネクタを使用する」と明記されています。ワークフローのステップで Cloud Run Admin API コネクタのジョブ実行メソッド(例: googleapis.run.v1.namespaces.jobs.run など)を call するだけで、認証が自動で行われ、ジョブの実行完了まで待機して結果を後続ステップで使うこともできます。複雑なデータ分析の各段階を順序立てて制御するのに適した方法です。

【誤りの選択肢】
A:Cloud Run ジョブは Pub/Sub トピックを直接サブスクライブしてメッセージを受け取る仕組みを持ちません(push サブスクリプションの宛先にできるのは HTTP エンドポイントを持つサービスです)。また、ワークフローの中でジョブの完了を待って次の処理へ進むといった制御もできません。
B:Eventarc はイベント(Cloud Storage へのファイル作成など)をきっかけにターゲットを呼び出す仕組みで、「トリガーをワークフローのステップに含める」という使い方はできません。Eventarc はむしろワークフロー自体を起動する側として使うもので、ワークフローの中からジョブを実行する方法ではありません。
D:Cloud Run ジョブには、リクエストを受け付ける「エントリ ポイント」となる HTTP URL がありません。Cloud Run Admin API の REST エンドポイントを http.post で直接呼ぶことは技術的には可能ですが、URL の組み立てや認証設定、完了待ちのポーリングを自前で書く必要があり、それらを自動処理するコネクタを使う推奨方法に劣ります。

【参考】
Workflows を使用してジョブを呼び出す | Cloud Run
コネクタを理解する | Workflows
この問題のページを開く →
問題 13規制要件に準拠するため、ジョブが完了したら直ちに顧客データが削除されるようにする必要があります。アプリケーションと Google Cloud サービスの統合
問題
あなたのチームは、Cloud Storage バケットに保存されている数百万件の顧客レコード ファイルを読み取る Python ジョブを実行しています。規制要件に準拠するため、ジョブが完了したら直ちに顧客データが削除されるようにする必要があります。このタスクの完了に要する時間を最小限に抑えたいと考えています。どうすればよいですか。

選択肢と解説

  • ✓
    ジョブに最終ステップを追加し、Cloud Storage API へのバッチ リクエストを使用して、バケット内のすべてのオブジェクトを一括で削除する。
  • 2
    ジョブの実行終了時にバケット内のすべてのオブジェクトを削除するオブジェクトのライフサイクル管理を Cloud Storage バケットに構成する。
  • 3
    ジョブが完了したら、Google Cloud コンソールからバケットを削除する
  • 4
    gcloud CLI を使用して gcloud storage rm --recursive gs://BUCKET_NAME/ コマンドを実行する。

解説

【正解】A

【0からの解説】
①前提知識
・Cloud Storage のオブジェクト削除は、基本的に 1 オブジェクトにつき 1 回の DELETE リクエストです。数百万件を 1 件ずつ順番に削除すると、HTTP の往復が数百万回発生して時間がかかります。
・JSON API のバッチ リクエストを使うと、最大 100 件の API 呼び出しを 1 つの HTTP リクエストにまとめられ、ネットワークのオーバーヘッドを削減できます。Python のクライアント ライブラリ(google-cloud-storage)では client.batch() コンテキストで削除をまとめられ、複数のバッチを並列に送ることもできます。
・オブジェクトのライフサイクル管理は、オブジェクトの経過日数・作成日・ストレージ クラスなどの条件に一致したオブジェクトを自動で削除・クラス変更する機能です。条件の評価と実行は非同期で、条件を満たしてから実際に削除されるまで最大 24 時間程度の遅延があり得ます。また「ジョブが終了したとき」というイベントを条件にすることはできません。
・参考: 現在の公式ドキュメントでは、数百万〜数十億件規模の削除には「ストレージ バッチオペレーション(Storage batch operations)」を使い、1 つの削除ジョブでまとめて削除する方法が案内されています。これは JSON API のバッチ リクエスト(選択肢 A)とは別の機能で、本問の選択肢にはありません。そのため本問では、選択肢の中で最も要件に合う A を選びます。

②要件の整理
・数百万件の顧客レコード ファイル
・ジョブ完了後「直ちに」削除(規制要件)
・完了までの時間を最小化

③正解の理由
ジョブ自身の最終ステップとして削除を組み込めば、処理の完了と同時に人手を介さず削除が始まり「直ちに」の要件を満たします。さらにバッチ リクエストで 100 件ずつまとめて(必要なら並列で)削除するため、1 件ずつ削除するより大幅に短時間で完了します。自動化・即時性・速度の 3 点を満たすのは A です。

【誤りの選択肢】
B:ライフサイクル管理は非同期で実行され、条件を満たしてから削除まで最大 24 時間程度かかる場合があるため「直ちに削除」を保証できません。また「ジョブの実行終了時」を条件にする設定は存在せず、選択肢の構成自体が実現できません。
C:Google Cloud コンソールは数百万件規模の一括削除をバックグラウンドで実行できますが、あくまで人が画面を操作する手動の手順です。ジョブの完了を人が確認してから作業するため、確認や操作が遅れればその分だけ削除開始が遅れ、規制要件の「ジョブ完了後に直ちに削除」を確実には満たせません(即時性・確実性に欠ける)。さらにバケット自体を消すと、次回のジョブ実行時にバケットを作り直す必要も生じます。ジョブに削除を組み込んで自動で即時に実行する A に劣ります。
D:gcloud storage rm --recursive でも削除はできますが、公式ドキュメントは「10 万件以上のオブジェクトを一括削除する場合は処理に長い時間がかかるため gcloud storage の使用は避ける」としています。また手動で実行する手順であり、ジョブ完了と連動した即時削除になっていない点でも A に劣ります。

【参考】
オブジェクトのライフサイクル管理 | Cloud Storage
リクエスト レートとアクセス分散のガイドライン | Cloud Storage
この問題のページを開く →
問題 14スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計スケーラブルで安全かつ信頼性の高いクラウドネイティブ アプリケーションの設計
問題
あなたはカスタムのジョブ スケジューラを開発しています。このスケジューラには、実行中の状態(削除、停止、一時停止されていない状態)にあるすべての Compute Engine VM のエントリを保持する永続キャッシュが必要です。ジョブ スケジューラはこのキャッシュを確認し、キャッシュ内の利用可能な Compute Engine VM にのみジョブを送信します。利用可能な Compute Engine インスタンスのキャッシュが古くならない(最新の状態が保たれる)ようにする必要があります。どうすればよいですか?

選択肢と解説

  • 1
    組織レベルの Cloud Storage ログシンクを、Compute Engine の監査ログイベントを取得するフィルタを付けて設定する。Cloud Storage バケットが更新されたときに実行される Eventarc トリガーを構成し、これらのイベントをアプリケーションに送信してキャッシュを更新する。
  • 2
    アセットタイプ フィルタを compute.googleapis.com/Instance に設定した、挿入イベントと削除イベントの Cloud Asset Inventory リアルタイム フィードを設定する。これらのイベントをアプリケーションに送信してキャッシュを更新する Eventarc トリガーを構成する。
  • ✓
    組織レベルの Pub/Sub ログシンクを、Compute Engine の監査ログイベントを取得するフィルタを付けて設定する。これらのイベントをアプリケーションに送信してキャッシュを更新する Eventarc トリガーを構成する。
  • 4
    組織レベルの BigQuery ログシンクを設定する。アプリケーションが 1 分ごとにこの BigQuery テーブルにクエリを実行して直近 1 分間のイベントを取得し、キャッシュを更新するように構成する。

解説

【正解】C

【0からの解説】
①前提知識
・Cloud 監査ログ(Cloud Audit Logs):Compute Engine では、VM の作成(insert)・削除(delete)・停止(stop)・起動(start)・一時停止(suspend)・再開(resume)などの API 操作が管理アクティビティ監査ログとして、また Google による自動的な停止(プリエンプションやホスト メンテナンスなど)がシステム イベント監査ログとして記録されます。
・ログシンク(Log Router のシンク):Cloud Logging に届いたログを、フィルタ条件で選んで Cloud Storage・BigQuery・Pub/Sub などの宛先へ転送する仕組みです。組織レベルで作成すれば組織内の全プロジェクトのログを集約できます。宛先が Pub/Sub の場合はログがほぼリアルタイムにメッセージとして発行されますが、Cloud Storage の場合はファイルとしてまとめて(バッチで)書き出されるため遅延があります。
・Eventarc:Pub/Sub トピックのメッセージなどのイベントを受け、Cloud Run などのターゲットへ配信するイベント ルーティング サービスです。
・Cloud Asset Inventory のリアルタイム フィード:指定したアセットタイプの変更を Pub/Sub トピックに通知する機能で、条件(CEL 式)で通知するイベントを絞り込めます。

②要件と制約の整理
・キャッシュに置くのは「実行中(削除・停止・一時停止されていない)」の VM だけ。つまり作成・削除だけでなく、停止・一時停止・再開といった「状態の変化」も漏れなく捉える必要があります。
・キャッシュが古くならないこと → ポーリングではなく、変化をほぼリアルタイムに受け取るイベント駆動が望ましい。

③正解がどう満たすか
組織レベルの Pub/Sub ログシンクで Compute Engine の監査ログイベントを抽出すれば、VM の作成・削除に加えて停止・一時停止・再開・プリエンプションなどの状態変化を含むすべてのイベントが、発生とほぼ同時に Pub/Sub へ発行されます。Pub/Sub トピックをイベント ソースにした Eventarc トリガーでアプリケーション(例: Cloud Run 上のキャッシュ更新処理)へ届ければ、イベントのたびにキャッシュを更新でき、キャッシュが古くなることを防げます。

【誤りの選択肢】
A:Cloud Storage を宛先とするログシンクは、ログを一定間隔でまとめてファイルとして書き出すため、イベント発生からキャッシュ更新まで大きな遅延が生じ、キャッシュが古くなります。さらにファイル単位の更新通知からイベントを取り出す処理も必要になり、構成が複雑です。
B:フィードを「挿入イベントと削除イベント」に限定しているため、VM の停止・一時停止・再開といった状態変化(アセットの更新)を捉えられません。停止された VM がキャッシュに残り続け、そこへジョブが送られてしまうため、「実行中の VM のみ」という要件を満たしません。
D:BigQuery シンクを 1 分ごとにポーリングする方式では、最大で 1 分以上キャッシュが古いままになるうえ、ストリーミング取り込みの遅延や毎分のクエリ費用も発生します。イベント駆動の C に比べて鮮度・コストの両面で劣ります。

【参考】
ログエントリを転送する | Cloud Logging
イベント プロバイダと宛先 | Eventarc
この問題のページを開く →
問題 15デプロイの手間を最小限に抑えながら、このメール サービスを構成する必要があります。クラウドネイティブ アプリケーションのデプロイ構成
問題
あなたは、会社の新しい e コマース ウェブサイトを開発しています。顧客が注文したときに、カスタマイズされたメール通知を受け取れるようにしたいと考えています。デプロイの手間を最小限に抑えながら、このメール サービスを構成する必要があります。どうすればよいですか。

選択肢と解説

  • ✓
    Firestore の作成(create)タイプのイベントによってトリガーされる Cloud Function を作成する。
  • 2
    HTTP リクエストによって呼び出される、Compute Engine 上でホストされるメール送信アプリケーションを作成する。
  • 3
    メール通知チャネルを作成し、作成(create)タイプのイベントのログベースの指標に基づくアラート ポリシーを設定する。
  • 4
    orders/ API が HTTP レスポンス 200 OK を返したときに、Pub/Sub を使用してメールを送信する。

解説

【正解】A

【0からの解説】
①前提知識
・Firestore はサーバーレスなドキュメント データベースで、e コマースの注文データなどを保存するのによく使われます。
・Cloud Functions(現 Cloud Run functions)は、イベントをトリガーに小さなコードをサーバーレスで実行するサービスです。Firestore トリガー(Eventarc 経由の google.cloud.firestore.document.v1.created イベントなど)を使うと、ドキュメントが作成されたタイミングで関数を自動起動できます。
・関数は作成されたドキュメント(注文内容・顧客名・メールアドレスなど)をイベント データとして受け取れるため、それを使って顧客ごとにカスタマイズしたメールを、SendGrid などのメール送信サービスの API 経由で送信できます。

②要件の整理
・注文時に顧客へメール通知を送る
・メールは顧客ごとにカスタマイズ(注文内容などを反映)
・デプロイの手間を最小化

③正解の理由
注文が Firestore にドキュメントとして作成されたことをトリガーに Cloud Function を起動すれば、サーバーの構築・運用なしに、関数のコードをデプロイするだけで注文ごとのメール送信を実現できます。注文データをそのまま受け取れるのでメールのカスタマイズも容易です。デプロイの手間が最も少なく、イベント駆動で確実に動作する A が最適です(なお原文の選択肢 A は末尾が読点で終わっていますが、意味は完結しています)。

【誤りの選択肢】
B:Compute Engine の VM にメール送信アプリをホストすると、VM の作成・OS やミドルウェアの管理・スケーリング・パッチ適用などが必要になり、「デプロイの手間を最小限に」という要件に反します。さらに注文処理側から HTTP で呼び出す連携も自前で実装する必要があります。
C:Cloud Monitoring の通知チャネルとアラート ポリシーは、システムの異常を運用担当者に知らせるための仕組みです。宛先は事前に登録した固定の通知チャネルで、顧客ごとに宛先や本文を変えたカスタマイズ メールを送る用途には使えません。
D:Pub/Sub はサービス間でメッセージを非同期に受け渡すメッセージング サービスであり、それ自体にメールを送信する機能はありません。メッセージを受け取ってメールを送る処理を別途実装する必要があり、選択肢の記述どおりでは要件を満たしません。

【参考】
Firestore ドキュメントで関数をトリガーする | Cloud Run
Cloud Run functions の概要
この問題のページを開く →

GCP-PCD 模擬問題集についてよくある質問

GCP-PCD の練習問題は無料で試せますか?

はい。GCP-PCD は先頭 15 問を会員登録なしで、正解と全選択肢の解説つきでご覧いただけます。16 問目以降は模試プラン(月額 ¥980)または Pro プラン(月額 ¥4,980)でご利用ください。

問題は何問ありますか?

GCP-PCD は本番形式の練習テスト 4 回・全 200 問を収録しています。全問に解説が付いています。

解説は付いていますか?

全ての問題に、正解の理由と各選択肢がなぜ誤りなのかの解説を付けています。ドメイン(出題分野)別の正答率も受験後に確認できます。