众所周知,Golang 适合写 CLI 工具,但你可能还不知道 Golang 还可以打包配置文件。 背景 最近在写一个涉及到管理阿里云 ECS 的 CLI 工具,这里当然就要考虑阿里云资源使用的安全性了,
众所周知,Golang 适合写 CLI 工具,但你可能还不知道 Golang 还可以打包配置文件。 背景 最近在写一个涉及到管理阿里云 ECS 的 CLI 工具,这里当然就要考虑阿里云资源使用的安全性了,要求阿里云账号的 AccessKeyId 和 AccessKeySecret 不能下发给 CLI 工具的使用者。 所以这里选择将一份包含 AccessKeyId 和 AccessKeySecret 的配置文件打包进了 CLI 工具中,CLI 工具的使用者默认将使用已经打包了的配置文件,当然也可以通过指定配置文件或传递参数的方式使用新的配置信息。 实现
这里将介绍 Golang 的一个可以把任意文件转换成 Go 代码的库 go-bindata,可以用于嵌入二进制文件到 Go 程序中。同时,也支持在转换成原始的字节切片前使用 gzip 进行压缩文件数据。 关于该工具的具体介绍请跳转至 https://github.com/go-bindata/go-bindata
使用 go-bindata 工具将包含敏感信息的配置文件转换成 Go 的源代码,下面是项目 Makefile 的部分内容,工具名称就叫 mycli 吧。 NAME = mycli .PHONY: build build: 其中将文件转换成 Go 源代码的部分如下: go-bindata -pkg asset -o cmd/mycli/asset/asset.go \ 关于 go-bindata 命令行工具的选项说明:
生成的 asset.go 代码如下: // Code generated by go-bindata. package asset func bindataRead(data []byte, name string) ([]byte, error) { type asset struct { type bindataFileInfo struct { func (fi bindataFileInfo) Name() string { ...
使用 Asset 方法进行加载打包好的配置文件: const preloadConfigFile = "config.yaml" type Config struct { func PreloadConfig() (*Config, error) { 总结 使用 go-bindata 将文件转换成 Go 的源代码,然后编译成二进制文件,最终只需要将二进制文件交给使用者,通过这种方式可以减少工具的使用者对一些敏感信息的直接接触,保障资源的安全性。其实,真正要做到对资源访问的完全把控,可以将 CLI 工具再次进行封装成 Jenkins job 类似的可视化操作界面,既方便使用者使用,又可以限制使用者对工具的使用范围,包括传递给 CLI 工具的参数。
|
2022-04-28
2022-04-21
2022-05-13
2022-08-17
2022-02-25