Ir para o conteúdo

Erro em restauração de banco do S3 para o RDS SQL Server entre contas - "Access Denied" em Restore Cross-Account

0

Estou tentando fazer uma restauração de um banco de dados em uma instância RDS para SQL Server a partir de um backup em um bucket S3 que está em outra conta da AWS, mas continuo recebendo o erro Access Denied, mesmo após validar toda a configuração. Gostaria de compartilhar meu processo de depuração passo a passo para ver se alguém já enfrentou algo parecido ou tem alguma ideia do que pode estar acontecendo.

1. Ambiente e Objetivo

  • Conta A (Destino): Contém a instância RDS para SQL Server.
  • Conta B (Origem): Contém o bucket S3 com os arquivos de backup .bak.

Objetivo: Executar o comando msdb.dbo.rds_restore_database na instância RDS (Conta A) para restaurar um backup a partir do bucket S3 (Conta B).

2. O Problema: Erro "Access Denied"

A tarefa de restauração no RDS falha consistentemente com a seguinte mensagem no log:

[TIMESTAMP] Aborted the task because of a task failure or a concurrent RESTORE_DB request. 
[TIMESTAMP] Task has been aborted 
[TIMESTAMP] Access Denied

Um teste secundário usando BULK INSERT a partir de um arquivo .csv no mesmo bucket também falhou, com um erro equivalente de permissão:

Cannot find the CREDENTIAL 's3://meu-bucket-cross-account/test.csv', because it does not exist or you do not have permission.

3. Diagnóstico Completo Realizado

Aqui estão todos os passos que já executei para tentar resolver o problema:

Fase 1: Configuração e Validação de Permissões (IAM & S3)

1. IAM Role (Conta A): Criei uma IAM Role (MinhaRoleRDSParaS3) dedicada na Conta A com uma política de confiança no serviço rds.amazonaws.com.

2. Política de Permissões (Conta A): Anexei a seguinte política à role, concedendo acesso de leitura ao bucket na Conta B:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [ "s3:ListBucket", "s3:GetObject" ],
            "Resource": [ "arn:aws:s3:::meu-bucket-cross-account", "arn:aws:s3:::meu-bucket-cross-account/*" ]
        }
    ]
}

3. Política do Bucket S3 (Conta B): Apliquei a seguinte política ao meu-bucket-cross-account, confiando na role da Conta A:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { "AWS": "arn:aws:iam::ID_CONTA_A:role/MinhaRoleRDSParaS3" },
            "Action": [ "s3:GetObject", "s3:ListBucket" ],
            "Resource": [ "arn:aws:s3:::meu-bucket-cross-account", "arn:aws:s3:::meu-bucket-cross-account/*" ]
        }
    ]
}

4. PROVA DE SUCESSO VIA CLI: Para validar as políticas, assumi a role MinhaRoleRDSParaS3 a partir do CloudShell na Conta A e executei comandos no bucket da Conta B. Ambos os testes funcionaram perfeitamente, provando que as políticas de IAM e S3 estão funcionalmente corretas.

  • aws s3 ls s3://meu-bucket-cross-account/ -> SUCESSO
  • aws s3api head-object --bucket meu-bucket-cross-account --key <arquivo> -> SUCESSO

Fase 2: Validação Completa da Rede (Conta A)

1. Acesso Público do RDS: A instância RDS está configurada com "Publicamente acessível: Sim".

2. Tabela de Rotas: A sub-rede do RDS é pública e possui uma rota 0.0.0.0/0 para um Internet Gateway.

3. VPC Endpoint: Não existe um VPC Gateway Endpoint para o S3 na VPC do RDS.

Fase 3: Teste de Isolamento com Arquivo Limpo

Para eliminar a possibilidade de o problema ser o arquivo de backup (criptografia TDE, corrupção, etc.), fiz o seguinte:

1. Criei um novo banco de dados no RDS.

2. Gerei um backup deste banco para um bucket S3 na mesma Conta A. -> A operação foi um SUCESSO.

3. Copiei este arquivo de backup sabidamente válido para o meu-bucket-cross-account na Conta B.

4. Tentei restaurar este novo arquivo a partir do bucket na Conta B. -> A operação FALHOU com o mesmo erro "Access Denied".

