terraform-provider-aws 中 aws_connect_prompt 数据源:检索 Amazon Connect 提示音(Prompt)信息
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
导读
aws_connect_prompt是 terraform-provider-aws 为 Amazon Connect 服务提供的一个只读数据源(Data Source),用于按名称查询指定 Connect 实例中的提示音(Prompt,即提示语音/铃声文件,如Beep.wav)信息。在编写呼叫中心基础设施配置时,你常常需要把已有 Prompt 的 ARN 或 ID 注入到联系流(Contact Flow)、队列(Queue)等资源的配置中,此时即可通过该数据源在 Terraform 配置中引用,而无需在aws_connect_instance之外另行管理 Prompt 的生命周期。读完本文,你将掌握该数据源的完整参数与导出属性、与aws_connect_instance资源的组合用法,以及其背后的ListPromptsAPI 查询与结果匹配原理。
数据源定位与适用场景
在 Amazon Connect 中,Prompt 是预先录制或系统生成的提示音频文件,例如按键提示音Beep.wav、问候语等,它们隶属于某个具体的 Connect 实例(Instance)。本数据源仅承担读取查询职责:它不会创建、修改或删除任何 Prompt 资源(仓库中只有website/docs/d/connect_prompt.html.markdown数据源文档,没有对应的r/connect_prompt管理资源文档),适合在配置中获取已有 Prompt 的元数据并建立引用关系。
典型的引用场景包括:
- 将 Prompt 的
arn传给联系流(Contact Flow)或提示音配置相关资源; - 将
prompt_id用于需要精确标识 Prompt 的 API 参数拼装; - 在模块(Module)间传递 Connect 实例中 Prompt 的标识信息,避免硬编码。
基本用法:按名称查询 Prompt
原文档给出的最小可用示例是按name查询一个名为Beep.wav的 Prompt:
data "aws_connect_prompt" "example" { instance_id = "aaaaaaaa-bbbb-cccc-dddd-111111111111" name = "Beep.wav" }查询完成后,可通过data.aws_connect_prompt.example.arn、data.aws_connect_prompt.example.prompt_id等属性在其他资源中引用。
在真实项目中,instance_id通常不需要手写 UUID,而是直接引用aws_connect_instance资源的id输出。仓库中的验收测试 prompt_data_source_test.go 就采用了这种更贴合实战的写法(先创建实例,再查询其中的系统默认 Prompt):
resource "aws_connect_instance" "test" { identity_management_type = "CONNECT_MANAGED" inbound_calls_enabled = true instance_alias = "resource-test-terraform-xxxx" outbound_calls_enabled = true } data "aws_connect_prompt" "test" { instance_id = aws_connect_instance.test.id name = "Beep.wav" }测试配置通过acctest.ConfigCompose将实例创建配置与数据源查询配置组合在一起,并在数据源中使用aws_connect_instance.test.id作为instance_id,这正是生产环境中推荐的组织方式——保证数据源查询与实例生命周期解耦、无需硬编码。
参数参考(Argument Reference)
该数据源支持以下参数:
| 参数 | 是否必填 | 说明 |
|---|---|---|
instance_id | Required | 托管该 Prompt 的 Amazon Connect 实例 ID(Reference to the hosting Amazon Connect Instance)。通常引用aws_connect_instance.<名称>.id。 |
name | Required | 要查询的 Prompt 名称,例如Beep.wav。该名称必须在实例内精确匹配,查询对大小写敏感。 |
region | Optional | 该数据源执行查询时使用的 AWS 区域。默认使用 provider 配置 中设置的区域。 |
从源码角度看,数据源 Schema 定义位于 prompt_data_source.go 的dataSourcePrompt()函数中,显式声明的参数为instance_id(Required,字符串)与name(Required,字符串);而region这类通用参数由服务包注册机制注入——在 service_package_gen.go 中,aws_connect_prompt数据源以Factory: dataSourcePrompt、TypeName: "aws_connect_prompt"、Name: "Prompt"注册,并带有Region: inttypes.ResourceRegionDefault()的区域默认行为,即未显式指定region时沿用 provider 级区域配置。
属性参考(Attribute Reference)
除上述参数外,该数据源在读取成功后还会导出以下属性:
| 属性 | 说明 |
|---|---|
arn | Prompt 的 ARN(Amazon Resource Name)。 |
prompt_id | Prompt 在 Connect 实例内的唯一标识符(Identifier for the prompt)。 |
在 prompt_data_source.go 的dataSourcePromptRead函数中可以看到这两个属性的赋值逻辑:d.Set(names.AttrARN, promptSummary.Arn)写入 ARN,d.Set("prompt_id", promptID)写入prompt_id;同时name与instance_id也会被回写到状态中。
该数据源的 ARN 遵循arn:aws:connect:<region>:<account>:instance/<instance_id>/prompt/<prompt_id>的格式。这一点在验收测试中通过acctest.CheckResourceAttrRegionalARNFormat(ctx, datasourceName, names.AttrARN, "connect", "instance/{instance_id}/prompt/{prompt_id}")显式校验,见 prompt_data_source_test.go。
底层实现原理:从 name 到 Prompt 元数据的查询链路
要理解该数据源的行为边界,值得沿源码追一遍它的读取链路,核心代码都在 prompt_data_source.go 中:
入口
dataSourcePromptRead:先从配置中取出instanceID与name,然后调用findPromptSummaryByTwoPartKey(ctx, conn, instanceID, name),将结果写入 Terraform 状态,并调用promptCreateResourceID(instanceID, promptID)生成数据源的复合 ID(格式为instanceID:promptID,分隔符为冒号)。构造查询
findPromptSummaryByTwoPartKey:调用 AWS SDK for Go v2 的connect.ListPromptsInput,其中InstanceId设置为实例 ID、MaxResults固定为 60,然后使用谓词函数过滤,匹配条件为aws.ToString(v.Name) == name——即按名称做精确匹配。分页拉取
findPromptSummaries:由于单个ListPrompts请求最多返回 60 条,源码使用connect.NewListPromptsPaginator自动分页遍历PromptSummaryList,对每一页逐条执行过滤并收集符合条件的项;若 API 抛出ResourceNotFoundException,则转换为retry.NotFoundError,最终向上表现为“资源不存在”的诊断信息。唯一性断言
findPromptSummary:收集完所有匹配项后,调用tfresource.AssertSingleValueResult断言结果必须恰好一条。这意味着如果实例内存在多个同名 Prompt(或名称不匹配导致 0 条),读取都会失败——前者会被视为歧义错误,后者则是 NotFound 错误。这也解释了为什么文档强调按name“returns information on a specific Prompt”。
这一链路也解释了该数据源的两个行为特征:一是名称必须与实例内的 Prompt 完全一致(如测试中使用的系统默认 Prompt 名Beep.wav);二是读取失败时不会静默返回空数据,而是产生明确的错误诊断。
验收测试与可验证性
仓库为该数据源提供了完整的验收测试用例testAccPromptDataSource_name,位于 prompt_data_source_test.go。该测试主要验证:
- ARN 格式正确性:通过
CheckResourceAttrRegionalARNFormat校验arn符合connect服务的instance/{instance_id}/prompt/{prompt_id}区域 ARN 模板; - 字段回写正确性:
instance_id与aws_connect_instance.test的id一致(TestCheckResourceAttrPair),name为Beep.wav,prompt_id非空(TestCheckResourceAttrSet)。
测试基础设施使用acctest.Test、acctest.PreCheck、acctest.ErrorCheck(t, names.ConnectServiceID)与ProtoV5ProviderFactories,执行环境与 terraform-provider-aws 的标准验收测试流程一致,相关约定可参见 running-and-writing-acceptance-tests.md。
注意事项与最佳实践
- 名称精确匹配:
name参数按全名精确比对(源码中为aws.ToString(v.Name) == name),不支持模糊匹配或通配符;若不确定实例内有哪些 Prompt,可先通过 AWS 控制台或ListPromptsAPI 确认。 - 同名歧义会导致读取失败:由于底层做唯一性断言,同名 Prompt 存在多条记录时数据源会报错,应确保查询名称在目标实例内唯一。
region参数按需指定:默认跟随 provider 的区域配置;若 Connect 实例所在区域与 provider 默认区域不同,应显式设置region,否则查询会落在错误区域并可能得到 NotFound 结果。- 只读数据源,不管理生命周期:该数据源没有对应的管理资源,适合引用“已存在”的 Prompt(如实例自带的系统提示音);若需要由 Terraform 管理 Prompt 的生命周期,应等待或采用其他官方资源方案,不要在配置中把数据源当作可写资源使用。
- 复合 ID 语义:数据源的 Terraform ID 格式为
instance_id:prompt_id(见promptCreateResourceID),这与 Connect 服务中 Prompt 在实例内的层级归属关系一致,可作为模块间传递与日志排查的参考。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考