Amazon EC2からWorkload Identity連携を使用して、Google CloudのVertex AIのGeminiをセキュアに呼び出す
はじめに
こんにちは。
クラウド事業本部コンサルティング部の渡邉です。
近年、各クラウドの強みを事業に活かすためや、リスク分散、DR対策を行っていくにあたり、マルチクラウドの採用が進んできています。
AWSは基盤インフラに強みがあり、Google CloudはAI/ML周りに強みがあるため、AWSからGoogle CloudのAIサービスへアクセスしたいニーズもあると思います。
AWSからGoogle Cloudへアクセスする上では、セキュアにアクセスしたいです。
今回は、AWS EC2インスタンスからWorkload Identity連携を使用して、Google CloudのVertex AIのGeminiをセキュアに呼び出す方法を紹介したいと思います。
前提知識と概要
Workload Identity連携とは
Workload Identity連携とは、サービスアカウントキーの代わりにフェデレーションIDを使用して、オンプレミスまたはマルチクラウドのワークロードにGoogle Cloudリソースへのアクセス権を付与することができる機能です。
Workload Identity連携は、以下のワークロードをサポートしています。
- AWS / Azure
- Active Directory
- デプロイメントパイプライン (GitHub/GitLabなど)
- Kubernetes
- X.509証明書を使用して認証するワークロード
- OIDC/SAMLをサポートするIDプロバイダ
従来の認証方法(サービスアカウントキー)との比較
サービスアカウントキーを利用することでも、Google Cloudリソースにアクセスすることができますが、サービスアカウントキーは払い出すとデフォルトでは認証情報の有効期限がないため、定期的にローテーションする必要があるなど、正しく管理しなければセキュリティ上のリスクとなります。Google Cloud公式からもサービスアカウントキーは可能な限り使用しないこととアナウンスが出ています。
Workload Identity連携は、キーの発行が不要で一時的な認証情報を自動的に取得することができます。アクセスする際に利用するトークンは短時間で失効され、どのワークロードからアクセスされたのかが明確になるため、監査性も高いことが特徴です。
| 方式 | セキュリティ | 運用負荷 | 監査性 | Google推奨度 |
|---|---|---|---|---|
| サービスアカウントキー | 低 | 高 | 低 | 非推奨 |
| Workload Identity連携 | 高 | 低 | 高 | 強く推奨 |
アーキテクチャ概要図
今回検証するAWS EC2からWorkload Identity連携を使用してVertex AIのGeminiを呼び出す構成図です。

環境準備
AWS側の前提条件(EC2インスタンス、IAMロール)
- VPCやサブネット、EC2インスタンス、IAMロールなど各種リソースは作成済みとします。
Google Cloud側の前提条件
-
Google Cloudプロジェクトはすでに作成済みとします。
-
以下のAPIを事前に有効化しておきます。
cloudresourcemanager.googleapis.com: プロジェクトリソース管理iamcredentials.googleapis.com: サービスアカウントの偽装とトークン生成sts.googleapis.com: 外部IDプロバイダー(AWS)からのトークン交換iam.googleapis.com: Workload Identity Poolの作成・管理aiplatform.googleapis.com: Vertex AIの利用
gcloud services enable \ iamcredentials.googleapis.com \ sts.googleapis.com \ iam.googleapis.com \ cloudresourcemanager.googleapis.com \ aiplatform.googleapis.com Google Cloud側の設定
Workload Identity Poolの作成
Workload Identity Poolの作成を行っていきます。
Workload Identity Poolは、外部IDを管理できるエンティティです。
プロジェクトのCloud Shellへアクセスし、以下のコマンドを実行してWorkload Identity Poolを作成します。
gcloud iam workload-identity-pools create aws-ec2-pool \ --location="global" \ --display-name="AWS EC2 Pool" \ --description="Workload Identity Pool for AWS EC2 instances to access Vertex AI" 【IAMと管理】→【Workload Identity 連携】へアクセスし、Workload Identity Poolを確認します。
Workload Identity Poolでは、Workload Identity連携の使用量のモニタリング状況や、ステータスの有効・無効、ログの確認などを行うことができます。

