Конфигурация репликации кросс -региона между ковшами S3 с использованием Terraform | от Soumya biswas | СЕП, 2025

Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Введение:

В этом блоге я собираюсь использовать Terraform для создания двух ведер S3 в разных регионах, и я позволю репликации Cross Region, то есть содержание, которое будет размещено в одном ведре, будет автоматически воспроизведено в другом ведре.

Требования:

  • Terraform, настроенный в локальной машине
  • Учетная запись AWS с IAM User, которая имеет надлежащие права администратора для создания ресурсов S3 и IAM

Шаги:

  1. Чтобы выполнить требование, я создал свое первое ведро S3. Чтобы включить правило репликации, должно быть включено управление ковшом как для исходных, так и для ведер.
  2. Чтобы доставить это, модуль под названием «ведь1«Создается. Он содержит приведенные ниже файлы.
#bucket.tf
//Creation of Source bucket with object lock enabled

resource "aws_s3_bucket" "bucket1" {
bucket = "application-bucket1-20250901"
object_lock_enabled = true
region = var.region1
tags = {
Name = "application-bucket-20250901"
Environment = "Test"
}
}

//Defined the object ownership for the bucket

resource "aws_s3_bucket_ownership_controls" "ownership_bucket1" {
bucket = aws_s3_bucket.bucket1.id
rule {
object_ownership = "BucketOwnerPreferred"
}
depends_on = [ aws_s3_bucket.bucket1 ]
}

//Defined the access control list of the bucket

resource "aws_s3_bucket_acl" "acl_bucket1" {
bucket = aws_s3_bucket.bucket1.id
acl = "private"
depends_on = [ aws_s3_bucket_ownership_controls.ownership_bucket1 ]
}

//Enabled the bucket Versioning

resource "aws_s3_bucket_versioning" "versioning_bucket1" {
bucket = aws_s3_bucket.bucket1.id
versioning_configuration {
status = "Enabled"
}
}

#bucket2.tf

//Creation of Destination bucket with object lock enabled

resource "aws_s3_bucket" "bucket2" {
bucket = "application-bucket2-20250901"
object_lock_enabled = true
region = var.region2
tags = {
Name = "application-bucket2-20250901"
Environment = "Test"
}
}

//Defined the object ownership for the bucket

resource "aws_s3_bucket_ownership_controls" "ownership_bucket2" {
bucket = aws_s3_bucket.bucket1.id
rule {
object_ownership = "BucketOwnerPreferred"
}
depends_on = [ aws_s3_bucket.bucket2 ]
}

//Defined the access control list of the bucket

resource "aws_s3_bucket_acl" "acl_bucket2" {
bucket = aws_s3_bucket.bucket1.id
acl = "private"
depends_on = [ aws_s3_bucket_ownership_controls.ownership_bucket1 ]
}

//Enabled the bucket Versioning

resource "aws_s3_bucket_versioning" "versioning_bucket2" {
bucket = aws_s3_bucket.bucket1.id
versioning_configuration {
status = "Enabled"
}
depends_on = [ aws_s3_bucket_acl.acl_bucket2 ]
}

3. Как только ведра созданы, создается роль IAM и встроенная политика для этой роли, которая будет использоваться во время настройки репликации. Если требование состоит в том, чтобы повторить объекты из одного ведра до другого ведра, оно будет выполнено путем выполнения фонового задания, которое потребует необходимого доступа, чтобы получить мало подробностей о ведре и разрешении, чтобы поместить объекты в ведро для назначения.

#role_policy.tf

//Creation of IAM role with trust policy

resource "aws_iam_role" "s3_role" {
name = "s3-replication-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "s3.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
depends_on = [ aws_s3_bucket_versioning.versioning_bucket2, aws_s3_bucket_versioning.versioning_bucket1 ]
}

//Creation of IAM policy

resource "aws_iam_policy" "replication_policy" {
name = "s3-replication-policy"
description = "Policy for S3 bucket replication"

policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"s3:GetReplicationConfiguration",
"s3:ListBucket",
"s3:GetBucketVersioning",
]
Resource = [
aws_s3_bucket.bucket1.arn,
]
},
{
Effect = "Allow"
Action = [
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
]
Resource = [
"${aws_s3_bucket.bucket1.arn}/*",
]
},
{
Effect = "Allow"
Action = [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags",
"s3:PutObject"
]
Resource = [
"${aws_s3_bucket.bucket2.arn}/*",
]
},
]
})
depends_on = [ aws_iam_role.s3_role ]
}

