Ir para o conteúdo

Por que recebo erros de “Acesso negado” quando uso uma função do Lambda para carregar arquivos em um bucket do Amazon S3 em outra conta da AWS?

4 minuto de leitura
0

Eu 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”.

A solução a seguir requer uma função do Lambda na conta A e um bucket do S3 na conta B.

Para configurar permissões entre uma função do Lambda na conta A e um bucket do S3 em outra conta (conta B), siga as etapas abaixo:

  1. Crie um perfil de execução do Lambda na conta A que permita que a função do Lambda carregue objetos no Amazon S3.
  2. Atualize a política de bucket do S3 na conta B para permitir que a função do Lambda carregue objetos no bucket.

Resolução

Crie um perfil de execução do Lambda na conta A que permita que a função do Lambda carregue objetos no Amazon S3

Exemplo de código em Python versão 3.12 para uma função do Lambda que carrega arquivos em um bucket do S3

import json
import boto3

s3 = boto3.client('s3')


def lambda_handler(event, context):
    bucket = 'EXAMPLE-DESTINATION-BUCKET'
    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)
    print("Put Complete")

Realize as seguintes etapas:

  1. Crie um perfil de execução do AWS Identity and Access Management (IAM) na conta A para sua função do Lambda:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  2. Anexe uma política ao perfil do IAM que conceda a permissão para carregar objetos no bucket na Conta B.
    Exemplo de política do IAM que concede a permissão s3:PutObject ao perfil do IAM

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

    Observação: Substitua AccountBBucketName pelo nome do bucket do S3 da conta B.

  3. Altere seu perfil de execução da função do Lambda para o perfil do IAM que você criou na etapa anterior. Para obter mais informações, consulte Configurar funções do Lambda.

Modifique a política de bucket do S3 na conta B para permitir que a função do Lambda carregue objetos no bucket

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

Exemplo de política de bucket do S3 que permite que uma função do Lambda carregue objetos no bucket

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountA:role/AccountARole"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

Observação: Substitua AccountBBucketName pelo nome do bucket do S3 da conta B.

Verificar a configuração de criptografia do AWS KMS

Se uma entidade do IAM tiver permissões totais para um objeto, mas ainda receber um erro de “Acesso negado”, verifique seus requisitos de configuração. Verifique se o objeto tem criptografia do AWS Key Management Service (AWS KMS) (SSE-KMS). Use o console do Amazon S3 para visualizar as propriedades do objeto e verificar as informações de SSE-KMS do objeto.

Se o bucket de destino tiver criptografia padrão com uma chave gerenciada pelo cliente, verifique seus requisitos de configuração. A política de chave do KMS deve permitir que seu perfil de execução do Lambda execute a ação kms:GenerateDataKey ou kms:Decrypt. Para obter mais informações, consulte Allows access to the AWS account and activates IAM policies.

Se a entidade do IAM pertencer a uma conta diferente da chave do AWS KMS, edite a política do IAM para conceder a permissão kms:GenerateDataKey. Por exemplo, para carregar os objetos do SSE-KMS, você deve especificar a permissão kms:GenerateDataKey na política de chave e na política do IAM. Para obter mais informações sobre o acesso entre contas entre o usuário do IAM e a chave do KMS, consulte Allowing users in other accounts to use a KMS key.

Informações relacionadas

Como solucionar erros 403 Acesso Negado do Amazon S3?

Como faço para permitir que minha função do Lambda acesse meu bucket do Amazon S3?

Por que estou recebendo uma mensagem de erro de acesso negado quando faço upload de arquivos para o meu bucket do Amazon S3 que tem a criptografia padrão do AWS KMS?

Como soluciono erros Access Denied quando usuários do IAM de outra conta da AWS tentam acessar meu bucket do Amazon S3?

AWS OFICIALAtualizada há 11 dias