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

配置跨区域复制S3加密对象的源KMS密钥技术咨询

我来帮你搞定这个S3跨区域复制的Terraform配置问题!当源对象用KMS加密时,你得在复制规则里明确指定用于解密的KMS密钥,同时确保IAM复制角色有对应的权限才行。下面是完整的配置示例和关键要点:

完整Terraform配置示例
# 源S3桶(需开启版本控制)
resource "aws_s3_bucket" "source_bucket" {
  bucket = "your-source-bucket-name"

  versioning {
    enabled = true
  }
}

# 目标复制S3桶(需开启版本控制)
resource "aws_s3_bucket" "replication_bucket" {
  bucket = "your-replication-bucket-name"

  versioning {
    enabled = true
  }
}

# 源对象加密用的KMS密钥(假设已存在)
data "aws_kms_key" "source_kms_key" {
  key_id = "arn:aws:kms:us-east-1:123456789012:key/abc123-xyz456"
}

# 可选:目标区域用于加密副本的KMS密钥
data "aws_kms_key" "dest_kms_key" {
  key_id = "arn:aws:kms:us-west-2:123456789012:key/def789-ghi012"
}

# 复制专用IAM角色
resource "aws_iam_role" "replication" {
  name = "s3-replication-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "s3.amazonaws.com"
        }
      }
    ]
  })
}

# 角色权限策略
resource "aws_iam_role_policy" "replication_permissions" {
  name = "s3-replication-permissions"
  role = aws_iam_role.replication.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      # 源桶必要权限
      {
        Action = [
          "s3:GetReplicationConfiguration",
          "s3:ListBucket",
          "s3:GetObjectVersion",
          "s3:GetObjectVersionAcl"
        ]
        Effect = "Allow"
        Resource = [
          aws_s3_bucket.source_bucket.arn,
          "${aws_s3_bucket.source_bucket.arn}/*"
        ]
      },
      # 目标桶必要权限
      {
        Action = [
          "s3:ReplicateObject",
          "s3:ReplicateDelete",
          "s3:ReplicateTags",
          "s3:PutObjectVersionAcl"
        ]
        Effect = "Allow"
        Resource = "${aws_s3_bucket.replication_bucket.arn}/*"
      },
      # 源KMS密钥解密权限
      {
        Action = "kms:Decrypt"
        Effect = "Allow"
        Resource = data.aws_kms_key.source_kms_key.arn
      },
      # 可选:目标KMS密钥加密权限(如果副本要加密)
      {
        Action = [
          "kms:Encrypt",
          "kms:GenerateDataKey*"
        ]
        Effect = "Allow"
        Resource = data.aws_kms_key.dest_kms_key.arn
      }
    ]
  })
}

# 源桶的复制核心配置
resource "aws_s3_bucket_replication_configuration" "source_replication" {
  bucket = aws_s3_bucket.source_bucket.id
  role   = aws_iam_role.replication.arn

  rules {
    id       = var.service
    prefix   = var.replication_bucket_prefix
    status   = "Enabled"

    # 指定解密源对象的KMS密钥
    source_selection_criteria {
      sse_kms_encrypted_objects {
        enabled = true

        kms_key_ids = [
          data.aws_kms_key.source_kms_key.arn
          # 若源桶对象用了多个KMS密钥,全部列在这里
        ]
      }
    }

    destination {
      bucket        = aws_s3_bucket.replication_bucket.arn
      storage_class = "STANDARD"

      # 可选:配置副本的加密方式
      encryption_configuration {
        replica_kms_key_id = data.aws_kms_key.dest_kms_key.arn
      }
    }
  }
}
关键配置说明
  • source_selection_criteria 块:这是处理KMS加密对象复制的核心,必须开启sse_kms_encrypted_objects.enabled = true,并在kms_key_ids中列出所有加密源对象的KMS密钥ARN,支持多个密钥。
  • IAM角色权限:复制角色需要具备源桶的读取权限、目标桶的写入权限,最重要的是对源KMS密钥有kms:Decrypt权限(才能解密源对象);如果目标副本也要用KMS加密,还需对目标KMS密钥有kms:Encrypt和kms:GenerateDataKey*权限。
  • KMS密钥策略:别忘了给源和目标KMS密钥的密钥策略添加允许复制角色访问的语句,比如:
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/s3-replication-role"
      },
      "Action": ["kms:Decrypt"],
      "Resource": "*"
    }
    
  • 版本控制要求:S3跨区域复制强制要求源桶和目标桶都开启版本控制,上面的配置已经包含了这部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:23:27