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

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

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

サービス アカウントは通常、アプリケーションやコンピューティング ワークロードで使用され、アカウント固有のメールアドレスで識別されます。

アプリケーションは、サービス アカウント自体として認証し、サービス アカウントにアクセス権が付与されているすべてのリソースにアクセスすることで、サービス アカウントを使用して承認された API 呼び出しを行うことができます。

アプリケーションをサービス アカウントとして認証する最も一般的な方法は、アプリケーションを実行しているリソースにサービス アカウントを関連付けることです。その後、サービス アカウントに Identity and Access Management(IAM)ロールを付与して、サービス アカウントが Google Cloud リソースにアクセスできるようにします。

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

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

    • Cloud Scheduler サービス エージェント(service-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 Run functions 関数の場合は、Cloud Run Invoker ロールを付与する必要があります。

    サービス アカウントをリソースに関連付けるために必要な権限を取得するには、サービス アカウントに対するサービス アカウント ユーザーroles/iam.serviceAccountUser)IAM ロールを付与するよう管理者に依頼してください。この事前定義ロールには、サービス アカウントをリソースに関連付けるために必要な iam.serviceAccounts.actAs 権限が含まれています。(サービス アカウントを作成した場合は、この権限が自動的に付与されます)。

    前の手順で、Cloud Scheduler ジョブのターゲットとなるサービスを呼び出すためにサービス アカウントを特別に作成した場合は、アカウントとその起動元の権限をターゲット サービスにバインドすることで、最小権限の原則に従うことができます。

    コンソール

    1. Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択します。

      プロジェクト セレクタに移動

    2. 呼び出すリソースタイプのページに移動します。たとえば、Cloud Run サービスを呼び出す場合は、Cloud Run サービスが一覧表示されているページに移動します。

    3. 呼び出すサービスの左側にあるチェックボックスをオンにします。(サービス自体はクリックしないでください)。

    4. [権限] タブをクリックします。

      情報ペインが表示されていない場合は、[情報パネルを表示] > [権限] をクリックする必要があります。

    5. [プリンシパルを追加] をクリックします。

    6. [新しいプリンシパル] フィールドに、作成したサービス アカウントのメールアドレスを入力します。

    7. [ロールを選択] リストから、付与するロールを選択します。

      プリンシパルが必要とする権限のみを含むロールを選択して、最小権限の原則に従います。

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

    gcloud

    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 Run 関数のターゲットの場合は roles/run.invoker です。
    • その他のオプション パラメータについては、gcloud コマンドライン リファレンスをご覧ください。

    例:

    • Cloud Run サービス my-service のサービス アカウント my-service-account@my-project.iam.gserviceaccount.comCloud Run 起動元roles/run.invoker)IAM ロールを付与します。

      gcloud run add-iam-policy-binding my-service \
          --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
          --role=roles/run.invoker
      
    • 第 2 世代の Cloud Run 関数で必要な Cloud Run 起動元roles/run.invoker)IAM ロールを、Cloud Run 関数 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 サービス エージェントのロールを付与する必要があります。これにより、Cloud Scheduler では、サービス アカウントに代わって、ターゲットに認証されるためのヘッダー トークンを生成できます。

認証を使用する Cloud Scheduler ジョブを作成する

Cloud Scheduler と HTTP ターゲットの間で認証を行うため、Cloud Scheduler はメールで指定されたクライアント サービス アカウントに基づくヘッダー トークンを作成し、HTTPS を使用してターゲットに送信します。ID(OIDC)トークンまたは OAuth(アクセス)トークンのいずれかを使用できます。一般には OIDC が使用されます。ただし、*.googleapis.com でホストされている Google API は例外で、OAuth トークンが使用されます。

認証を使用する Cloud Scheduler ジョブを作成するには、ジョブの作成時にトークン タイプとクライアント サービス アカウントを識別するメールアドレスを追加する必要があります。

