关于使用 Golang 创建 CLI 工具来编辑 AWS 安全组的故事
我叫寺冈,是一名基础设施工程师。
这次我将讨论使用 Golang 创建 CLI 工具。
这个名字是“goacl”,我想向您介绍一下它是什么。
1.什么是goacl?
goacl 是一个用 Golang 编写的 CLI 工具。
显示 AWS 安全组列表并
为特定组添加规则。
目前,它仅允许列表显示和添加规则,但
我们计划添加功能以允许删除不必要的规则。
2.创建原因
有两个原因:内部/个人。
内部原因
简而言之,原因是办公室的固定IP地址将来会发生变化。
为了提高我们内部网络的质量,我们
决定更换线路本身,但是
如何允许新的IP地址访问呢?
由于我们的主营业务是MSP,所以我们
负责很多客户的AWS账户。
每次IP地址更改时,您都需要检查所有帐户的权限设置,并且
手动添加权限设置存在限制。
这里使用“goacl”。
个人原因
我一直希望能够编写Golang,我认为这
将是提高我的工作效率以及个人学习的好方法。
Golang
也被用在 HashiCorp 产品中,例如 Terraform 和 Kubernetes,所以
我认为基础设施工程师学习 Golang 有很多好处。
3. Goacl的用法和逻辑
由于它是一个 CLI 工具,因此可以从命令行执行。
用法
您只需输入 goacl 即可检查使用情况。
$ goacl goacl 是一个 CLI 工具,用于列出 AWS 安全组并添加/删除规则 用法:goacl [command] 可用命令:add 添加 SecurityGroup 规则 help 有关任何命令列表的帮助 列出 SecurityGroup 信息 标志:--config 字符串配置文件(默认)。是 $HOME/.goacl.yaml) -h, --help goacl 的帮助 -t, --toggle 用于切换的帮助消息 使用“goacl [command] --help”获取有关命令的更多信息。
列表
您可以查看安全组列表。
如下使用子命令“list”。
$ goacl list --region us-west-1 --profile default +------------+------------+-------- -- --+----------------+--------------+ | 组名称 | CIDRIP/组 ID | +- ------------+------------+------------+--------- ----- --+--------------+ | sg-XXXXXXXX | 默认 | sg-XXXXXXXX | +-------- ----- +------------+----------+----------------+--- ------ -----+
由于这是一篇博客,所以ID部分被屏蔽了,但是
在goacl内部,使用aws-sdk-go来获取安全组信息,并将
执行结果以表格的形式输出。
您可以指定要列出的区域和要用作
命令选项的如果未指定任何内容,则将使用默认值,
区域将为“ap-northeast-1”,配置文件将为“default”。
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 +------------ +------------+----------+----------------+-------- - -----+ | 组名 | CIDRIP/VPCID | +-------------+------------+-- ------+----------------+--------------+ | sg-XXXXXXXX | 默认 | 0.0/0 | vpc-XXXXXXXX | + +----------------+ | -1 | 0.0.0.0/0 | 0.0.0.0 ---------+------------+----------+---------------- + --------------+
您可以使用“--config”选项指定配置文件。
后面的选项与 list 命令类似。
如果执行add命令后运行list命令,可以确认已经添加。
逻辑使用
viper在Go代码中定义一个与yaml结构相同的结构体,
读取配置文件,执行viper.Unmarshal,将
yaml中写入的值存储到该结构体中。
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.总结
我认为我们暂时会在内部使用它并识别任何错误,但
我们希望将来将它作为 OSS 发布。
我还不能删除规则,所以我会继续实现它们并在另一个博客中总结它们!