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

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

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

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

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

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

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

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

デフォルトのサービス アカウントは、テストと開発でのみ使用することをおすすめします。本番環境では、新しいサービス アカウントを作成し、ワークフローの管理に必要な最小限の権限を含む 1 つ以上の IAM のロールを付与することをおすすめします。

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

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

    Console

    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 権限が含まれています。

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

    Console

    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. プロジェクト間サービス アカウントを使用してワークフローをデプロイします。

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

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

Console

  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: [...]

次のステップ