Workload Identity Providerの設定(AWS用)
Workload Identity Providerの作成を行っていきます。
Workload Identity Providerは、Google Cloud と IdP の間の関係を記述するエンティティです。
Workload Identity連携は、OAuth2.0トークン交換の仕様に準拠しています。IdPからSecurity Token Serviceに認証情報を提供し、認証情報のIDを検証し、連携トークンを返します。
Workload Identity Providerには、【属性のマッピング】と【属性条件】を設定することができます。
属性のマッピングは、外部サービス(AWS、Azure等)から連携された認証情報をGoogle Cloudが理解できる形式に翻訳し、利用することができる仕組みのことです。
属性条件は、属性をチェックする式です。特定の属性がtrueと評価された場合のみ認証情報を受け入れます。それ以外の場合、認証情報は拒否されます。
属性条件を設定することにより、認証できるIDを制限することができるので、より厳密に管理していきたい場合は設定することをお勧めします。
以下のコマンドを実行してWorkload Identity Providerを作成します。
gcloud iam workload-identity-pools providers create-aws aws-ec2-provider \ --location="global" \ --workload-identity-pool="aws-ec2-pool" \ --account-id="<AWS_ACCOUNT_ID>" \ --display-name="AWS EC2 Provider" \ --description="Workload Identity Provider for AWS EC2" \ --attribute-mapping="google.subject=assertion.arn,attribute.aws_account=assertion.account,attribute.aws_role=assertion.arn.extract('assumed-role/{role}/')" \ --attribute-condition="assertion.arn.startsWith('arn:aws:sts::<AWS_ACCOUNT_ID>:assumed-role/')" 同様に、【IAMと管理】→【Workload Identity 連携】へアクセスし、Workload Identity Poolを確認すると、Workload Identity Providerが作成されています。

詳細を確認すると、コマンドで実行して設定した属性マッピングや、属性条件などが設定されています。

ワークロードの認証方法
ワークロードにGoogle Cloudリソースへのアクセス権を付与するには以下の2つの方法があります。
- リソースへの直接アクセス
- サービスアカウントの権限借用
Google Cloud公式では、リソースへの直接アクセスを推奨されていますが、この認証方法では一部のGoogle Cloudプロダクトで制限があるため、サービスアカウントを利用した権限借用での認証方法を使用することもできます。
一部のGoogle Cloudプロダクトでの制限は、公式ドキュメントで確認することができます。
今回は、サービスアカウントを利用した権限借用での認証方法を使用します。
サービスアカウントの作成と権限付与
Workload Identity連携で使用するサービスアカウントを作成します。
EC2からVertex AIを利用するためのサービスアカウントなので、vertex-ai-callerとして、以下のコマンドを実行してサービスアカウントを作成します。
gcloud iam service-accounts create vertex-ai-caller \ --display-name="Vertex AI Access from AWS EC2" \ --description="Service Account for AWS EC2 to access Vertex AI" 【IAMと管理】→【サービス アカウント】へアクセスし、作成したサービスアカウントを確認します。

サービスアカウントに、Vertex AIを利用するロールroles/aiplatform.userを付与します。
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member="serviceAccount:vertex-ai-caller@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" 【IAMと管理】→【IAM】へアクセスし、作成したサービスアカウントの権限を確認します。

サービスアカウントとWorkload Identityの紐付け
以下のコマンドを実行して、作成したサービスアカウントとWorkload Identityを紐づけて、サービスアカウントの権限借用を許可します。
連携プリンシパルまたはプリンシパルセットにroles/iam.workloadIdentityUserを付与することで実現することができます。
gcloud iam service-accounts add-iam-policy-binding \ vertex-ai-caller@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com \ --role="roles/iam.workloadIdentityUser" \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/aws-ec2-pool/attribute.aws_role/EC2-Vertex-AI-Role" Workload Identity Poolから【接続済みサービスアカウント】を確認すると、サービスアカウントの権限借用の設定ができていました。
この場合は、EC2-Vertex-AI-RoleというAWS側のIAMロールからのアクセスのみを許可します。

