View a markdown version of this page

OAuth2 を使用して Google Drive と統合する - Amazon Bedrock AgentCore

OAuth2 を使用して Google Drive と統合する

この入門チュートリアルでは、AI エージェントに Amazon Bedrock AgentCore Identity の使用を開始するための重要なステップについて説明します。開発環境のセットアップ、必要な SDKsのインストール、最初のエージェント ID の作成、エージェントが外部リソースに安全にアクセスできるようにする方法について説明します。

このチュートリアルを終了すると、AgentCore Identity OAuth2 認証情報プロバイダーを使用して Google からアクセストークンを取得し、アクセストークンを使用して Google Drive からファイルを読み取ることができる作業エージェントが作成されます。OAuth2 フローの詳細については、AgentCore Identity で認証情報プロバイダーを管理する」を参照してください。

前提条件

開始する前に、以下が必要です。

  • 適切なアクセス許可を持つ AWS アカウント (例: BedrockAgentCoreFullAccess )

  • Python 3.10 以降

  • 最新の CLI AWS と jqがインストールされている

  • AWS 認証情報とリージョンの設定 ( aws configure )

  • Python プログラミングの基本的な理解

重要

BedrockAgentCoreFullAccess 管理ポリシーは、 を含む広範なアクセス許可を付与します。これによりGetWorkloadAccessTokenForUserId、発信者は IdP トークンの検証なしで任意のユーザー識別子文字列を使用してワークロードアクセストークンを発行できます。これは開発とテストに適しています。本番デプロイでは、最小特権の原則に従い、必要な特定のアクションのみにアクセス許可を制限するカスタム IAM ポリシーを作成します。アプリケーションで JWT ベースの認証 (本番稼働用に推奨) を使用している場合は、明示的に拒否GetWorkloadAccessTokenForUserIdして、すべてのユーザー ID が検証済みの JWT パスを通過するようにすることができます。詳細については、「ワークロードアクセストークンの取得」を参照してください。

SDK のインストール

開始するには、 bedrock-agentcoreパッケージをインストールします。

pip install bedrock-agentcore

Google クライアント ID とクライアントシークレットを取得する

エージェントが Google Drive にアクセスできるようにするには、エージェントの Google クライアント ID とクライアントシークレットを取得する必要があります。Google デベロッパーコンソールに移動し、以下の手順に従います。

  1. Google デベロッパーコンソールでプロジェクトを作成する

  2. Google Drive API を有効にする

  3. OAuth 同意画面を設定する

  4. 「My Agent 1」など、エージェントの新しいウェブアプリケーションを作成する

  5. エージェントアプリケーションに次の OAuth 2.0 スコープを追加します。 https://www.googleapis.com/auth/drive.metadata.readonly

  6. 新しいウェブアプリケーションの OAuth 2.0 認証情報を作成し、生成された Google クライアント ID とクライアントシークレットを保存します。

ステップ 1: OAuth 2.0 認証情報プロバイダーを設定する

次の CLI コマンドを使用して、以前に取得した Google クライアント ID とクライアントシークレットを使用して、新しい OAuth 2.0 AWS 認証情報プロバイダーを作成します。

OAUTH2_CREDENTIAL_PROVIDER_RESPONSE=$(aws bedrock-agentcore-control create-oauth2-credential-provider \ --region us-east-1 \ --name "google-provider" \ --credential-provider-vendor "GoogleOauth2" \ --oauth2-provider-config-input '{ "googleOauth2ProviderConfig": { "clientId": "<your-google-client-id>", "clientSecret": "<your-google-client-secret>" } }' \ --output json) OAUTH2_CALLBACK_URL=$(echo $OAUTH2_CREDENTIAL_PROVIDER_RESPONSE | jq -r '.callbackUrl') echo "OAuth2 Callback URL: $OAUTH2_CALLBACK_URL"
注記

上記の CreateOauth2CredentialProvider レスポンスcallbackUrlから を取得し、Google アプリケーションのリダイレクト URI リストに URI を追加します。コールバック URL は次のようになります。https://bedrock-agentcore.us-east-1.amazonaws.com/identities/oauth2/callback/********-****-****-************

ステップ 2: Identity モジュールと Auth モジュールをインポートする

このインポートステートメントを Python ファイルに追加します。

from bedrock_agentcore.services.identity import IdentityClient from bedrock_agentcore.identity.auth import requires_access_token, requires_api_key

ステップ 3: OAuth 2.0 アクセストークンを取得する

前のステップで Google 認証情報プロバイダーを作成したら、Google アクセストークンを必要とするエージェントコードに@requires_access_tokenデコレータを追加します。コンソール出力から認可 URL をコピーし、ブラウザに貼り付けて、Google Drive で同意フローを完了します。

