Google Cloud リソースにアクセスするための権限をワークフローに付与する

Workflows はサービス アカウントを使用して、ワークフローが Google Cloud リソースにアクセスできるようにします。サービス アカウントは、関数、アプリケーション、VM など、人以外の ID として機能する特別なアカウントです。これにより、人以外の認証を行うことができます。 サービス アカウントは、ID とリソースの両方と考えることができます。

  • サービス アカウントを ID として考える際は、ワークフローなどのリソースにアクセスできるようにするために、サービス アカウントにロールを付与できます。

  • サービス アカウントをリソースとして考える際は、そのサービス アカウントに対するアクセスやアカウント管理を行うために、他のユーザーに役割を付与できます。

サービス アカウントは、アカウント固有のメールアドレスで識別されます。

本番環境のアプリケーションで認証を設定する方法についての詳細は、サービス アカウントとして認証するをご覧ください。

デフォルトのサービス アカウント

すべてのワークフローは、ワークフローの作成時に Identity and Access Management(IAM)サービス アカウントに関連付けられます。ワークフローの作成時にサービス アカウントを指定しない場合、ワークフローは、デフォルトの Compute Engine サービス アカウントをその ID に対して使用します。ワークフローに関連付けられたサービス アカウントを確認できます。このドキュメントのワークフローに関連付けられたサービス アカウントを確認するをご覧ください。

デフォルトのサービス アカウントは、テストと開発でのみ使用することをおすすめします。

サービス アカウントの権限

サービス アカウントは ID であるため、他のプリンシパルと同様に、ロールを付与することでプロジェクト内のリソースにアクセスできます。たとえば、ワークフローによって Cloud Logging にログが送信されるようにするには、ワークフローを実行するサービス アカウントに logging.logEntries.create 権限を含むロール(たとえば、Logs Writer ロール)が付与されていることを確認します。

ワークフローがそれ自体や他のワークフローを呼び出す(つまり、新しいワークフロー実行を作成する)場合を除き、ワークフロー サービス アカウントには workflows.invoker のロールは必要ありません。詳細については、Workflows を呼び出すをご覧ください。

サービス アカウントを含め、プリンシパルにロールを付与する方法の詳細については、プロジェクト、フォルダ、組織へのアクセスの管理をご覧ください。

サービス アカウントをリソースに関連付ける

リソースを作成してサービス アカウントを関連付けるには、対象のリソースを作成し、サービス アカウントをリソースに関連付けるための権限が必要です。サービス アカウントをリソースに関連付ける権限は、iam.serviceAccounts.actAs 権限を含むロールによって付与されます。

詳細については、サービス アカウント認証のロールをご覧ください。

Cloud Functions(第 2 世代)を呼び出す

Cloud Functions(第 2 世代)では、基盤となる Cloud Run サービスを管理することで呼び出し権限を使用できます。ワークフローが Cloud Function(第 2 世代)サービスを呼び出す場合は、呼び出し元のサービス アカウントに Cloud Functions 起動元(roles/cloudfunctions.invoker)ロールを付与する必要はありません。代わりに、Cloud Run 起動元(roles/run.invoker)のロールを付与する必要があります。

詳細については、Cloud Functions のバージョンの比較をご覧ください。

カスタム サービス アカウントを使用してワークフローをデプロイする

独自のユーザー管理サービス アカウントを作成すると、ワークフローへのアクセスをより柔軟に管理できます。

  1. サービス アカウントを作成し、その名前をメモします。

  2. ワークフローで作業を行うためにアクセスする必要があるリソースに基づいて、適切なロールサービス アカウントに付与します。

  3. ワークフローをデプロイするすべてのプリンシパルに、サービス アカウントをリソースに関連付ける権限があることを確認します。サービス アカウントを作成した場合は、この権限が自動的に付与されます。詳細については、サービス アカウント認証のロールをご覧ください。

    サービス アカウントをリソースに接続するために必要な権限を取得するには、プロジェクトまたはサービス アカウントに対するサービス アカウント ユーザー roles/iam.serviceAccountUser) IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセスの管理をご覧ください。

    この事前定義ロールには、サービス アカウントをリソースに関連付けるために必要な iam.serviceAccounts.actAs 権限が含まれています。

    カスタムロールや他の事前定義ロールを使用して、この権限を取得することもできます。

    プロジェクトに対するロールを付与します。

    gcloud projects add-iam-policy-binding WORKFLOWS_PROJECT_ID \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    または、サービス アカウントにロールを付与します。

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_RESOURCE_NAME \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    以下を置き換えます。

    • WORKFLOWS_PROJECT_ID: ワークフロー リソースを含む Google Cloud プロジェクト ID
    • PRINCIPAL: ワークフロー デプロイ担当者の識別子(user|group|serviceAccount:email または domain:domain の形式)。例:

      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com
    • SERVICE_ACCOUNT_RESOURCE_NAME: サービス アカウントの完全なリソース名。例:

      projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com

      ここで

      • SERVICE_ACCOUNT_PROJECT_ID は、サービス アカウントを含む Google Cloud プロジェクト ID です。
      • SERVICE_ACCOUNT_NAME はサービス アカウントの名前です。
  4. カスタム サービス アカウントを使用してワークフローをデプロイします。

プロジェクト間のサービス アカウントを使用してワークフローをデプロイする

デフォルトでは、あるプロジェクトでサービス アカウントを作成したとき、そのアカウントを別のプロジェクトのリソースに接続することはできません。次の手順では、あるプロジェクトのサービス アカウントを別のプロジェクトのワークフローにアタッチする方法を示します。その後、異なるプロジェクト間でサービス アカウントを使用してワークフローをデプロイできます。

