0Pricing
DevOps Bootcamp · 课时

配置 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. AWS 提供商配置
  2. 配置 EC2 实例
  3. 管理 S3 存储桶与 IAM
  4. 配置 VPC 与网络
← 返回 DevOps Bootcamp