Terraform中使用VPC模块定义datasync位置的subnet_arn

92次阅读
没有评论

问题描述

在使用Terraform时,想要定义一个datasync位置,用于将文件从S3同步到EFS。用户是Terraform的新手,并且正在使用terraform-aws-modules/vpc/aws模块来帮助他入门,所以他怀疑缺少实际的aws_subnet可能会对他产生影响。aws_datasync_location_efs资源需要ec2_config{}部分的subnet_arn。用户尝试了几种方法,terraform plan运行正常,但是apply时出现以下错误:

Error: error creating DataSync Location EFS: ValidationException: 1validation error detected: Value'arn:aws:elasticfilesystem:us-east-1::file-system/fs-03364c016d406d0f6'at 'efsFilesystemArn' failed to satisfy constraint: Member mustsatisfy regular expression pattern:^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):elasticfilesystem:[a-z-0-9]+:[0-9]{12}:file-system/fs-[0-9a-f]{8,40}$status code: 400, request id:a8f12e4c-8734-4833-b640-82e10a8557a9 withaws_datasync_location_efs.my_s3_sync_src, on efs.tf line 72, inresource "aws_datasync_location_efs" "my_s3_sync_src": 72:resource "aws_datasync_location_efs" "my_s3_sync_src" {

用户想知道Terraform需要什么样的subnet_arnvpc模块的输出将private_subnet_arns列为“私有子网的ARN列表”,但这似乎不是用户所期望的。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,我们可以看到在aws_datasync_location_efs资源的ec2_config部分,subnet_arn是从module.vpc.private_subnet_arns中获取的。这个值是一个列表,我们可以使用索引来获取第一个子网的ARN。以下是解决方案的步骤:
1. 打开efs.tf文件。
2. 找到aws_datasync_location_efs资源的定义。
3. 将subnet_arn的值更改为${element(module.vpc.private_subnet_arns, 0)}
下面是一个示例:

resource "aws_datasync_location_efs" "my_s3_sync_src" {
  efs_file_system_arn          = aws_efs_mount_target.my_target1.file_system_arn
  file_system_access_role_arn  = aws_iam_role.my_efs_datasync_role.arn
  in_transit_encryption        = "TLS1_2"
  subdirectory                 = "/"
  ec2_config {
    security_group_arns         = [aws_security_group.my_efs-sg.arn]
    subnet_arn                  = "${element(module.vpc.private_subnet_arns, 0)}"
  }
}

在上面的示例中,我们使用${element(module.vpc.private_subnet_arns, 0)}来获取module.vpc.private_subnet_arns列表中的第一个子网的ARN,并将其赋值给subnet_arn
请注意,如果你想使用其他子网的ARN,可以更改索引的值。例如,${element(module.vpc.private_subnet_arns, 1)}将返回列表中的第二个子网的ARN。

方案2

如果方案1中的解决方法无效,你可以尝试手动查找子网的ARN。以下是一些可能的方法:
1. 登录到AWS控制台。
2. 导航到VPC服务。
3. 在左侧的导航栏中,选择“子网”。
4. 找到你想要使用的子网,并点击它。
5. 在子网的详细信息页面中,你应该能够找到子网的ARN。
请注意,这种方法需要手动查找子网的ARN,并将其复制到Terraform配置文件中的subnet_arn字段中。

方案3

如果你仍然无法找到子网的ARN,可能是因为terraform-aws-modules/vpc/aws模块没有输出子网的ARN。在这种情况下,你可以尝试使用其他方法来获取子网的ARN,例如使用AWS CLI或SDK。以下是使用AWS CLI获取子网ARN的示例命令:

aws ec2 describe-subnets --filters "Name=tag:Name,Values=your_subnet_name" --query "Subnets[0].SubnetArn" --output text

your_subnet_name替换为你要查找的子网的名称。运行上述命令后,你应该能够获取到子网的ARN。将此ARN复制到Terraform配置文件中的subnet_arn字段中。
请注意,这种方法需要安装并配置AWS CLI,并具有适当的权限来访问子网的信息。
以上是几种可能的解决方案,你可以根据你的具体情况选择适合你的方法来获取子网的ARN,并将其用于Terraform配置文件中的subnet_arn字段。

正文完