Terrafrom EMR引导程序外壳文件

时间:2019-05-14 00:08:59

标签: terraform amazon-emr

我希望在AWS EMR的Terrafrom模块内执行一个外壳文件,并将该文件传递给bootstrap操作。但是文件未加载。

调用文件的代码块在此处的main.tf文件中-

id

main.tf与“文件”目录位于同一级别。

错误消息是-

bootstrap_action {
  path = "${file("files/emr_bootstrap.sh")}"
  name = "emr_bootstrap"
}

任何想法/指针将不胜感激。

回答1

谢谢HenryTK。我也尝试了此尝试,但没有成功,因此我认为问题在于该文件实际上在目标位置不存在。为了克服bootstrap_action块之前的问题,添加了一个文件复制块,如此处所示-

ValidationException: Invalid bootstrap action path, must be a location in Amazon S3 or a local path starting with 'file:'.

即使使用此文件配置程序,shell脚本也不会得到执行,这意味着bootstrap_action并未找到shell脚本。

4 个答案:

答案 0 :(得分:0)

使用神奇的path.module插值法[1]。

bootstrap_action {
  path = "${file("${path.module}/files/emr_bootstrap.sh")}"
  name = "emr_bootstrap"
}

[1] https://www.terraform.io/docs/configuration-0-11/interpolation.html

答案 1 :(得分:0)

因此对于s3,您可以这样做:

  bootstrap_action {
path = "s3://${var.bucket_name}/bootstrap/configure-system.sh"
name = "configure_system"

}

我会在本地猜测您会想要的:

  bootstrap_action {
path = "file://<path>"
name = "configure_system"

}

让我知道这是否有帮助

答案 2 :(得分:0)

bootstrap_action 中引用的脚本应该保存在 S3 上,或者是本地集群中的实例,而不是 Terraform 的本地文件系统。

这样你就可以使用类似下面的代码片段,但显然不能以这种方式上传本地脚本:

bootstrap_action {
  name = "openjdk11"
  path = "file:/usr/bin/sudo"
  args = ["amazon-linux-extras", "install", "java-openjdk11", "-y"]
}

除了 Github 上的一个示例外,我找不到任何对此的引用,但您可以自己轻松验证行为。

至于您为 Terraform 提供脚本的最初意图,您可能需要以某种不同的方式将其上传到 S3,或者如果它是单行的,则将其包装为上述单个命令。

答案 3 :(得分:0)

我能够将文件复制到主节点并在创建集群后在那里执行。也可以是核心实例。不确定它是否可以称为引导操作...

    resource "null_resource" "your_action_name" {
    
      triggers = {
        private_ip = data.aws_instance.master.private_ip
      }
    
      connection {
        type = "ssh"
        user = "ec2-user"
        host = data.aws_instance.master.private_ip
      }
    
      provisioner "file" {
        when        = create
        source      = "${path.module}/emr_bootstrap.sh"
        destination = "/tmp/emr_bootstrap.sh"
    
      }
    
      provisioner "remote-exec" {
        when = create
        inline = [
          "chmod +x /tmp/emr_bootstrap.sh",
          "/tmp/emr_bootstrap.sh"
        ]
      }
    }

如果需要,添加适当的 ssh 身份验证。

在data.tf中你需要添加:


    data "aws_instance" "master" {
      filter {
        name   = "dns-name"
        values = aws_emr_cluster.your_clister_name.*.master_public_dns
      }
    }