ユーザー管理のサービス アカウントを使用する VM を作成する


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

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

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

始める前に

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

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

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

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

    Terraform

    このページの Terraform サンプルをローカル開発環境から使用するには、gcloud CLI をインストールして初期化し、自身のユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定してください。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、 ローカル開発環境の認証の設定 をご覧ください。

    REST

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

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

      gcloud init

必要なロール

サービス アカウントを使用する VM を作成するために必要な権限を取得するには、以下の IAM ロールをプロジェクトに付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセス権の管理に関する記事をご覧ください。

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

必要な権限

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

  • サービス アカウントを作成する: serviceAccountCreator ロールのすべての権限
  • VM を作成する:
    • プロジェクトに対する compute.instances.create
    • カスタム イメージを使用して VM を作成する: イメージに対する compute.images.useReadOnly
    • スナップショットを使用して VM を作成する: スナップショットに対する compute.snapshots.useReadOnly
    • インスタンス テンプレートを使用して VM を作成する: インスタンス テンプレートに対する compute.instanceTemplates.useReadOnly
    • レガシー ネットワークを VM に割り当てる: プロジェクトに対する compute.networks.use
    • VM の静的 IP アドレスを指定する: プロジェクトに対する compute.addresses.use
    • レガシー ネットワークの使用時に VM に外部 IP アドレスを割り当てる: プロジェクトに対する compute.networks.useExternalIp
    • VM のサブネットを指定する: プロジェクトまたは選択したサブネットに対する compute.subnetworks.use
    • VPC ネットワークの使用時に VM に外部 IP アドレスを割り当てる: プロジェクトまたは選択したサブネットに対する compute.subnetworks.useExternalIp
    • VM の VM インスタンス メタデータを設定する: プロジェクトに対する compute.instances.setMetadata
    • VM にタグを設定する: VM に対する compute.instances.setTags
    • VM にラベルを設定する: VM に対する compute.instances.setLabels
    • VM が使用するサービス アカウントを設定する: VM に対する compute.instances.setServiceAccount
    • VM に新しいディスクを作成する: プロジェクトに対する compute.disks.create
    • 既存のディスクを読み取り専用モードまたは読み取り / 書き込みモードでアタッチする: ディスクに対する compute.disks.use
    • 既存のディスクを読み取り専用モードでアタッチする: ディスクに対する compute.disks.useReadOnly

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

概要

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 パラメータを使用してアクセス スコープを設定できます。

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

サービス アカウントを作成し、必要な IAM ロールを割り当てます。IAM ロールは必要な数だけ割り当てます。必要に応じて、サービス アカウントの IAM ロールを変更できます。

サービス アカウントの権限を制限し、サービス アカウントの権限を定期的に確認して、最新の状態にしておくことをおすすめします。

サービス アカウントは、次のいずれかの方法で設定します。

コンソール

    In the Google Cloud console, go to the Create service account page.

    Go to Create service account
  1. Select your project.
  2. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

    In the Service account description field, enter a description. For example, Service account for quickstart.

  3. Click Create and continue.
  4. Grant the required roles to the service account.

    To grant a role, find the Select a role list, then select the role.

    To grant additional roles, click Add another role and add each additional role.

  5. Click Continue.
  6. In the Service account users role field, enter the identifier for the principal that will attach the service account to other resources, such as Compute Engine instances.

    This is typically the email address for a Google Account.

  7. Click Done to finish creating the service account.

gcloud

    Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. To provide access to your project and your resources, grant a role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
      • ROLE: the role to grant
    3. To grant another role to the service account, run the command as you did in the previous step.
    4. Grant the required role to the principal that will attach the service account to other resources.

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
      • USER_EMAIL: the email address for a Google Account

Terraform

サービス アカウントを作成するには、google_service_account リソースを使用します。

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

account_id 属性と display_name 属性のプレースホルダの値を忘れずに置き換えてください。

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

VM を作成してサービス アカウントを接続する

サービス アカウントを作成したら VM を作成し、前のセクションで作成したサービス アカウントに接続します。また、VM のアクセス スコープを cloud-platform に設定します。

すでに既存の VM があり、別のサービス アカウントを使用するようにその VM を構成する場合は、接続されたサービス アカウントを変更するをご覧ください。

以下のいずれかの方法で VM を作成し、サービス アカウントを接続します。

コンソール

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

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

  1. プロジェクトを選択し、[続行] をクリックします。
  2. [インスタンスを作成] をクリックします。
  3. VM の名前を指定します。
  4. [ID と API へのアクセス] セクションまで移動します。
  5. [サービス アカウント] リストで、作成したサービス アカウントを選択します。サービス アカウントを VM に接続すると、Google Cloud アクセス スコープの cloud-platform アクセス スコープが VM に自動的に設定されます。
  6. 必要に応じて、VM をさらにカスタマイズします。
  7. VM を作成して起動するには、[作成] をクリックします。

gcloud

