配置 EC2 实例
编写 Terraform 配置以部署和管理 Amazon EC2 虚拟机,包括网络和安全组设置。
配置 EC2 实例 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。
使用 Terraform 管理 EC2 实例
欢迎您!在本课中,您将学习如何使用 Terraform 预配和管理 Amazon EC2 虚拟机。
EC2(弹性计算云)在云中提供可扩展的虚拟服务器。使用 Terraform 通过基础设施即代码管理 EC2,意味着您可以用代码定义服务器,确保部署一致且可重复。
定义 EC2 实例
在 Terraform 中,EC2 实例的核心资源是 aws_instance。您至少需要指定两个关键参数:
ami:要使用的 Amazon Machine Image(OS、软件)。instance_type:硬件配置(例如,符合免费套餐条件的实例可使用t2.micro)。
以下是基本的 aws_instance 块:
resource "aws_instance" "web_server" {
ami = "ami-053b04dcd42d5397e" # Example: Amazon Linux 2 in us-east-1
instance_type = "t2.micro"
tags = {
Name = "MyWebServer"
}
}启动您的第一个 EC2 实例
让我们将所有内容组合起来,启动一个简单的 EC2 实例。此配置定义 AWS 提供商和 EC2 实例。
要进行部署,请将其保存为 .tf 文件,然后在终端中依次运行 terraform init、terraform plan 和 terraform apply。
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "web_server" {
ami = "ami-053b04dcd42d5397e" # Amazon Linux 2 AMI for us-east-1
instance_type = "t2.micro"
tags = {
Name = "MyBasicWebServer"
}
}保护您的 EC2:安全组
安全组充当 EC2 实例的虚拟防火墙。它们控制允许到达实例或离开实例的入站(入口)和出站(出口)网络流量。
正确配置安全组至关重要,这样既能保护服务器免受未经授权的访问,又能允许 SSH 或 HTTP 等必要服务通过。
创建安全组
您可以使用 aws_security_group 资源定义安全组。我们将添加一条 ingress 规则,允许来自任何位置(0.0.0.0/0)的 SSH 访问(端口 22)。
您需要为安全组指定一个现有的 vpc_id,以确定其所属的 VPC。
resource "aws_security_group" "allow_ssh" {
name = "allow_ssh_traffic"
description = "Allow SSH inbound traffic"
vpc_id = "vpc-0123456789abcdef0" # IMPORTANT: Replace with YOUR VPC ID!
ingress {
description = "SSH from anywhere"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1" # All protocols
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "allow_ssh_sg"
}
}将安全组附加到 EC2
现在,让我们更新 aws_instance,使其使用这个新的安全组。我们使用 aws_security_group.allow_ssh.id 引用安全组的 ID。
请记得将安全组中的 vpc_id 替换为 AWS 账户中的实际 VPC ID,使配置可以运行。
provider "aws" {
region = "us-east-1"
}
resource "aws_security_group" "allow_ssh" {
name = "allow_ssh_traffic_example"
description = "Allow SSH inbound traffic"
vpc_id = "vpc-0123456789abcdef0" # IMPORTANT: Replace with YOUR VPC ID!
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"]
}
}
resource "aws_instance" "web_server" {
ami = "ami-053b04dcd42d5397e"
instance_type = "t2.micro"
vpc_security_group_ids = [
aws_security_group.allow_ssh.id
]
tags = {
Name = "WebServerWithSSH"
}
}EC2 网络:VPC 与子网
每个 EC2 实例都位于一个虚拟私有云(VPC)中,以及该 VPC 内的特定子网中。VPC 是一个隔离的虚拟网络,而子网是 VPC 的逻辑划分(例如公有子网或私有子网)。
默认情况下,EC2 可能会在默认 VPC/子网中启动。为了获得更多控制并改善组织管理,您通常需要指定实例应使用的子网。
创建基本网络
为了完全控制 EC2 的网络,让我们定义一个最小化的 VPC 和一个公有子网。这还需要一个用于提供公有访问的互联网网关,以及一个用于引导流量的路由表。
这一完整设置可确保您的 EC2 能够与互联网通信。
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "main-vpc-lesson"
}
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
map_public_ip_on_launch = true # Instances in this subnet get a public IP
tags = {
Name = "public-subnet-lesson"
}
}
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "main-gw-lesson"
}
}
resource "aws_route_table" "public_rt" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0" # Traffic to the internet
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "public-rt-lesson"
}
}
resource "aws_route_table_association" "public_rt_assoc" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public_rt.id
}在自定义网络中运行 EC2
现在,我们将组合所有部分:自定义 VPC、子网、安全组和 EC2 实例。EC2 将在指定的公有子网中启动,并自动获取公有 IP。
这一完整配置让您可以精细控制 EC2 的部署,并使其能够通过 SSH 访问。
provider "aws" {
region = "us-east-1"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = { Name = "main-vpc-lesson" }
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
map_public_ip_on_launch = true
tags = { Name = "public-subnet-lesson" }
}
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = { Name = "main-gw-lesson" }
}
resource "aws_route_table" "public_rt" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = { Name = "public-rt-lesson" }
}
resource "aws_route_table_association" "public_rt_assoc" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public_rt.id
}
resource "aws_security_group" "allow_ssh" {
name = "allow_ssh_lesson"
description = "Allow SSH inbound traffic"
vpc_id = aws_vpc.main.id
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"]
}
}
resource "aws_instance" "web_server" {
ami = "ami-053b04dcd42d5397e"
instance_type = "t2.micro"
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [
aws_security_group.allow_ssh.id
]
associate_public_ip_address = true
tags = {
Name = "FullWebServerLesson"
}
}EC2 配置检查
以下哪些参数对于在 Terraform 中定义基本的 aws_instance 资源是必需的?
回顾:使用 Terraform 管理 EC2
做得好!您已经学会了如何使用 Terraform 创建 Amazon EC2 实例。
- 我们使用
aws_instance资源定义了 EC2 实例。 - 我们使用
aws_security_group保护这些实例,并控制网络流量。 - 我们设置了一个用于承载 EC2 的基本自定义网络(VPC、子网、互联网网关和路由表)。
- 现在,您已经具备用代码部署和管理虚拟服务器的基础了!
常见问题解答
「配置 EC2 实例」课时是免费的吗?
是的 — 「配置 EC2 实例」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。
「配置 EC2 实例」这节课中我会学到什么?
编写 Terraform 配置以部署和管理 Amazon EC2 虚拟机,包括网络和安全组设置。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DevOps Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「配置 EC2 实例」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DevOps Bootcamp 课中编写并运行代码吗?
能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- AWS 提供商配置
- 配置 EC2 实例
- 管理 S3 存储桶与 IAM
- 配置 VPC 与网络