認証情報の構成をダウンロード
Cloudクライアントライブラリや、gcloud CLIなどは、外部認証情報を自動的に取得し、これらの認証情報を使用してサービスアカウントの権限借用をすることができます。
認証情報構成ファイルは、コンソール上では、先ほどのWorkload Identity Poolの接続済みサービスアカウントからダウンロードすることができます。
今回は、コマンドを利用して認証情報構成ファイルを作成していきます。
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/aws-ec2-pool/providers/aws-ec2-provider \ --service-account=vertex-ai-caller@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com \ --aws \ --enable-imdsv2 \ --output-file=credentials-configuration-file.json 実行すると、実行環境にcredentials-configuration-file.jsonが生成されます。
{ "universe_domain": "googleapis.com", "type": "external_account", "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/aws-ec2-pool/providers/aws-ec2-provider", "subject_token_type": "urn:ietf:params:aws:token-type:aws4_request", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "environment_id": "aws1", "region_url": "http://169.254.169.254/latest/meta-data/placement/availability-zone", "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials", "regional_cred_verification_url": "https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15", "imdsv2_session_token_url": "http://169.254.169.254/latest/api/token" }, "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/vertex-ai-caller@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com:generateAccessToken" } AWS側の設定
EC2インスタンスの準備
EC2インスタンスはAmazon Linux 2023のOSを利用して作成しています。
$ cat /etc/os-release NAME="Amazon Linux" VERSION="2023" ID="amzn" ID_LIKE="fedora" VERSION_ID="2023" PLATFORM_ID="platform:al2023" PRETTY_NAME="Amazon Linux 2023.9.20251105" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023" HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/" DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/" SUPPORT_URL="https://aws.amazon.com/premiumsupport/" BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023" VENDOR_NAME="AWS" VENDOR_URL="https://aws.amazon.com/" SUPPORT_END="2029-06-30" IAMロールの設定
IAMロールは、Google Cloud側のサービスアカウントとWorkload Identityの紐付けで設定した属性マッピングのIAMロール名EC2-Vertex-AI-Roleと同じ名前で作成します。
SSMでEC2インスタンスへアクセスしているため、ポリシーはAmazonEC2RoleforSSMを設定し、信頼関係は以下のようになっています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } 認証情報構成ファイルの配置
先ほど作成した認証情報構成ファイルをEC2内に配置し、環境変数GOOGLE_APPLICATION_CREDENTIALSとGCP_PROJECT_IDを設定し、認証情報の構成ファイルを指すように設定します。
$ ls -ltr total 4 -rw-r--r--. 1 ssm-user ssm-user 948 Nov 6 02:03 credentials-configuration-file.json export GOOGLE_APPLICATION_CREDENTIALS=credentials-configuration-file.json export GCP_PROJECT_ID=PROJECT_ID 実装
認証情報の取得フロー
Workload Identity連携を使用した認証情報の取得フローは以下のようになります。
サンプルコード
以下は、AWS EC2インスタンスからWorkload Identity連携を使用してVertex AIのGeminiを呼び出すPythonサンプルコードです。
Amazon Linux 2023では、Pythonバージョンが古く、デフォルトでpipコマンドが使用できないので初期設定を行い、ライブラリをインストールします。
sudo dnf install python3.11 -y python3.11 -m venv venv source venv/bin/activate pip install google-genai google-auth Python実装
import os import json from google.auth import aws from google.cloud import aiplatform from google.auth.transport.requests import Request from google import genai from google.genai import types def initialize_vertex_ai_with_workload_identity(): """ Workload Identity連携を使用してVertex AIクライアントを初期化する """ # 環境変数から認証情報構成ファイルのパスを取得 credentials_file = os.environ.get("GOOGLE_APPLICATION_CREDENTIALS") if not credentials_file: raise ValueError( "環境変数 GOOGLE_APPLICATION_CREDENTIALS が設定されていません。" "認証情報構成ファイルのパスを設定してください。" ) if not os.path.exists(credentials_file): raise FileNotFoundError( f"認証情報構成ファイルが見つかりません: {credentials_file}" ) # 環境変数からGoogle Cloudプロジェクト設定を取得 project_id = os.environ.get("GCP_PROJECT_ID") location = os.environ.get("GCP_LOCATION", "asia-northeast1") if not project_id: raise ValueError( "環境変数 GCP_PROJECT_ID が設定されていません。" "Google CloudのプロジェクトIDを設定してください。" ) # 認証情報の構成ファイルからAWS外部アカウントの認証情報を作成 with open(credentials_file, 'r') as f: credentials_info = json.load(f) credentials = aws.Credentials.from_info( credentials_info, scopes=['https://www.googleapis.com/auth/cloud-platform'] ) # 認証情報をリフレッシュ(トークン取得) print("Refreshing credentials...") credentials.refresh(Request()) print(f"✓ Credentials refreshed successfully") print(f"✓ Project: {project_id}") print(f"✓ Location: {location}") return credentials, project_id, location def call_vertex_ai_text_generation(credentials, project_id: str, location: str, prompt_text: str): """ 新しいGoogle GenAI SDKを使用してテキスト生成を実行する """ # GenAI クライアントの初期化 client = genai.Client( vertexai=True, project=project_id, location=location, credentials=credentials ) # テキスト生成 response = client.models.generate_content( model='gemini-2.5-flash', contents=prompt_text ) return response.text def main(): """ メイン実行関数 """ try: # 1. Workload Identity連携で認証 print("Step 1: Authenticating with Workload Identity Federation...") credentials, project_id, location = initialize_vertex_ai_with_workload_identity() # 2. Google GenAI SDKでテキスト生成 print("\nStep 2: Calling Vertex AI Generative AI...") prompt = "Google Cloudとは何ですか?簡潔に説明してください。" result = call_vertex_ai_text_generation(credentials, project_id, location, prompt) print(f"\nGenerated text:\n{result}") print("\n✓ All operations completed successfully!") except Exception as e: print(f"✗ Error occurred: {str(e)}") import traceback traceback.print_exc() raise if __name__ == "__main__": main() Vertex AI APIの呼び出し
EC2インスタンス上で、先ほど作成したPythonコードを実行します。
# スクリプトの実行 $ python3 vertex_ai_client.py 実行後、Vertex AIのGeminiへの質問「Google Cloudとは何ですか?簡潔に説明してください。」の回答が得られました。
Step 1: Authenticating with Workload Identity Federation... Refreshing credentials... ✓ Credentials refreshed successfully ✓ Project: xxxxxxxxxxxxxx ✓ Location: asia-northeast1 Step 2: Calling Vertex AI Generative AI... Generated text: **Google Cloud(Google Cloud Platform / GCP)** とは、Googleが提供する「クラウドコンピューティングサービス」の総称です。 簡潔に言うと: * 企業や開発者が、自前でサーバーやデータセンターを持つことなく、**インターネット経由でコンピューティングリソース**(サーバー、ストレージ、データベース、AI、機械学習など多様なサービス)を利用できるようにするものです。* 必要な分だけ利用し、**使った分だけ料金を支払う従量課金制**が特徴です。 これにより、インフラの管理コストを削減し、ビジネスの迅速な展開や大規模なデータ処理、AI活用などを可能にします。 ✓ All operations completed successfully! 最後に
今回は、AWS EC2インスタンスからWorkload Identity連携を使用して、Google CloudのVertex AIのGeminiをセキュアに呼び出す方法を紹介しました。
Google Cloud外部からGoogle Cloud APIを呼び出す際には、サービスアカウントキーを利用されるパターンがあると思いますが、サービスアカウントキーにはセキュリティリスクが存在するため、積極的にWorkload Identity連携を利用するようにしていただければと思います。
Workload Identity連携が使いこなせるようになると、EC2だけではなくLambdaやECSからもGoogle CloudのAPIへアクセスすることができるので、マルチクラウド構成でGoogle Cloudにアクセスしたい要件がある場合には、是非利用を検討してください。
Workload Identity連携のベストプラクティスについては、公式ドキュメントに記載があるので、一読することをお勧めします。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部コンサルティング部の渡邉でした!






