【问题标题】:Terraform EC2 userdata not runningTerraform EC2 用户数据未运行
【发布时间】:2019-07-18 15:52:23
【问题描述】:

我有以下实例:

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 中创建类似的实例时,它可以正常工作。

【问题讨论】:

  • 您是否尝试检查实例上的日志以查看用户数据未运行的原因?如果您的 remote-exec 配置程序未连接,那么您可能正在查看防火墙问题或配置错误。您没有提供任何错误消息或您正在运行的操作系统类型的任何信息,这使得您很难为您提供帮助。例如,不同的操作系统(如 Windows、Amazon Linux、Ubuntu 和 Container Linux)以不同的方式解析用户数据。尝试运行带有调试输出的 Terraform。见terraform.io/docs/internals/debugging.html

标签: amazon-web-services terraform


【解决方案1】:

不要将 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))}"

【讨论】:

  • 仅供参考 - 只要您的用户数据似乎没有运行,您的第一步应该是检查用户数据是否正确传递到 AWS。您可以通过在实例上运行curl http://169.254.169.254/latest/user-data 或通过在控制台中选择实例并查看其用户数据来执行此操作。下一步是检查实例上的日志以查找执行错误。
  • 它是 PaloAlto 的 Linux AMI。上面的代码还是不行。我现在试试调试。
  • 它不会改变结果,但你的代码可以简化为user_data = "vmseries-bootstrap-aws-s3bucket=${var.MasterS3Bucket}"
  • 我想通了。如果我删除网络接口,它可以工作。知道为什么吗?
  • 可能性:您在 ENI 上的安全组规则不正确,或者附加在索引 0 处的 ENI 可能会阻止访问元数据端点。不知道故障的细节就很难排除故障。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2018-11-11
相关资源
最近更新 更多