Terraform 0.11中如何实现仅当文件存在时部署资源?
在Terraform 0.11中实现基于文件存在性的条件资源部署
在Terraform 0.11里实现这个需求确实有点小挑战——毕竟这个版本还没有像新版那样内置fileexists()这类直接检查文件存在的函数。不过我们可以通过外部数据源+count参数的组合来搞定,具体步骤如下:
1. 用外部数据源检查文件是否存在
首先定义一个external数据源,借助系统命令来判断目标XML文件是否存在。这个数据源会返回JSON格式的结果,明确告诉我们文件是否存在:
针对Linux/macOS(bash环境)
data "external" "check_abc_metadata" { program = ["bash", "-c", "test -f ${path.module}/metadata/abc-${var.aws_account}.xml && echo '{\"exists\": true}' || echo '{\"exists\": false}'"] }
针对Windows(PowerShell环境)
如果是在Windows上运行,把命令换成PowerShell版本:
data "external" "check_abc_metadata" { program = ["powershell", "-Command", "if (Test-Path '${path.module}/metadata/abc-${var.aws_account}.xml') { echo '{\"exists\": true}' } else { echo '{\"exists\": false}' }"] }
逻辑很直白:用系统原生命令检查文件路径,存在就输出{"exists": true},否则输出{"exists": false},external数据源会自动解析这个结果供后续使用。
2. 给IAM SAML Provider资源添加条件判断
接下来修改你的aws_iam_saml_provider资源,通过count参数根据上面的检查结果决定是否创建资源:
resource "aws_iam_saml_provider" "xyz" { count = "${data.external.check_abc_metadata.result.exists == "true" ? 1 : 0}" name = "abc-${var.aws_account}" saml_metadata_document = "${file("${path.module}/metadata/abc-${var.aws_account}.xml")}" }
这里的核心是count参数:
- 当文件存在时,
count=1,Terraform会正常创建这个资源; - 当文件不存在时,
count=0,Terraform会完全跳过这个资源的创建流程,不会触发file()函数的报错,其他资源也能正常执行。
注意事项
- 确保
var.aws_account是字符串类型,否则拼接文件名时可能出现格式问题; - 这个方案依赖系统的shell/PowerShell环境,如果你在非类Unix/Windows环境运行,需要调整对应的检查命令;
- 只有当文件存在时,
file()函数才会被调用读取内容——因为我们已经提前通过外部数据源确保了文件存在,不会触发读取错误。
内容的提问来源于stack exchange,提问作者Samriddha Choudhuri
相关产品推荐
相关产品推荐

