使用Terraform和aws\u AMI\u ids数据源将AMI共享给子帐户

使用Terraform和aws\u AMI\u ids数据源将AMI共享给子帐户,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我希望使用Terraform在AWS中的帐户之间共享AMI。 我有以下模块 data "aws_ami_ids" "wh_ami_ids" { owners = "${var.owner_id}" name_regex = "${var.name_regex}" } resource "aws_ami_launch_permission" "ami_shared" { count = "${length(data.aws_ami_ids.wh_ami_ids.ids)}" im

我希望使用Terraform在AWS中的帐户之间共享AMI。 我有以下模块

data "aws_ami_ids" "wh_ami_ids" {
  owners = "${var.owner_id}"
  name_regex = "${var.name_regex}"
}

resource "aws_ami_launch_permission" "ami_shared" {
  count = "${length(data.aws_ami_ids.wh_ami_ids.ids)}"
  image_id = "${data.aws_ami_ids.wh_ami_ids.ids[count.index]}"
  account_id = "${var.account_id}"
}
问题是数据源
aws\u ami\u id
以创建日期降序返回
ami\u id
列表

因此,如果您添加了一个新的AMI,它似乎在修改已经创建的
aws\u AMI\u launch\u权限
,因为新的AMI插入到列表的开头,改变了顺序

如果子帐户在更新资源时可能无法访问AMI,则这可能会导致竞争条件

似乎没有一种方法可以指定数据源的排序顺序,以便始终在最后添加新的AMI,这意味着只会创建新的资源


关于如何解决这个问题,您有什么想法吗?

您可以使用插值中的计算向后迭代:

resource "aws_ami_launch_permission" "ami_shared" {
  count = "${length(data.aws_ami_ids.wh_ami_ids.ids)}"
  image_id = "${data.aws_ami_ids.wh_ami_ids.ids[length(data.aws_ami_ids.wh_ami_ids.ids) - count.index - 1]}"
  account_id = "${var.account_id}"
}

啊,我自己也在想,不知道它是否有效:)我来试试。是的,像这样简单的计算一般都可以。我认为上面的说法是对的,但它可能有一个一个的错误。。。!值得注意的是(见右下方):“由于Terraform允许在资源和变量名中使用连字符,因此最好在数学运算符之间使用空格,以防止混淆或意外行为。”通过签入状态文件,它似乎可以按预期工作。