0

我正在尝试创建一个 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 网络配置):

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 实例或挂载目标安全组配置正确。我的问题是:

  1. 我上面的 terraform 上的 EC2 实例配置在哪里?是 aws_datasync_location_efs.source_efs.ec2_config 吗?我的猜测是.. AWS 会临时生成一个 EC2 实例来访问 EFS,它是使用这个块配置的吗?
  2. 假设没有。1 是正确的,EC2 已使用 a) 安全组 'sg-datasync' b) 'datasync_to_efs' 规则配置了挂载目标安全组 (sg-049fd2c6708c42c20) 以允许来自 EC2 安全组 'sg 的入站 NFS 访问-数据同步'。

非常感谢任何帮助/指针!

4

0 回答 0