Введение:
В этом блоге я собираюсь использовать Terraform для создания двух ведер S3 в разных регионах, и я позволю репликации Cross Region, то есть содержание, которое будет размещено в одном ведре, будет автоматически воспроизведено в другом ведре.
Требования:
- Terraform, настроенный в локальной машине
- Учетная запись AWS с IAM User, которая имеет надлежащие права администратора для создания ресурсов S3 и IAM
Шаги:
- Чтобы выполнить требование, я создал свое первое ведро S3. Чтобы включить правило репликации, должно быть включено управление ковшом как для исходных, так и для ведер.
- Чтобы доставить это, модуль под названием «ведь1«Создается. Он содержит приведенные ниже файлы.
#bucket.tf
//Creation of Source bucket with object lock enabledresource "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.tfvariable "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
7. Ресурсы успешно развернуты. Давайте подтвердим то же самое.
Та же самая конфигурация также будет применима к Bucket2.
8. Теперь, поскольку все ресурсы созданы успешно. Давайте загружать документ в ведро Source S3, чтобы проверить, автоматически ли он реплицируется.
Давайте попробуем удалить объект из исходного ведра и проверить, работает ли репликация маркера удаления, как и ожидалось или нет.
Как это проверяется, правило репликации хорошо включено, и мы успешно установили репликацию поперечной области между двумя ведрами S3.
2025-09-02 10:50:00
1756810954
#Конфигурация #репликации #кросс #региона #между #ковшами #использованием #Terraform #от #Soumya #biswas #СЕП
Читайте также

