在Terraform中,当引导操作内容更改时,可以重新创建EMR群集资源吗?

时间:2018-12-21 15:13:25

标签: terraform amazon-emr terraform-provider-aws

我不太确定如何在Terraform中解决此问题。

我们有一个EMR群集,其中有一些引导操作被指定为S3资源。我们的terraform配置的简化视图是:

resource "aws_s3_bucket_object" "bootstrap_action" {
  bucket = "${var.s3_emr_bootstrap_bucket}"
  key    = "bootstrap"
  content = <<EOF
#!/bin/bash
echo "Doing bootstrap actions"
EOF
}

resource "aws_emr_cluster" "emr_cluster" {

    ...configuration of the EMR cluster...

    bootstrap_action {
        path = "s3://${aws_s3_bucket_object.bootstrap_action.bucket}/${aws_s3_bucket_object.bootstrap_action.key}"
        name = "Bootstrap Step"
    }
}

我们想要做的是,使更改引导操作脚本的内容导致集群重新构建。现在,如果发生更改,我们必须手动对集群进行污染。

我尝试使用“ depends_on”,但这只影响订购,实际上并没有强制重建。

https://github.com/hashicorp/terraform/issues/8099中对此问题进行了一些讨论,读到我没有看到明显的解决方案,但认为我仍然会提出问题。

1 个答案:

答案 0 :(得分:0)

您要查找aws_emr_cluster的某个参数,该参数在更新后会导致资源重建。如果可用,我通常使用namedescription并强制重新创建资源。名字在这里似乎很合理。

执行以下操作:

locals {
  script = <<EOF
#!/bin/bash
echo "Doing bootstrap actions"
EOF
  script_sha = "${sha256(local.script)}"
}

...

name = "emr_cluster_name ${local.script_sha}"

然后,当脚本内容更改时,群集的名称也会更改,并且群集将被强制重建。

如果name在资源上是可变的,那么这显然将不起作用。您链接的问题是在一般情况下如何解决此问题的更好的讨论。