AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

クロスアカウントを使用して、アカウント内で Amazon Bedrock を呼び出す方法を教えてください。

所要時間2分
0

Python ランタイムでクロスアカウントの AWS Lambda 関数を使用する Amazon Bedrock モデルを呼び出したいです。

簡単な説明

クロスアカウントで AWS Lambda 関数を使用して、アカウント内で Amazon Bedrock を呼び出すと、次のエラーが発生することがあります。

botocore.errorfactory.AccessDeniedException: PutLogEvents 操作の呼び出し時にエラーが発生しました (AccessDeniedException): 指定したモデル ID のモデルにアクセスできません。

解決策

このエラーを解決するには、次の 2 段階の手順を実行してください。

  1. アカウント A (Amazon Bedrock モデルの所有者) に AWS Identity and Access Management (IAM) ロールを作成します。このロールは Amazon BedrockFullAccess ポリシーに関連付けられており、引き受けたロールにアカウント B へのアクセス許可を付与します。
  2. アカウント B (Lambda 関数の所有者) に IAM ロールを作成します。このロールには、引き受けたロールにアカウント A の IAM ロールへのアクセス許可を付与する基本的な実行ポリシーが関連付けられています。

注: Amazon Bedrock 基盤モデルを使用する場合、販売者の価格条件が適用されます。

前提条件

Amazon Bedrockモデルを所有するアカウント (たとえば、アカウントA) で、Amazon Bedrockモデルのアクセス許可が「付与済み」に設定されていることを確認します。アクセスをリクエストする方法の詳細については、「モデルアクセスを追加する」を参照してください。

別のアカウントから Amazon Bedrock を呼び出す

このセクションの手順に従って、あるアカウントで Lambda 関数を使用し、別のアカウントで Amazon Bedrock モデルを呼び出します。
注: クロスアカウントのベストプラクティスについては、「IAM でのセキュリティに関するベストプラクティス」を参照してください。

アカウント A (アクセスが許可された Amazon Bedrock モデルを持つアカウント)

次の手順を実行します。

  1. IAM コンソールにログインします。

  2. アカウント A 用の AWS Identity and Access Management (IAM) ロールを作成します。

  3. IAM ロールに次に示すものが含まれていることを確認します。

    AmazonBedrockFullAccess ポリシー。

    アカウント B で Lambda 関数を呼び出すアクセス許可を持つ、引き受けたロール。例を次に示します。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<Account B ID>:role/my-lambda-execution-role"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

アカウント B (Lambda 関数を所有するアカウント)

次の手順を実行します。

  1. IAM コンソールにログインします。

  2. Lambda 関数用の IAM ロールを作成します。Lambda 関数はこのロールを使用して、アカウント内で実行されます。

  3. IAM ロールに次に示すものが含まれていることを確認します。

    Lambda の基本的な実行ポリシー

    引き受けたロール。アカウント A (Amazon Bedrock のアカウント) で作成したロールを引き受けるためのアクセス許可が付与されています。例:

    {
        "Version": "2012-10-17",
        "Statement": {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<Account A ID>:role/role-on-source-account"
        }
    }

AWS Lambda 関数を作成する

Lambda 関数を作成する

この Lambda 関数は、Amazon Bedrock モデルへのアクセスに必要なアクセス許可を持つアカウント A の IAM ロールを引き受けます。次に、関数は引き受けたロールの認証情報を使用して、Amazon Bedrock モデルとやり取りする Amazon Bedrock および Amazon Bedrock-Runtime クライアントを作成します。

Lambda 関数は Python で、次のサンプル関数のようになっている必要があります。

import boto3
import botocore
import json


def lambda_handler(event, context):
    bedrock_role="arn:aws:iam:::role/BedrockLambdaCrossAccount"   #### Account A Role
    credentials =
boto3.client('sts').assume_role(RoleArn=bedrock_role,RoleSessionName='assume-role')
    ACCESS_KEY = credentials['Credentials']['AccessKeyId']
    SECRET_KEY = credentials['Credentials']['SecretAccessKey']
    SESSION_TOKEN = credentials['Credentials']['SessionToken']

    bedrock_session = boto3.session.Session(aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,aws_session_token=SESSION_TOKEN)
    bedrock = boto3.client(service_name='bedrock', region_name='us-east-1',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,aws_session_token=SESSION_TOKEN)
    print(bedrock)

    # Bedrock Runtime client used to invoke and question the models
    bedrock_runtime = boto3.client(service_name='bedrock-runtime', region_name='us-east-1',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,aws_session_token=SESSION_TOKEN)
   # Just shows an example of how to retrieve information about available models
    foundation_models = bedrock.list_foundation_models()
    print(foundation_models)


    prompt = "Please list the 10 most popular movies from the 90's"

     # The payload to be provided to Bedrock
    body = json.dumps({"inputText": "Please list the 10 most popular movies from the 90's"})
    modelId = 'anthropic.claude-v2'
    accept = 'application/json'
    contentType = 'application/json'
    response = bedrock_runtime.invoke_model(body=body, modelId=modelId,
accept=accept,contentType=contentType)
    response_body = json.loads(response.get('body').read())
    print(response_body.get('results')[0].get('outputText'))

     # The response from the model now mapped to the answer
    output=response_body.get('results')[0].get('outputText')    
    print(output)
    return {
     'statusCode': 200,
     'headers': {
       'Access-Control-Allow-Headers': '*',
       'Access-Control-Allow-Origin': '*',
       'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
     },
       'body': response_body.get('results')[0].get('outputText')
     }
AWS公式
AWS公式更新しました 8ヶ月前
コメントはありません

関連するコンテンツ