Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
크로스 계정 Lambda 함수를 사용하여 Amazon Bedrock을 간접적으로 호출하려고 할 때 발생하는 "botocore.errorfactory.AccessDeniedException" 오류를 해결하려면 어떻게 해야 합니까?
내 AWS 계정에서 Amazon Bedrock 모델을 호출하고 싶습니다. Python 런타임에서 크로스 계정 AWS Lambda 함수를 사용해 보았는데 "botocore.errorfactory.AccessDeniedException" 오류 메시지가 표시되었습니다.
간략한 설명
크로스 계정 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."
이 오류를 해결하려면 다음 작업을 수행하십시오.
- 계정 A(Amazon Bedrock 모델을 소유하는 계정)에서 AWS Identity and Access Management(IAM) 역할을 생성합니다. 그런 다음 AmazonBedrockFullAccess 정책을 역할에 연결하여 Lambda 함수를 소유한 계정인 계정 B에 액세스할 수 있도록 허용합니다.
- 계정 B에서 IAM 역할을 생성한 다음, IAM 역할을 기본 실행 정책과 연결하여 수임된 역할이 계정 A의 IAM 역할에 액세스할 수 있도록 합니다.
참고: Amazon Bedrock 파운데이션 모델을 사용할 때는 판매자의 가격 약관을 확인하십시오.
계정 A에서 Amazon Bedrock 모델에 대한 모델 액세스를 요청해야 합니다. 액세스 상태가 액세스 허용됨으로 변경되는지 확인합니다.
해결 방법
계정 A 구성
Amazon Bedrock 모델을 소유한 계정에 대해 다음 단계를 완료하십시오.
- IAM 콘솔을 엽니다.
- 계정 A의 IAM 역할을 생성합니다.
- AmazonBedrockFullAccess 정책을 IAM 역할에 연결합니다.
- 계정 B의 Lambda 함수 역할이 계정 A의 역할을 수임할 수 있도록 허용하는 신뢰 관계 정책을 연결합니다.
신뢰 관계 정책의 예:
참고: Account_B_ID를 계정 B ID로 바꾸고 my-lambda-execution-role을 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 함수를 소유한 역할에 대해 다음 단계를 완료하십시오.
- IAM 콘솔을 엽니다.
- Lambda 함수가 계정에서 실행되는 데 사용하는 IAM 역할을 생성합니다.
- AWSLambdaBasicExecutionRole 정책을 역할에 연결합니다.
- 계정 B의 IAM 역할이 계정 A의 IAM 역할을 수임하도록 허용하는 정책을 연결합니다.
정책 예시:
참고: Account_A_ID를 계정 A ID로 바꾸고 role-on-source-account를 계정 A의 IAM 역할 이름으로 바꾸십시오.{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::Account_A_ID:role/role-on-source-account" } }
크로스 계정 모범 사례에 대한 자세한 내용은 IAM의 보안 모범 사례를 참조하십시오.
Lambda 함수 생성
Lambda 함수를 생성합니다. Lambda 함수는 Amazon Bedrock 모델에 액세스할 수 있는 계정 A IAM 역할을 수임합니다. 그런 다음, 위임된 역할의 자격 증명을 사용하여 Amazon Bedrock 모델과 상호 작용하는 Amazon Bedrock 런타임 클라이언트를 생성합니다.
Lambda 함수는 다음과 같은 예시 Python 함수와 유사해야 합니다.
import boto3import botocore import json def lambda_handler(event, context): bedrock_role="arn:aws:iam:::role/BedrockLambdaCrossAccount" 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 = 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) foundation_models = bedrock.list_foundation_models() print(foundation_models) prompt = "Please list the 10 most popular movies from the 90's" 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')) 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') }
- 언어
- 한국어

