Perché ricevo errori di accesso negato quando utilizzo una funzione Lambda per caricare file su un bucket Amazon S3 in un altro account AWS?

4 minuti di lettura
0

Ricevo un errore di accesso negato quando utilizzo una funzione AWS Lambda per caricare file su un bucket Amazon Simple Storage Service (Amazon S3). Il bucket Amazon S3 si trova in un altro account AWS. 

Breve descrizione

Se le autorizzazioni tra una funzione Lambda e un bucket Amazon S3 sono incomplete o errate, Lambda restituisce un errore di Accesso negato.

Per configurare le autorizzazioni tra una funzione Lambda in un account (account 1) e un bucket S3 in un altro account (account 2), procedi come segue:

  1. (Nell'account 1) Crea un ruolo di esecuzione Lambda che consenta alla funzione Lambda di caricare oggetti su Amazon S3.

  2. (Nell'account 2) Modifica la politica dei bucket per il bucket S3 al fine di consentire alla funzione Lambda di caricare oggetti nel bucket.

Risoluzione

**Importante:**La seguente soluzione richiede una funzione Lambda in un account AWS e un bucket S3 in un altro account.

Codice di esempio per una funzione Lambda che carica file in un bucket S3 (Python versione 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

**Nota:**Prima di inserire la lista di controllo degli accessi (ACL) con pieno controllo del proprietario del bucket nella richiesta di caricamento, verifica che le ACL non siano disattivate sul bucket. Esegui questa operazione nelle impostazioni di proprietà del bucket S3. Per ulteriori informazioni, consulta Controllo della proprietà degli oggetti e disabilitazione delle ACL per il bucket.

(Nell'account 1) Crea un ruolo di esecuzione Lambda che consenta alla funzione Lambda di caricare oggetti su Amazon S3

  1. Crea un ruolo AWS Identity and Access Management (IAM) per la tua funzione Lambda.

  2. Copia il nome della risorsa Amazon (ARN) del ruolo IAM.

Nota: Devi ottenere l'ARN del ruolo IAM prima di poter aggiornare la policy dei bucket per il bucket S3. Un modo per ottenere l'ARN del ruolo IAM consiste nell'eseguire il comando get-role dell'Interfaccia della linea di comando (AWS CLI). Se ricevi errori durante l'esecuzione dei comandi AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

  1. Allega una policy al ruolo IAM che concede l'autorizzazione a caricare oggetti (s3:PutObject) nel bucket nell'Account 2.

Esempio di policy IAM che concede a un ruolo IAM le autorizzazioni s3:PutObject e s3:PutObjectAcl

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}
  1. Cambia il ruolo di esecuzione della funzione Lambda con il ruolo IAM che hai creato. Per istruzioni, consulta Configurazione delle opzioni della funzione Lambda.

(Nell'account 2) Modifica la politica dei bucket per il bucket S3 al fine di consentire alla funzione Lambda di caricare oggetti nel bucket

Aggiorna la policy dei bucket in modo che specifichi l'ARN del ruolo di esecuzione Lambda come Principale che ha accesso all'azione s3:PutObject.

Esempio di policy del bucket S3 che consente a una funzione Lambda di caricare oggetti nel bucket

**Nota:**La seguente policy concede inoltre al ruolo di esecuzione della funzione Lambda l'autorizzazione a s3:PutObjectAcl.

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

Informazioni correlate

In che modo è possibile risolvere gli errori 403 di accesso negato da Amazon S3?

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa