2017-06-07 236 views
0

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

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

来决定我是否应该创建elasticahe集群或ASG,问题是,我需要一个主机名或IP地址传递给服务器扇子和API节点,以便他们可以连接到Redis的,计划使用:

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

但由于资源的一个永远不会被创建,我不能引用它在​​3210功能这总是失败。有任何想法吗?

回答

0

我设法得到这个工作,貌似如果我们用图示可变格式,这样大家可以参考不存在的资源:

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)}" 

所以不存在的资源会返回一个空列表和其他人会返回单个元素列表,我将它们连接在一起并获取第一个元素。