第13天:Terraform 数据源
Source: Dev.to
数据源
把数据源想象成一个电话簿,里面的用户名和电话号码是通过 API 访问的键‑值对。与其硬编码值,你可以使用键来检索它们。
简而言之,Terraform 对 AWS 的数据源让你能够获取已有 AWS 资源或外部数据的信息,然后在 Terraform 配置中引用这些信息。
示例: 创建 EC2 实例时需要 AMI ID。与其手动查找最新的 Amazon Linux 2 AMI,你可以使用数据源自动获取 AMI ID。
数据源使 Terraform 能够 读取 现有基础设施的信息。它们:
- 不会创建、更新或删除资源
- 允许你引用在其他地方管理的资源
- 能在团队之间共享基础设施
- 使用
data块而不是resource块来定义

如何使用 AWS 数据源
在 Terraform 配置中使用 data 块定义数据源:
data "provider_type" "name" {
# 用于过滤或标识数据源的配置设置
}
- provider_type – AWS 数据源的类型(例如
aws_ami、aws_vpc、aws_s3_bucket)。 - name – 用于引用该数据源的本地标识符。
- 配置设置 – 根据数据源不同而异,通常包括
id、name,或带有name与values参数的filter块。
示例:Data 与 Resource 块的区别
# Resource Block – Terraform 管理此资源
resource "aws_vpc" "my_vpc" {
cidr_block = "10.0.0.0/16"
}
# Data Block – Terraform 读取此资源
data "aws_vpc" "existing_vpc" {
filter {
name = "tag:Name"
values = ["shared-network-vpc"]
}
}
在 resource 块中,Terraform 创建并管理 VPC;在 data 块中,Terraform 仅读取符合提供的过滤条件的 已存在 VPC 的信息。
任务
使用 Terraform 创建一个 VPC,然后使用数据源获取 AMI ID 并在刚创建的 VPC 中启动 EC2 实例。

VPC 的创建
# 由其他团队模拟创建的基础设施
provider "aws" {
region = "us-east-1"
}
resource "aws_vpc" "shared" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "shared-network-vpc"
}
}
resource "aws_subnet" "shared" {
vpc_id = aws_vpc.shared.id
cidr_block = "10.0.1.0/24"
tags = {
Name = "shared-primary-subnet" # ← 这个标签很重要!
}
}
运行 plan 查看 Terraform 将执行的操作:
terraform plan
典型输出(为简洁起见已截断):
# aws_subnet.shared will be created
+ resource "aws_subnet" "shared" {
+ cidr_block = "10.0.1.0/24"
+ tags = {
+ "Name" = "shared-primary-subnet"
}
+ vpc_id = (known after apply)
}
# aws_vpc.shared will be created
+ resource "aws_vpc" "shared" {
+ cidr_block = "10.0.0.0/16"
+ enable_dns_support = true
+ tags = {
+ "Name" = "shared-network-vpc"
}
}