Logo
Section 1 / 3

详细资源

本节课将探讨Terraform资源的含义、工作原理,以及如何为资源添加属性。

导入

详细资源

本节课将探讨Terraform资源的含义、工作原理,以及如何为资源添加属性。

Terraform 资源

Terraform 中的资源代表现实世界中的实体。例如,一个资源可以是 AWS 负载均衡器、PagerDuty 中的告警、Vault 中的策略等。资源是 Terraform 的基础,它允许你定义如何在现实中创建某个对象。需要注意的是,你可以在同一个项目中创建来自多个供应商(例如多个云平台)的资源。

你的项目资源

让我们更详细地看一下在[上一章]中定义的资源:

1 2resource "aws_s3_bucket" "first_bucket" { 3 bucket = "<yourname>-first-bucket" 4}

资源类型 aws_s3_bucket 以提供方名称开头,后跟下划线(aws_)。这样你可以仅通过资源名称的第一个词判断该资源将在哪个厂商或组件中创建。

资源示例

再来看几个其他例子:

1 2resource "google_folder" "department" { 3 display_name = "Department" 4 parent = "organisation/1234567" 5}

上述 department 资源将在 Google Cloud(GCP)中创建一个文件夹。可以看到其名称以 google_ 开头,这是 Google Cloud(GCP)提供方的命名前缀。该提供方下的所有资源都将以 google_ 开头。

PostgreSQL 提供方资源示例

1 2resource "postgresql_role" "my_role" { 3 name = "my_role" 4 login = true 5 password = "password123" 6}

上述 my_role 资源将在 PostgreSQL 数据库中创建一个登录账号,用户名为 my_role,密码为 password123。该资源名称以 postgresql_ 开头,这也是 PostgreSQL 提供方下所有资源的统一前缀。

回顾我们之前定义的 S3 存储桶资源,引号内的最后一个词 "first_bucket" 是该 S3 存储桶在 Terraform 项目中的标识符。这个标识符用于在项目内部引用该资源实例。如果你创建了同一资源的多个实例(例如多个 S3 存储桶),就可以通过不同的标识符来区分它们。

资源属性

构成资源主体的键值对称为资源的属性。某些属性是必填的,另一些则是可选的。对于 AWS S3 存储桶来说,唯一必需的属性是存储桶名称。当然,我们也可以设置更多属性。例如:

1 2resource "aws_s3_bucket" "first_bucket" { 3 bucket = "kevholditch-first-bucket" 4 acl = "private" 5 6 versioning { 7 enabled = true 8 mfa_delete = false 9 } 10}

在上面的例子中,我们将 acl 设置为 private,表示该存储桶仅允许私有访问。同时我们还设置了两个版本控制相关的属性:启用版本控制,并且删除对象时不需要 MFA 认证。可以看到,版本控制的属性被嵌套在一个对象中,这是资源设计者为了将所有版本控制相关属性归组而采用的结构。此外,版本控制中的两个属性是布尔值(true/false),不像字符串那样需要用引号包围。

你可以在 Terraform 提供方的文档页面查看 S3 存储桶支持的所有属性完整列表。这些文档通常很容易通过搜索引擎找到。

另一种资源类型

再来看另一种资源类型,以便了解资源属性中可以使用的其他数据类型:

1 2resource "aws_security_group" "my_security_group" { 3 name = "allow_tls" 4 ingress { 5 protocol = "tcp" 6 from_port = 443 7 to_port = 443 8 cidr_blocks = ["10.0.0.0/16", "11.0.0.0/16"] 9 } 10}

在这个资源中,我们看到了另外两种数据类型:数字和列表。端口属性(from_port 和 to_port)是数值型,赋值时无需加引号。cidr_blocks 是列表类型,用于指定允许访问此安全组的 CIDR 地址块。可以看出,列表的写法类似于 JSON 字符串数组,使用方括号包裹元素。

Terraform 简介

插值语法