深入解析 Terraform AWS Provider 的aws_media_convert_queue数据源:读取 Elemental MediaConvert 队列信息
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
本指南以 HashiCorp Terraform AWS Provider 官方文档中aws_media_convert_queue数据源(Data Source)为核心,完整讲解如何通过 Terraform 读取 AWS Elemental MediaConvert 队列的标识、ARN、状态与标签信息。读完本文,你将掌握该数据源的全部参数与导出属性、底层 SDK 调用链路,以及如何与aws_media_convert_queue资源组合实现"创建即引用"的典型场景。
一、数据源概览:它解决什么问题
AWS Elemental MediaConvert 是一项媒体转码服务,队列(Queue)用于管理转码作业(Job)的调度与并发。在实际基础设施管理中,你经常需要引用已存在队列的 ARN(例如配置转码作业、IAM 策略或事件通知),而不是重复硬编码。
aws_media_convert_queue数据源正是为此设计:给定队列的唯一标识id,Terraform 会向 MediaConvert 服务发起查询,返回队列的 ARN、名称、当前状态以及全部标签,供配置中的其他资源引用。官方文档对该数据源的定位表述为:Retrieve information about a AWS Elemental MediaConvert Queue(参见 website/docs/d/media_convert_queue.html.markdown)。
二、最小可用示例
官方文档给出的最简用法只需一个必填参数id:
data "aws_media_convert_queue" "example" { id = "tf-example-queue" }执行terraform plan或terraform apply后,即可通过data.aws_media_convert_queue.example.arn、.status等属性在配置中引用查询结果。
注意:该数据源隶属于
Elemental MediaConvert子分类,使用前请确保 AWS 账号已开通 MediaConvert 服务,且 Terraform 执行环境具备读取队列所需的 IAM 权限(对应 MediaConvertGetQueueAPI 操作)。
三、Argument Reference:支持的查询参数
数据源支持以下两个参数:
| 参数 | 必填 | 说明 |
|---|---|---|
region | 可选 | 队列所在的 AWS 区域。默认使用 provider 配置中设置的区域,也可以通过 provider 的region或各资源级region覆盖。MediaConvert 采用区域化端点,因此跨区域查询时必须显式指定。 |
id | 必填 | 队列的唯一标识符,其值与队列的name相同。文档明确指出The same asname。 |
四、Attribute Reference:导出的属性
查询成功后,该数据源在参数之外还导出以下属性:
| 属性 | 类型 | 说明 |
|---|---|---|
arn | string | 队列的 Amazon Resource Name(ARN)。 |
name | string | 队列名称,与id相同。 |
status | string | 队列当前状态(如ACTIVE或PAUSED)。 |
tags | map | 资源上的标签映射,包含从 providerdefault_tagsconfiguration block 继承的标签。 |
一个常见的输出用法:
output "queue_arn" { value = data.aws_media_convert_queue.example.arn } output "queue_status" { value = data.aws_media_convert_queue.example.status } output "queue_tags" { value = data.aws_media_convert_queue.example.tags }五、底层实现解析:数据源是如何工作的
在 Terraform AWS Provider 仓库中,该数据源的完整实现位于 internal/service/mediaconvert/queue_data_source.go。阅读源码可以验证文档描述与真实行为完全一致:
5.1 Schema 定义
实现采用 Terraform Plugin SDK v2,通过SchemaFunc定义字段:
names.AttrARN: { Type: schema.TypeString, Computed: true }, names.AttrID: { Type: schema.TypeString, Required: true }, names.AttrName: { Type: schema.TypeString, Computed: true }, names.AttrStatus: { Type: schema.TypeString, Computed: true }, names.AttrTags: tftags.TagsSchemaComputed(),可以看到:id是唯一 Required(必填)字段,arn、name、status均为 Computed(只读导出),tags使用TagsSchemaComputed()——这正是文档中"tags包含从 providerdefault_tags继承标签"的源码级体现。
5.2 读取流程
dataSourceQueueRead是核心读取函数,调用链如下:
conn := meta.(*conns.AWSClient).MediaConvertClient(ctx) id := d.Get(names.AttrID).(string) queue, err := findQueueByName(ctx, conn, id) ... name := aws.ToString(queue.Name) d.SetId(name) d.Set(names.AttrARN, queue.Arn) d.Set(names.AttrName, name) d.Set(names.AttrStatus, queue.Status)关键点:
- 通过
AWSClient.MediaConvertClient(ctx)获取 MediaConvert 的 AWS SDK for Go v2 客户端; - 调用
findQueueByName按名称查询队列(该函数定义于 internal/service/mediaconvert/queue.go,内部封装了conn.GetQueueAPI 调用,并对NotFoundException与空结果分别转换为retry.NotFoundError和tfresource.NewEmptyResultError); - 查询成功后,将返回的队列
Name写回id(印证文档所述"id与name相同"),再依次填充arn、name、status。
六、数据从哪来:配套的aws_media_convert_queue资源
数据源查询的对象通常由aws_media_convert_queue资源管理(资源文档见 website/docs/r/media_convert_queue.html.markdown)。掌握资源的全部参数有助于理解队列可查询的字段来源。
6.1 资源参数一览
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
name | 是 | — | 队列唯一标识,创建后不可更改(ForceNew)。 |
concurrent_jobs | 否 | 由服务端决定 | 队列可并发处理的作业数上限。按需(ON_DEMAND)队列受账号配额约束;预留(RESERVED)队列由预订计划决定。 |
description | 否 | — | 队列描述。 |
pricing_plan | 否 | ON_DEMAND | 计费计划,可选ON_DEMAND或RESERVED,创建后不可更改。 |
reservation_plan_settings | 否 | — | 预留队列的详细计费计划(见下文)。 |
status | 否 | ACTIVE | 队列状态,可选ACTIVE或PAUSED。 |
tags | 否 | — | 资源标签,可与 providerdefault_tags合并。 |
说明:资源源码位于 internal/service/mediaconvert/queue.go,其中
pricing_plan默认值types.PricingPlanOnDemand、status默认值types.QueueStatusActive均通过Default字段声明,并与文档一致。资源也支持terraform import按队列名称导入(如terraform import aws_media_convert_queue.test tf-test-queue)。
6.2reservation_plan_settings子块
仅当pricing_plan = "RESERVED"时使用,包含三个必填字段:
| 字段 | 可选值 | 说明 |
|---|---|---|
commitment | ONE_YEAR | 预订计划的承诺期限长度。 |
renewal_type | AUTO_RENEW/EXPIRE | 预订期限到期后的续订方式。 |
reserved_slots | 整数 | 队列预留的转码槽位(RTS)数量。 |
在源码中,这三个字段分别通过enum.Validate[types.Commitment]()与enum.Validate[types.RenewalType]()做枚举校验,并由expandReservationPlanSettings/flattenReservationPlan函数完成 Terraform 结构与 AWS SDK 类型之间的转换。
七、典型组合用法:创建队列并立即引用
实际工程中最常见的模式是"资源创建 + 数据源引用",既能在同一配置内管理队列,又能把 ARN 安全地传递给下游资源。数据源测试中也采用了这种模式(见 internal/service/mediaconvert/queue_data_source_test.go):
resource "aws_media_convert_queue" "example" { name = "tf-example-queue" description = "Video transcode queue for production" concurrent_jobs = 10 pricing_plan = "ON_DEMAND" status = "ACTIVE" tags = { Environment = "production" Team = "media" } } data "aws_media_convert_queue" "example" { # id 与资源 name 一致,直接引用资源属性即可保证同步 id = aws_media_convert_queue.example.id } output "example_queue_arn" { value = data.aws_media_convert_queue.example.arn } output "example_queue_status" { value = data.aws_media_convert_queue.example.status }这样,下游无论需要队列 ARN(用于授权转码、构建作业配置)还是状态(用于自动化判断),都可以从data.aws_media_convert_queue.example.*稳定获取。
八、标签是如何读取的:tags与tags_all的机制
数据源的tags属性由tftags.TagsSchemaComputed()生成。标签的实际读取通过 MediaConvert 的ListTagsForResourceAPI 完成,实现在 internal/service/mediaconvert/tags_gen.go 的listTags函数中——它以资源的 ARN 为标识(与数据源 Schema 上的@Tags(identifierAttribute="arn")注解对应)发起请求:
input := mediaconvert.ListTagsForResourceInput{ Arn: aws.String(identifier), } output, err := conn.ListTagsForResource(ctx, &input, optFns...)需要留意两个细节:
- 数据源导出的是
tags(含继承的default_tags),而资源额外导出tags_all(同样含继承标签),两者语义在文档中均有明确区分; - 若队列本身没有标签,
tags会是一个空 map,不会导致数据源读取失败。
九、测试验证:数据源行为如何被保障
仓库中的 internal/service/mediaconvert/queue_data_source_test.go 提供了数据源的验收测试TestAccMediaConvertQueueDataSource_basic。其核心断言如下:
resource.TestCheckResourceAttrPair(resourceName, names.AttrARN, dataSourceName, names.AttrARN), resource.TestCheckResourceAttrPair(resourceName, names.AttrName, dataSourceName, names.AttrName), resource.TestCheckResourceAttrPair(resourceName, acctest.CtTagsPercent, dataSourceName, acctest.CtTagsPercent),测试逻辑清晰可验证:
- 先创建资源
aws_media_convert_queue.test,再声明数据源data.aws_media_convert_queue.test,且数据源id直接引用aws_media_convert_queue.test.id; - 用
TestCheckResourceAttrPair断言资源与数据源的arn、name完全一致——从验收层面再次证明数据源读取的就是同名队列; - 对比
tags.%(标签数量)一致,确认标签读取链路工作正常。
配套的资源级测试(internal/service/mediaconvert/queue_test.go)还覆盖了concurrent_jobs动态调整(100→5)、status在PAUSED/ACTIVE间切换、description更新、多标签增删以及pricing_plan = RESERVED的预订计划场景,为数据源可查询到的字段取值提供了完整佐证。
十、使用注意事项
- 区域一致性:
region参数默认继承 provider 配置,跨区域查询队列时必须显式设置,否则会因端点区域不匹配而查询失败。 id即name:查询标识就是队列名称,无独立 UUID;因此按资源属性id引用即可,无需额外转换。- 只读语义:数据源不会创建或修改任何 AWS 资源,仅执行一次
GetQueue读取;对队列的管理应交给aws_media_convert_queue资源完成。 - 权限要求:执行读取需要具备
mediaconvert:GetQueue(及读取标签所需的mediaconvert:ListTagsForResource)权限。
综上,aws_media_convert_queue数据源是一个轻量但可靠的队列信息读取入口。无论是对接转码作业配置、构建依赖 ARN 的基础设施编排,还是自动化巡检队列状态,你都可以基于本文的用法与源码依据放心使用。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考