キュー構成の保護

このページでは、キューの作成と構成を安全に行うための推奨事項について説明します。少数のユーザーまたはエンティティにキュー管理メソッドを制限することが重要です。大規模な組織では、サービス アカウントを使用して、適切なキュー構成を実施するソフトウェアを実行しなければならない場合があります。

一般的に、ユーザーと他のエンティティを次の 3 つのカテゴリに分けます。

  1. キュー管理者 - このグループのユーザーには、Cloud Tasks のキュー管理メソッドを呼び出す権限、または queue.yaml ファイルをアップロードする権限があります。このグループは、特に queue.yaml と Cloud Tasks のキュー管理メソッドを誤って混在させキュー構成を壊すリスクを減らすため、ごく少数のユーザーに限定されています。
  2. Cloud Tasks ワーカー - このグループのユーザーは、タスクのエンキューやデキューなど、Cloud Tasks との共通のやりとりを実行する権限を持っています。 Cloud Tasks のキュー管理メソッドを呼び出すことはできません
  3. App Engine デプロイ担当者 - App Engine アプリを持つプロジェクトの場合、このグループのユーザーはアプリをデプロイする権限を持っています。queue.yaml ファイルのアップロードや Cloud Tasks API の呼び出しは許可されていないため、キュー管理者は適切なポリシーを適用できます。

このスキームでは、カテゴリ分けの目的が損なわれるため、キュー管理者であるユーザーは Cloud Tasks ワーカーにならないでください。

プロジェクトで Cloud Tasks のキュー管理メソッドを排他的に使用している場合、誤った queue.yaml ファイルがアップロードされる可能性があるため、キュー管理者は App Engine デプロイ担当者にもならない方がよいでしょう。

小規模なプロジェクトと組織

小規模なプロジェクトや組織は、Identity and Access Management(IAM)ロールをユーザーに直接割り当てて、上記のグループに配置することができます。これは、構成の簡素化を望むチームや、キューの構成変更や App Engine アプリのデプロイを手作業で行うチームにとって意味があります。

これらのグループにユーザーを追加する方法の手順は、次のとおりです。

キュー管理者

  1. プロジェクト管理者として、Cloud Tasks のキュー管理 API 呼び出し、または queue.yaml ファイルのアップロードを許可されたユーザーに cloudtasks.queueAdmin ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/cloudtasks.queueAdmin
    

    以下を置き換えます。

    • PROJECT_ID: オブジェクトの ID
    • EMAIL: メンバーユーザーのメールアドレス
  2. 上記のベスト プラクティスに従って、cloudtasks.queueAdmin のロールを持つユーザーとして、次のいずれかの方法でキュー構成を変更します。

    1. Cloud Tasks API を使用してキュー構成を変更します。

    2. gcloudqueue.yaml をアップロード:

      gcloud app deploy queue.yaml
      

Cloud Tasks ワーカー

通常は、多数のユーザーに対して Cloud Tasks の利用を許可します。このような場合は、個々のユーザーではなくサービス アカウントに役割を割り当てるという方法を使用できます。本番環境では、このタイプの使用法が一般的です。詳細については、大規模なプロジェクトと組織をご覧ください。

  1. プロジェクト管理者として、Cloud Tasks の利用は許可するもキュー構成の変更は許可しないユーザーに、以下の役割を付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskDeleter
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

上記で付与されたロールを 1 つ以上持つユーザーとして、Cloud Tasks API を利用できます。

App Engine デプロイ担当者

  1. プロジェクト管理者として、App Engine アプリのデプロイを許可する一方、キュー構成の変更とタスクの操作は許可しないユーザーに役割を付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/storage.admin
    

    以下を置き換えます。

    • PROJECT_ID: オブジェクトの ID
    • EMAIL: メンバーユーザーのメールアドレス
  2. 上記で付与された役割を持つユーザーとして、App Engine アプリをデプロイします。

    gcloud app deploy app.yaml
    

