Google Cloud 認証ライブラリを使用してワークロードを認証する

このドキュメントでは、Workload Identity 連携 を Google Cloud 認証ライブラリ(auth ライブラリ)で使用して、 AWS、Microsoft Azure、OpenID Connect(OIDC)または SAML 2.0 をサポートするプロバイダなどのサードパーティ ID プロバイダからワークロードを認証する方法について説明します。

Workload Identity 連携を使用すると、 Google CloudGoogle Cloud の外部で実行されているアプリケーションがサービス アカウント キーを使用せずにリソースに アクセス できます。Google 認証ライブラリは、外部認証情報を 有効期間の短い Google Cloud アクセス トークンと交換することで、これを実現します。

認証用の外部認証情報は、次の方法で取得できます。

始める前に

  1. 必要な API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法について学習する

    API を有効にする

  2. ID プロバイダとの Workload Identity 連携を構成します。

標準の認証情報メカニズムを使用して認証する

一般的にサポートされているサードパーティ ID プロバイダの場合は、 Google Cloud 認証ライブラリの組み込み機能を使用して、 認証情報構成ファイルを生成することでワークロードを認証できます。このファイルは、認証ライブラリが外部プロバイダから ID を連携するために必要な情報を提供します。

通常、GOOGLE_APPLICATION_CREDENTIALS 環境変数を使用して読み込まれる認証情報構成ファイルは、次のいずれかの方法でサードパーティのサブジェクト トークンを取得するように認証ライブラリに指示できます。

  • ファイル提供: ライブラリは、ローカル ファイルからサブジェクト トークンを読み取ります。 別のプロセスで、このファイルに有効期限が切れていない有効なトークンが含まれていることを確認する必要があります。
  • URL 提供: ライブラリは、指定されたローカル URL エンドポイントにリクエストを送信してサブジェクト トークンを取得します。
  • 実行可能ファイル提供: ライブラリは、構成された実行可能コマンドを実行します。 実行可能ファイルの標準出力には、サブジェクト トークンが含まれている必要があります。
  1. 特定のプロバイダの認証情報構成ファイルを生成します。

  2. 認証情報構成ファイルを使用して認証します。

    Google Cloud クライアント ライブラリが 認証情報構成ファイルを自動的に検出して使用できるようにするには、GOOGLE_APPLICATION_CREDENTIALS 環境変数を生成された JSON ファイルのパスに設定します。

    シェルで環境変数をエクスポートします: bash export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/config.json

    環境変数を設定すると、クライアント ライブラリが認証フローを処理します。

次のコードサンプルは、認証済み API Google Cloud に対して呼び出しを行う方法を示しています。

Node.js

IAM のクライアント ライブラリをインストールして使用する方法については、 IAM クライアント ライブラリをご覧ください。 詳細については、IAM Node.js API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

// Imports the Google Cloud client library.
const {Storage} = require('@google-cloud/storage');

// Instantiates a client. If you don't specify credentials when constructing
// the client, the client library will look for credentials in the
// environment.
const storage = new Storage();
// Makes an authenticated API request.
async function listBuckets() {
  try {
    const results = await storage.getBuckets();

    const [buckets] = results;

    console.log('Buckets:');
    buckets.forEach(bucket => {
      console.log(bucket.name);
    });
  } catch (err) {
    console.error('ERROR:', err);
  }
}
listBuckets();

Python

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

def implicit():
    from google.cloud import storage

    # If you don't specify credentials when constructing the client, the
    # client library will look for credentials in the environment.
    storage_client = storage.Client()

    # Make an authenticated API request
    buckets = list(storage_client.list_buckets())
    print(buckets)

Java

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

static void authImplicit() {
  // If you don't specify credentials when constructing the client, the client library will
  // look for credentials via the environment variable GOOGLE_APPLICATION_CREDENTIALS.
  Storage storage = StorageOptions.getDefaultInstance().getService();

  System.out.println("Buckets:");
  Page<Bucket> buckets = storage.list();
  for (Bucket bucket : buckets.iterateAll()) {
    System.out.println(bucket.toString());
  }
}

Go

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Go API のリファレンス ドキュメントをご覧ください。

IAM で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/storage"
	"google.golang.org/api/iterator"
)

// authenticateImplicitWithAdc uses Application Default Credentials
// to automatically find credentials and authenticate.
func authenticateImplicitWithAdc(w io.Writer, projectId string) error {
	// projectId := "your_project_id"

	ctx := context.Background()

	// NOTE: Replace the client created below with the client required for your application.
	// Note that the credentials are not specified when constructing the client.
	// The client library finds your credentials using ADC.
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	it := client.Buckets(ctx, projectId)
	for {
		bucketAttrs, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintf(w, "Bucket: %v\n", bucketAttrs.Name)
	}

	fmt.Fprintf(w, "Listed all storage buckets.\n")

	return nil
}