コンソール

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

    Cloud Scheduler に移動

  2. [ジョブを作成] をクリックします。

  3. [名前] フィールドに、プロジェクトに固有のジョブの名前を入力します。関連付けられているジョブを削除しても、プロジェクトでそのジョブ名を再利用できないので注意してください。

  4. [リージョン] リストで、ジョブのリージョンを選択します。

  5. ジョブの頻度タイムゾーンを指定します。ここで指定する文字列には、unix-cron 互換の任意の文字列を使用できます。

  6. [続行] をクリックします。

  7. [ターゲット タイプ] リストで、[HTTP] を選択します。

  8. URLHTTP メソッドを指定します。

  9. [Auth header] リストで、トークンタイプを選択します。一般には OIDC トークンが使用されます。ただし、*.googleapis.com でホストされている Google API は例外で、OAuth トークンが使用されます。

  10. [サービス アカウント] リストで、サービス アカウントのメールアドレスを選択します。

  11. 必要に応じて、OIDC トークンの受信者を制限するオーディエンスを指定します。通常は、URL パラメータのないジョブのターゲット URL です。指定しない場合、リクエスト パラメータを含む URL 全体がオーディエンスとして使用されます。

  12. 必要に応じて設定を行います。

  13. [作成] をクリックします。

gcloud

gcloud scheduler jobs create http JOB_ID \
    --schedule="FREQUENCY" \
    --uri=URI \
    --oidc-service-account-email=SERVICE_ACCOUNT_EMAIL

次のように置き換えます。

  • JOB_ID: プロジェクトに固有のジョブの名前。関連付けられているジョブを削除しても、プロジェクトでそのジョブ名を再利用できないので注意してください。
  • FREQUENCY: ジョブを実行する間隔または頻度(every 3 hoursevery 10 mins など)。ここで指定する文字列には、unix-cron 互換の任意の文字列を使用できます。
  • URI はエンドポイントの完全修飾 URL です。
  • SERVICE_ACCOUNT_EMAIL: サービス アカウントのメールアドレス。一般には OIDC トークンが使用されます。ただし、*.googleapis.com でホストされている Google API は例外で、OAuth トークンが使用されます。(OAuth トークン タイプを定義するには、代わりに --oauth-service-account-email フラグを使用します)。
  • その他のオプション パラメータについては、gcloud コマンドライン リファレンスをご覧ください。

Cloud Scheduler サービス エージェントのロールを付与する

一部の Google Cloud サービスは、ユーザーに代わって処理を行うためにリソースにアクセスする必要があります。このニーズに応えるために、Google Cloud ではサービス エージェントと呼ばれるサービス アカウントを作成して管理します。これらのサービス アカウントは、Google Cloud サービスを有効にして使用すると自動的に作成され、ロールが付与されます。

Cloud Scheduler サービス エージェントには、Cloud Scheduler サービス エージェントroles/cloudscheduler.serviceAgent)ロールが必要です。このロールがないと、Cloud Scheduler ジョブは失敗します。次の形式のメールアドレスを持つ Cloud Scheduler サービス エージェントに、ロールを手動で付与できます。

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

ロールを手動で付与する必要があるのは、次のいずれかに該当する場合のみです。

  • 2019 年 3 月 19 日より前に Cloud Scheduler API を有効にした
  • サービス エージェントから Cloud Scheduler サービス エージェントのロールを削除した

Cloud Scheduler サービス エージェントがプロジェクトで設定され、Cloud Scheduler サービス エージェント ロールが付与されていることを確認するには、プロジェクトの現在のアクセス権を表示します。Google Cloud コンソールを使用してプロジェクトのアクセス権を表示する場合は、[Google 提供のロール付与を含みます] チェックボックスをオンにしてください。

サービス エージェントにロールを付与する方法については、ロールを作成してサービス エージェントに付与するをご覧ください。

次のステップ

Cloud Scheduler にプログラムで認証する方法を学習する