AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

교차 계정을 사용하여 내 계정에서 Amazon Bedrock을 호출하려면 어떻게 해야 합니까?

3분 분량
0

Python 런타임에서 교차 계정 AWS Lambda 함수를 사용하는 Amazon Bedrock 모델을 호출하려고 합니다.

간략한 설명

교차 계정의 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.

해결 방법

이 오류를 해결하려면 2단계 프로세스를 사용합니다.

  1. 계정 A(Amazon Bedrock 모델의 소유자)에서 AWS Identity and Access Management(IAM) 역할을 생성합니다. 이 역할은 계정 B에 위임된 역할 액세스 권한을 부여하는 Amazon BedrockFullAccess 정책과 연결되어 있습니다.
  2. 계정 B(Lambda 함수의 소유자)에서 IAM 역할을 생성합니다. 이 역할은 계정 A의 IAM 역할에 위임된 역할 액세스 권한을 부여하는 기본 실행 정책과 연결되어 있습니다.

참고: Amazon Bedrock 기반 모델을 사용할 때는 판매자의 요금 약관이 적용됩니다.

사전 요구 사항

Amazon Bedrock 모델을 보유한 계정(예: 계정 A)에서 해당 모델의 액세스 권한이 Granted(부여됨)로 설정되어 있어야 합니다. 액세스를 요청하는 방법에 대한 자세한 내용은 모델 액세스 추가를 참조하십시오.

다른 계정의 Amazon Bedrock 호출

이 섹션의 지침에 따라 한 계정에서 Lambda 함수를 사용하여 다른 계정의 Amazon Bedrock 모델을 호출하십시오.
참고: 교차 계정 모범 사례에 대한 자세한 내용은 ](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)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 런타임 클라이언트를 생성합니다.

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')
     }