Por que recebo erros de Acesso Negado quando uso uma função do Lambda para fazer upload de arquivos para um bucket do Amazon S3 em uma outra conta da AWS?

4 minuto de leitura
0

Recebo um erro de Acesso Negado quando uso uma função do AWS Lambda para carregar arquivos em um bucket do Amazon Simple Storage Service (Amazon S3). O bucket do Amazon S3 está em outra conta da AWS. 

Breve descrição

Se as permissões entre uma função do Lambda e um bucket do Amazon S3 estiverem incompletas ou incorretas, o Lambda retornará um erro de Acesso Negado.

Para configurar permissões entre uma função do Lambda em uma conta (conta 1) e um bucket do S3 em uma outra conta (conta 2), faça o seguinte:

1.    (Na conta 1) Crie uma função de execução do Lambda que permita que a função do Lambda carregue objetos no Amazon S3.

2.    (Na conta 2) Modifique a política de bucket do bucket do S3 para permitir que a função do Lambda carregue objetos no bucket.

Solução

Importante: a solução a seguir requer uma função do Lambda em uma conta da AWS e um bucket do S3 em uma outra conta.

Código de exemplo para uma função do Lambda que carrega arquivos para um bucket S3 (Python versão 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")

Observação: antes de passar a ACL de controle total do proprietário do bucket na solicitação de upload, confirme se não estão desativadas as ACLs no bucket. Faça isso nas configurações de propriedade do bucket do S3. Para obter mais informações, consulte Controle da propriedade de objetos e desativação de ACLs do seu bucket.

(Na conta 1) Crie uma função de execução do Lambda que permita que a função do Lambda carregue objetos no Amazon S3

1.    Crie um perfil do AWS Identity and Access Management (IAM) para a sua função do Lambda.

2.    Copie o nome de recurso da Amazon (ARN) do perfil do IAM.

Observação: você deve ter obtido o ARN do perfil do IAM antes de atualizar a política de bucket do bucket S3. Uma forma de obter o ARN do perfil do IAM é executar o comando get-role da AWS Command Line Interface (AWS CLI). Se você receber erros ao executar comandos da AWS CLI, verifique se você está usando a versão mais recente da AWS CLI.

3.    Anexe uma política ao perfil do IAM que conceda a permissão para carregar objetos (s3:PutObject) para o bucket na Conta 2.

Exemplo de política do IAM que concede permissões ao perfil do IAM s3:PutObject e s3:PutObjectAcl

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

4.    Altere a função de execução da sua função do Lambda para o perfil do IAM que você criou. Para obter instruções, consulte Como configurar as opções de função do Lambda.

(Na conta 2) Modifique a política do bucket do S3 para permitir que a função do Lambda carregue objetos no bucket

Atualize a política de bucket para que ela especifique que o ARN do perfil de execução do Lambda como Principal tem acesso à ação s3:PutObject.

Exemplo de política de bucket do S3 que permite que uma função do Lambda faça upload de objetos para o bucket

Observação: a política a seguir concede também a permissão para s3:PutObjectAcl através do perfil de execução da função do Lambda.

{
            "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"
            }
            }
            }
            ]
            }

Informações relacionadas

Como soluciono os erros 403 de Acesso Negado do Amazon S3?

AWS OFICIAL
AWS OFICIALAtualizada há um ano