AWS RDS 备份到 S3 失败

我们有一个附加到我们的 SQL Server 实例的选项组,用于备份到 S3 存储桶。当我们尝试使用 rds_backup_database 存储过程运行备份时,我们收到以下错误:

[2021-03-18 20:20:22.260] Aborted the task because of a task failure or an overlap with your preferred backup window for RDS automated backup.
[2021-03-18 20:20:22.270] Task has been aborted
[2021-03-18 20:20:22.270] Access Denied

我读到的所有内容都表明,这意味着用于备份和还原选项组的 IAM 角色对 S3 存储桶没有适当的权限。

然而,一切似乎都配置正确。这是该角色的权限配置。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::sabmssqldevbackups"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectMetaData",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::sabmssqldevbackups/sabmssqldev/*"
            ]
        }
    ]
}

至于备份窗口,它被配置为午夜刚过半小时,所以我们不能与之冲突。

另一个特点是我们的 RDS 实例位于区域 us-east-2a 中。我找不到关于 us-east-2a 是什么的任何信息。当您可以选择区域时,您无法选择它。我们的 S3 存储桶应该在 us-east-2 中。这两个区域是否相同,或者这种不匹配是我们无法执行备份的原因?

stack overflow AWS RDS backup to S3 fails
原文答案

答案:

作者头像

我认为您正在尝试在自动 RDS 备份窗口中执行到 s3 的备份,因此 RDS 将终止您的本机 SQL 备份/恢复。解决此问题的方法是永远不要在计划的 RDS 备份窗口周围运行本机 SQL 备份/恢复命令,或者将其更改为不同的时间: [enter image description here ](https://i.stack.imgur.com/kBgH9 .png)

作者头像

us-east-2a 看起来像是您的数据库所在的 AZ:

enter image description here

该区域仍然是 us-east-2

基于数据库快照导出 IAM 角色示例:

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html#USER_ExportSnapshot.SetupIAMRole

您应该在最后一条语句中声明 arn:aws:s3:::your-s3-bucket

从:

{
  "Effect": "Allow",
  "Action": [
    "s3:GetObjectMetaData",
    "s3:GetObject",
    "s3:PutObject",
    "s3:ListMultipartUploadParts",
    "s3:AbortMultipartUpload"
  ],
  "Resource": [
    "arn:aws:s3:::sabmssqldevbackups/sabmssqldev/*"
  ]
}

至:

{
  "Effect": "Allow",
  "Action": [
    "s3:GetObjectMetaData",
    "s3:GetObject",
    "s3:PutObject",
    "s3:ListMultipartUploadParts",
    "s3:AbortMultipartUpload"
  ],
  "Resource": [
    "arn:aws:s3:::sabmssqldevbackups/sabmssqldev"
    "arn:aws:s3:::sabmssqldevbackups/sabmssqldev/*"
  ]
}

要验证 IAM 角色是否正常工作,您可以在以下位置展开 AWS CLI 部分:

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html#USER_ExportSnapshot.Exporting

并启动 aws rds start-export-task 命令来验证一切是否正常:

aws rds start-export-task 
    --export-task-identifier my_snapshot_export 
    --source-arn arn:aws:rds:AWS_Region:123456789012:snapshot:snapshot_name 
    --s3-bucket-name my_export_bucket 
    --iam-role-arn iam_role 
    --kms-key-id master_key
作者头像

原来这是加密密钥的问题。有人将我们的数据库实例设置为使用默认的 AWS 托管密钥。这会产生一个粘性权限问题,只能通过使用客户管理的密钥进行加密来解决。由于您无法更改现有数据库实例上的加密密钥,唯一的解决方案是执行以下操作:

  • 在 KMS 控制台中创建新的客户管理密钥
  • 对现有数据库实例进行快照
  • 将该快照还原到新实例
  • 应用客户管理的密钥作为加密密钥
  • 更改所有现有引用以指向新的数据库实例
  • 删除原来的实例

工作量比我希望的要多得多。