接続されたサービス アカウントを変更する


このドキュメントでは、別のサービス アカウントを使用するように既存の仮想マシン(VM)を構成する方法について説明します。サービス アカウントは特別なアカウントであり、通常はアプリケーションやコンピューティング ワークロードが承認された API 呼び出しを行うときに使用されます。

サービス アカウントは、カスタム アプリケーションなどのワークロードで、エンドユーザーの関与なしに Google Cloud リソースにアクセスする場合やアクションを実行する必要がある場合に必要です。サービス アカウントを使用するタイミングの詳細については、サービス アカウントの使用に関するベスト プラクティスをご覧ください。

Google Cloud APIs を呼び出す必要があるアプリケーションがある場合、アプリケーションまたはワークロードを実行中の VM にユーザー管理のサービス アカウントを接続することをおすすめします。次に、サービス アカウントに IAM ロールを付与して、サービス アカウント、ひいては VM 上で実行中のアプリケーションに、Google Cloud リソースへのアクセス権を付与します。

始める前に

  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境でコードまたはサンプルを実行するには、次のいずれかのオプションを選択して Compute Engine に対する認証を行います。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      詳細については、Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

必要なロール

VM 上でサービス アカウントを構成するために必要な権限を取得するには、VM またはプロジェクトに対する Compute インスタンス管理者(v1)roles/compute.instanceAdmin.v1)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、VM 上でサービス アカウントを構成するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

VM でサービス アカウントを構成するには、次の権限が必要です。

  • compute.instances.setServiceAccount
  • compute.instances.stop
  • compute.instances.start

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

概要

