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

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

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

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

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

    • Cloud Scheduler サービス エージェント(service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com)は使用しないでください。この目的に使用することはできません。

    • プロジェクトの Cloud Scheduler サービス エージェントの Cloud Scheduler サービス エージェント ロール(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=serviceAccount: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=serviceAccount: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: 先ほどコピーしたプロジェクト番号