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


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

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

始める前に

必要なロール

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

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

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

必要な権限

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

  • サービス アカウントを作成する権限: serviceAccountCreator ロールのすべての権限
  • VM を作成する権限:
    • プロジェクトに対する compute.instances.create
    • Shielded VM インスタンスを作成し、Shielded VM の設定を変更できるようにする場合: compute.instances.updateShieldedVmConfig
    • レガシー ネットワークを使用している場合: プロジェクトに対する compute.networks.use
    • プロジェクト全体または選択したサブネット(VPC ネットワーク)に対する compute.subnetworks.use
    • レガシー ネットワークを使用してインスタンスに外部 IP アドレス(エフェメラルまたは静的アドレス)を割り当てる必要がある場合: プロジェクトに対する compute.networks.useExternalIp
    • VPC ネットワークを使用してインスタンスに外部 IP アドレス(エフェメラルまたは静的アドレス)を割り当てる必要がある場合: プロジェクト全体または選択したサブネットに対する compute.subnetworks.useExternalIp
    • プロジェクトで静的アドレスを指定する場合: プロジェクトに対する compute.addresses.use
    • メタデータを設定する場合: compute.instances.setMetadata
    • タグを設定する場合: インスタンスに対する compute.instances.setTags
    • ラベルを設定する場合: インスタンスに対する compute.instances.setLabels
    • サービス アカウントを設定する場合: インスタンスに対する compute.instances.setServiceAccount
    • 新しいルート永続ディスクを作成する場合: イメージに対する compute.images.useReadOnly
    • このインスタンスで新しいルート永続ディスクを作成する場合: プロジェクトに対する compute.disks.create
    • 既存の永続ディスクを読み取り専用モードでアタッチする場合: ディスクに対する compute.disks.useReadOnly
    • 既存のディスクを読み書きモードでアタッチする場合: ディスクに対する compute.disks.use
    • ラベルを設定する場合: ディスクに対する compute.disks.setLabels
    • スナップショットからインスタンスを作成する際に新しいスナップショットを作成する場合: プロジェクトに対する compute.snapshots.create
    • スナップショットからインスタンスを作成する場合: スナップショットに対する compute.snapshots.useReadOnly
    • インスタンス テンプレートからインスタンスを作成する場合: インスタンス テンプレートに対する compute.instanceTemplates.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 ロールを変更できます。

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

コンソール

  1. Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。

    [サービス アカウントの作成] に移動
  2. プロジェクトを選択します。
  3. [サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。

    [サービス アカウントの説明] フィールドに説明を入力します。例: Service account for quickstart

  4. [作成して続行] をクリックします。
  5. サービス アカウントに必要なロールを付与します。

    ロールを付与するには、[ロールを選択] リストを見つけてロールを選択します。

    追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。

  6. [続行] をクリックします。
  7. [サービス アカウント ユーザーロール] ボックスに、Google アカウントのメールアドレスを入力します。
  8. [完了] をクリックして、サービス アカウントの作成を完了します。

gcloud

    認証を設定します。

    1. サービス アカウントを作成します。

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME をサービス アカウントの名前に置き換えます。

    2. プロジェクトとリソースへのアクセス権を付与するには、サービス アカウントにロールを付与します。

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

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

      • SERVICE_ACCOUNT_NAME: サービス アカウントの名前
      • PROJECT_ID: サービス アカウントを作成したプロジェクト ID
      • ROLE: 付与するロール
    3. サービス アカウントに別のロールを付与するには、前の手順で行ったようにコマンドを実行します。
    4. サービス アカウントのロールを使用して、そのサービス アカウントを他のリソースに関連付けることができるロールを Google アカウントに付与します。

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

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

      • SERVICE_ACCOUNT_NAME: サービス アカウントの名前
      • PROJECT_ID: サービス アカウントを作成したプロジェクト ID
      • USER_EMAIL: Google アカウントのメールアドレス

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 や gsutil などの一部の Google Cloud ツールは、自動的にサービス アカウントを使用して VM から Google Cloud APIs にアクセスできます。詳細については、サービス アカウントを使用したワークロードの認証をご覧ください。

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

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

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

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

  3. VM に接続します。

  4. VM から、次のいずれかのツールを使用して Cloud Storage リソースを管理します。

おすすめの方法

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

次のステップ