通过 S3 存储桶从 ElastiCache 迁移到 Redis Cloud

最后更新日期:2025 年 3 月 26 日

目标

本文介绍如何通过使用 S3 存储桶从 ElastiCache 迁移到 Redis Cloud。

解决方案

步骤 1. 创建 S3 存储桶并授予 ElastiCache 访问权限

  1. 遵循 AWS 的导出备份教程特别注意启用 ACL 并为 ElastiCache 受赠者添加规范 ID
  2. 选择权限选项卡,在权限下,选择访问控制列表 (ACL),然后选择编辑
  3. 添加受赠者规范 ID 540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353,并配置以下选项
    • 对象:列出、写入
    • 存储桶 ACL:读取、写入

这将确保 ElastiCache 有权将备份导出到您的存储桶。生成的备份对象将使用唯一的外部 AWS 账户所有者创建:aws-scs-s3-readonly

步骤 2. 将所有 ElastiCache 备份导出到 S3

我发现最简单的方法是按照导出 ElastiCache 备份中“导出 ElastiCache 备份 (控制台)”下拉菜单中的指示使用 AWS 控制台进行操作

您可以使用具有足够权限的 IAM 调用者通过 AWS 控制台或 CLI 进行操作

AWS 提供的所需 IAM 权限示例

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "s3:GetBucketLocation",
            "s3:ListAllMyBuckets",
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": "arn:aws:s3:::*"
    }]
}

您可能会注意到,对于 ElastiCache 备份对象,对象所有者始终是 aws-scs-s3-readonly,ElastiCache 受赠者Canonical ID 指的是外部账户

步骤 3. 添加Redis Cloud 存储桶策略,以授予 Redis Cloud 对您存储桶的访问权限

  1. 使用服务菜单找到并选择存储 > S3。这将带您进入 Amazon S3 管理面板。
  2. 使用存储桶列表找到并选择您的存储桶。出现设置时,选择权限选项卡,找到存储桶策略部分,然后点击编辑
  3. 如果尚无存储桶策略,请添加以下 JSON 存储桶策略。将 <UNIQUE-BUCKET-NAME> 替换为您存储桶的名称。
{
    "Version": "2012-10-17",
    "Id": "MyBucketPolicy",
    "Statement": [
        {
            "Sid": "RedisCloudBackupsAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::168085023892:root"
            },
            "Action": [
                "s3:PutObject",
                "s3:getObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::UNIQUE-BUCKET-NAME/*"
        }
    ]
}

如果存储桶策略已存在,请将以下 JSON 策略语句添加到语句列表中。将 UNIQUE-BUCKET-NAME 替换为您存储桶的名称。

{
    "Sid": "RedisCloudBackupsAccess",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::168085023892:root"
    },
    "Action": [
        "s3:PutObject",
        "s3:getObject",
        "s3:DeleteObject"
    ],
    "Resource": "arn:aws:s3:::UNIQUE-BUCKET-NAME/*"
}

如果存储桶使用SSE-KMS 加密,请务必同时考虑密钥策略要求

如果存储桶使用SSE-KMS 加密,请将以下语句添加到您的密钥策略中。如果您没有密钥策略,请参阅创建密钥策略。将 <UNIQUE-BUCKET-NAME> 替换为您存储桶的名称,将 <KMS-KEY-ARN> 替换为您的密钥的 Amazon 资源名称 (ARN)

{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::168085023892:root"
    },
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ],
    "Resource": [
        "arn:aws:s3:::<UNIQUE-BUCKET-NAME>/*",
        "<KMS-KEY-ARN"
    ]
}

步骤 4. 移除 ElastiCache 受赠者并禁用存储桶上的 ACL

只要启用了 ACL 并且对象由 aws-scs-s3-readonly 拥有,我们的存储桶策略就不会应用于 ElastiCache 备份对象

以 JSON 格式编写的存储桶策略提供对存储在存储桶中对象的访问权限。存储桶策略不适用于由其他账户拥有的对象

通过禁用 ACL,所有对象的所有权将恢复到存储桶所有者,并确保我们的存储桶策略生效

步骤 5. 像往常一样将对象导入到 Redis Cloud DB

  1. Redis Cloud 控制台中,从数据库列表中选择目标数据库。
  2. 危险区域中,选择导入
  3. 输入 RDB 文件的详细信息
    1. 源类型 - 选择AWS S3
    2. 源路径 - 输入 RDB 文件的 URL:s3://bucketname/[path/]filename.rdb[.gz]
      • bucketname - S3 存储桶的名称
      • path - 文件路径(如有需要)
      • filename - RDB 文件的文件名,如果文件已压缩,则包括 .gz 后缀
  4. 选择添加源,为包含多个 RDB 文件的分片数据库添加另一个 RDB 文件。
  5. 选择导入

参考资料