在 Terraform 中,当 bootstrap 操作内容发生变化时,我可以重新创建 EMR 集群资源吗?

In Terraform, can I recreate an EMR cluster resource when its bootstrap action contents change?

我不太确定如何在 terraform 中解决这个问题。

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

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

我们想要做的是让更改 bootstrap 操作脚本的内容导致集群重建。如果这种情况发生变化,现在我们必须手动污染集群。

我试过使用 "depends_on",但这只会影响排序,实际上并不会强制重建。

关于这个问题的一些讨论在:https://github.com/hashicorp/terraform/issues/8099 读到我没有看到明显的解决方案,但我想我还是 post 一个问题。

您想找到 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 在资源上是可变的,这显然不起作用。您链接的问题更好地讨论了在一般情况下如何解决此问题。