尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

使用 AWS SDK for Go 实战管理 CloudFormation 堆栈:创建、列出与删除全流程

发布时间:2026/9/25 4:59:59

资讯中心
01
ARTICLE

使用 AWS SDK for Go 实战管理 CloudFormation 堆栈:创建、列出与删除全流程

使用 AWS SDK for Go 实战管理 CloudFormation 堆栈:创建、列出与删除全流程
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本指南以 AWS Code Examples 仓库中的 go/example_code/cloudformation/README.md 为主体配合仓库内 CfnCrudOps.go、CfnCrudOps_test.go、config.json 与 template.json 等源码与配置文件完整讲解如何使用 AWS SDK for Go 在默认 AWS 区域中基于默认凭证执行 CloudFormation 堆栈的创建Create、列出List与删除Delete。读完本文你将掌握一个开箱即用的 Go 命令行程序及其参数用法、底层 API 调用链、配套单元测试的运行方式以及将示例扩展到自己的模板与工作流中的方法。示例概览与仓库位置该示例位于仓库的go/example_code/cloudformation/目录由以下文件组成文件作用CfnCrudOps.go主程序提供 create / list / delete / all 四种操作CfnCrudOps_test.go单元测试真实创建并删除一个随机命名的堆栈config.json测试运行配置指定模板文件名template.jsonCloudFormation 模板创建私有 S3 存储桶README.md示例说明文档主程序演示了三项核心能力创建堆栈、列出堆栈摘要、删除堆栈。其中列出操作还支持按堆栈状态Status过滤例如只查看CREATE_COMPLETE的堆栈。这三种能力正是 CloudFormation 生命周期管理的基础操作可以进一步组合成自动化发布、环境清理等场景。此外仓库在 go/cloudformation/ 目录下还提供了功能相同的拆分版独立示例CreateStack、ListStacks、DeleteStack三个子目录其服务归属记录在 metadata.yaml 中可作为对比阅读的参考。前提条件在运行示例之前需要满足以下条件拥有一个 AWS 账户。已按 AWS SDK for Go 开发者指南中的说明配置好默认凭证credentials与默认区域RegionSDK 会从共享凭证文件~/.aws/credentials与共享配置文件~/.aws/config中加载这些设置。本地环境已安装 Go且能够拉取github.com/aws/aws-sdk-go、github.com/google/uuid两个依赖包。从源码看会话的加载方式是显式启用共享配置sess : session.Must(session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable, }))这行代码位于 CfnCrudOps.go意味着程序同时读取~/.aws/config与~/.aws/credentials其解析行为对默认区域、默认凭证、SSO 等配置均生效。命令行运行方式与参数说明主程序通过 Go 标准库的flag包解析三个命令行参数完整语法如下注意 README 语法示例中的CfnCodeOps.go为笔误实际源码文件名是CfnCrudOps.gogo run CfnCrudOps.go [-o all | create | list | delete] [-n stack-name] [-t template-name]参数含义与取值规则如下表参数含义说明-o要执行的操作取值可为create、list、delete、allall为默认值按「创建 → 列出 → 删除」顺序依次执行-n堆栈名称创建或删除堆栈时使用的名称若执行create/delete/all而省略该参数程序会使用github.com/google/uuid自动生成形如stack-uuid的唯一名称-t模板文件名本地 CloudFormation 模板文件路径执行create或all时必填否则程序打印提示并退出对应源码中的参数定义位于 CfnCrudOps.gooperationPtr : flag.String(o, , The operation to perform: create, list, delete, or all in that order) stackNamePtr : flag.String(n, , The name of the stack to create or delete) templateFilePtr : flag.String(t, , The name of the file containing the CloudFormation template)参数组合的约束逻辑如下若提供-o create、-o delete、-o all或完全不提供-o默认走all分支则-n stack-name是必需的缺省时自动生成名称。若提供-o create、-o all或完全不提供-o则-t template-name是必需的。常用运行示例仅列出所有堆栈go run CfnCrudOps.go -o list使用指定模板创建堆栈go run CfnCrudOps.go -o create -n my-stack -t template.json创建、列出、删除一条龙go run CfnCrudOps.go -o all -n my-stack -t template.json删除指定堆栈go run CfnCrudOps.go -o delete -n my-stackall模式会先调用创建流程再列出所有堆栈摘要最后删除刚才创建的堆栈适合快速验证整条调用链是否打通。核心源码解析三大操作背后的 API 调用链CfnCrudOps.go 将三种操作分别封装为独立函数全部基于github.com/aws/aws-sdk-go/service/cloudformation客户端且都做了同步等待处理保证程序不会在堆栈操作尚未完成时就提前退出。1. CreateStack创建堆栈函数签名与实现如下见 CfnCrudOps.gofunc CreateStack(sess *session.Session, stackName string, template string) error { svc : cloudformation.New(sess) // Open file template content, err : ioutil.ReadFile(template) if err ! nil { return err } templateBody : string(content) input : cloudformation.CreateStackInput{TemplateBody: aws.String(templateBody), StackName: aws.String(stackName)} _, err svc.CreateStack(input) if err ! nil { return err } desInput : cloudformation.DescribeStacksInput{StackName: aws.String(stackName)} return svc.WaitUntilStackCreateComplete(desInput) }关键点模板以TemplateBody模板正文方式传参先用ioutil.ReadFile读取本地文件再转为字符串作为请求体。这也意味着只要模板文件可读无需上传到 S3 即可创建堆栈。CreateStackInput只设置了TemplateBody与StackName两个字段其余可选字段如Parameters、Capabilities、Tags、OnFailure、RoleARN未设置说明这是最精简的调用形态。创建后立即调用WaitUntilStackCreateComplete轮询堆栈状态直至状态变为CREATE_COMPLETE或失败才返回避免程序立即执行后续步骤时堆栈尚未就绪。2. GetStackSummaries列出堆栈摘要函数实现见 CfnCrudOps.gofunc GetStackSummaries(sess *session.Session, status string) ([]*cloudformation.StackSummary, error) { svc : cloudformation.New(sess) var stackSummaries []*cloudformation.StackSummary var filter []*string if status ! all { filter append(filter, aws.String(status)) } input : cloudformation.ListStacksInput{StackStatusFilter: filter} resp, err : svc.ListStacks(input) if err ! nil { return stackSummaries, err } return resp.StackSummaries, nil }关键点底层调用ListStacksAPI并通过StackStatusFilter支持按状态过滤。当传入的status不是all时会把该状态字符串加入过滤器。返回值是[]*cloudformation.StackSummary主程序遍历后打印每个堆栈的名称与状态*s.StackName , Status: *s.StackStatus。可传入的状态值覆盖 CloudFormation 全部堆栈生命周期例如CREATE_IN_PROGRESS、CREATE_COMPLETE、CREATE_FAILED、ROLLBACK_IN_PROGRESS、DELETE_IN_PROGRESS、DELETE_COMPLETE、UPDATE_IN_PROGRESS、UPDATE_COMPLETE等。仓库的拆分版示例 ListStacks.go 中维护了一张完整合法的状态校验清单可用于参考。3. DeleteStack删除堆栈函数实现见 CfnCrudOps.gofunc DeleteStack(sess *session.Session, name string) error { svc : cloudformation.New(sess) delInput : cloudformation.DeleteStackInput{StackName: aws.String(name)} _, err : svc.DeleteStack(delInput) if err ! nil { return err } desInput : cloudformation.DescribeStacksInput{StackName: aws.String(name)} return svc.WaitUntilStackDeleteComplete(desInput) }关键点底层调用DeleteStackAPI仅需传入堆栈名称。删除同样采用同步等待策略调用WaitUntilStackDeleteComplete直到堆栈状态变为DELETE_COMPLETE。与创建流程对称README 中的清理验证命令正是借助DeleteStack与GetStackSummaries配合完成的见下文「验证清理结果」。4. main 中的调度逻辑main函数通过switch分支分发四种操作见 CfnCrudOps.goall先CreateStack再GetStackSummaries(sess, all)打印全部堆栈最后DeleteStack。create仅创建。list仅列出全部堆栈。delete仅删除。其余取值打印Unrecognized operation: ...提示。其中对all分支若创建或删除出错程序只会打印错误信息而不会中断整个流程错误处理仅fmt.Println后继续这是示例代码刻意保持的简洁风格。模板文件 template.json 详解示例自带的 template.json 是一个最小可用的 CloudFormation 模板完整内容如下{ AWSTemplateFormatVersion : 2010-09-09, Description : AWS CloudFormation Sample template to create an Amazon S3 bucket., Resources : { S3Bucket : { Type : AWS::S3::Bucket, Properties : { AccessControl : Private, }, DeletionPolicy : Delete } }, }要素说明AWSTemplateFormatVersion模板格式版本固定为2010-09-09。Description模板用途描述这里说明该模板用于创建 Amazon S3 存储桶。Resources.S3Bucket声明唯一资源类型为AWS::S3::Bucket。Properties.AccessControl: Private存储桶访问控制为私有即默认不公开。DeletionPolicy: Delete删除堆栈时连同 S3 存储桶一并删除。这一策略保证了测试流程可以做到资源的完整回收——README 特别指出「策略包含在堆栈删除时删除存储桶」因此运行单元测试不会残留 S3 存储桶。单元测试与 config.json 配置测试文件 CfnCrudOps_test.go 的测试流程如下从config.json读取配置PopulateConfiguration使用encoding/json反序列化到Config结构体。初始化会话同样启用共享配置。用github.com/google/uuid生成随机堆栈名stack-uuid。调用CreateStack创建堆栈。调用isStackComplete(sess, stackName, CREATE_COMPLETE)验证堆栈确实创建完成。调用DeleteStack删除堆栈。调用isStackComplete(sess, stackName, DELETE_COMPLETE)验证堆栈确实删除完成。测试在真实 AWS 环境上运行会真实创建并删除资源因此可能产生 AWS 费用同时它确保了自己创建的资源最终被删除不会遗留 S3 存储桶。config.json 的字段说明config.json 当前内容如下{ TemplateFile: template.json }TemplateFile单元测试使用的模板文件名默认值为template.json即创建私有 S3 存储桶的模板。按 README 描述该文件还包含一个可选的Debug成员若设为true单元测试会输出额外的日志信息。需要说明的是当前仓库中的 config.json 实际只包含TemplateFile一项测试代码的Config结构体也仅声明了TemplateFile字段如需开启调试日志可在运行测试时使用go test -test.v即 verbose 模式同样能看到详细日志输出。运行单元测试进入示例目录后执行go test正常输出形如PASS ok PATH 65.593s其中PATH是包含 Go 文件的文件夹路径。PASS表示测试通过耗时约 65 秒时间取决于堆栈创建/删除的速度。如需查看详细日志go test -test.v该模式会打印每个步骤的日志如堆栈创建开始、验证创建完成、删除开始、验证删除完成等最后两行与普通模式输出一致。验证清理结果测试结束后可以用以下命令确认测试创建的资源已全部删除go run CfnCrudOps.go -o list | sed /DELETE_COMPLETE/d | grep stack-该命令的含义先列出所有堆栈摘要用sed过滤掉状态为DELETE_COMPLETE的行再用grep匹配以stack-开头的堆栈。若测试资源已清理干净输出应为空若有残留堆栈则会显示其名称与状态。仓库中的拆分版独立示例除了合并版CfnCrudOps.go仓库在 go/cloudformation/ 下提供了三个功能独立的示例目录代码结构更细、更便于单独复用目录核心函数说明CreateStack/CreateStack.goMakeStack(svc cloudformationiface.CloudFormationAPI, stackName, templateBody *string)创建堆栈接收接口类型便于单元测试注入 mockListStacks/ListStacks.goGetStackSummaries(sess *session.Session, status string)列出堆栈摘要内置完整状态合法性校验DeleteStack/DeleteStack.goRemoveStack(svc cloudformationiface.CloudFormationAPI, stackName *string)删除堆栈这些独立示例同样遵循「创建/删除后等待完成」的模式分别调用WaitUntilStackCreateComplete与WaitUntilStackDeleteComplete并都显式启用共享配置加载会话。其中MakeStack与RemoveStack接受cloudformationiface.CloudFormationAPI接口便于在测试中用 mock 客户端替换真实服务这一设计在 metadata.yaml 中被标记为 cloudformation 服务的示例。将它们与合并版对照阅读可以清晰看到「一个命令聚合多个操作」与「单操作独立可复用」两种代码组织的取舍。注意事项最小权限原则建议为该示例授予最小权限Least Privilege即仅授予完成任务所需的最少权限。对于本示例IAM 策略至少需要覆盖 CloudFormation 的cloudformation:CreateStack、cloudformation:ListStacks、cloudformation:DeleteStack、cloudformation:DescribeStacks等操作具体权限边界请参考 AWS Identity and Access Management 用户指南中的相关最佳实践。区域可用性示例代码未在所有区域经过测试部分 AWS 服务仅在特定区域提供。运行前请确认目标区域支持所用服务此处为 S3 与 CloudFormation。费用提示运行本示例包括单元测试可能在你的 AWS 账户中产生费用因为堆栈创建、S3 存储桶创建与删除均为真实云上操作。凭证安全程序从共享凭证文件加载凭证请确保这些凭证具备最小权限且不要在代码或命令行中硬编码密钥。小结通过 go/example_code/cloudformation/ 下的完整示例你可以掌握用 AWS SDK for Go 操作 CloudFormation 堆栈的标准姿势flag参数解析、CreateStackWaitUntilStackCreateComplete的同步创建、ListStacksStackStatusFilter的过滤列举、DeleteStackWaitUntilStackDeleteComplete的同步删除以及基于config.json配置的真实单元测试闭环。配合 go/cloudformation/ 的拆分版示例可以进一步理解接口化封装cloudformationiface.CloudFormationAPI对测试友好性的提升。这套模式可直接迁移到你自己的模板与堆栈管理脚本中作为 CI/CD 流水线里环境编排的基础构件。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for Go 管理 AWS CloudFormation 栈创建、删除与状态查询实战指南使用 AWS SDK for Go 管理 AWS CloudFormation 栈创建、删除与状态查询实战指南 在 AWS 基础设施即代码IaC体系中A示例工程教程后端aws-doc-sdk-examples 仓库实战使用 AWS SDK for C 管理 Amazon EBS 卷创建、挂载、列举、删除aws doc sdk examples 仓库实战使用 AWS SDK for C 管理 Amazon EBS 卷创建、挂载、列举、删除 Amazon示例工程教程后端AWS CLI 实战指南使用 aws cloudformation update-stack 更新 CloudFormation 堆栈AWS CLI 实战指南使用 aws cloudformation update stack 更新 CloudFormation 堆栈 本文是一份基于 AWS开发工具云原生运维上一篇彻底解决目标检测重叠框问题Darknet中的非极大值抑制(NMS)算法实现与优化下一篇3分钟玩转优质国产开发项目GitHub_Trending精选指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。