適切な認証情報を持つサービス アカウントを設定すると、認証が必要な HTTP ターゲットを Cloud Scheduler から呼び出すことができます。
サービス アカウントを設定する
HTTP ターゲットで Cloud Scheduler ジョブに使用するサービス アカウントがまだない場合は、新しいサービス アカウントを作成します。次の点にご注意ください。
サービス アカウントは、Cloud Scheduler ジョブが作成されるプロジェクトに属している必要があります。
デフォルトの Cloud Scheduler サービス アカウント(
service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
)は使用しないでください。この Google 管理のサービス アカウント(サービス エージェントとも呼ばれます)は、この目的で使用できません。プロジェクトまたはその
Cloud Scheduler Service Agent (roles/cloudscheduler.serviceAgent)
ロールから、デフォルトの Cloud Scheduler サービス アカウントを削除しないでください。その場合、ジョブのサービス アカウントに適切なロールがあっても、認証が必要なエンドポイントに403
レスポンスが返されます。
ターゲットが Google Cloud 内にある場合は、必要な IAM ロールをサービス アカウントに付与します。Google Cloud 内の各サービスには特定のロールが必要で、受信側のサービスは生成されたトークンを自動的に検証します。たとえば、Cloud Run と第 2 世代の Cloud Functions 関数では、
Cloud Run Invoker
ロールを追加する必要があります。ユーザーが管理するサービス アカウントでリソースをデプロイするには、デプロイ担当者がそのサービス アカウントに対する
iam.serviceAccounts.actAs
権限を持っている必要があります。サービス アカウントを作成した場合は、この権限が自動的に付与されます。そうでない場合は、正しい権限を持つユーザーがサービス アカウントに対するこの権限を付与する必要があります。おすすめの方法: 前の手順で、Cloud Scheduler ジョブが対象とするサービスの呼び出しに特化したサービス アカウントを作成した場合は、そのアカウントとターゲット サービスに対する呼び出し元権限をバインディングすることによる次の最小権限の原則(セキュリティに関するベスト プラクティス)を考慮してください。これを行うには、Google Cloud コンソールまたは gcloud CLI を使用します。
コンソール
1. Google Cloud コンソールを開きます。
2. プロジェクトを選択します。
3. 呼び出すリソースタイプのページに移動します。たとえば、Cloud Run サービスを呼び出す場合は、Cloud Run サービスを一覧表示するページに移動します。
4. 呼び出すサービスの左側にあるチェックボックスをオンにします。(サービス自体はクリックしないでください)。
5. [権限] タブをクリックします。 情報ペインが表示されていない場合は、[情報パネルを表示] をクリックしてから [権限] をクリックします。
6.
[プリンシパルを追加] をクリックします。7. [プリンシパルを追加] に、作成したサービス アカウントのメールアドレスを入力します。
8. [ロールを割り当てる] で、プルダウン リストから付与するロールを選択します。最小権限の原則に従って、プリンシパルが必要とする権限のみを含むロールを選択します。
9. [保存] をクリックします。
gcloud
add-iam-policy-binding
コマンドを実行します。gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \ --member=PRINCIPAL --role=ROLE
次のように置き換えます。
RESOURCE_TYPE
: ターゲットのリソースタイプ。たとえば、Cloud Run ターゲットの場合はrun
です。RESOURCE_ID
: ターゲットの識別子。たとえば、Cloud Run ターゲットのサービス名です。PRINCIPAL
: サービス アカウントの識別子。形式はserviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS
です。例:serviceAccount:my-service-account@my-project.iam.gserviceaccount.com
。ROLE
: ターゲット サービスの呼び出しに必要なロールの名前。たとえば、Cloud Run や第 2 世代の Cloud Functions ターゲットの場合はroles/run.invoker
です。
例:
Cloud Run のターゲット: 次のコマンドは、Cloud Run 起動元ロールを、Cloud Run サービス
my-service
用のサービス アカウントmy-service-account@my-project.iam.gserviceaccount.com
に付与します。gcloud run add-iam-policy-binding my-service \ --member=my-service-account@my-project.iam.gserviceaccount.com \ --role=roles/run.invoker
Cloud Functions のターゲット: 次のコマンドは、第 2 世代の Cloud Functions の関数で必要な Cloud Run 起動元ロールを、第 2 世代の Cloud Functions の関数
my-gen2-function
用のサービス アカウントmy-service-account@my-project.iam.gserviceaccount.com
に付与します。gcloud functions add-iam-policy-binding my-gen2-function \ --member=my-service-account@my-project.iam.gserviceaccount.com \ --role=roles/run.invoker --gen2
ターゲットが Google Cloud の外部にある場合、受信サービスはトークンを手動で確認する必要があります。
デフォルトの Cloud Scheduler サービス アカウントは、Cloud Scheduler API を有効にすると自動的に設定されます。ただし、2019 年 3 月 19 日より前にこの API を有効にしていた場合は、
Cloud Scheduler Service Agent
ロールを手動で追加する必要があります。これにより、Cloud Scheduler では、クライアント サービス アカウントに代わって、ターゲットに認証されるためのヘッダー トークンを生成できます。デフォルトの Cloud Scheduler サービス アカウントがプロジェクトで設定され、
Cloud Scheduler Service Agent
ロールが付与されていることを確認するには、プロジェクトの現在のアクセス権を表示します。Google Cloud コンソールを使用してプロジェクトのアクセス権を表示する場合、[Google 提供のロール付与を含みます] チェックボックスを必ずオンにしてください。
認証を使用するスケジューラ ジョブを作成する
認証を使用するジョブを作成するには、トークンタイプと、クライアント サービス アカウントを識別するメールアドレスを create-job
リクエストに追加する必要があります。
コンソール
- 頻度を指定します。
- ターゲット タイプとして HTTP を指定します。
- URL と HTTP メソッドを追加します。
- [Auth ヘッダー] リストで、トークンタイプを選択します。一般には OIDC が使用されます。ただし、
*.googleapis.com
でホストされている Google API は例外で、OAuth(アクセス)トークンが使用されます。 - [サービス アカウント] で、クライアント サービス アカウントのメールアドレスを指定します。
- [オーディエンス] はオプションで、OIDC トークンの受信者を制限します。通常は、ジョブのターゲット URL です(URL パラメータなし)。指定しないと、デフォルトで(リクエスト パラメータを含む)URL 全体がオーディエンスとして使用されます。
gcloud
gcloud scheduler jobs create http JOB_ID \ --schedule="FREQUENCY" --uri=URI \ --oidc-service-account-email=CLIENT_SERVICE_ACCOUNT_EMAIL
次のように置き換えます。
JOB_ID
: ジョブの名前。これはプロジェクト内で一意でなければなりません。関連付けられているジョブを削除しても、プロジェクトでそのジョブ名を再利用できないので注意してください。FREQUENCY
: ジョブの間隔は、ジョブの実行頻度です(例:every 3 hours
、every 10 mins
)。ここで指定する文字列には、crontab 互換の任意の文字列を使用できます。 (おすすめしませんが、従来の App Engine cron 構文は既存のジョブで引き続きサポートされます。)URI
はエンドポイントの完全修飾 URL です。--oidc-service-account-email
または--oauth-service-account-email
はトークンタイプを定義します。一般には OIDC が使用されます。ただし、*.googleapis.com
でホストされている Google API は例外で、OAuth トークンが使用されます。CLIENT_SERVICE_ACCOUNT_EMAIL
は、クライアント サービス アカウントのメールです。- 他のオプション パラメータを使用できます。詳細については、gcloud コマンドライン リファレンスをご覧ください。
トークンタイプを選択する
Cloud Scheduler と HTTP ターゲットの間で認証を行うため、Cloud Scheduler はメールで指定されたクライアント サービス アカウントに基づくヘッダー トークンを作成し、HTTPS を使用してターゲットに送信します。ID(OIDC)トークンまたは OAuth(アクセス)トークンのいずれかを使用できます。一般には OIDC が使用されます。ただし、*.googleapis.com
でホストされている Google API は例外で、OAuth トークンが使用されます。
Cloud Scheduler サービス エージェントのロールを Cloud Scheduler サービス アカウントに手動で追加する
この操作は、次のいずれかに該当する場合にのみ必要です。
- 2019 年 3 月 19 日より前に Cloud Scheduler API を有効にした
- サービス アカウントから Cloud Scheduler サービス エージェントのロールを削除した
Cloud Scheduler サービス アカウントには、Cloud Scheduler サービス エージェントのロールが必要です。このロールがないと、Cloud Scheduler ジョブは失敗します。Cloud Scheduler サービス エージェントのロールは、Google Cloud コンソールまたは gcloud CLI を使用して Cloud Scheduler サービス アカウントに追加できます。
コンソール
Google Cloud コンソールで、[設定] ページに移動します。
プロジェクト番号を探してコピーします。
Google Cloud コンソールの [IAM] ページに移動します。
[Add] をクリックします。[プリンシパルの追加] ペインが開きます。
[新しいプリンシパル] フィールドに、次の形式のメールアドレスを追加します。
service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
PROJECT_NUMBER
は、実際の Google Cloud プロジェクトの番号に置き換えます。[ロールを選択] リストで、[サービス管理] > [Cloud Scheduler サービス エージェント] の順に選択します。
[保存] をクリックします。
gcloud
プロジェクト番号を確認します。
gcloud projects describe PROJECT_ID --format='table(projectNumber)'
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。番号をコピーします。
Cloud Scheduler サービス アカウントに
Cloud Scheduler Service Agent
のロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com \ --role roles/cloudscheduler.serviceAgent
次のように置き換えます。
PROJECT_ID
: プロジェクト IDPROJECT_NUMBER
: 先ほどコピーしたプロジェクト番号