Terraform无法ssh到EC2实例以上载文件

Terraform无法ssh到EC2实例以上载文件,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我正在尝试建立并运行一个基本的terraform示例,然后在docker容器中推送一个非常简单的flask应用程序。如果我删除文件provisioner部分和用户数据部分,脚本都可以工作。pem文件与main.tf脚本和terraform.exe文件在我的磁盘上的位置相同 如果我将文件provisioner保留在中,则脚本将失败,并出现以下错误: Error: Error applying plan: 1 error(s) occurred: * aws_launch_configurati

我正在尝试建立并运行一个基本的terraform示例,然后在docker容器中推送一个非常简单的flask应用程序。如果我删除文件provisioner部分和用户数据部分,脚本都可以工作。pem文件与
main.tf
脚本和
terraform.exe
文件在我的磁盘上的位置相同

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

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\u 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
  }
}
资源“aws\u启动\u配置”示例{
image_id=“${lookup(var.eu_west_ami,var.region)}”
实例_type=“t2.micro”
key_name=“Terraform python”
security_groups=[“${aws_security_group.instance.id}”]
供应器“文件”{
source=“python/hello\u flask.py”
destination=“/home/ec2 user/hello\u flask.py”
联系{
type=“ssh”
user=“ec2用户”
private_key=“${file(“Terraform python.pem”)}”
超时=“2m”
代理=错误
}
}
供应器“文件”{
source=“python/flask\u dockerfile”
destination=“/home/ec2 user/flask\u dockerfile”
联系{
type=“ssh”
user=“ec2用户”
private_key=“${file(“Terraform python.pem”)}”
超时=“2m”
代理=错误
}
}

用户_data=
aws_launch_配置
不是实际的EC2实例,只是启动实例的“模板”。因此,无法通过SSH连接到它

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

  • 创建自定义AMI。为此,您可以使用或地形化自身,使用
    aws\u instance
    和这些文件供应器启动EC2实例,并使用
    aws\u AMI

  • 第二种不是最佳做法,但如果文件较短,则可以将其包含在
    用户\u数据中


因此,如果我选择执行选项一,那么我是否仍然可以在aws\u launch\u配置块中使用新创建的aws\u实例,或者我的脚本的这部分是否需要重写?首先设置一个aws\u实例,然后从中创建一个aws\u ami,最后可以在aws\u launch\u配置中使用该ami您是否有指向github或tuto的链接这说明了如何做到这一点?从文档中不清楚如何在aws_ami块中使用aws_实例,也不清楚如何在启动配置中使用它。我已经为docker实例创建了aws_实例,但无法确定如何使用它。我试过了我认为你的意思,但它似乎不起作用,至少我认为它不起作用我已经尝试过了!我创建了一个aws\u实例,它可以正常工作,然后我使用aws\u ami\u from\u实例创建了一个ami,它似乎也可以工作,但似乎没有办法让启动配置使用它。文档说aws\u ami的所有属性都是公开的,但它似乎不喜欢ami\u id。如果你有一个可以工作的示例,我会非常感谢h想看看。是的,aws\u ami资源确实导出了ami id:然后您可以在
aws\u launch\u配置的
image\u id
属性中使用它