我正在尝试创建一个 DataSync 任务以将文件从 EFS 复制到 S3,为此我正在使用 Terraform。通过阅读文档,看起来我不需要 DataSync 代理来执行此操作。按照https://ystoneman.medium.com/serverless-datasync-from-efs-to-s3-6cb3a7ab85f7上的指南,我创建了以下内容
- 安全组。我创建了这个安全组,并将其分配给数据同步源位置的 EC2 配置
resource "aws_security_group" "sg-datasync" {
name = "datasync"
vpc_id = "vpc-sampleVPC"
}
- DataSync 源位置 (EFS)
resource "aws_datasync_location_efs" "source_efs" {
efs_file_system_arn = "arn:aws:elasticfilesystem:ap-southeast-2:XXXXX:file-system/fs-6b3f3753"
ec2_config {
security_group_arns = [aws_security_group.sg-datasync.arn]
subnet_arn = "arn:aws:ec2:ap-southeast-2:XXXXX:subnet/subnet-09d919d3b76e9c7f0"
}
}
- DataSync 目标位置 (S3)
resource "aws_datasync_location_s3" "target_s3" {
s3_bucket_arn = local.s3_arn
subdirectory = "/some_target_folder"
s3_config {
bucket_access_role_arn = local.s3_bucket_role_arn
}
}
- 数据同步任务
resource "aws_datasync_task" "sampleTask" {
destination_location_arn = aws_datasync_location_s3.target_s3.arn
name = "sampleTask"
source_location_arn = aws_datasync_location_efs.source_efs.arn
options {
bytes_per_second = -1
}
}
除此之外,我还创建了更多与安全相关的内容:
- 允许来自 DataSync 源位置安全组的入站 NFS 访问的安全组规则(基于文章所说的“在您的 EFS 文件系统挂载目标的安全组上,允许来自 DataSync 源位置的安全组的端口 2049 上的入站访问。”)
resource "aws_security_group_rule" "datasync_to_efs" {
type = "ingress"
from_port = 2049
to_port = 2049
protocol = "tcp"
source_security_group_id = aws_security_group.sg-datasync.id
security_group_id = "sg-049fd2c6708c42c20"
}
- 安全组规则,允许所有端口上的所有出站访问 EFS 文件系统的挂载目标的安全组。同样,这是基于文章“在您的 DataSync 源位置的安全组上,允许所有端口上的所有出站访问到您的 EFS 文件系统的挂载目标的安全组”
resource "aws_security_group_rule" "egress_datasync_to_efs" {
type = "egress"
from_port = 0
to_port = 65535
protocol = "tcp"
source_security_group_id = "sg-049fd2c6708c42c20"
security_group_id = aws_security_group.sg-datasync.id
}
另请注意,“sg-049fd2c6708c42c20”是 EFS 文件系统的挂载目标安全组。至少我是这么认为的,基于下面的截图(取自 fs-6b3f3753 的 EFS 网络配置):
所以有了这些,我可以看到成功创建的数据同步任务和位置。但是,当我尝试运行任务时,连接超时:
“任务无法访问位置 loc-0bdebcc42541f73e4:x40016:mount.nfs:连接超时”
仅供参考:loc-0bdebcc42541f73e4 是源位置,我可以从控制台看到它具有以下详细信息:
- 位置 ID:loc-0bdebcc42541f73e4
- 类型:Amazon EFS 文件系统
- 小路: /
- 文件共享:fs-6b3f3753
- 子网:subnet-09d919d3b76e9c7f0
- 安全组:sg-0bb0d7ddb3dec8ca6
sg-0bb0d7ddb3dec8ca6 是安全组“sg-datasync”。从控制台,它没有入站,但它有一个出站规则:
- IP版本:-
- 类型:所有 TCP
- 协议:TCP
- 端口范围:0-65535
- 目的地:sg-049fd2c6708c42c20
查看https://docs.aws.amazon.com/efs/latest/ug/troubleshooting-efs-mounting.html#mount-hangs-fails-timeout,似乎我没有设置 EC2 实例或挂载目标安全组配置正确。我的问题是:
- 我上面的 terraform 上的 EC2 实例配置在哪里?是 aws_datasync_location_efs.source_efs.ec2_config 吗?我的猜测是.. AWS 会临时生成一个 EC2 实例来访问 EFS,它是使用这个块配置的吗?
- 假设没有。1 是正确的,EC2 已使用 a) 安全组 'sg-datasync' b) 'datasync_to_efs' 规则配置了挂载目标安全组 (sg-049fd2c6708c42c20) 以允许来自 EC2 安全组 'sg 的入站 NFS 访问-数据同步'。
非常感谢任何帮助/指针!