HTTP ターゲットで認証を使用する

適切な認証情報を持つサービス アカウントを設定すると、認証が必要な HTTP ターゲットを Cloud Scheduler から呼び出すことができます。

サービス アカウントを設定する

  1. HTTP ターゲットと Cloud Scheduler ジョブに使用するサービス アカウントがまだない場合は、新しいサービス アカウントを作成します。次の点にご注意ください。

    • サービス アカウントは、Cloud Scheduler ジョブが作成されたプロジェクトに属している必要があります。

    • デフォルトの Cloud Scheduler サービス アカウント(service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com)は使用しないでください。この Google 管理のサービス アカウント(サービス エージェントとも呼ばれます)は、この目的で使用できません。

    • デフォルトの Cloud Scheduler サービス アカウントはプロジェクトや Cloud Scheduler Service Agent (roles/cloudscheduler.serviceAgent) ロールから削除しないでください。削除すると、認証が必要なエンドポイントに対する 403 レスポンスが返されます。これは、ジョブのサービス アカウントに適切なロールがあったとしても変わりません。

  2. ターゲットが 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
      
  3. ターゲットが Google Cloud の外部にある場合、受信サービスはトークンを手動で確認する必要があります。

  4. デフォルトの 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 リクエストに追加する必要があります。

コンソール

  1. 頻度を指定します。
  2. ターゲット タイプとして HTTP を指定します。
  3. URL と HTTP メソッドを追加します。
  4. [Auth ヘッダー] リストでトークンタイプを選択します。一般には OIDC が使用されます。ただし、*.googleapis.com でホストされている Google API は例外で、OAuth(アクセス)トークンが使用されます。
  5. [サービス アカウント] に、クライアント サービス アカウントのメールアドレスを指定します。
  6. [オーディエンス] は省略可能で、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 hoursevery 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 サービス アカウントに追加できます。

コンソール

  1. Google Cloud コンソールで、[Cloud Scheduler API] ページに移動します。

    Cloud Scheduler API に移動

    [ステータス] フィールドがあり、ステータスが [有効] と表示されている場合は、続行します。そうでない場合は、[有効にする] をクリックします。

  2. Google Cloud コンソールで、[設定] ページに移動します。

    [設定] に移動

  3. プロジェクト番号を見つけてコピーします。

  4. Google Cloud コンソールの [IAM] ページに移動します。

    IAM に移動

  5. [アクセス権を付与] をクリックします。 アクセス権の付与ペインが開きます。

  6. [新しいプリンシパル] フィールドに、次の形式のメールアドレスを追加します。

    service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    

    PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。

  7. [ロールを選択] リストで、[Cloud Scheduler サービス エージェント] を検索して選択します。

  8. [保存] をクリックします。

gcloud

  1. プロジェクトで Cloud Scheduler API が有効になっていることを確認します。

    gcloud services list --enabled \
     --filter=cloudscheduler.googleapis.com
    
    • 次の出力が表示された場合、API は有効になっています。

      NAME: cloudscheduler.googleapis.com
      TITLE: Cloud Scheduler API
      
    • 表示されていない場合(例: Listed 0 items. が表示される)は、API を有効にします。

      gcloud services enable cloudscheduler.googleapis.com
      
  2. プロジェクト番号を確認します。

    gcloud projects describe PROJECT_ID --format='table(projectNumber)'
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  3. 番号をコピーします。

  4. 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: プロジェクト ID
    • PROJECT_NUMBER: 先ほどコピーしたプロジェクト番号