【正解】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)