本文讲述了如何使用 Golang 创建用于编辑 AWS 安全组的 CLI 工具。

我叫寺冈,是一名基础设施工程师。
这次,我将介绍如何使用 Golang 创建一个 CLI 工具。
它叫做“goacl”,我想先介绍一下它的功能。
1. goacl是什么?
goacl 是一个用 Golang 编写的命令行工具。
查看 AWS 安全组列表,并向
特定组添加规则。
目前仅提供列表视图和规则添加功能,但
我们计划添加一项功能,允许用户删除不必要的规则。
2.创建原因
有两个内部/个人原因。
内部原因
简而言之,原因是办公室的固定 IP 地址将来会发生变化。
为了改善内部网络的质量
我们决定更换网络线路
问题在于如何允许从新的 IP 地址进行访问。
由于我们的核心业务是托管服务提供商 (MSP),
我们很荣幸能为客户管理大量的 AWS 账户。
每当 IP 地址发生变更时,我们都需要检查所有账户的权限设置,而
手动添加权限设置存在诸多限制。
这时,“goacl”就派上了用场。
个人原因
我一直想学习 Golang,我认为这不仅可以
提高我的工作效率,而且对我来说也是一次很好的学习经历。
HashiCorp 的产品(如 Terraform)和
都使用了 Golang
我认为基础设施工程师学习 Golang 有很多好处。
3.goacl 的用法和逻辑
这是一个命令行工具,因此需要从命令行运行。
用法
只需输入 goacl 即可查看用法。
`goacl` 是一个命令行工具,用于列出 AWS 安全组并添加/删除规则。用法:`goacl [命令]` 可用命令:`add` 添加安全组规则;`help` 获取任何命令的帮助信息;`list` 列出安全组信息。参数:`--config string` 配置文件(默认为 `$HOME/.goacl.yaml`);`-h, --help` 获取 `goacl` 的帮助信息;`-t, --toggle` 获取切换命令的帮助信息。使用 `goacl [命令] --help` 获取有关命令的更多信息。.
列表
您可以查看安全组列表。
使用“list”子命令,如下所示:
$ goacl list --region us-west-1 --profile default +-------------+----------+----------+----------------+--------------+ | GROUPID | GROUPNAME | FROMPORT | CIDRIP/GROUPID | VPCID | +-------------+------------+----------+----------------+--------------+ | sg-XXXXXXXX | default | +-------------+------------+----------+----------------+--------------+
由于这是一篇博客,ID 部分已被屏蔽,但
goacl 在内部使用 aws-sdk-go 来检索安全组信息,
执行结果以格式化表格的形式输出。
命令选项
指定要列出的区域和要使用的配置文件
如果您未指定任何内容,则将使用默认值,
区域为“ap-northeast-1”,配置文件为“default”。
子命令和选项的实现Cobra。Cobra使用了
相当知名,因为它也被用在了 Kubernetes 的源代码中。
添加
您可以向特定安全组添加规则。`add`
命令需要一个以 YAML 格式编写的配置文件。
规则: - groupid: sg-XXXXXXXX fromport: 80 toport: 80 ipprotocol: tcp ipranges: - 0.0.0.0/0 - groupid: sg-XXXXXXXX fromport: 443 toport: 443 ipprotocol: tcp ipranges: - 0.0.0.0/0
要开放 80/443 端口,请使用上述格式。`ipranges`
指定允许的 IP 地址;
此字段可以列出多个地址。
我们来试一试。
$ goacl add --region us-west-1 --profile default --config config.yaml $ goacl list --region us-west-1 --profile default +-------------+------------+----------+----------------+--------------+ | GROUPID | GROUPNAME | FROMPORT | CIDRIP/GROUPID | VPCID | +-------------+-----------+----------+----------------+--------------+ | sg-XXXXXXXX | default | 80 | 0.0.0.0/0 | vpc-XXXXXXXX | + + +----------+----------------+ + | | | -1 | sg-XXXXXXXX | | + + +----------+----------------+ + | | | 443 | 0.0.0.0/0 |
“--config”选项允许您指定配置文件。
后续选项与list命令的选项相同。
如果在运行add命令后运行list命令,则可以确认是否已添加。
读取配置文件Viper涉及使用
在 Go 代码中定义了一个与 YAML 结构相同的结构体,
通过读取配置文件并使用 viper.unmarshal
存储在该结构体中
type Config struct { Rules []Rules `yaml:rules` } type Rules struct { GroupID string `yaml:groupid` FromPort int64 `yaml:fromport` ToPort int64 `yaml:toport` IpProtocol string `yaml:ipprotocol` IpRanges []string `yaml:ipranges` }
我其实完全不理解结构的概念,所以遇到了不少困难,但我最终
还是成功地让它正常运行了(我需要多学习)。
4. 总结
目前我们会将其用于内部漏洞识别,但希望
将来能将其开源。
我们还需要实现规则删除功能,所以我会继续开发,并撰写另一篇博文介绍相关内容!
1
