首页 > 解决方案 > Terraform EC2 用户数据未运行

问题描述

我有以下实例:

resource "aws_instance" "FWInstance" {
  disable_api_termination = false
  iam_instance_profile = "${aws_iam_instance_profile.FirewallBootstrapInstanceProfile2Tier.name}"
  instance_initiated_shutdown_behavior = "stop"
  ebs_optimized = true
  ami = "${var.PANFWRegionMap[var.aws_region]}"
  instance_type = "m4.xlarge"

  ebs_block_device {
    device_name = "/dev/xvda"
    volume_type = "gp2"
    delete_on_termination = true
    volume_size = 60
  }

  key_name = "${var.ServerKeyName}"
  monitoring = false

  network_interface {
    device_index = 0
    network_interface_id = "${aws_network_interface.FWManagementNetworkInterface.id}"
  }

  user_data = "${base64encode(join("", list("vmseries-bootstrap-aws-s3bucket=", var.MasterS3Bucket)))}"
}

通过 terraform 运行它时,它会创建实例,但会在 VM 登录时停止,并且从不运行 user_data 代码。

我尝试像这样使用 remote_exec:

provisioner "remote-exec" {
    inline = ["# Connected!"]
  } 

它等待 5 分钟。并且由于那时没有创建实例而出错。

有没有办法通过 terraform 在这个 ec2 实例中运行用户数据?当我在没有 terraform 的 AWS 中创建类似的实例时,它工作正常。

标签: amazon-web-servicesterraform

解决方案


不要将 base64 编码的数据传递给user_data,因为 Terraform 将为您进行 base64 编码。请参阅https://www.terraform.io/docs/providers/aws/r/instance.html#user_data

如果必须传入 base64 编码数据,请user_data_base64改用。

将您的代码更改为:

  user_data = "${join("", list("vmseries-bootstrap-aws-s3bucket=", var.MasterS3Bucket))}"

推荐阅读