2017-06-07 453 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)}" 

所以不存在的資源會返回一個空列表和其他人會返回單個元素列表,我將它們連接在一起並獲取第一個元素。