Terraform AWS VPC+可SSH登录EC2完整Demo
这是上一章节纯VPC网络架构的实战验证版 ,在原有网络底座基础上新增了安全控制和计算资源,最终实现:一键部署完整VPC网络 + 一台可通过SSH密钥安全登录的公网EC2实例,用于验证整个网络架构的连通性。
一、核心升级点(对比纯VPC Demo)
| 原有组件 | 新增组件 | 核心作用 |
|---|---|---|
| VPC/子网/IGW/NAT | 安全组 | 实例级防火墙,开放22端口允许SSH登录 |
| - | SSH密钥对 | 替代密码登录,更安全的远程访问方式 |
| - | 公网EC2实例 | 部署在公网子网,自动获得公网IP,作为网络验证节点 |
| - | outputs.tf | 自动输出实例公网IP等关键信息,方便连接 |
二、完整部署与验证流程
生成本地SSH密钥 → Terraform初始化 → 部署所有资源 → 获取实例公网IP → SSH登录验证
三、关键新增文件说明
1. security.tf(安全组配置)
hcl
# 创建允许SSH登录的安全组
resource "aws_security_group" "ssh_access" {
name = "ssh-access"
description = "Allow SSH access from anywhere"
vpc_id = aws_vpc.main.id
# 入站规则:允许所有IP访问22端口(SSH)
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# 出站规则:允许所有流量外出
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "ssh-access"
}
}
注意 :生产环境不要用0.0.0.0/0,应限制为你的办公IP。
2. instance.tf(EC2实例配置)
hcl
# 导入本地生成的SSH公钥到AWS
resource "aws_key_pair" "mykey" {
key_name = "mykey"
public_key = file("${path.module}/mykey.pub")
}
# 在公网子网创建EC2实例
resource "aws_instance" "public_test" {
ami = "ami-0c55b159cbfafe1f0" # Ubuntu 20.04 LTS (eu-west-1)
instance_type = "t2.micro" # 免费套餐可用
key_name = aws_key_pair.mykey.key_name
subnet_id = aws_subnet.main-public-1.id # 部署在公网子网
vpc_security_group_ids = [aws_security_group.ssh_access.id] # 关联安全组
tags = {
Name = "public-test-instance"
}
}
3. outputs.tf(输出关键信息)
hcl
output "ec2_public_ip" {
description = "EC2实例公网IP"
value = aws_instance.public_test.public_ip
}
四、精简执行步骤
-
生成SSH密钥对 (本地执行,生成私钥
mykey和公钥mykey.pub)bashssh-keygen -t rsa -b 2048 -f mykey -N "" -
部署所有资源
bashterraform init # 初始化项目 terraform plan # 预览资源 terraform apply # 确认部署 -
SSH登录验证
bash# Linux/Mac:设置密钥文件权限(必须,否则SSH会报错) chmod 400 mykey # 连接实例(IP从terraform output获取) ssh -i mykey ubuntu@$(terraform output -raw ec2_public_ip)
五、验证成功标准
- 执行
ssh命令后能成功进入Ubuntu系统命令行 - 在实例内执行
ping 8.8.8.8能通(验证公网路由正常) - 在实例内执行
curl ifconfig.me能返回实例公网IP
六、常见问题
- SSH连接被拒绝:检查安全组是否开放22端口,实例是否在公网子网
- 权限错误 :确保执行了
chmod 400 mykey,私钥文件权限不能太开放 - 密钥不匹配 :确保本地私钥
mykey和导入到AWS的公钥mykey.pub是一对
?