问题描述
在使用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_arn
。vpc
模块的输出将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
字段。