サービス アカウントとワークフロー リソースが異なるプロジェクトにある場合、サービス アカウントが存在するプロジェクトから次の操作を行います。

  1. Google Cloud コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

    プロジェクトの組織のポリシーを調べて、iam.disableCrossProjectServiceAccountUsage ブール型制約がプロジェクトに適用されていないことを確認します。詳細については、プロジェクト間でのサービス アカウントの接続を有効にするをご覧ください。

  2. サービス アカウントを作成し、その名前をメモします。

  3. ワークフローで作業を行うためにアクセスする必要があるリソースに基づいて、適切なロールサービス アカウントに付与します。

  4. サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を Workflows サービス エージェントに付与します。これにより、サービス エージェントはサービス アカウントのプロジェクト間のアクセスを管理できます。サービス エージェントは、特定のプロジェクトに対する特定の Google Cloud サービスの ID です。詳細については、サービス エージェントをご覧ください。

    コンソール

    1. Google Cloud コンソールの [ワークフロー] ページに移動します。

      [ワークフロー] に移動

    2. [作成] をクリックしてワークフローを作成するか、更新するワークフローの名前を選択します。

    3. [サービス アカウント] リストで、[プロジェクトを切り替え] をクリックします。

    4. 別のプロジェクトのサービス アカウントを選択します。

    5. プロンプトが表示されたら、Workflows サービス エージェントに roles/iam.serviceAccountTokenCreator ロールを付与します。

    gcloud

    1. Workflows サービス エージェントに roles/iam.serviceAccountTokenCreator ロールを付与します。

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_RESOURCE_NAME \
          --member='serviceAccount:service-WORKFLOWS_PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com' \
          --role='roles/iam.serviceAccountTokenCreator'

      以下を置き換えます。

      • SERVICE_ACCOUNT_RESOURCE_NAME: サービス アカウントの完全なリソース名。例:

        projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com

        ここで

        • SERVICE_ACCOUNT_PROJECT_ID は、サービス アカウントを含む Google Cloud プロジェクト ID です。
        • SERVICE_ACCOUNT_NAME はサービス アカウントの名前です。
      • WORKFLOWS_PROJECT_NUMBER: ワークフロー リソースを含む Google Cloud プロジェクト番号。

  5. ワークフローをデプロイするすべてのプリンシパルに、サービス アカウントをリソースに関連付ける権限があることを確認します。サービス アカウントを作成した場合は、この権限が自動的に付与されます。詳細については、サービス アカウント認証のロールをご覧ください。

    サービス アカウントをリソースに接続するために必要な権限を取得するには、プロジェクトまたはサービス アカウントに対するサービス アカウント ユーザー roles/iam.serviceAccountUser) IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセスの管理をご覧ください。

    この事前定義ロールには、サービス アカウントをリソースに関連付けるために必要な iam.serviceAccounts.actAs 権限が含まれています。

    カスタムロールや他の事前定義ロールを使用して、この権限を取得することもできます。

    コンソール

    1. Google Cloud コンソールの [ワークフロー] ページに移動します。

      [ワークフロー] に移動

    2. [作成] をクリックしてワークフローを作成するか、更新するワークフローの名前を選択します。

    3. [サービス アカウント] リストで、[プロジェクトを切り替え] をクリックします。

    4. 別のプロジェクトのサービス アカウントを選択します。

    5. プロンプトが表示されたら、プロジェクトに対する roles/iam.serviceAccountUser ロールを付与します。

    gcloud

    プロジェクトに対するロールを付与します。

    gcloud projects add-iam-policy-binding WORKFLOWS_PROJECT_ID \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    または、サービス アカウントにロールを付与します。

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_RESOURCE_NAME \
        --member=PRINCIPAL \
        --role='roles/iam.serviceAccountUser'

    以下を置き換えます。

    • WORKFLOWS_PROJECT_ID: ワークフロー リソースを含む Google Cloud プロジェクト ID
    • PRINCIPAL: ワークフロー デプロイ担当者の識別子(user|group|serviceAccount:email または domain:domain の形式)。例:
      • user:test-user@gmail.com
      • group:admins@example.com
      • serviceAccount:test123@example.domain.com
      • domain:example.domain.com

    • SERVICE_ACCOUNT_RESOURCE_NAME: サービス アカウントの完全なリソース名。例:

      projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com

      ここで

      • SERVICE_ACCOUNT_PROJECT_ID は、サービス アカウントを含む Google Cloud プロジェクト ID です。
      • SERVICE_ACCOUNT_NAME はサービス アカウントの名前です。
  6. プロジェクト間サービス アカウントを使用してワークフローをデプロイします。

ワークフローに関連付けられたサービス アカウントを確認する

特定のワークフローに関連付けられているサービス アカウントを確認できます。

コンソール

  1. Google Cloud コンソールの [ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. [Workflows] ページで、ワークフロー名をクリックします。

  3. [詳細を表示] ページで、[詳細] タブをクリックします。

    ワークフローに関連付けられたサービス アカウントが表示されます。

gcloud

  1. ターミナルを開きます。

  2. 次のコマンドを入力します。

    gcloud workflows describe MY_WORKFLOW
    

    MY_WORKFLOW は、使用するワークフローの名前に置き換えます。

    関連するサービス アカウントを含むワークフローの完全な説明が返されます。次に例を示します。

    createTime: '2020-06-05T23:45:34.154213774Z'
    name: projects/myProject/locations/us-central1/workflows/myWorkflow
    serviceAccount: projects/my-project/serviceAccounts/012345678901-compute@developer.gserviceaccount.com
    sourceContents: [...]

次のステップ