大規模なプロジェクトと組織

大規模なプロジェクトや組織は、サービス アカウントを使用して職務と責任を分けることができます。これは、複雑なインフラストラクチャを抱え、キュー構成を変更し、場合によっては App Engine アプリのデプロイも行うチームにとって意味があります。

最小権限の原則に従ってアクセス管理を簡素化するため、この手順ではサービス アカウントの権限借用を使用します。このパターンの詳細については、Google Cloud 認証のドキュメントでサービス アカウントの権限借用を使用するをご覧ください。

これらのサービス アカウントを設定する手順は、次のとおりです。

キュー管理者

  1. プロジェクト管理者として、サービス アカウントを作成します。

    gcloud iam service-accounts create queue-admin \
    --display-name "Queue Admin"
    
  2. サービスア カウントに cloudtasks.queueAdmin ロールを付与して、queue.yaml ファイルをアップロードし、Cloud Tasks のキュー管理 API 呼び出しを行えるようにします。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:queue-admin@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.queueAdmin
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  3. 作成した「キュー管理者」サービス アカウントの権限借用を選択的に許可します。

    これは通常、キュー管理者として機能する小規模なプリンシパル グループである必要があります。作成した「キュー管理者」サービス アカウントで、これらのプリンシパルに iam.serviceAccountTokenCreator ロールを付与します。この方法については、IAM ドキュメントの単一のロールの付与または取り消しをご覧ください。

  4. キュー管理または queue.yaml の使用に記載されているベスト プラクティスに従って、次のいずれかの方法を選択し、キュー構成を変更します。

    • Cloud Tasks を使用してキュー構成を変更します。

    • gcloud CLI を使用して queue.yaml をアップロードする

Cloud Tasks ワーカー

  1. プロジェクト管理者として、サービス アカウントを作成します。

    gcloud iam service-accounts create cloud-tasks-worker \
    --display-name "Cloud Tasks Worker"
    
  2. Cloud Tasks と対話できるが、キュー構成を変更できないように、サービス アカウントに役割を付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.viewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.enqueuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.dequeuer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskRunner
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudtasks.taskDeleter
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  3. 作成した「Cloud Tasks ワーカー」サービス アカウントの権限借用を選択的に許可します。

    Cloud Tasks とやり取りするプリンシパルの場合、作成した「Cloud Tasks ワーカー」サービス アカウントに iam.serviceAccountTokenCreator ロールを付与します。この方法については、IAM ドキュメントの単一のロールの付与または取り消しをご覧ください。

App Engine デプロイ担当者

  1. プロジェクト管理者として、サービス アカウントを作成します。

    gcloud iam service-accounts create app-engine-deployer \
    --display-name "App Engine Deployer"
    
  2. queue.yaml ではなく App Engine アプリをデプロイできるように、サービス アカウントにロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/appengine.deployer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/appengine.serviceAdmin
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \
    --role roles/storage.admin
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  3. 作成した「App Engine デプロイ担当者」サービス アカウントの権限借用を選択的に許可します。

    App Engine サービスをデプロイするプリンシパルには、作成した「App Engine デプロイ担当者」サービス アカウントに iam.serviceAccountTokenCreator ロールを付与します。この方法については、IAM ドキュメントの単一のロールの付与または取り消しをご覧ください。

単一キューに対するアクセスの制限

プロジェクトに複数のキューがあり、個々のキューへのアクセスを制限する場合は、プロジェクト レベルではなくキューレベルで IAM ポリシーを使用できます。キューによるアクセスを制限するには、gcloud tasks queues add-iam-policy-binding コマンドを使用します。次に例を示します。

  gcloud tasks queues add-iam-policy-binding QUEUE_NAME --location=LOCATION \
  --member=serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer

以下を置き換えます。

  • QUEUE_NAME: キューの名前
  • LOCATION: キューのロケーション
  • PROJECT_ID: オブジェクトの ID

次のステップ