VM のサービス アカウントは、次のように構成することをおすすめします。

  1. Compute Engine のデフォルトのサービス アカウントを使用せずに、ユーザー管理の新しいサービス アカウントを作成し、必要なリソースとオペレーションに対してのみ、そのサービス アカウントに IAM ロールを付与します。
  2. サービス アカウントを VM に接続します。
  3. VM にクラウド プラットフォーム(https://www.googleapis.com/auth/cloud-platform)のスコープを設定します。これにより、VM のサービス アカウントを使用して、使用権限のある Google Cloud APIs を呼び出せるようになります。
    • Google Cloud コンソールを使用してサービス アカウントを指定すると、VM のアクセス スコープは自動的にデフォルトで cloud-platform スコープに設定されます。
    • Google Cloud CLI または Compute Engine API を使用してサービス アカウントを指定すると、scopes パラメータを使用してアクセス スコープを設定できます。

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

ユーザー管理のサービス アカウントを作成するか、Compute Engine のデフォルトのサービス アカウントを使用できます。ユーザー管理のサービス アカウントの使用をおすすめします。

選択したサービス アカウントに対して、必要な Identity and Access Management(IAM)ロールが割り当てられていることを確認します。

ユーザー管理

ユーザー管理のサービス アカウントがない場合は、サービス アカウントを作成します。詳しい手順については、サービス アカウントを設定するをご覧ください。

デフォルト

Compute Engine のデフォルトのサービス アカウントについて詳しい知識があり、新しいサービス アカウントを作成する代わりにデフォルトのサービス アカウントによって提供される認証情報を使用する場合は、IAM ロールをデフォルトのサービス アカウントに付与できます。

デフォルトのサービス アカウントに IAM ロールを割り当てる前に、以下の点を確認してください。

  • IAM ロールをデフォルトのサービス アカウントに付与すると、デフォルトのサービス アカウントとして実行中のすべての VM に影響します。たとえば、デフォルトのサービス アカウントに roles/storage.objectAdmin ロールを付与すると、必要なアクセス スコープを持ち、デフォルトのサービス アカウントとして実行されているすべての VM が roles/storage.objectAdmin ロールで付与される権限を持つことになります。同様に、特定のロールを省略してアクセス権限を制限すると、デフォルトのサービス アカウントとして実行中のすべての VM に影響します。

  • 組織のポリシーの構成によっては、デフォルトのサービス アカウントに、プロジェクトに対する編集者のロールが自動的に付与される場合があります。iam.automaticIamGrantsForDefaultServiceAccounts 組織ポリシー制約を適用して、自動的なロール付与を無効にすることを強くおすすめします。2024 年 5 月 3 日以降に組織を作成した場合、この制約はデフォルトで適用されます。

    自動ロール付与を無効にする場合、デフォルトのサービス アカウントに付与するロールを決定し、これらのロールを付与する必要があります。

    デフォルトのサービス アカウントにすでに編集者ロールが設定されている場合は、編集者ロールを権限の低いロールに置き換えることをおすすめします。サービス アカウントのロールを安全に変更するには、Policy Simulator を使用して変更の影響を確認してから、適切なロールを付与または取り消す操作を行います。

デフォルトのサービス アカウントに IAM ロールを付与すべきかどうか判断できない場合は、代わりにユーザー管理の新しいサービス アカウントを作成します。

サービス アカウントを接続してアクセス スコープを更新する

VM のサービス アカウントとアクセス スコープを変更するには、VM を一時的に停止する必要があります。

サービス アカウントが VM とは異なるプロジェクトにある場合、異なるプロジェクトのリソースのサービス アカウントを構成する必要があります。

VM のサービス アカウントとアクセス スコープを変更するには、次のいずれかの方法を使用します。

コンソール

  1. [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. サービス アカウントを変更する VM インスタンスの名前をクリックします。

  3. インスタンスが停止していない場合は、[停止] をクリックします。VM が停止するまで待ちます。

  4. [編集] をクリックします。

  5. 下にスクロールして、[サービス アカウント] セクションに移動します。

  6. プルダウン リストから、VM に割り当てるサービス アカウントを選択します。

    • ユーザー管理のサービス アカウントを選択した場合、VM のアクセス スコープはデフォルトで推奨の cloud-platform スコープになります。ユーザー管理のサービス アカウントに別のスコープが必要な場合は、gcloud CLI または Compute Engine API を使用してサービス アカウントを接続します。
    • Compute Engine のデフォルトのサービス アカウントを選択した場合は、Google Cloud コンソールでアクセス スコープを変更できます。
      • スコープを変更するには、[アクセス スコープ] セクションで、[各 API にアクセス権を設定] を選択して、必要に応じて適切なスコープを設定します。
      • 推奨: 設定する適切なアクセス スコープがわからない場合は、[すべての Cloud APIs に完全アクセス権を許可] を選択してから、サービス アカウントに IAM ロールを設定してアクセスを制限してください。
  7. [保存] をクリックして、変更を保存します。

  8. [開始 / 再開] をクリックして VM を再起動します。

gcloud

  1. instances stop コマンドを使用して VM を停止します。VM_NAME は、VM インスタンスの名前に置き換えます。

    gcloud compute instances stop VM_NAME
    
  2. サービス アカウントを接続します。サービス アカウントを接続するには、instances set-service-account コマンドを使用して、VM 名、サービス アカウントのメールアドレス、必要なスコープを指定します。アクセス スコープの設定の詳細については、ベスト プラクティスをご覧ください。

    gcloud compute instances set-service-account VM_NAME \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --scopes=SCOPES
    

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

    • SERVICE_ACCOUNT_EMAIL: 作成したサービス アカウントのメールアドレス。例: my-sa-123@my-project-123.iam.gserviceaccount.com。メールアドレスを表示するには、サービス アカウントの一覧取得をご覧ください。

      VM からサービス アカウントを削除する場合は、--no-service-account フラグを使用します。

    • VM_NAME: VM インスタンスの名前。

    • SCOPES: --scopes フラグの説明で提供されるスコープ URI またはエイリアスのカンマ区切りリスト。

      VM のスコープをすべて削除する場合は、--no-scopes フラグを使用します。

    たとえば、次のコマンドは example-instance という VM にサービス アカウント my-sa-123@my-project-123.iam.gserviceaccount.com を割り当て、この VM にアクセス スコープを設定して Compute Engine に対する読み取り / 書き込みアクセスと Cloud Storage への読み取り専用アクセスを許可します。

    gcloud compute instances set-service-account example-instance \
      --service-account=my-sa-123@my-project-123.iam.gserviceaccount.com \
      --scopes=compute-rw,storage-ro
    
  3. instances start コマンドを使用して VM を起動します。VM_NAME は、VM インスタンスの名前に置き換えます。

    gcloud compute instances start VM_NAME
    

REST

  1. instances.stop メソッドを使用して POST リクエストを送信し、VM を停止します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

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

    • PROJECT_ID: VM が属しているプロジェクト
    • ZONE: VM インスタンスが配置されているゾーン
    • VM_NAME: 停止する VM の名前
  2. setServiceAccount メソッドPOST リクエストを送信して、サービス アカウントを接続します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount
    
    {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": [
        "SCOPE_URI",
        "SCOPE_URI",
        ...
      ]
    }
    

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

    • PROJECT_ID: このリクエストのプロジェクト ID。
    • ZONE: この VM が属しているゾーン。
    • VM_NAME: VM の名前。
    • SERVICE_ACCOUNT_EMAIL: 作成したサービス アカウントのメールアドレス。例: my-sa-123@my-project-123.iam.gserviceaccount.com。メールアドレスを表示するには、サービス アカウントの一覧取得をご覧ください。
    • SCOPE_URI: 必要なスコープ URI

    たとえば、次のリクエストではサービス アカウントのメールアドレス my-sa-123@my-project-123.iam.gserviceaccount.com を使用して、Cloud Storage と BigQuery のスコープを設定しています。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount
    
    {
      "email": "my-sa-123@my-project-123.iam.gserviceaccount.com",
      "scopes": [
        "https://www.googleapis.com/auth/bigquery",
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
    
  3. instances.start メソッドを使用して POST リクエストを作成し、VM を起動します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

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

    • PROJECT_ID: VM が属しているプロジェクト
    • ZONE: VM インスタンスが配置されているゾーン
    • VM_NAME: 起動する VM の名前

VM が使用するサービス アカウントを表示する

プロジェクト内のすべてのサービス アカウントを表示するには、サービス アカウントの一覧取得をご覧ください。

VM が使用しているサービス アカウントを特定する必要がある場合は、次のいずれかの手順を実施します。

コンソール

  1. [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. サービス アカウントを変更する VM インスタンスの名前をクリックします。

  3. [API と ID の管理] セクションに移動します。このセクションには、VM で使用されるサービス アカウントとアクセス スコープが表示されます。

gcloud

gcloud compute instances describe コマンドを実行します。

gcloud compute instances describe VM_NAME \
    --format json

出力は次のようになります。

{
  ...
  "serviceAccounts":[
      {
        "email":"123845678986-compute@developer.gserviceaccount.com",
        "scopes":[
            "https://www.googleapis.com/auth/devstorage.full_control"
        ]
      }
  ]
  ...
   }

VM がサービス アカウントを使用していない場合、serviceAccounts プロパティのないレスポンスが返されます。

メタデータ サーバー

VM 内からメタデータ サーバーをクエリします。次のように http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/ にリクエストします。

user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \
-H "Metadata-Flavor: Google"

インスタンスの作成時に 1 つ以上のサービス アカウントを有効にしている場合、この curl コマンドを実行すると、次のような出力が返されます。

123845678986-compute@developer.gserviceaccount.com/
default/

インスタンスがサービス アカウントを使用していない場合、空のレスポンスが返されます。

ベスト プラクティス

  • サービス アカウントの権限を制限してサービス アカウントの権限を定期的に確認し、最新の状態にします。
  • サービス アカウントの削除は慎重に行ってください。サービス アカウントを削除する前に、重要なアプリケーションがそのサービス アカウントを使用していないことを確認してください。サービス アカウントが使用されているかどうかわからない場合は、削除するのではなくサービス アカウントを無効にすることをおすすめします。無効になっているサービス アカウントがまだ必要な場合は、再度有効にすることができます。
  • サービス アカウントのセキュリティ リスクを軽減します。詳しくは、サービス アカウントの使用に関するベスト プラクティスをご覧ください。

次のステップ