Amazon web services 如何输出节点';从每个AZ到地形的s ip

Amazon web services 如何输出节点';从每个AZ到地形的s ip,amazon-web-services,amazon-ec2,amazon-cloudformation,terraform,Amazon Web Services,Amazon Ec2,Amazon Cloudformation,Terraform,我正在使用terraform定义在东京地区的AWS上启动10个节点(两个AZ)。因此,在每个AZ中有5个节点被启动 resource "aws_instance" "test" { count = "${var.dse_cass_node_count}" ami = "${var.dse_cass_ami}" instance_type = "${var.dse_cass_instance

我正在使用terraform定义在东京地区的AWS上启动10个节点(两个AZ)。因此,在每个AZ中有5个节点被启动

resource "aws_instance" "test" {
  count                   = "${var.dse_cass_node_count}"
  ami                     = "${var.dse_cass_ami}"
  instance_type           = "${var.dse_cass_instance_type}"
  key_name                = "${var.dse_cass_key_name}"
  subnet_id               = "${element(split(",", var.dse_cass_vpc_subnets), count.index)}"
  availability_zone       = "${element(split(",", var.dse_cass_azs), count.index)}"
  vpc_security_group_ids  = ["${var.dse_sg_id}"]

  tags {
    Name             = "${var.namespace}-${var.env_name}-${var.dse_cluster_name}-node-${count.index}"
    Environment      = "${var.env_name}"
    DSE_Cluster_Name = "${var.dse_cluster_name}"
  }
}
我希望在输出中有基于AZ的节点IP。现在,我可以使用下面提到的定义列出输出中所有节点的ip,但无法基于AZ获得

output "cassandra_ips" {
  value = ["${aws_instance.test.*.private_ip}"]
}

output "cassandra_ips1" {
  value = ["${aws_instance.test.0.private_ip}"]
}

output "cassandra_ips2" {
  value = ["${aws_instance.test.1.private_ip}"]
}
我想根据AZ分类。使用地形有可能吗?我希望每个AZ有一个节点的ip。 如果能有一些建议就太好了。提前谢谢

地形v0.10.5


另外,我希望每个AZ的一个节点的ip添加到Cassandra的种子列表中。

Terraform允许地图输出。语法应该是这样的,我还没有尝试过

值(必需)-输出的值。这可以是一个字符串, 列表,或映射。这通常包括内插输出 是静态的,通常不有用


根据前面的评论找到了一个可行的解决方案

output "cassandra_ip_zmap" {
  value = "${
    zipmap(
      "${aws_instance.test.*.availability_zone}", "${aws_instance.test.*.private_ip}"
    )
  }"
}

它可能会让terraform崩溃吗?在我在输出中添加上述行之后,Terraform正在崩溃。panic:reflect.Value.SetMapIndex:type[]接口{}的值不可分配给类型string。很可能,请尝试读取日志,“您可以将TF_LOG设置为TRACE、DEBUG、INFO、WARN或ERROR日志级别之一,以更改日志的详细程度。TRACE是最详细的,如果TF_LOG设置为除日志级别名称以外的其他名称,则它是默认值。“你能发布一个完整terraform的链接吗?terraform的定义非常庞大,有大量的模块和带有密码的私钥。因此,我们无法共享整个定义。如何将整个日志附加到此处?“测试”资源名称是问题,实际定义中的“cassandra_ebs”资源名称是什么
output "cassandra_ip_zmap" {
  value = "${
    zipmap(
      "${aws_instance.test.*.availability_zone}", "${aws_instance.test.*.private_ip}"
    )
  }"
}