ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Terraform AWS Provider 的 Serverless Application Repository(serverlessrepo)服务包完全指南:从包级 README 到资源源码实现

Terraform AWS Provider 的 Serverless Application Repository(serverlessrepo)服务包完全指南:从包级 README 到资源源码实现 Terraform AWS Provider 的 Serverless Application Repositoryserverlessrepo服务包完全指南从包级 README 到资源源码实现【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读本文围绕 internal/service/serverlessrepo/README.md 展开面向 Terraform AWS Provider 的贡献者与维护者系统讲解serverlessrepo服务包的结构与实现。你将掌握该服务包在仓库中的代码布局、aws_serverlessapplicationrepository_cloudformation_stack资源与aws_serverlessapplicationrepository_application数据源的核心配置项、完整生命周期调用链以及测试与代码生成机制从而能够独立阅读、修改或扩展这一服务包。服务包概述这份 README 讲了什么internal/service/serverlessrepo/README.md 是 Terraform AWS Provider 中 Serverless Application Repository 服务包的包级说明文档。它明确指出受众定位该区域主要面向 AWS provider 的贡献者与维护者对于最终用户应转向 网站文档 与 数据源文档 获取使用说明。服务名约定AWS Serverless Application Repository 在 AWS CLI 中也被称为serverlessrepo这一短名同样贯穿于 provider 的命名体系如names.ServerlessRepo。从源码结构看整个服务包位于 internal/service/serverlessrepo包含以下核心文件文件职责cloudformation_stack.goaws_serverlessapplicationrepository_cloudformation_stack资源实现SDKv2application_data_source.goaws_serverlessapplicationrepository_application数据源实现find.go底层查找封装findApplicationwait.go创建/更新/删除的默认超时常量generate.gogo:generate指令tags、servicepackage、identitytestsservice_package_gen.go生成的服务包注册与 SDK v2 客户端工厂cloudformation_stack_test.go单元测试与全量验收测试AccTest核心资源aws_serverlessapplicationrepository_cloudformation_stack该服务包最重要的功能是管理从 Serverless Application Repository 部署的 CloudFormation 栈。在 Terraform 配置中资源类型为aws_serverlessapplicationrepository_cloudformation_stack其注册信息位于 service_package_gen.go。基本用法示例data aws_partition current {} data aws_region current {} resource aws_serverlessapplicationrepository_cloudformation_stack postgres-rotator { name postgres-rotator application_id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRDSPostgreSQLRotationSingleUser capabilities [ CAPABILITY_IAM, CAPABILITY_RESOURCE_POLICY, ] parameters { functionName func-postgres-rotator endpoint secretsmanager.${data.aws_region.current.region}.${data.aws_partition.current.dns_suffix} } }参数Argument详解资源 Schema 定义在 cloudformation_stack.go各参数如下参数类型必填说明与约束application_idstring是ForceNewServerless Application Repository 中应用的 ARN必须通过verify.ValidARN校验变更会强制重建namestring是ForceNew要创建的栈名称。实际在 AWS 中部署的资源会被加上serverlessrepo-前缀见下文常量capabilitiesset(string)否合法值CAPABILITY_IAM、CAPABILITY_NAMED_IAM、CAPABILITY_RESOURCE_POLICY、CAPABILITY_AUTO_EXPAND。若应用含 IAM 资源、自定义命名 IAM 资源、基于资源的策略或嵌套应用必须声明对应能力省略时 AWS 实际下发的值会被记录到 stateOptionalComputed校验使用enum.Validate[awstypes.Capability]()parametersmap(string)否传入栈的输入参数键值对semantic_versionstring否要部署的应用版本不指定则部署最新版本tagsmap(string)否资源标签支持 provider 级default_tags覆盖属性Attribute参考资源导出以下只读属性id栈唯一标识即 CloudFormation Stack ID、outputs栈输出键值对 map、tags_all含 providerdefault_tags继承的完整标签。超时配置默认超时在 wait.go 中定义为三个 30 分钟常量create— 默认30mcloudFormationStackCreatedDefaultTimeoutupdate— 默认30mcloudFormationStackUpdatedDefaultTimeoutdelete— 默认30mcloudFormationStackDeletedDefaultTimeout可在资源块内通过timeouts块覆盖例如timeouts { create 45m }。数据源aws_serverlessapplicationrepository_application数据源aws_serverlessapplicationrepository_application用于查询 Serverless Application Repository 应用信息最常见的用途是自动推导部署该应用所需的 capabilities 与版本其 Schema 定义在 application_data_source.go。典型用法数据源与资源联动data aws_serverlessapplicationrepository_application example { application_id arn:aws:serverlessrepo:us-east-1:123456789012:applications/ExampleApplication semantic_version 1.0.0 } resource aws_serverlessapplicationrepository_cloudformation_stack example { name Example application_id data.aws_serverlessapplicationrepository_application.example.application_id semantic_version data.aws_serverlessapplicationrepository_application.example.semantic_version capabilities data.aws_serverlessapplicationrepository_application.example.required_capabilities }参数与导出属性参数application_id必填应用 ARN、semantic_version可选指定版本默认取最新版、region可选覆盖 provider 级 region。导出属性属性含义name应用名称required_capabilities部署该应用所需的 capabilities 列表可直接透传给资源的capabilitiessource_code_url该版本应用源码的 URLtemplate_url该版本应用的 CloudFormation 模板 URL底层查询由 find.go 的findApplication完成调用 AWS SDK v2 的GetApplication当NotFoundException或空响应时返回retry.NotFoundError供上层区分资源不存在与其他错误。生命周期实现源码级调用链创建Create两段式变更集流程创建流程在 resourceCloudFormationStackCreate 中实现遵循 Serverless Application Repository 的标准部署模式创建变更集调用createCloudFormationChangeSet先通过ServerlessRepoClient调用 Serverless Application Repository API 的CreateCloudFormationChangeSet传入StackName、ApplicationId、Capabilities、Tags、可选的SemanticVersion与ParameterOverrides再通过 CloudFormation 客户端的WaitChangeSetCreated等待变更集就绪。注意parameter_overrides由expandCloudFormationChangeSetParameters把map[string]any展开为[]awstypes.ParameterValue。执行变更集用CloudFormationClient调用ExecuteChangeSet并携带create.UniqueId(ctx)生成的ClientRequestToken实现幂等。等待完成调用tfcloudformation.WaitStackCreated超时使用d.Timeout(schema.TimeoutCreate)。资源 ID 在变更集创建后即被设置为changeSet.StackIdcloudformation_stack.go。读取Read跨服务的数据回填resourceCloudFormationStackRead 是本资源最精巧的部分它同时依赖CloudFormation与Serverless Application Repository两个客户端用tfcloudformation.FindStackByName通过 Stack ID 找到栈若返回retry.NotFound从 state 中移除资源。从栈名剥离serverlessrepo-前缀还原name常量CloudFormationStackNamePrefix serverlessrepo-。从栈标签中读取两个关键约定标签serverlessrepo:applicationId与serverlessrepo:semanticVersion常量定义于 cloudformation_stack.go。缺少任一标签都会报错这是 Serverless Application Repository 部署栈的固有标记。回填outputsflattenCloudFormationOutputs。调用findApplication获取应用版本元数据用于还原parameters与capabilities。参数裁剪逻辑flattenNonDefaultCloudFormationParameters读取阶段对parameters的处理采用**只保留非默认值**策略cloudformation_stack.go并结合应用版本的ParameterDefinition若参数已被用户在配置中显式声明configuredParams命中则无条件保留若参数值与其DefaultValue不同则保留若参数NoEcho为 true密文参数API 返回****占位此时只回填用户配置中的原始值避免把占位符写入 state。capabilities的回填flattenStackCapabilities同样有讲究CAPABILITY_RESOURCE_POLICY不会被 CloudFormation API 返回因此只要应用版本RequiredCapabilities中包含它就手动补回防止配置漂移cloudformation_stack.go。更新Update与删除Delete更新resourceCloudFormationStackUpdate与创建几乎一致——重建变更集 → 执行 →WaitStackUpdated因此semantic_version、parameters、capabilities的变更都会走变更集增量更新而不是销毁重建。删除resourceCloudFormationStackDelete调用 CloudFormationDeleteStack同样带ClientRequestToken若返回ValidationError视为栈已不存在直接成功返回随后WaitStackDeleted等待删除完成。导入Import行为该资源支持导入实现在 resourceCloudFormationStackImport导入 ID 接受三种形式CloudFormation Stack ARN直接作为栈 ID 使用带前缀的栈名如serverlessrepo-postgres-rotator直接使用不带前缀的栈名如postgres-rotator自动补上serverlessrepo-前缀。对应 Terraform 1.5 的import块或terraform import命令import { to aws_serverlessapplicationrepository_cloudformation_stack.example id serverlessrepo-postgres-rotator }% terraform import aws_serverlessapplicationrepository_cloudformation_stack.example serverlessrepo-postgres-rotator测试体系从单元测试到全量验收cloudformation_stack_test.go 提供了覆盖完整的验证单元测试TestFlattenNonDefaultCloudFormationParameters用 5 组用例验证参数裁剪非默认值保留、NoEcho回填配置值、NoEcho未配置则排除、显式配置的默认值保留、未配置的默认值排除。验收测试AccTest以SecretsManagerRDSPostgreSQLRotationSingleUser应用ARN 形如arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRDSPostgreSQLRotationSingleUser为对象覆盖 basic含 ImportState、disappears、版本升级1.1.465→1.1.88且校验栈不被重建、数据源-资源联动paired、tags、参数默认值防漂移noChangeUpdate对应历史 issue 的回归、参数更新等场景。其中noChangeUpdate测试尤为值得注意它显式把passwordLength设为应用默认值32验证修复后第二次apply产生空计划plancheck.ExpectEmptyPlan()防止默认值参数被 Read 阶段裁剪导致永久漂移的历史缺陷该缺陷曾以 No updates are to be performed 形式出现。代码生成与注册机制作为服务包它遵循 provider 统一的代码生成规范。generate.go声明了三条指令//go:generate go run ../../generate/tags/main.go -ServiceTagsSlice //go:generate go run ../../generate/servicepackage/main.go //go:generate go run ../../generate/identitytests/main.go由servicepackage生成器产出的 service_package_gen.go 完成两件事注册数据源aws_serverlessapplicationrepository_application与资源aws_serverlessapplicationrepository_cloudformation_stack到服务包清单客户端工厂NewClient基于 provider 的aws_sdkv2_config创建serverlessapplicationrepository.Client注入端点解析器、provider 级 region 覆盖、VCR 重试支持等选项。服务包名称由names.ServerlessRepo决定与 README 中CLI 里叫 serverlessrepo的说明一致。面向贡献者的实用指引结合本服务包可以总结出以下对 provider 贡献者有价值的实践要点修改 Schema/资源逻辑改动集中在 cloudformation_stack.go 与 application_data_source.go每次改动后运行go generate ./internal/service/serverlessrepo/...重新生成注册代码。新增验收测试参考TestAccServerlessRepoCloudFormationStack_*系列注意需要真实 AWS 账号与TF_ACC1环境详见 docs/running-and-writing-acceptance-tests.md。理解跨服务依赖该包虽归入 serverlessrepo但大量工作由 internal/service/cloudformation 的 finder/wait 承担FindStackByName、WaitStackCreated等阅读时需跨包追踪。编写新资源时的参考文件头部注释明确提示不要照搬旧资源使用 skaff新资源模板可参考 skaff。相关文档索引包级说明internal/service/serverlessrepo/README.md资源用户文档website/docs/r/serverlessapplicationrepository_cloudformation_stack.html.markdown数据源用户文档website/docs/d/serverlessapplicationrepository_application.html.markdown服务包入口与生成逻辑internal/service/serverlessrepo/service_package_gen.go、internal/service/serverlessrepo/generate.go通过以上内容你可以完整掌握serverlessrepo服务包从包级 README 到资源源码、再到测试与代码生成的全链路实现为后续贡献或排查问题提供依据。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表