Resource 介绍
什么是资源
在 Terraform 领域,资源是基础设施元素,例如 ECS 实例和 OSS Bucket,这些元素可以通过 Terraform 代码进行配置。现实世界中的基础设施包含多种资源和资源类型,Terraform 使用每个阿里云服务的 API 来部署你的资源,包括ECS 实例、ECS 实例部署模板、安全组、VPC 网络、防火墙规则、VPN、路由表、数据库和负载均衡器等。
资源声明的语法
资源在 .tf 文件中定义,建议将相似类型的资源放在一个目录中,并在 main.tf 文件中定义资源。
在这个示例中,main.tf 是根配置文件:
resource
resource 块用于声明单个基础设施对象
resource_type
resource_type 标识要创建的资源类型,每个资源类型取决于在 Terraform provider 块中声明的提供商,提供商是提供一组资源类型的插件
resource_name
resource_name 是对资源类型在当前配置目录下的标识,并不是实际基础设施的名称,同一个资源类型在当前目录下的所有配置中,resource_name 不能重复
资源参数
资源参数使用表达式来声明资源的属性。一些资源参数是资源创建时的必填参数,其他的为可选参数。属性可以用于定义与资源相关的任何高级功能。
在同一个 Terraform 配置文件中包含多个相同或不同类型的资源,这些资源甚至可以跨多个提供商。
这里,第一个 resource 块声明了 VPC 网络,另一个声明了交换机。两个资源都在同一个 main.tf 文件中。这个例子展示了一个名为 main-vpc 的 VPC 资源,其类型是 alicloud_vpc;一个名为 main-vswitch 的交换机资源,其类型时 alicloud_vswitch。
alicloud_vpc 块所有参数是可选的,其中 cidr_block 可选的原因是其存在一个默认值,即当在配置文件中不显示定义时,提供商或者 VPC 服务后端将会默认生成一个值作为这个参数的值。
对于 alicloud_vswitch 块,vpc_id,cidr_block,zone_id 都是必填参数,其他的都是可选参数。
需要注意的是,资源参数取决于资源类型,即不同的资源类型对应的资源参数相差很大。alicloud_vpc 包括如 vpc_name,cidr_blcok 等参数,而 alicloud_vswitch 包括 vswitch_name,cidr_block,zone_id,vpc_id 等参数。
属性参数引用
当从一个资源块访问另一个资源属性时,使用格式:<resource_type>.<resource_name>.<attribute>
。
在上述例子中,当创建交换机时,vswitch 需要所属 VPC 网络的网络 ID。网络 ID 是 alicloud_vpc 块的计算资源属性,即在 VPC 创建时由服务端生成。alicloud_vswitch 资源块使用从 alicloud_vpc 块创建的网络 ID,对应的使用格式是:alicloud_vpc.main_vpc.id。
需要注意的是,这种方法只有当相关的资源定义在同一根配置目录的文件中时才能使用。
资源定义考虑事项
在定义资源块时,有一些重要的因素需要考虑:
resource_name 必须唯一
声明的资源通过其类型和名称在当前配置目录中进行标识,因此,资源名称(resource_name)在所属的配置目录中必须是唯一的。
resource_type 不能自定义
资源类型是与提供商关联的关键字,不能由用户自定义。一个 OSS Bucket 与阿里云 Provider 相关联,并由关键字 alicloud_oss_bucket 进行定义,任何其他 OSS Bucket 的定义在运行 terraform plan 或 terraform apply 时都会导致错误。
所有配置参数必须包含在资源块体内,即大括号之间
基础设施元素及其相关属性在资源块中定义。
所有必填参数必须设置
如果配置中未定义所有必需参数,Terraform 配置将无法成功执行 plan 和 apply。