如何通过Terraform实现AWS API Gateway部署依赖动态资源列表
Terraform for_each动态生成资源的依赖配置方案
核心解决思路
Terraform 0.13及更高版本已经支持在depends_on中传入动态构造的资源列表,同时你也可以通过隐式依赖的方式避开显式声明依赖的限制,以下是两种可直接落地的方案:
方案1:使用隐式依赖(最推荐)
直接在后续部署操作的配置中引用批量生成资源的任意属性,Terraform会自动识别依赖关系,不需要手动声明depends_on。
示例代码:
# 用for_each批量生成EC2实例 resource "aws_instance" "web_servers" { for_each = toset(["web-01", "web-02", "web-03"]) ami = "ami-xxxxxx" instance_type = "t2.micro" } # 部署操作资源,直接引用实例属性即可自动建立依赖 resource "null_resource" "deploy_web_service" { provisioner "remote-exec" { # 引用所有批量生成实例的公网IP,Terraform会自动等待所有EC2创建完成后再执行部署 hosts = values(aws_instance.web_servers)[*].public_ip inline = [ "echo '部署web服务'" ] } }
方案2:动态构造depends_on依赖列表
如果不需要引用动态资源的属性,仅需要纯依赖关系,可以用values()函数或者for表达式构造所有批量生成资源的列表传入depends_on。
示例代码:
# 用for_each批量生成IAM角色 resource "aws_iam_role" "service_roles" { for_each = toset(["api", "admin", "worker"]) name = each.value # 其他角色配置省略 } # 依赖所有角色的权限绑定操作 resource "null_resource" "bind_role_permissions" { # 动态传入所有批量生成的IAM角色作为依赖 depends_on = [values(aws_iam_role.service_roles)] provisioner "local-exec" { command = "echo '所有角色创建完成,开始绑定权限'" } }
注意事项
- 不要直接把
for_each生成的资源集合整体传入depends_on,例如depends_on = [aws_instance.web_servers]是无效配置,Terraform无法识别集合类型的直接依赖 - 优先选择隐式依赖方案,比显式声明
depends_on更稳妥,不会出现依赖漏加、多加的问题 - 如果你使用的是0.12及更早版本的Terraform,可以用
[for k in toset(["web-01", "web-02", "web-03"]) : aws_instance.web_servers[k]]的方式手动构造依赖列表
内容的提问来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

