使用数据源查询数据
利用数据源获取现有基础设施或外部服务的信息,从而实现更加动态且自适应的配置。
使用数据源查询数据 是 CoddyKit 上的免费 Terraform Infrastructure as Code 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Terraform Infrastructure as Code 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Terraform Infrastructure as Code 课程共包含 4 节课。
什么是数据源
在 Terraform 中,我们经常需要引用现有基础设施或当前配置未管理的外部数据。
这正是数据源发挥作用的地方!数据源允许您的 Terraform 配置获取有关已配置资源或外部服务的信息。
数据源与资源的区别
区分数据源和资源非常重要。
- 资源定义 Terraform 将创建、更新或删除的基础设施。
- 数据源只获取有关现有基础设施或数据的信息,不会创建或修改任何内容。
您可以将它们理解为针对基础设施的只读查询。
实际使用场景
数据源在以下场景中非常有用:
- 查找现有虚拟私有云(VPC)的 ID。
- 获取 EC2 实例所需的最新 Amazon Machine Image(AMI)。
- 从机密管理服务中获取机密信息。
- 查询 DNS 记录或网络配置。
它们可以让您的配置更具动态性,并减少硬编码。
定义数据源
数据源块的形式与资源块相似。它以 data 关键字开头,后面依次是提供商、类型和本地名称。
data "aws_vpc" "selected" {
filter {
name = "tag:Name"
values = ["my-existing-vpc"]
}
}使用获取的数据
数据源获取信息后,其属性便可供配置的其他部分使用。您可以使用以下语法引用这些属性:data.<TYPE>.<NAME>.<ATTRIBUTE>。
例如,要获取我们所选 VPC 的 ID:
output "vpc_id" {
value = data.aws_vpc.selected.id
}获取最新的 AMI
一个常见任务是查找 EC2 实例所需的最新 Amazon Machine Image(AMI)。这样可以避免将 AMI ID 硬编码,使您的配置更加健壮。
以下是获取最新 Amazon Linux 2 AMI 的方法:
provider "aws" {
region = "us-east-1"
}
data "aws_ami" "amazon_linux_2" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["amzn2-ami-hvm-*-x86_64-gp2"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
output "latest_ami_id" {
value = data.aws_ami.amazon_linux_2.id
}动态 S3 策略文档
数据源不仅适用于云资源。aws_iam_policy_document 数据源可以帮助您以结构化方式构建复杂的 IAM 策略。
它不会创建策略,而是生成 JSON 文档,之后您可以将其应用于 S3 存储桶等资源。
provider "aws" {
region = "us-east-1"
}
data "aws_iam_policy_document" "s3_read_only_policy" {
statement {
principals {
type = "AWS"
identifiers = ["arn:aws:iam::123456789012:user/example-user"]
}
actions = [
"s3:GetObject",
"s3:ListBucket"
]
resources = [
"arn:aws:s3:::my-example-bucket",
"arn:aws:s3:::my-example-bucket/*"
]
}
}
output "policy_json" {
value = data.aws_iam_policy_document.s3_read_only_policy.json
}优化搜索
许多数据源支持筛选器块。您可以使用这些筛选器指定条件,缩小结果范围,并确保获取正确的资源或数据。
筛选器通常接受 name(用于筛选的属性)和 values(该属性可接受值的列表)。
data "aws_instance" "web" {
instance_state_names = ["running"]
filter {
name = "tag:Environment"
values = ["production"]
}
filter {
name = "instance-type"
values = ["t2.micro", "t3.micro"]
}
}数据源最佳实践
为了让您的配置保持整洁高效:
- 具体明确:使用筛选器确保获取所需的确切数据,避免歧义。
- 幂等性:数据源本身具有幂等性,这意味着多次运行会产生相同的结果。
- 减少调用:仅在必要时获取数据,以加快
terraform plan操作。 - 结合输出:使用输出公开其他配置或用户可能需要的已获取数据。
数据源测验
以下关于 Terraform 数据源的说法哪些是 TRUE?
总结:查询数据
您已经了解 Terraform 的数据源如何让配置查询并获取有关现有基础设施或外部服务的信息。
通过避免硬编码值并适应环境的当前状态,这项强大功能可以让配置更具动态性、灵活性和健壮性。请记住,数据源只负责读取,绝不会创建或修改内容!
常见问题解答
「使用数据源查询数据」课时是免费的吗?
是的 — 「使用数据源查询数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Terraform Infrastructure as Code 课程的其余内容,请升级到 CoddyKit PRO。 Terraform Infrastructure as Code 课程共包含 4 节课。
「使用数据源查询数据」这节课中我会学到什么?
利用数据源获取现有基础设施或外部服务的信息,从而实现更加动态且自适应的配置。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Terraform Infrastructure as Code 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Terraform Infrastructure as Code 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用数据源查询数据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Terraform Infrastructure as Code 课中编写并运行代码吗?
能。每节 Terraform Infrastructure as Code 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用数据源查询数据
- 本地与远程执行配置器
- 空资源与触发器
- 使用外部数据与模板