【问题标题】:Terraform cannot ssh into EC2 instance to upload filesTerraform 无法通过 ssh 进入 EC2 实例以上传文件
【发布时间】:2019-03-18 08:54:23
【问题描述】:

我正在尝试启动并运行一个基本的 terraform 示例,然后将一个非常简单的烧瓶应用程序推送到那里的 docker 容器中。如果我删除文件配置器部分和用户数据部分,该脚本所有工作。 pem 文件与main.tf 脚本和terraform.exe 文件在我的磁盘上的位置相同。

如果我将文件配置器保留在其中,则脚本将失败并出现以下错误:

Error: Error applying plan:

1 error(s) occurred:

* aws_launch_configuration.example: 1 error(s) occurred:

* dial tcp :22: connectex: No connection could be made because the target    machine actively refused it.

如果我删除文件配置部分,脚本运行良好,我可以使用我的私钥 ssh 进入创建的实例,因此key_name 部分似乎工作正常,我认为这与文件配置程序尝试连接有关添加我的文件。

这是我脚本中的启动配置,我尝试使用从另一个在线帖子中获得的连接块,但我看不出我做错了什么。

resource "aws_launch_configuration" "example" {
  image_id = "${lookup(var.eu_west_ami, var.region)}"
  instance_type = "t2.micro"
  key_name      = "Terraform-python"
  security_groups = ["${aws_security_group.instance.id}"]
  provisioner "file" {
    source      = "python/hello_flask.py"
    destination = "/home/ec2-user/hello_flask.py"
    connection {
        type     = "ssh"
        user     = "ec2-user"       
        private_key = "${file("Terraform-python.pem")}"
        timeout = "2m"
        agent = false
    }
  }
  provisioner "file" {
    source      = "python/flask_dockerfile"
    destination = "/home/ec2-user/flask_dockerfile" 
    connection {
        type     = "ssh"
        user     = "ec2-user"       
        private_key = "${file("Terraform-python.pem")}"
        timeout = "2m"
        agent = false
    }
  }
  user_data = <<-EOF
          #!/bin/bash
          sudo yum update -y
          sudo yum install -y docker
          sudo service docker start
          sudo usermod -a -G docker ec2-user
          sudo docker build -t flask_dockerfile:latest /home/ec2-user/flask_dockerfile
          sudo docker run -d -p 5000:5000 flask_dockerfile
          EOF
  lifecycle {
     create_before_destroy = true
  }
}

这可能是我正在做的非常简单和愚蠢的事情,提前感谢任何人看一看。

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    aws_launch_configuration 不是实际的 EC2 实例,而只是启动实例的“模板”。因此,无法通过 SSH 连接到它。

    要复制这些文件,您有两个选择:

    • 创建自定义 AMI。为此,您可以使用 Packer 或 Terraform 本身,使用 aws_instance 和这些文件配置器启动 EC2 实例,并使用 aws_ami 从它创建一个 AMI

    • 第二个不是最佳实践,但如果文件很短,您可以将它们包含在 user_data 中。

    【讨论】:

    • 因此,如果我选择执行选项一,我可以在 aws_launch_configuration 块内使用新创建的 aws_instance 还是需要重写我的脚本的这一部分?
    • 您首先设置一个 aws_instance,然后从中创建一个 aws_ami,最后您可以在 aws_launch_configuration 中使用该 ami
    • 你有 github 的链接或演示如何执行此操作的教程吗?从文档中不清楚您如何在 aws_ami 块中使用 aws_instance,也不清楚如何在启动配置中使用它。我已经为我的 docker 实例创建了 aws_instance,但不知道如何使用它。
    • 我尝试了我认为你的意思,但它似乎不起作用,至少我已经尝试过!我创建了一个 aws_instance 并且工作正常,然后我使用 aws_ami_from_instance 创建了一个 ami,这似乎也可以工作,但似乎没有办法让启动配置使用它。文档说 aws_ami 的所有属性都已公开,但它似乎不喜欢 ami_id。如果您有一个工作示例,我非常希望看到它。
    • 是的 aws_ami 资源确实导出了 ami id:terraform.io/docs/providers/aws/r/ami.html#attributes-reference 然后您可以在aws_launch_configurationimage_id 属性中使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2013-06-20
    • 1970-01-01
    • 2020-08-28
    • 2011-10-30
    • 2021-02-04
    相关资源
    最近更新 更多