有条件地创建具有terraform的资源

时间:2017-06-07 20:29:49

标签: amazon-web-services terraform amazon-elasticache

我正在尝试编写一个模块来在AWS上部署Sensu,计划是为Redis使用弹性缓存,但现在我面临着一个边缘情况。我们的一些VPC将租赁设置为专用,我们不能在那里使用弹性(http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/AmazonVPC.EC.html),我想我可以通过有条件地使用弹性或在ASG中部署redis集群来解决这个问题。我编写了代码并使用了:

count = "${replace(replace(var.vpc_instance_tenancy,"/.*dedicated.*/","0"),"/(.*default.*|^$)/","1")}"

决定是否应该创建弹性集群或ASG,问题是我需要将主机名或IP地址传递给Sensu服务器和api节点,以便它们可以连接到Redis,计划使用:< / p>

redis_host = "${coalesce(aws_elasticache_cluster.redis_cluster.cache_nodes.0.address,aws_elb.redis_lb.dns_name)}"

但这总是失败,因为其中一个资源永远不会被创建,我无法在coalesce函数中引用它。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我设法让这个工作,如果我们使用splat变量格式,我们可以参考不存在的资源,如下所示:

redis_host = "${element(concat(aws_elasticache_cluster.redis_cluster.*.cache_nodes.0.address, aws_elb.redis_lb.*.dns_name), 0)}"
redis_port = "${element(concat(aws_elasticache_cluster.redis_cluster.*.cache_nodes.0.port, list(var.redis_port)), 0)}"

所以不存在的资源将返回一个空列表,另一个将返回单个元素列表,我将它们连接在一起并得到第一个元素。

相关问题