使用 Terraform AWS Provider 查询 Lambda Code Signing Config 数据源:配置项、属性与源码实现解析
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
导读
aws_lambda_code_signing_config是 Terraform AWS Provider 提供的一个只读数据源(Data Source),用于按 ARN 检索已有的 AWS Lambda 代码签名配置(Code Signing Config),从而获取其允许的签名发布者(Allowed Publishers)、签名策略(Code Signing Policies)等元数据,为 Lambda 函数的代码完整性与真实性校验提供依据。读完本文,你将掌握该数据源的参数与导出属性、四种典型实战用法(基础查询、函数绑定、签名档案校验、多环境对比),并理解其背后的 AWS API 调用链与 Provider 源码实现。
数据源概览:它解决了什么问题
Lambda 代码签名功能允许组织要求部署到 Lambda 的所有代码都必须由受信任的签名方签名,从而防止未经验证的代码被部署。aws_lambda_code_signing_config数据源正面向"已有配置"的查询场景:你不需要在 Terraform 中重新创建配置,只需要提供其 ARN,即可读取配置详情,供其他资源(尤其是aws_lambda_function)引用。
该数据源的官方文档位于 website/docs/d/lambda_code_signing_config.html.markdown,核心实现在 code_signing_config_data_source.go 中。
数据源与资源的关系
本数据源与托管配置的aws_lambda_code_signing_config资源(实现在 code_signing_config.go)相互配合:资源负责创建/更新/删除,数据源负责按 ARN 读取既有配置。二者共用同一套findCodeSigningConfigByARN查找逻辑,保证读到的数据与实际状态一致。
参数(Argument Reference)
数据源的入参非常简单:
arn-(必填)代码签名配置的 ARN。在 code_signing_config_data_source.go 中,该字段为Required: true且通过verify.ValidARN校验 ARN 格式,非法 ARN 会在plan阶段直接报错,而不是等到调用 AWS API 时才发现。region-(可选)资源所在区域,默认使用 Provider 配置中设置的区域(即当前 Provider 的默认 Region)。
其中region参数与 AWS 的区域级端点解析机制相关,适合需要跨区域查询配置的场景;不指定时则跟随 Provider 的全局配置。
导出属性(Attribute Reference)
除了上述参数外,数据源还导出以下只读属性(均为Computed: true):
| 属性 | 类型 | 说明 |
|---|---|---|
allowed_publishers | 列表(List) | 允许的发布者列表,即被允许作为本配置签名方的签名档案(Signing Profiles),详见下方 allowed_publishers 块 |
config_id | 字符串 | 代码签名配置的唯一标识符(形如csc-xxxxxxxx) |
description | 字符串 | 代码签名配置的描述信息 |
last_modified | 字符串 | 配置最后修改的日期与时间 |
policies | 列表(List) | 控制签名不匹配或过期时校验失败动作的代码签名策略,详见下方 policies 块 |
allowed_publishers块
signing_profile_version_arns- 一个字符串集合(Set),包含每个签名档案的 ARN。签名档案(Signing Profile)定义了"谁是被信任的、可以给代码包签名的人"。
在源码中,该字段被建模为TypeSet(code_signing_config_data_source.go),Terraform 会将其作为集合去重处理,因此通过[0].signing_profile_version_arns索引访问即可获得完整集合。
policies块
untrusted_artifact_on_deployment- 部署校验失败时采取的策略,合法值为Warn(仅告警,允许部署)与Enforce(强制拦截,拒绝部署)。
在资源侧(code_signing_config.go),该字段通过enum.Validate[awstypes.CodeSigningPolicy]()校验,与 AWS SDK 的枚举类型强绑定,因此传入非法值会在校验阶段被拒绝。
典型用法
1. 基础用法:按 ARN 查询配置并导出详情
data "aws_lambda_code_signing_config" "example" { arn = "arn:aws:lambda:us-west-2:123456789012:code-signing-config:csc-0f6c334abcdea4d8b" } output "config_details" { value = { config_id = data.aws_lambda_code_signing_config.example.config_id description = data.aws_lambda_code_signing_config.example.description policy = data.aws_lambda_code_signing_config.example.policies[0].untrusted_artifact_on_deployment } }policies[0].untrusted_artifact_on_deployment的索引写法基于"配置恰好包含一个策略块"的事实:资源侧policies块被限制为MaxItems: 1,因此数据源返回的列表至多包含一个元素。
2. 在 Lambda 函数中使用:绑定代码签名配置
将数据源查询到的 ARN 直接传给aws_lambda_function的code_signing_config_arn参数,即可让新创建的 Lambda 函数强制启用代码签名:
# 获取已存在的代码签名配置 data "aws_lambda_code_signing_config" "security_config" { arn = var.code_signing_config_arn } # 创建启用代码签名的 Lambda 函数 resource "aws_lambda_function" "example" { filename = "function.zip" function_name = "secure-function" role = aws_iam_role.lambda_role.arn handler = "index.handler" runtime = "nodejs24.x" code_signing_config_arn = data.aws_lambda_code_signing_config.security_config.arn tags = { Environment = "production" Security = "code-signed" } }从源码看,aws_lambda_function的code_signing_config_arn参数在 function.go 中被定义为Optional且经过verify.ValidARN校验。创建函数时,该值会被写入CreateFunction请求的CodeSigningConfigArn字段(function.go);如果函数创建后才变更该属性,Provider 会在更新阶段调用PutFunctionCodeSigningConfig或DeleteFunctionCodeSigningConfigAPI 完成绑定与解绑(function.go),读取阶段则通过GetFunctionCodeSigningConfig回填状态(function.go)。
3. 校验签名档案:条件化部署
在部署前动态校验目标签名档案是否被当前配置允许,只有允许时才创建函数:
data "aws_lambda_code_signing_config" "example" { arn = var.code_signing_config_arn } # 检查指定签名档案是否被允许 locals { allowed_profiles = data.aws_lambda_code_signing_config.example.allowed_publishers[0].signing_profile_version_arns required_profile = "arn:aws:signer:us-west-2:123456789012:/signing-profiles/MyProfile" profile_allowed = contains(local.allowed_profiles, local.required_profile) } # 根据签名档案校验结果条件化创建资源 resource "aws_lambda_function" "conditional" { count = local.profile_allowed ? 1 : 0 filename = "function.zip" function_name = "conditional-function" role = aws_iam_role.lambda_role.arn handler = "index.handler" runtime = "python3.12" code_signing_config_arn = data.aws_lambda_code_signing_config.example.arn } output "deployment_status" { value = { profile_allowed = local.profile_allowed function_created = local.profile_allowed message = local.profile_allowed ? "Function deployed with valid signing profile" : "Deployment blocked - signing profile not allowed" } }这里的核心技巧是contains(local.allowed_profiles, local.required_profile):由于signing_profile_version_arns底层是集合(Set)类型,Terraform 的contains函数可以可靠地执行成员判断,从而把"配置权限校验"变成"基础设施即代码"中的一等公民。
4. 多环境配置对比
生产与开发环境通常使用不同的签名配置,可以并行查询两个配置并对比策略差异:
# 生产环境代码签名配置 data "aws_lambda_code_signing_config" "prod" { arn = "arn:aws:lambda:us-west-2:123456789012:code-signing-config:csc-prod-123" } # 开发环境代码签名配置 data "aws_lambda_code_signing_config" "dev" { arn = "arn:aws:lambda:us-west-2:123456789012:code-signing-config:csc-dev-456" } # 对比配置 locals { prod_policy = data.aws_lambda_code_signing_config.prod.policies[0].untrusted_artifact_on_deployment dev_policy = data.aws_lambda_code_signing_config.dev.policies[0].untrusted_artifact_on_deployment config_comparison = { prod_enforcement = local.prod_policy dev_enforcement = local.dev_policy policies_match = local.prod_policy == local.dev_policy } } output "environment_comparison" { value = local.config_comparison }该模式适合在 CI/审查流程中确保生产环境比开发环境更严格(例如生产为Enforce、开发为Warn),一旦策略漂移,policies_match会输出false并可通过terraform plan直接暴露。
源码级解析:数据源如何工作
读取链路:ARN → GetCodeSigningConfig
数据源的读取逻辑集中在dataSourceCodeSigningConfigRead(code_signing_config_data_source.go):
- 从配置中取出
arn; - 调用
findCodeSigningConfigByARN(ctx, conn, arn)执行查询; - 查询失败(如配置不存在)时返回诊断错误
"reading Lambda Code Signing Config (%s)"; - 成功后依次回填
allowed_publishers、config_id、description、last_modified、policies,并将资源的Id设置为配置 ARN。
findCodeSigningConfigByARN与findCodeSigningConfig(code_signing_config.go)位于资源文件而非数据源文件,二者共用:底层调用 AWS SDK v2 的GetCodeSigningConfigAPI;当返回ResourceNotFoundException时包装为retry.NotFoundError,当返回空响应时包装为tfresource.NewEmptyResultError()。这种"统一的 finder + 错误归一化"模式在整个 Provider 中广泛使用,也是数据源与资源读取行为保持一致的原因。
数据模型与扁平化(Flatten)
从 AWS API 返回的*awstypes.CodeSigningConfig会被扁平化为 Terraform 状态:
flattenAllowedPublishers(code_signing_config.go)把AllowedPublishers.SigningProfileVersionArns转换为包含单个元素的列表,元素内含 ARN 集合;policies在数据源中直接以内联方式构造(code_signing_config_data_source.go),将CodeSigningPolicies.UntrustedArtifactOnDeployment的枚举值字符串化后写入untrusted_artifact_on_deployment。
数据源与资源的 Schema 差异
对比数据源与资源 Schema 可见:数据源将arn设为Required(外部传入),将allowed_publishers、config_id、description、last_modified、policies全部设为Computed(只读回填);而资源侧allowed_publishers为Required、description为Optional(长度 0-256)、policies为Optional + Computed,并额外支持tags与tags_all(code_signing_config.go)。理解这一差异有助于避免在数据源中误用只能在资源上设置的字段。
测试验证与使用前提
该数据源配套的验收测试位于 code_signing_config_data_source_test.go,覆盖basic、policyID、description三个场景,测试方式均为"先创建资源,再用数据源读取并断言二者属性一致",例如TestCheckResourceAttrPair(dataSourceName, "allowed_publishers.0.signing_profile_version_arns.#", resourceName, ...)。测试中的签名档案通过aws_signer_signing_profile创建,平台为AWSLambda-SHA384-ECDSA:
resource "aws_signer_signing_profile" "test" { platform_id = "AWSLambda-SHA384-ECDSA" } resource "aws_lambda_code_signing_config" "test" { allowed_publishers { signing_profile_version_arns = [ aws_signer_signing_profile.test.version_arn ] } policies { untrusted_artifact_on_deployment = "Warn" } } data "aws_lambda_code_signing_config" "test" { arn = aws_lambda_code_signing_config.test.arn }使用该数据源时有两点前提需要留意:
- 网络可达性:数据源会在
read阶段实时调用 AWS Lambda 的GetCodeSigningConfigAPI,因此运行terraform plan/apply的环境必须配置有效的 AWS 凭证且具备lambda:GetCodeSigningConfig权限; - 区域限制:测试代码通过
acctest.PreCheckPartitionNot(t, endpoints.AwsUsGovPartitionID)排除了 AWS GovCloud 分区(code_signing_config_data_source_test.go),说明该数据源在实际 AWS 标准分区中已验证可用;若在 GovCloud 等特殊分区使用,建议先在目标区域确认服务可用性,并通过region参数显式指定区域。
小结
aws_lambda_code_signing_config数据源用最小的入参(仅arn)封装了 AWS Lambda 代码签名配置的完整查询能力:五个只读属性覆盖了发布者白名单、部署策略、标识符、描述与修改时间,配合aws_lambda_function的code_signing_config_arn参数即可快速构建"签名即部署门禁"的供应链安全体系。其实现遵循 Provider 统一的 finder 模式,数据源与资源共用查找逻辑,且拥有覆盖多场景的验收测试作为质量保障,是在 Terraform 中安全、可靠地管理 Lambda 代码签名配置的推荐入口。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考