6. 使用 Terraform 从自定义 AMI 启动 EC2 实例
Source: Dev.to
要为您进行翻译,我需要您提供要翻译的具体文本内容(除代码块和 URL 之外)。请粘贴文章的正文部分,我会按照要求保留源链接、格式和技术术语,将其翻译成简体中文。
实验信息
Nautilus DevOps 团队需要从现有的 EC2 实例创建 AMI,以用于备份和扩展目的。
- 现有 EC2 实例名称:
devops-ec2 - 期望的 AMI 名称:
devops-ec2-ami - 新 EC2 实例名称:
devops-ec2-new(必须使用该 AMI 启动)
更新 main.tf 文件(不要创建单独的 .tf 文件)以:
- 从现有实例创建 AMI。
- 使用该 AMI 启动新的 EC2 实例。
创建一个 outputs.tf 文件,输出:
KKE_ami_id– 创建的 AMI 的 ID。KKE_new_instance_id– 新 EC2 实例的 ID。
实验解决方案
main.tf
# Step 1: Read the existing EC2 instance
data "aws_instance" "existing_ec2" {
filter {
name = "tag:Name"
values = ["devops-ec2"]
}
}
# Step 2: Create AMI from existing EC2
resource "aws_ami_from_instance" "devops_ami" {
name = "devops-ec2-ami"
source_instance_id = data.aws_instance.existing_ec2.id
}
# Step 3: Launch a new EC2 from the AMI
resource "aws_instance" "devops_ec2_new" {
ami = aws_ami_from_instance.devops_ami.id
instance_type = "t2.micro"
tags = {
Name = "devops-ec2-new"
}
}
outputs.tf
output "KKE_ami_id" {
value = aws_ami_from_instance.devops_ami.id
}
output "KKE_new_instance_id" {
value = aws_instance.devops_ec2_new.id
}
Terraform 命令(必需)
按顺序运行以下命令:
terraform init
terraform validate
terraform apply
# Type "yes" when prompted

Source: …
简单的逐步解释(原因与过程)
什么是 AMI?
AMI(Amazon Machine Image)是 快照 + 蓝图,用于描述一个 EC2 实例。它包括:
- 操作系统
- 已安装的软件
- 配置
- 磁盘数据
为什么要创建 AMI?
- 备份 EC2 实例
- 快速创建相同的服务器
- 高效实现水平扩展
- 实现灾难恢复
Terraform 代码的作用
-
查找已有的 EC2
data "aws_instance" "existing_ec2" { … }Terraform 读取
Name标签为devops-ec2的实例。此步骤不会创建新资源。 -
从该 EC2 创建 AMI
resource "aws_ami_from_instance" "devops_ami" { … }Terraform 告诉 AWS 冻结运行中实例的磁盘状态并生成 AMI。此过程可能需要几分钟。
-
使用 AMI 启动新 EC2
resource "aws_instance" "devops_ec2_new" { … }Terraform 基于该 AMI 创建全新的实例,得到与原实例相同的操作系统、软件和配置。
Terraform 如何确定正确的执行顺序
Terraform 会构建依赖图:
existing EC2 → AMI → new EC2
因为 AMI 资源依赖于已有实例,而新 EC2 又依赖于 AMI,Terraform 会自动按正确的顺序执行这些步骤。
terraform apply 时会发生什么
- Terraform 读取已有的 EC2。
- AWS 创建 AMI。
- Terraform 等待 AMI 可用。
- AWS 使用该 AMI 启动新 EC2。
- Terraform 将所有信息记录到状态文件中。
- 定义的输出会显示 AMI ID 和新实例 ID。
为什么输出很重要
- 确认 AMI 已成功创建。
- 确认新 EC2 实例已启动。
- KodeKloud(以及其他评分系统)会使用这些输出进行验证,省去手动检查 AWS 控制台的步骤。
常见错误需避免
- 硬编码实例 ID。
- 创建额外的
.tf文件(实验要求只有一个main.tf)。 - 在 AMI 尚未准备好时就启动新 EC2。
- 忘记定义必需的输出。
- 使用了错误的输出变量名(如
KKE_ami_id、KKE_new_instance_id)。
资源与后续步骤
- 完整代码仓库: KodeKloud Learning Labs
- 更多深入阅读: Whispering Cloud Insights – 额外的技术文章
- 加入讨论: DEV Community
致谢
所有实验均来自:KodeKloud