Google Cloud CLI を使用して新しい VM インスタンスを作成し、カスタム サービス アカウントを使用するように構成するには、gcloud compute instances create コマンドを使用して、VM インスタンスにサービス アカウントのメールと cloud-platform アクセス スコープを指定します。

gcloud compute instances create VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=https://www.googleapis.com/auth/cloud-platform

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

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

例:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/cloud-platform

エイリアス --scopes=cloud-platform を使用してスコープを指定することもできます。これらのエイリアスは、gcloud CLI によってのみ認識されます。API や他のライブラリではこれらのエイリアスが認識されないため、完全なスコープ URI を指定する必要があります。

Terraform

サービス アカウントを使用するように新しい VM を設定するには、google_compute_instance リソースを使用します。

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

REST

instances.insert メソッドを使用して VM を作成し、VM インスタンスに対してサービス アカウントのメールとアクセス スコープを指定します。

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

{
   "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
   "name":"VM_NAME",
   
   "disks":[
      {
         "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
         },
         "boot":true
      }
   ],
   
   
   "networkInterfaces":[
      {
         "network":"global/networks/NETWORK_NAME"
      }
   ],
   
  "serviceAccounts": [
      {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
      }
   ],
   "shieldedInstanceConfig":{
      "enableSecureBoot":"ENABLE_SECURE_BOOT"
   }
}

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

  • PROJECT_ID: VM を作成するプロジェクトの ID
  • ZONE: VM を作成するゾーン
  • MACHINE_TYPE_ZONE: 新しい VM に使用するマシンタイプを含むゾーン
  • MACHINE_TYPE: 新しい VM のマシンタイプ(事前定義またはカスタム
  • VM_NAME: 新しい VM の名前
  • IMAGE_PROJECT: イメージを含むプロジェクト
    たとえば、イメージ ファミリーとして debian-10 を指定する場合は、イメージ プロジェクトとして debian-cloud を指定します。
  • IMAGE or IMAGE_FAMILY: 次のいずれかを指定します。
    • IMAGE: 公開イメージの特定のバージョン
      "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"
    • IMAGE_FAMILY: イメージ ファミリー
      これにより、最新の非推奨ではない OS イメージから VM が作成されます。たとえば、"sourceImage": "projects/debian-cloud/global/images/family/debian-10" を指定すると、Compute Engine は Debian 10 イメージ ファミリーの OS イメージの最新バージョンから VM を作成します。
  • NETWORK_NAME: VM に使用する VPC ネットワーク。default を指定して、デフォルト ネットワークを使用できます。
  • SERVICE_ACCOUNT_EMAIL: 作成したサービス アカウントのメールアドレス。例: my-sa-123@my-project-123.iam.gserviceaccount.com。メールアドレスを表示するには、サービス アカウントのメールを取得するをご覧ください。
  • ENABLE_SECURE_BOOT: 省略可。Shielded VM 機能をサポートしているイメージを選択した場合は、Compute Engine がデフォルトで仮想トラステッド プラットフォーム モジュール(vTPM)整合性モニタリングを有効にします。Compute Engine は、デフォルトではセキュアブートを有効にしません。

    enableSecureBoottrue を指定すると、Compute Engine は 3 つの Shielded VM 機能をすべて有効にした VM を作成します。Compute Engine が VM を起動した後、Shielded VM のオプションを変更するには、VM を停止する必要があります。

他の Google Cloud サービスにアクセスして使用する

サービス アカウントを使用するように VM を構成すると、アプリケーションはサービス アカウントを使用して認証できるようになります。最も一般的な方法は、アプリケーションのデフォルト認証情報とクライアント ライブラリを使用して認証する方法です。gcloud CLI などの一部の Google Cloud ツールは、自動的にサービス アカウントを使用して VM から Google Cloud APIs にアクセスできます。詳細については、サービス アカウントを使用したワークロードの認証をご覧ください。

サービス アカウントが削除されると、アプリケーションはそのサービス アカウントを使用して Google Cloud リソースにアクセスできなくなります。デフォルトの App Engine サービス アカウントと Compute Engine サービス アカウントを削除すると、VM はプロジェクト内のリソースにアクセスできなくなります。サービス アカウントが使用されているかどうかわからない場合は、削除する前に、サービス アカウントを無効にすることをおすすめします。無効になっているサービス アカウントがまだ必要である場合は、再度有効にすることができます。

例: VM から Cloud Storage リソースにアクセスする

storage.admin ロールを持つサービス アカウントを使用するように VM を構成すると、gcloud CLI などのツールを使用して、Cloud Storage に保存したファイルを管理できます。Cloud Storage リソースにアクセスするには、次の操作を行います。

  1. VM に接続されているサービス アカウントに roles/storage.admin ロールがあることを確認します。

  2. VM でカスタム OS イメージを使用している場合は、gcloud CLI をインストールします。デフォルトでは、gcloud CLI は Google Cloud が提供するほとんどの公開 OS イメージにインストールされています。

  3. VM に接続します。

  4. VM から Google Cloud CLI を使用して Cloud Storage リソースを管理します。

次のステップ