S3 使用 Terraform 的跨区域复制

问题描述 投票:0回答:2

我正在使用 Terraform 设置 S3 存储桶(不同区域)并在它们之间设置复制。

在我添加 KMS 之前,它工作正常。

我创建了 2 个 KMS 密钥,一个用于源,一个用于目标。

现在在应用复制配置时,有一个选项可以为目标存储桶传递目标密钥,但我不确定如何在源应用密钥。

任何帮助将不胜感激。

provider "aws" {
  alias  = "east"
  region = "us-east-1"
}

resource "aws_s3_bucket" "destination-bucket" {
  bucket = ""destination-bucket"
  provider = "aws.east"
  acl    = "private"
  region   = "us-east-1"
  versioning {
    enabled = true
  }
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = "${var.kms_cmk_dest_arn}"
        sse_algorithm     = "aws:kms"
      }
    }
  }
}

resource "aws_s3_bucket" "source-bucket" {
  bucket = "source-bucket"
  acl    = "private"
  versioning {
    enabled = true
  }
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = "${var.kms_cmk_arn}"
        sse_algorithm     = "aws:kms"
      }
    }
  }
  replication_configuration {
    role = "${aws_iam_role.replication.arn}"

    rules {
      status = "Enabled"
	  destination {
        bucket        = "${aws_s3_bucket.source-bucket.arn}"
        storage_class = "STANDARD"
		replica_kms_key_id = "${var.kms_cmk_dest_arn}"
      }
	  source_selection_criteria {
      sse_kms_encrypted_objects {
      enabled = true
	  }
    }
    }
  }
}

resource "aws_iam_role" "replication" {
  name = "cdd-iam-role-replication"
  permissions_boundary    = "arn:aws:iam::${var.account_id}:policy/ServiceRoleBoundary"
  assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
POLICY
}

resource "aws_iam_role_policy" "replication" {
  name = "cdd-iam-role-policy-replication"
  role = "${aws_iam_role.replication.id}"

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:GetReplicationConfiguration",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "${aws_s3_bucket.source-bucket.arn}"
      ]
    },
    {
      "Action": [
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl"
      ],
      "Effect": "Allow",
      "Resource": [
        "${aws_s3_bucket.source-bucket.arn}/*"
      ]
    },
    {
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateDelete"
      ],
      "Effect": "Allow",
      "Resource": "${aws_s3_bucket.destination-bucket.arn}/*"
    }
  ]
}
POLICY
}

amazon-web-services amazon-s3 encryption terraform replication
2个回答
0
投票

如果您使用客户管理密钥 (CMK) 进行 S3 加密,则需要额外配置。 AWS S3 文档提到 CMK 所有者必须授予源存储桶所有者使用 CMK 的权限。

https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-config-for-kms-objects.html#replication-kms-cross-acct-scenario

还有一篇总结S3跨区域复制配置的好文章:

https://medium.com/@devopslearning/100-days-of-devops-day-44-s3-cross-region-replication-crr-8c58ae8c68d4


0
投票

如果我没理解错的话,您在同一个帐户的两个不同区域中有两个 S3 存储桶。

我过去这样做的一种方法是首先将 KMS 密钥计划/应用到两个区域。

然后在单独的计划/申请中,我使用了 Terraform 的数据源:

data "aws_kms_key" "source_credentials_encryption_key" {
  key_id = "alias/source-encryption-key"
}
    
data "aws_kms_key" "destination_credentials_encryption_key" {
  provider = aws.usEast
  key_id   = "alias/destination-encryption-key"
}

并使用数据源进行复制配置,如下所示:

replication_configuration {
  role = aws_iam_role.replication_role.arn
  
  rules {
    status = "Enabled"
    
    destination {
      bucket = aws_s3_bucket.source_bucket.arn
      storage_class = "STANDARD"
      replicate_kms_key_id = data.aws_kms_key.destination_bucket_encryption_key.arn
    }
    
    source_selection_criteria {
      sse_kms_encrypted_objects {
        enabled = true
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.