Come posso risolvere l'errore "botocore.errorfactory.AccessDeniedException"che ricevo quando cerco di utilizzare una funzione Lambda multi-account per richiamare Amazon Bedrock?
Desidero invocare i miei modelli Amazon Bedrock nel mio account AWS. Ho provato a utilizzare una funzione AWS Lambda multi-account con runtime Python. Tuttavia, ho ricevuto un messaggio di errore "botocore.errorfactory.AccessDeniedException".
Breve descrizione
Quando utilizzi una funzione Lambda multi-account per invocare Amazon Bedrock, potresti ricevere il seguente messaggio di errore:
"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."
Per risolvere l'errore, intraprendi le seguenti azioni:
- Crea un ruolo AWS Identity and Access Management (AWS IAM) nell'account A, l'account proprietario del modello Amazon Bedrock. Quindi collega la policy AmazonBedrockFullAccess al ruolo per consentirgli di accedere all'account B, l'account proprietario della funzione Lambda.
- Crea un ruolo IAM nell'account B. Quindi associa il ruolo IAM a una policy di esecuzione di base per consentire al ruolo assunto di accedere al ruolo IAM nell'account A.
Nota: quando utilizzi i modelli di fondazione Amazon Bedrock, assicurati di controllare i ](https://aws.amazon.com/bedrock/pricing/)prezzi del venditore[.
Assicurati di richiedere l'accesso al modello per il modello Amazon Bedrock nell'account A. Verifica che Access status (Stato di accesso) diventi Access granted (Accesso concesso).
Risoluzione
Configura l'account A
Completa i seguenti passaggi per l'account proprietario dei modelli Amazon Bedrock:
- Apri la console IAM.
- Crea un ruolo IAM per l'account A.
- Collega la policy AmazonBedrockFullAccess al ruolo IAM.
- Collega una policy della relazione di attendibilità che consenta al ruolo della funzione Lambda nell'account B di assumere il ruolo nell'account A.
Esempio di policy della relazione di attendibilità:
Nota: sostituisci Account_B_ID con l'ID del tuo account B e my-lambda-execution-role con il ruolo di esecuzione della tua funzione Lambda.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Account_B_ID:role/my-lambda-execution-role" }, "Action": "sts:AssumeRole" } ] }
Configura l'account B
Completa i seguenti passaggi per il ruolo proprietario della funzione Lambda:
- Apri la console IAM.
- Crea un ruolo IAM che la funzione Lambda utilizza per l'esecuzione nell'account.
- Collega la policy AWSLambdaBasicExecutionRole al ruolo.
- Collega una policy che consenta al ruolo IAM nell'account B di assumere il ruolo IAM nell'account A.
Esempio di policy:
Nota: sostituisci Account_A_ID con l'ID del tuo account A e role-on-source-account con il nome del ruolo IAM dell'account A.{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::Account_A_ID:role/role-on-source-account" } }
Per informazioni sulle best practice multi-account, consulta Best practice per la sicurezza in IAM.
Crea una funzione Lambda
Crea una funzione Lambda. La funzione Lambda assume il ruolo IAM dell'account A che ha accesso ai modelli Amazon Bedrock. La funzione utilizza quindi le credenziali del ruolo assunto per creare i client di runtime Amazon Bedrock che interagiscono con i modelli Amazon Bedrock.
La funzione Lambda deve essere simile a questo esempio di funzione 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') }
- Lingua
- Italiano
Video correlati

