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 権限を含むロール(たとえば、ログ書き込み(roles/logging.logWriter)IAM ロール)が付与されていることを確認します。一般的に、サービス アカウントに必要なロールは、ワークフローでオーケストレートするリソースによって異なります。必要なロールを確認するには、オーケストレーションするリソースのプロダクト ドキュメントを確認するか、事前定義ロールを選択します。

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

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

ワークフローを作成してサービス アカウントを関連付けるには、ワークフローを作成する権限と、サービス アカウントをワークフローに関連付ける権限が必要です。

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

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

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

既存のワークフローのソースコードまたはサービス アカウントを更新する場合は、iam.serviceAccounts.actAs 権限も必要です。

  • ワークフローのソースコードのみを更新する(サービス アカウントを更新しない): ワークフローに関連付けられている既存のサービス アカウントに対する iam.serviceAccounts.actAs 権限が必要です。
  • サービス アカウント、またはソースコードとサービス アカウントの両方を更新する: ワークフローに関連付ける新しいサービス アカウントに対する iam.serviceAccounts.actAs 権限が必要です。

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

Cloud Run functions の関数を呼び出す

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

詳細については、Cloud Run functions を比較するをご覧ください。

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

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

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

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

  3. ワークフローをデプロイまたは更新するすべてのプリンシパルに、サービス アカウント(roles/iam.serviceAccountUser)を関連付けるか、サービス アカウントとして機能する権限があることを確認します。サービス アカウントを作成した場合は、この権限が自動的に付与されます。

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

    gcloud projects add-iam-policy-binding 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'

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

    • PROJECT_ID: ワークフローとサービス アカウントを含む Google Cloud プロジェクト ID。
    • PRINCIPAL: user|group|serviceAccount:email または domain:domain 形式のワークフロー デプロイヤの識別子。次に例を示します。

      • user:dana@example.com
      • group:admins@example.com
      • serviceAccount:my-service-account@example.com
      • domain:example.com
    • SERVICE_ACCOUNT_RESOURCE_NAME: サービス アカウントの完全なリソース名。形式は次のとおりです。

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

      ここで、SERVICE_ACCOUNT_NAME はサービス アカウントの名前です。

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

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

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

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

  1. Google Cloud コンソールで、サービス アカウントが配置されているプロジェクトの [組織のポリシー] ページに移動します。

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

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

  2. サービス アカウントが存在するプロジェクトで、サービス アカウントを作成し、その名前をメモします。

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

  4. ワークフローのプロジェクトの Workflows サービス エージェントにサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。これにより、サービス エージェントはプロジェクト間でのサービス アカウントのアクセスを管理できます。サービス エージェントは、特定のプロジェクトの 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)を関連付けるか、サービス アカウントとして機能する権限があることを確認します。サービス アカウントを作成した場合は、この権限が自動的に付与されます。

    コンソール

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

      [ワークフロー] に移動

    2. ワークフローを作成するには、 [作成] をクリックします。既存のワークフローを更新するには、ワークフローの名前をクリックします。

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

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

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

    gcloud

    サービス アカウントを含むプロジェクトに対するロールを付与します。

    gcloud projects add-iam-policy-binding \
        SERVICE_ACCOUNT_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'

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

    • SERVICE_ACCOUNT_PROJECT_ID: サービス アカウントを含むGoogle Cloud プロジェクト ID。
    • PRINCIPAL: user|group|serviceAccount:email または domain:domain 形式のワークフロー デプロイヤの識別子。例:
      • user:dana@example.com
      • group:admins@example.com
      • serviceAccount:my-service-account@example.com
      • domain:example.com
    • SERVICE_ACCOUNT_RESOURCE_NAME: サービス アカウントの完全なリソース名。次の形式で指定します。

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

      ここで、SERVICE_ACCOUNT_NAME はサービス アカウントの名前です。

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

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

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

コンソール

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

    [ワークフロー] に移動

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

  3. [ワークフローの詳細] ページで、[詳細] タブをクリックします。

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

gcloud

gcloud workflows describe コマンドを実行して、ワークフローの説明を取得します。

gcloud workflows describe WORKFLOW_NAME \
    --location=LOCATION

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

  • WORKFLOW_NAME: ワークフローの名前。
  • LOCATION: ワークフローがデプロイされているリージョン(例: us-central1)。

出力は次のようになります。関連付けられたサービス アカウントが含まれます。

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

次のステップ