//Attaching the policy with the role

resource "aws_iam_role_policy_attachment" "role_attachment" {
role = aws_iam_role.s3_role.name
policy_arn = aws_iam_policy.replication_policy.arn
depends_on = [ aws_iam_policy.replication_policy ]
}

Роль позволит ниже разрешения:
На уровне исходного ведра:
S3: GetReplicationConfiguration, S3: ListBucket, S3: GetBucket версия

На уровне объекта исходного ведра:
S3: GetObjectVersionForePlication, S3: GetObjectVersionAcl, S3: GetObjectVersionTagging

На уровне объекта ведра назначения:
S3: ReplicateObject, S3: ReplicatedElete, S3: Replicatetags, S3: putobject

4. Теперь следующий код записан для настройки репликации ведра.

#replication.tf

//Replication configuration

resource "aws_s3_bucket_replication_configuration" "new_replication" {
role = aws_iam_role.s3_role.arn
bucket = aws_s3_bucket.bucket1.id #ID of source bucket
rule {
id = "replication_rule"
filter {
prefix = "" #It will define the file name starts with. If it remains empty, the rule will be applicable to all objects
}
delete_marker_replication { #Enable the replication for delete markers or deleted objects as well
status = "Enabled"
}
status = "Enabled"
destination {
bucket = aws_s3_bucket.bucket2.arn
# storage_class = "STANDARD"
}
}
depends_on = [ aws_s3_bucket_versioning.versioning_bucket2, aws_s3_bucket_versioning.versioning_bucket1, aws_iam_policy.replication_policy ]
}

Следующий файл содержит регионы, где будут созданы ведра.

#var.tf

variable "region1" {}
variable "region2" {}

5. Теперь модуль разработан, пришло время вызвать модуль. В основной папке проекта приведенные ниже файлы создаются.

#provider.tf

//Provides the provider information

provider "aws" {
region = var.region1
}

#vars.tf

//Declare the variables

variable "region1" {}
variable "region2" {}

#dev.tfvars

//Declare the value of the variables

region1 = "eu-west-1"
region2 = "ap-south-1"

#main.tf

//Calling the module to implement the changes

module "s3_bucket_replication" {
source = "./bucket1"
region1 = "${var.region1}"
region2 = "${var.region2}"
}

6. Код готов, и мы все настроены на развертывание, и мы начинаем с команд ниже.

terraform init          #Initialize terraform
terraform validate #Validate the code

Следующим шагом является создание плана, сохранить его в выходном файле и применить план из этого выходного файла.

terraform plan -var-file=dev.tfvars -out=dev.tfplan   #Creation of the plan with values used in dev.tfvars file and save it to de.tfplan file
terraform apply -var-file=dev.tfvars -input=false 'dev.tfplan' #Apply the plan which is created in dev.tfplan file
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Вывод команды плана
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Вывод команды Apply

7. Ресурсы успешно развернуты. Давайте подтвердим то же самое.

Read more:  Случаи ожогов Одиша: третий студент умирает от самосожжения на фоне обвинений в шантаже - Deccan Herald
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Созданы ведра S3, специфичные для региона
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Версия ведра включено в Bucket1
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Блокировка объекта включена в Bucket1
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Общественный доступ заблокирован в Bucket1
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Собственность объекта установлена в Bucket1
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

ACL установлен в Bucket1

Та же самая конфигурация также будет применима к Bucket2.

Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Создана роль репликации S3
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Доветная политика добавляется к роли
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Политика разрешения добавляется к роли

8. Теперь, поскольку все ресурсы созданы успешно. Давайте загружать документ в ведро Source S3, чтобы проверить, автоматически ли он реплицируется.

Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Загрузил объект в исходное ведро
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Объект реплицируется в ведро с назначением

Давайте попробуем удалить объект из исходного ведра и проверить, работает ли репликация маркера удаления, как и ожидалось или нет.

Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Удалил объект из исходного ведра
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Объект удаляется из исходного ведра
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Объект удаляется из ведра назначения
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Удалить маркер включен в исходном ведре
Нажмите Enter или нажмите, чтобы просмотреть изображение в полном размере

Удалить маркер включен в ведро назначения с тем же идентификатором версии

Как это проверяется, правило репликации хорошо включено, и мы успешно установили репликацию поперечной области между двумя ведрами S3.

2025-09-02 10:50:00


1756810954
#Конфигурация #репликации #кросс #региона #между #ковшами #использованием #Terraform #от #Soumya #biswas #СЕП

Читайте также

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.