You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3跨区域复制(CRR)加密对象无法自动复制问题求助

排查S3跨区域复制(CRR)加密对象不复制的问题

核心问题定位

你的Terraform代码中,S3复制配置的目标区域块未显式指定KMS密钥ID,这是导致加密对象无法自动复制的关键原因。AWS要求:当目标存储桶使用KMS加密,或者需要将加密对象复制到目标桶时,必须在CRR规则的destination配置中明确指定目标KMS密钥ARN,否则即使IAM角色权限配置正确,S3复制服务也不会自动关联该密钥——这就是手动在控制台添加密钥后生效的原因,控制台操作补全了这个缺失的配置项。

具体排查步骤

  • 补全CRR配置的目标密钥指定
    查看你的aws_s3_bucket_replication_configuration资源,当前rule内的destination块仅配置了storage_class和bucket,缺少kms_key_id参数。修正后的配置需添加目标KMS密钥ARN:

    resource "aws_s3_bucket_replication_configuration" "source_bucket_replication" {
      provider = aws.source
    
      bucket = aws_s3_bucket.source_bucket.bucket
      role   = aws_iam_role.replication_role.arn
    
      rule {
        status = "Enabled"
        destination {
          storage_class = "STANDARD"
          bucket        = aws_s3_bucket.dest_bucket.arn
          # 新增:指定目标区域的KMS密钥ARN
          kms_key_id = aws_kms_key.dest_key.arn
        }
      }
    
      depends_on = [aws_iam_role_policy_attachment.role_policy_attach]
    }
    
  • 验证KMS密钥策略权限
    除了IAM角色的权限,目标区域的KMS密钥策略必须允许源区域的复制IAM角色执行kms:Encrypt操作。检查目标KMS密钥的策略是否包含类似语句:

    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::你的账号ID:role/源区域复制角色名"
      },
      "Action": "kms:Encrypt",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:ViaService": "s3.目标区域.amazonaws.com",
          "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::目标桶名"
        }
      }
    }
    
  • 确认复制配置的实际生效状态
    执行Terraform状态查看命令,确认实际生成的CRR配置是否包含目标KMS密钥:

    terraform state show aws_s3_bucket_replication_configuration.source_bucket_replication
    

    将输出内容与控制台手动配置后的CRR配置对比,检查是否存在差异。

  • 测试新对象的复制行为
    CRR仅对配置生效后新创建的对象生效,测试时需上传新的加密对象到源桶,等待几分钟后查看目标桶是否同步,避免使用配置前已存在的对象测试。

  • 查看S3复制日志
    在源桶的CRR配置中启用复制日志,通过日志排查是否存在权限拒绝或配置错误的报错:

    rule {
      status = "Enabled"
      # 新增日志配置
      metrics {
        status = "Enabled"
        event_threshold {
          minutes = 15
        }
      }
      destination {
        storage_class = "STANDARD"
        bucket        = aws_s3_bucket.dest_bucket.arn
        kms_key_id = aws_kms_key.dest_key.arn
      }
      # 指定日志存储桶(需提前创建)
      log_delivery {
        bucket = "arn:aws:s3:::你的日志桶名"
        prefix = "replication-logs/"
      }
    }
    

内容的提问来源于stack exchange,提问作者user23350878

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:20:57