次のコードサンプルは、認可ワークフローを呼び出すためにエージェントコードに統合されることを目的としています。これは、個別にコピーして実行できるスタンドアロンコードではありません。

import asyncio # Injects Google Access Token @requires_access_token( # Uses the same credential provider name created above provider_name="google-provider", # Requires Google OAuth2 scope to access Google Drive scopes=["https://www.googleapis.com/auth/drive.metadata.readonly"], # Sets to OAuth 2.0 Authorization Code flow auth_flow="USER_FEDERATION", # Prints authorization URL to console on_auth_url=lambda x: print("\nPlease copy and paste this URL in your browser:\n" + x), # If false, caches obtained access token force_authentication=False, # The callback URL to redirect to after the OAuth 2.0 token retrieval is complete callback_url='oauth2_callback_url_for_session_binding', ) async def write_to_google_drive(*, access_token: str): # Prints the access token obtained from Google print(access_token) asyncio.run(write_to_google_drive(access_token=""))

バックグラウンドでは、@requires_access_tokenデコレータは次のシーケンスを実行します。

@requires_access_token デコレータによって行われた API コールのシーケンスを示すフロー図
  1. SDK はCreateWorkloadIdentity、、、および に対して API GetWorkloadAccessToken コールを行いますGetResourceOauth2Token

  2. エージェントコードをローカルで実行すると、SDK はローカルテスト用のエージェント ID とランダムなユーザー ID を自動的に生成し、 というローカルファイルに保存します.bedrock_agentcore.yaml

  3. AgentCore Runtime でエージェントコードを実行する場合、SDK はエージェント ID またはランダムユーザー ID を生成しません。代わりに、割り当てられたエージェント ID と、エージェントの呼び出し元から渡されたユーザー ID または JWT トークンを使用します。

  4. エージェントアクセストークンは、エージェント ID とユーザー ID を含む暗号化された (不透明な) トークンです。

  5. AgentCore Identity サービスは、Google アクセストークンをエージェント ID とユーザー ID のトークンボールトに保存します。これにより、エージェント ID、ユーザー ID、Google アクセストークン間にバインドが作成されます。

  6. セッションバインディングフローは、Google アクセストークンが AgentCore Identity によって発信者に返される前に完了する必要があります。

ステップ 4: OAuth2 アクセストークンを使用して外部リソースを呼び出す

エージェントが上記のステップで Google アクセストークンを取得すると、アクセストークンを使用して Google Drive にアクセスできます。ユーザーがアクセスできる最初の 10 個のファイルの名前と IDs を一覧表示する完全な例を次に示します。

まず、Python 用の Google クライアントライブラリをインストールします。

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

次に、次のコードをコピーします。

import asyncio from bedrock_agentcore.identity.auth import requires_access_token, requires_api_key from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError SCOPES = ["https://www.googleapis.com/auth/drive.metadata.readonly"] def main(access_token): """Shows basic usage of the Drive v3 API. Prints the names and ids of the first 10 files the user has access to. """ creds = Credentials(token=access_token, scopes=SCOPES) try: service = build("drive", "v3", credentials=creds) # Call the Drive v3 API results = ( service.files() .list(pageSize=10, fields="nextPageToken, files(id, name)") .execute() ) items = results.get("files", []) if not items: print("No files found.") return print("Files:") for item in items: print(f"{item['name']} ({item['id']})") except HttpError as error: # TODO(developer) - Handle errors from drive API. print(f"An error occurred: {error}") if __name__ == "__main__": # This annotation helps agent developer to obtain access tokens from external applications @requires_access_token( provider_name="google-provider", # Google OAuth2 scopes scopes=["https://www.googleapis.com/auth/drive.metadata.readonly"], # 3LO flow auth_flow="USER_FEDERATION", # prints authorization URL to console on_auth_url=lambda x: print("Copy and paste this authorization url to your browser", x), force_authentication=True, callback_url='oauth2_callback_url_for_session_binding', ) async def read_from_google_drive(*, access_token: str): print(access_token) # You can see the access_token # Make API calls... main(access_token) asyncio.run(read_from_google_drive(access_token=""))
注記

次のステップ

このセクションの例では、特定のユースケースに適応できる実用的な実装パターンに焦点を当てています。エージェントまたはモデルコンテキストプロトコル (MCP) ツールの一部としてコードを埋め込むことができます。AgentCore Runtime でエージェントコードまたは MCP ツールをホストする場合は、Amazon Bedrock AgentCore Runtime でホストエージェントまたはツールを使用して、上記のコードを AgentCore Runtime にコピーします。