使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何使用跨账户在我的账户中调用 Amazon Bedrock?

2 分钟阅读
0

我想调用我的 Amazon Bedrock 模型,这些模型使用跨账户 AWS Lambda 函数和 Python 运行时。

简短描述

当您在跨账户中使用 AWS Lambda 函数调用账户中的 Amazon Bedrock 时,可能会收到以下错误。

botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the InvokeModel operation: You don't have access to the model with the specified model ID.(botocore.errorfactory.AccessDeniedException:调用 InvokeModel 操作时出错 (AccessDeniedException):您无权访问具有指定模型 ID 的模型。)

解决方法

使用两步流程来解决此错误:

  1. 在账户 A(Amazon Bedrock 模型的所有者)中创建 AWS Identity and Access Management (IAM) 角色。此角色与 Amazon BedrockFullAccess 策略相关联,以授予其代入的角色对账户 B 的访问权限。
  2. 在账户 B(Lambda 函数的所有者)中创建 IAM 角色。该角色与基本执行策略相关联,以授予其代入的角色对账户 A 中的 IAM 角色的访问权限。

**注意:**当您使用 Amazon Bedrock 基础模型时,您需要遵守卖方的定价条款

先决条件

确保将 Amazon Bedrock 模型在持有它们的账户(例如账户 A)中的访问权限设置为“Granted(已授予)”。有关如何请求访问权限的详细信息,请参阅添加模型访问权限

从其他账户调用 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 函数代入账户 A 中的 IAM 角色,该角色拥有访问 Amazon Bedrock 模型的必要权限。然后,它使用代入角色的凭证来创建与 Amazon Bedrock 模型交互的 Amazon Bedrock 和 Amazon Bedrock 运行时客户端。

您的 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 个月前