terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 3.0" } } }
provider "aws" { region = "eu-west-1" }
data "aws_vpc" "default" { default = true }
data "aws_subnet_ids" "public" { vpc_id = data.aws_vpc.default.id }
data "aws_subnet" "selected" { vpc_id = data.aws_vpc.default.id id = sort(data.aws_subnet_ids.public.ids)[0] }
data "aws_ami" "amzn2" { most_recent = true
filter { name = "name" values = ["amzn2-ami-hvm-2.0.*-x86_64-gp2"] }
filter { name = "virtualization-type" values = ["hvm"] }
owners = ["137112412989"] }
resource "aws_datasync_location_s3" "demo" { s3_bucket_arn = aws_s3_bucket.demo.arn subdirectory = "/"
s3_config { bucket_access_role_arn = aws_iam_role.datasync.arn } }
resource "aws_datasync_location_efs" "demo" { efs_file_system_arn = aws_efs_file_system.demo.arn
ec2_config { security_group_arns = [ aws_security_group.datasync.arn ] subnet_arn = data.aws_subnet.selected.arn } }
resource "aws_datasync_task" "demo" { name = "demo-s3-to-efs" source_location_arn = aws_datasync_location_s3.demo.arn destination_location_arn = aws_datasync_location_efs.demo.arn }
resource "aws_s3_bucket" "demo" { bucket_prefix = "demo-" }
resource "aws_efs_file_system" "demo" { tags = { Name = "Demo" } }
resource "aws_iam_role" "datasync" { name = "demo-datasync"
assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = { Service = "datasync.amazonaws.com" } Action = "sts:AssumeRole" }, ] }) }
resource "aws_iam_role_policy" "datasync" { role = aws_iam_role.datasync.name
policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "s3:GetBucketLocation", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:HeadBucket" ] Resource = aws_s3_bucket.demo.arn }, { Effect = "Allow" Action = [ "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:GetObjectTagging", "s3:PutObjectTagging", "s3:PutObject" ] Resource = "${aws_s3_bucket.demo.arn}/*" } ] }) }
resource "aws_efs_mount_target" "demo" { for_each = data.aws_subnet_ids.public.ids file_system_id = aws_efs_file_system.demo.id subnet_id = each.value security_groups = [ aws_security_group.efs.id ] }
resource "aws_security_group" "efs" { name_prefix = "demo-efs-" vpc_id = data.aws_vpc.default.id }
resource "aws_security_group_rule" "efs_datasync" { type = "ingress" from_port = 2049 to_port = 2049 protocol = "tcp" security_group_id = aws_security_group.efs.id source_security_group_id = aws_security_group.datasync.id }
resource "aws_security_group_rule" "efs_ec2" { type = "ingress" from_port = 2049 to_port = 2049 protocol = "tcp" security_group_id = aws_security_group.efs.id source_security_group_id = aws_security_group.ec2.id }
resource "aws_security_group" "datasync" { name_prefix = "demo-datasync-" vpc_id = data.aws_vpc.default.id }
resource "aws_security_group_rule" "datasync" { type = "egress" from_port = 2049 to_port = 2049 protocol = "tcp" security_group_id = aws_security_group.datasync.id source_security_group_id = aws_security_group.efs.id }
resource "aws_instance" "demo" { ami = data.aws_ami.amzn2.id instance_type = "t3.micro" vpc_security_group_ids = [ aws_security_group.ec2.id ] subnet_id = data.aws_subnet.selected.id iam_instance_profile = aws_iam_instance_profile.ec2.name
tags = { Name = "demo-datasync" } }
resource "aws_security_group" "ec2" { name_prefix = "demo-ec2-" vpc_id = data.aws_vpc.default.id
egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } }
resource "aws_iam_role" "ec2" { name = "demo-ec2"
assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } Action = "sts:AssumeRole" }, ] }) }
resource "aws_iam_instance_profile" "ec2" { name = "demo-ec2" role = aws_iam_role.ec2.name }
resource "aws_iam_role_policy" "ec2" { role = aws_iam_role.ec2.name
policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "ec2messages:*", "ssmmessages:*", "ssm:UpdateInstanceInformation", "ssm:GetDeployablePatchSnapshotForInstance", "ssm:ListAssociations" ] Resource = "*" } ] }) }
|