Terraform EC2 网络中断
Terraform EC2 networking broken
我正在使用 Terraform 0.12.26,我想构建一个 AWS Ubuntu 机器实例。
当我 运行 terraform apply
时,一切看起来都正常...但我无法通过 ssh 连接到新的 EC2 机器。我的家庭防火墙允许 ssh 无处不在,我可以 ssh 到任何其他互联网资源。
如果我在同一区域/az 手动安装 EC2 实例,ssh 工作正常...这个问题似乎仅限于 Terraform。
$ terraform apply
...
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_key_pair.mykeypair: Creating...
aws_vpc.main: Creating...
aws_key_pair.mykeypair: Creation complete after 2s [id=mykeypair-pub]
aws_vpc.main: Still creating... [10s elapsed]
aws_vpc.main: Creation complete after 14s [id=vpc-0396212cf58236e68]
aws_subnet.first_subnet: Creating...
aws_security_group.ingress-policy-example: Creating...
aws_subnet.first_subnet: Creation complete after 10s [id=subnet-0558eb0d5c2a4cb3e]
aws_security_group.ingress-policy-example: Still creating... [10s elapsed]
aws_security_group.ingress-policy-example: Creation complete after 13s [id=sg-080e7fa96dc485107]
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Creation complete after 25s [id=i-0aaf3c53023c1226f]
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
Outputs:
ip = 34.217.88.173
$ telnet 34.217.88.173 22
Trying 34.217.88.173...
telnet: Unable to connect to remote host: Resource temporarily unavailable
$
这是我的地形代码:
$ cat main.tf
provider "aws" {
region = var.region
access_key = "SECRET_ACCESS_KEY_HERE"
secret_key = "SECRET_KEY_HERE"
# Allow any 2.x version of the AWS provider
version = "~> 2.0"
}
variable region {
default = "us-west-2"
}
variable availability_zone_01 {
default = "us-west-2a"
}
variable key_path {
default = "~/.ssh/id_rsa.pub"
}
variable site_supernet {
default = "10.0.0.0/16"
}
variable first_subnet {
default = "10.0.1.0/24"
}
resource "aws_vpc" "main" {
cidr_block = var.site_supernet
enable_dns_hostnames = true
enable_dns_support = true
instance_tenancy = "default"
tags = {
Name = "tag-primary-vpc"
}
}
resource "aws_subnet" "first_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = var.first_subnet
availability_zone = var.availability_zone_01
map_public_ip_on_launch = true
tags = {
Name = "tag-first_subnet"
}
}
resource "aws_security_group" "ingress-policy-example" {
vpc_id = aws_vpc.main.id
ingress {
cidr_blocks = ["0.0.0.0/0",]
from_port = 22 # Port from 22 to 22...
to_port = 22
protocol = "tcp"
}
## This egress rule was missing from my original question...
egress {
# Terraform doesn't allow all egress traffic by default...
cidr_blocks = ["0.0.0.0/0"]
from_port = 0
to_port = 0
protocol = "-1"
}
tags = {
Name = "tag-sg-allow-ssh"
}
}
resource "aws_key_pair" "mykeypair" {
key_name = "mykeypair-pub"
public_key = file(var.key_path)
}
resource "aws_instance" "example" {
#ami = "ami-0994c095691a46fb5"
ami = "ami-003634241a8fcdec0"
instance_type = "t2.nano"
key_name = aws_key_pair.mykeypair.key_name
subnet_id = aws_subnet.first_subnet.id
vpc_security_group_ids = [
aws_security_group.ingress-policy-example.id,
]
associate_public_ip_address = true
root_block_device {
delete_on_termination = false
}
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install openssh-server
EOF
tags = {
Name = "Whosebug_20200619"
}
}
output "ip" {
value = aws_instance.example.public_ip
}
问题:如何修复此 terraform 部署以便我可以通过 ssh 连接到上面的服务器?
我尝试了什么:
- 正在使用密钥授权手动构建 Ubuntu 映像;这工作正常,我可以通过 ssh 访问它
- 正在删除 terraform 安全组;没有帮助
- 更改了 AWS Terraform 区域/可用性区域;没有帮助
- 删除
user_data
包安装;没有帮助
- 删除
aws_subnet
;没有帮助
- 删除
instance_tenancy
;没有帮助
- 用另一个ssh密钥替换ssh密钥;没有帮助
- 用静态用户名/密码替换ssh密钥;没有帮助
- 使用 PuTTY 从 Windows 使用 SSH(而不是 linux & openssh);没有帮助
您的 VPC 没有互联网网关 (IGW)。您需要创建它并为其添加路由 table 条目。
添加这些资源应该可行(在我的 phone 上写了这个,所以你的里程可能会有所不同):
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "main"
}
}
resource "aws_route" "r" {
route_table_id = aws_route_table.rt
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
resource "aws_route_table" "rt" {
vpc_id = aws_vpc.main.id
}
resource "aws_route_table_association" "rta" {
subnet_id = aws_subnet.first_subnet.id
route_table_id = aws_route_table.rt.id
}
我正在使用 Terraform 0.12.26,我想构建一个 AWS Ubuntu 机器实例。
当我 运行 terraform apply
时,一切看起来都正常...但我无法通过 ssh 连接到新的 EC2 机器。我的家庭防火墙允许 ssh 无处不在,我可以 ssh 到任何其他互联网资源。
如果我在同一区域/az 手动安装 EC2 实例,ssh 工作正常...这个问题似乎仅限于 Terraform。
$ terraform apply
...
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_key_pair.mykeypair: Creating...
aws_vpc.main: Creating...
aws_key_pair.mykeypair: Creation complete after 2s [id=mykeypair-pub]
aws_vpc.main: Still creating... [10s elapsed]
aws_vpc.main: Creation complete after 14s [id=vpc-0396212cf58236e68]
aws_subnet.first_subnet: Creating...
aws_security_group.ingress-policy-example: Creating...
aws_subnet.first_subnet: Creation complete after 10s [id=subnet-0558eb0d5c2a4cb3e]
aws_security_group.ingress-policy-example: Still creating... [10s elapsed]
aws_security_group.ingress-policy-example: Creation complete after 13s [id=sg-080e7fa96dc485107]
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Creation complete after 25s [id=i-0aaf3c53023c1226f]
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
Outputs:
ip = 34.217.88.173
$ telnet 34.217.88.173 22
Trying 34.217.88.173...
telnet: Unable to connect to remote host: Resource temporarily unavailable
$
这是我的地形代码:
$ cat main.tf
provider "aws" {
region = var.region
access_key = "SECRET_ACCESS_KEY_HERE"
secret_key = "SECRET_KEY_HERE"
# Allow any 2.x version of the AWS provider
version = "~> 2.0"
}
variable region {
default = "us-west-2"
}
variable availability_zone_01 {
default = "us-west-2a"
}
variable key_path {
default = "~/.ssh/id_rsa.pub"
}
variable site_supernet {
default = "10.0.0.0/16"
}
variable first_subnet {
default = "10.0.1.0/24"
}
resource "aws_vpc" "main" {
cidr_block = var.site_supernet
enable_dns_hostnames = true
enable_dns_support = true
instance_tenancy = "default"
tags = {
Name = "tag-primary-vpc"
}
}
resource "aws_subnet" "first_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = var.first_subnet
availability_zone = var.availability_zone_01
map_public_ip_on_launch = true
tags = {
Name = "tag-first_subnet"
}
}
resource "aws_security_group" "ingress-policy-example" {
vpc_id = aws_vpc.main.id
ingress {
cidr_blocks = ["0.0.0.0/0",]
from_port = 22 # Port from 22 to 22...
to_port = 22
protocol = "tcp"
}
## This egress rule was missing from my original question...
egress {
# Terraform doesn't allow all egress traffic by default...
cidr_blocks = ["0.0.0.0/0"]
from_port = 0
to_port = 0
protocol = "-1"
}
tags = {
Name = "tag-sg-allow-ssh"
}
}
resource "aws_key_pair" "mykeypair" {
key_name = "mykeypair-pub"
public_key = file(var.key_path)
}
resource "aws_instance" "example" {
#ami = "ami-0994c095691a46fb5"
ami = "ami-003634241a8fcdec0"
instance_type = "t2.nano"
key_name = aws_key_pair.mykeypair.key_name
subnet_id = aws_subnet.first_subnet.id
vpc_security_group_ids = [
aws_security_group.ingress-policy-example.id,
]
associate_public_ip_address = true
root_block_device {
delete_on_termination = false
}
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install openssh-server
EOF
tags = {
Name = "Whosebug_20200619"
}
}
output "ip" {
value = aws_instance.example.public_ip
}
问题:如何修复此 terraform 部署以便我可以通过 ssh 连接到上面的服务器?
我尝试了什么:
- 正在使用密钥授权手动构建 Ubuntu 映像;这工作正常,我可以通过 ssh 访问它
- 正在删除 terraform 安全组;没有帮助
- 更改了 AWS Terraform 区域/可用性区域;没有帮助
- 删除
user_data
包安装;没有帮助 - 删除
aws_subnet
;没有帮助 - 删除
instance_tenancy
;没有帮助 - 用另一个ssh密钥替换ssh密钥;没有帮助
- 用静态用户名/密码替换ssh密钥;没有帮助
- 使用 PuTTY 从 Windows 使用 SSH(而不是 linux & openssh);没有帮助
您的 VPC 没有互联网网关 (IGW)。您需要创建它并为其添加路由 table 条目。
添加这些资源应该可行(在我的 phone 上写了这个,所以你的里程可能会有所不同):
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "main"
}
}
resource "aws_route" "r" {
route_table_id = aws_route_table.rt
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
resource "aws_route_table" "rt" {
vpc_id = aws_vpc.main.id
}
resource "aws_route_table_association" "rta" {
subnet_id = aws_subnet.first_subnet.id
route_table_id = aws_route_table.rt.id
}