Em resumo,o que eu consegui configurar e validar como usuário parece estar 100% correto. O teste via CLI mostram que as permissões funcionam, e o teste de isolamento prova que o problema não está no arquivo de backup, mas sim na interação do serviço RDS com um bucket em outra conta. No Destino consigo ler e listar os objetos do Bucket da Origem. Porém o RDS continua com o erro de acesso negado

Alguém na comunidade já enfrentou um cenário "PARECIDO" como este? Existe alguma particularidade do RDS para SQL Server ou uma configuração que eu possa ter deixado passar?

Já passei pelas documentações e guias de troubleshooting:

2 Respostas
0
Resposta aceita

1. Diagnóstico com Log e Eventos do RDS e verificação de Logs mais completos com AWS CloudTrail

"userIdentity": {
    "type": "AssumedRole",
    "sessionContext": {
        "sessionIssuer": {
            "type": "Role",
            "arn": "arn:aws:iam::ID_CONTA_A:role/MinhaRoleRDSParaS3",
            "userName": "MinhaRoleRDSParaS3"
        },
    },
    "invokedBy": "rds.amazonaws.com"
},
"eventSource": "s3.amazonaws.com",
"eventName": "GetBucketLocation",
"awsRegion": "sa-east-1",
"sourceIPAddress": "rds.amazonaws.com",
"userAgent": "rds.amazonaws.com",
"errorCode": "AccessDenied",
"errorMessage": "Access Denied",

Com isso conseguimos entender que o erro estava no s3:GetBucketLocation

Adicionamos a permissão s3:GetBucketLocation na S3 Bucket Policy na conta B e na IAM Role da conta A

Com isso conseguimos entender e resolver o problema de compartilhamento entre contas RDS e S3

respondido há um mês
0

Para resolver o problema de "Access Denied" ao restaurar um backup do SQL Server de um bucket S3 em outra conta para o RDS, há alguns pontos específicos que você deve verificar:

  1. Verificar criptografia do bucket S3: Se o bucket S3 na Conta B estiver criptografado com uma chave KMS, a IAM role na Conta A também precisará de permissões para descriptografar usando essa chave. Verifique se o bucket usa criptografia e, em caso afirmativo, adicione permissões de descriptografia à sua IAM role.

  2. Associação da IAM role ao RDS: Certifique-se de que a IAM role MinhaRoleRDSParaS3 está corretamente associada à sua instância RDS. Você pode verificar isso no console do RDS ou usando o comando add-role-to-db-instance da AWS CLI.

  3. Opção SQLSERVER_BACKUP_RESTORE: Confirme que a opção SQLSERVER_BACKUP_RESTORE está adicionada ao grupo de opções da sua instância RDS. Esta opção é obrigatória para operações nativas de backup e restauração.

  4. Região do bucket S3: Verifique se o bucket S3 na Conta B está na mesma região AWS que sua instância RDS na Conta A. Restaurações entre regiões não são suportadas.

  5. Tamanho do arquivo de backup: Certifique-se de que seu arquivo de backup não excede o limite de 5 TB para objetos S3.

  6. Tarefas concorrentes: Verifique se você não tem mais de duas tarefas de backup ou restauração executando simultaneamente na sua instância RDS.

  7. Permissões específicas do S3: Além de s3:GetObject e s3:ListBucket, você pode precisar adicionar s3:GetBucketLocation às permissões da IAM role.

  8. Política de endpoint da VPC: Se você estiver usando um endpoint da VPC para S3, verifique se a política do endpoint permite o acesso ao bucket específico.

Considerando que seus testes via CLI foram bem-sucedidos, o problema provavelmente está relacionado a alguma configuração específica do RDS ou a uma permissão adicional necessária quando o RDS tenta acessar o S3 em outra conta.
Sources
Restore SQL bak backupfile to RDS Database | AWS re:Post
KBHS-00719: Error 'AccessDenied' | AWS re:Post
Native SQL Server backup/restore - AWS Prescriptive Guidance

respondido há um mês

Você não está conectado. Fazer login para postar uma resposta.

Uma boa resposta responde claramente à pergunta, dá feedback construtivo e incentiva o crescimento profissional de quem perguntou.