Terraform: AWS VPC+可SSH登录EC2

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
}

四、精简执行步骤

  1. 生成SSH密钥对 (本地执行,生成私钥mykey和公钥mykey.pub

    bash 复制代码
    ssh-keygen -t rsa -b 2048 -f mykey -N ""
  2. 部署所有资源

    bash 复制代码
    terraform init   # 初始化项目
    terraform plan   # 预览资源
    terraform apply  # 确认部署
  3. 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

六、常见问题

  1. SSH连接被拒绝:检查安全组是否开放22端口,实例是否在公网子网
  2. 权限错误 :确保执行了chmod 400 mykey,私钥文件权限不能太开放
  3. 密钥不匹配 :确保本地私钥mykey和导入到AWS的公钥mykey.pub是一对

相关推荐
像风一样自由202019 小时前
加强版VScode结合remote-ssh远程连接服务器开发指南
服务器·vscode·ssh
国际云,接待1 天前
云服务器 SSH 被扫爆了怎么办:安全组、密钥登录与 Fail2ban 的完整加固清单
服务器·安全·ssh
测试运维日常笔记1 天前
AWS EKS 集群部署与清理手顺
云计算·aws
故乡dee云2 天前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
RisunJan2 天前
Linux命令-ssh-keyscan(从主机收集公钥)
linux·ssh
RisunJan3 天前
Linux命令-sshd(SSH 服务器守护进程)
linux·服务器·ssh
翼龙云_cloud4 天前
亚马逊云代理商:VPC网络ACL和安全组配置实践 从网络层到实例层的双重防护
运维·网络·安全·云计算·aws
杨浦老苏5 天前
开源堡垒机 Warpgate:一个容器搞定 SSH、MySQL 和 Web 访问
运维·docker·ssh·堡垒机·群晖
90后小陈老师7 天前
Windows 10 下 Gitee SSH 连接配置详解(附常见问题解决)
windows·gitee·ssh
dyxal7 天前
SSH本地端口转发完全解析:像“挖掘隧道”一样安全访问远程数据库
数据库·安全·ssh