Terraform无法ssh到EC2实例以上载文件
我正在尝试建立并运行一个基本的terraform示例,然后在docker容器中推送一个非常简单的flask应用程序。如果我删除文件provisioner部分和用户数据部分,脚本都可以工作。pem文件与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
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
属性中使用它