ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Terraform AWS Provider:aws_acm_certificate 数据源——按域名、标签与状态精确查找 ACM 证书 ARN

Terraform AWS Provider:aws_acm_certificate 数据源——按域名、标签与状态精确查找 ACM 证书 ARN Terraform AWS Provideraws_acm_certificate 数据源——按域名、标签与状态精确查找 ACM 证书 ARN【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws在 Terraform 管理 AWS 资源时ACM 证书的 ARN 通常是 ELBv2 监听器、CloudFront 分发、API Gateway 域名等资源的必填参数但手工硬编码 ARN 既不可移植也容易随证书续期、重建而失效。aws_acm_certificate数据源正是为解决这一问题而设计它让你只需通过域名、标签、状态、密钥算法或证书类型等条件即可动态查询到目标证书的 ARN 及证书本体。读完本文你将掌握该数据源的完整参数用法、各参数的筛选语义以及其在 Provider 源码中的查找、重试与多结果处理机制从而在配置中可靠地引用 ACM 证书而不必硬编码 ARN。数据源用途aws_acm_certificate用于获取 AWS Certificate ManagerACM中某个证书的 ARN。核心场景是以域名或标签作为查询条件替代硬编码的 ARN。例如当aws_acm_certificate资源在另一份配置或另一次部署中创建后监听器配置可以通过域名反查得到其 ARNlistener arn:aws:acm:us-east-1:123456789012:certificate/... # 硬编码不可移植 listener data.aws_acm_certificate.issued.arn # 动态查询可移植使用示例以下是官方文档中的三组典型查询示例覆盖最常见的三种筛选方式# Find a certificate that is issued data aws_acm_certificate issued { domain tf.example.com statuses [ISSUED] } # Find a certificate issued by (not imported into) ACM data aws_acm_certificate amazon_issued { domain tf.example.com types [AMAZON_ISSUED] most_recent true } # Find a RSA 4096 bit certificate data aws_acm_certificate rsa_4096 { domain tf.example.com key_types [RSA_4096] }三个示例分别演示了按状态筛选显式指定statuses [ISSUED]只匹配已签发证书这也是不指定statuses时的默认行为按来源类型筛选并取最新types [AMAZON_ISSUED]保证匹配的是由 ACM 签发而非导入的证书配合most_recent true在同域名多张证书中取最新签发的一张按密钥算法筛选key_types [RSA_4096]通过 ACM API 的Includes.KeyTypes过滤器在 List 阶段就缩小候选范围。参数参考该数据源支持以下参数参数类型必填说明domainString与tags至少填一项要查找的证书的域名。设置后若按域名找不到任何证书返回错误tagsMap与domain至少填一项标签映射其中每一对键值必须与目标证书上的标签完全一致包含式匹配statusesList of String否按状态筛选。合法值PENDING_VALIDATION、ISSUED、INACTIVE、EXPIRED、VALIDATION_TIMED_OUT、REVOKED、FAILED。未指定时仅返回ISSUED状态的证书typesList of String否按证书类型筛选。合法值AMAZON_ISSUED、PRIVATE、IMPORTEDkey_typesSet of String否按密钥算法筛选。注意ACM 的ListCertificatesAPI 默认并不返回所有类型的证书默认仅返回 RSA 密钥因此要查找 ECDSA 或非默认长度的证书时必须显式指定most_recentBoolean否为true时将此前条件匹配到的多张证书按NotBefore字段排序只返回最新的一张为false默认时若匹配到多张证书则返回错误regionString否查询所在区域默认为 Provider 配置中设置的区域从源码结构看domain与tags的“至少一项”约束在 schema 层通过AtLeastOneOf实现见 certificate_data_source.go即只设置tags不设置domain也是合法的配置可以在整个区域内按标签反查证书。属性参考查询成功后该数据源在参数之外导出以下属性属性说明arn匹配到的证书的 ARN可直接引用到支持 ACM 证书的其他资源如aws_lb_listener的certificate_arnid匹配到的证书的 ARN与arn相同status匹配到的证书的状态certificateACM 签发的证书正文PEM。仅当证书状态为ISSUED时有值其他状态为空certificate_chain构成该 ACM 签发证书信任链的证书包括签发 CA 的证书及其他下级 CA 的中间证书。同样仅ISSUED状态有值tags证书上的标签映射其中certificate与certificate_chain是许多场景的关键输出例如将证书内容直接写入 SSM Parameter 或用于代码签名配置时无需再单独调用aws_acm_certificate资源的导出属性。底层实现一次数据源读取的完整流程数据源的核心实现位于 certificate_data_source.go 中的dataSourceCertificateRead函数。理解其执行流程有助于解释各种边界行为。1. 构造 ListCertificates 请求读取的第一步是构造ListCertificates输入筛选条件分两层下发key_types走 API 过滤器当设置了key_types时它被展开为acm.Filters{KeyTypes: [...]}并赋给input.Includes由 API 在 List 阶段完成过滤statuses走 API 状态列表设置的statuses会转换为input.CertificateStatuses未设置时源码显式补上CertificateStatusIssuedcertificate_data_source.go这解释了文档中“未指定statuses时仅返回ISSUED证书”的默认行为且该默认行为与 API 默认返回 RSA 密钥证书的特性叠加正是测试注释中反复出现的 “ListCertificates: Default filtering returns only RSA_2048 certificates” 的原因。domain和types则没有对应的一级 API 过滤参数domain是客户端谓词匹配因此它们在客户端侧执行。2. 分页遍历与客户端过滤findCertificates使用acm.NewListCertificatesPaginator对分页结果做完整遍历certificate_data_source.go对每页中的CertificateSummary应用谓词若设置了domain谓词要求summary.DomainName domain若设置了types谓词进一步要求证书Type在指定列表内使用PredicateAnd组合两个谓词。3. 空结果的 1 分钟重试整个 List 过程被包裹在tfresource.RetryWhenNotFound(ctx, 1*time.Minute, ...)中certificate_data_source.go若列表为空抛出EmptyResultError并最多重试 1 分钟。这是为了容忍数据源读取早于证书创建完成的时间窗口典型于测试与并发编排场景。若 1 分钟后仍无结果最终报错reading ACM Certificates: empty result——这一错误信息在验收测试TestAccACMCertificateDataSource_byDomainNoMatch中被精确断言见 certificate_data_source_test.go。4. 逐张证书 Describe 与标签匹配拿到候选列表后实现会对每个CertificateSummary的 ARN 调用findCertificateByARN即DescribeCertificate见 certificate.go获取完整CertificateDetail。有两个值得注意的细节若描述阶段证书已被删除ResourceNotFoundException该证书被静默跳过从源码结构看findCertificateByARN还有一处边缘行为当证书状态为VALIDATION_TIMED_OUT时会返回NotFoundError并在本数据源中被跳过——即处于验证超时状态的证书即使被statuses选中也可能不出现在最终结果中。标签筛选发生在这一层若配置了tags实现会调用listTags拉取每张候选证书的实际标签并要求配置中的每一对键值都包含在证书标签中tags.ContainsAll(keyValueTags(...))certificate_data_source.go。不满足的候选被剔除最终若无任何候选则报错no matching ACM Certificate found。5. most_recent 的排序规则most_recent的多证书裁决逻辑在mostRecentCertificate函数中certificate_data_source.go规则比文档描述更细致参与比较的证书状态必须一致否则报错most_recent filtering on different ACM certificate statuses is not supported若状态为ISSUED覆盖IMPORTED与已签发的AMAZON_ISSUED证书按NotBefore比较取生效时间最晚者对于非ISSUED状态的AMAZON_ISSUED证书则退化为按CreatedAt比较。若most_recent false默认而匹配到多于 1 张证书数据源会报错并附带数量例如2 matching ACM Certificates found——该行为同样被验收测试TestAccACMCertificateDataSource_byDomainMultiple断言见 certificate_data_source_test.go。6. 证书正文的按需获取最后一步是证书正文的获取仅当匹配证书的Status ISSUED时才会调用GetCertificate填充certificate和certificate_chain否则两者被显式置空certificate_data_source.go。这解释了为什么查询PENDING_VALIDATION等状态的证书时这两个属性没有值。数据源的id最终被设置为匹配证书的 ARNd.SetId(...)因此id与arn属性总是相等的。实操建议与已知边界结合源码与验收测试实际使用时的几点建议默认只搜到 RSA 2048ACM 的ListCertificates默认返回 RSA 密钥证书。如果你的证书是 ECDSA 或 RSA_4096 等非默认类型务必显式设置key_types否则会出现“明明存在却查不到”的假象。验收测试配置中普遍以key_types [RSA_4096]作为与导入证书区分的查询条件见 certificate_data_source_test.go同域名多证书是常态导入证书与 ACM 签发证书可以共用同一域名。用types [AMAZON_ISSUED]或types [IMPORTED]区分来源配合most_recent true是最稳的组合domain与tags至少一项必填两者都缺会在 plan/apply 阶段被 schema 校验拒绝而非等到运行时most_recent不跨状态比较如果你用statuses同时选了多个状态且候选中出现不同状态的证书most_recent会直接报错建议把状态过滤收敛到单一状态未匹配到证书时的报错形态1 分钟重试耗尽后为reading ACM Certificates: empty result标签不匹配为no matching ACM Certificate found多结果冲突为N matching ACM Certificates found。排错时可据此区分是“没有候选”“标签不符”还是“候选过多”。参考数据源实现certificate_data_source.goDescribeCertificate封装含VALIDATION_TIMED_OUT边缘处理certificate.go验收测试按域名、标签、状态、密钥类型、多结果、most_recent 等场景certificate_data_source_test.go服务内配套资源创建证书、验证列表等可与本数据源组合使用internal/service/acm【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表