概要
- 社内の ZABBIX server の CPU 使用率が高くなってきたので、最小工数で解決したい
- CloudWatch からメトリクスを取得するスクリプトが python(boto3) で書かれてる
- とりあえずこのスクリプトを go(aws-sdk-go) に書き換える
結論
簡単なスクリプトがボトルネックになってそうなら、go で書き換えれば良いと思いました。
以下詳細
弊社のメトリクスの取得方法
-
プロジェクト毎に ZABBIX proxy を立て、proxy 経由で ZABBIX server が各メトリクスを取得・保存
-
1 で取得できないものは、ZABBIX server が全プロジェクト分 CloudWatch api で取得
CloudWatch でのメトリクス取得について
- 1回の api で取得しているのは、1インスタンスの 1メトリック
- api は基本的に 300秒に 1回、CPU 使用率のような細くほしいものは 60秒に 1回
- RDS であれば、1インスタンスあたり10個ほどのメトリクスを取得している
- Python boto3 で書かれていた
go で書き換えるに当たって
- 最小工数でいくために ZABBIX の設定を変えなくても済むよう、引数と出力を python スクリプトと同じにする
- 最低限の開発環境は整える(外部パッケージのバージョン管理とか)
以下 go に関すること
version | |
---|---|
go | 1.6.2 |
aws-sdk-go | 1.4.15 |
- ディレクトリ構成は以下のような構成で
├── Gomfile
├── Makefile
├── README.md
├── aws.go
├── bin
│ └── cloudwatch_metrics
├── main.go
└── vendor
├── bin
├── github.com
└── pkg
- パッケージ管理はシンプルなもので良かったので、https://github.com/mattn/gom を使用
- 1 回のコマンド実行で 1 度しか api が実行されないので、service の使い回しとかも考えない
- 関数は全部で 4 つ
- init
- main
- createCloudWatchService
- getMetrics
- config ファイルを指定する必要があったが、1.4.15 では環境変数 "AWS_CONFIG_FILE" にファイルパスを設定しなくてはならず、サーバー側の変更を最小限にしたかったので、コマンド内で環境変数を設定することにした
// サーバー側の変更を最小限にしたかったので、コマンド内で環境変数を設定
if err := os.Setenv("AWS_CONFIG_FILE", credentialFilePath); err != nil {
return nil, fmt.Errorf("AWS_CONFIG_FILE could not be set, %s", err)
}
// credential ファイルパスはここで設定できる
creds := credentials.NewSharedCredentials(credentialFilePath, *profile)
conf := aws.NewConfig().WithCredentials(creds)
s, err := session.NewSessionWithOptions(
session.Options{
Config: *conf,
Profile: *profile,
SharedConfigState: session.SharedConfigEnable,
},
)
- 後は公式ドキュメント・サンプル通り、CloudWatch service インスタンス作って、Input インスタンス作って、GetMetricStatistics するだけ
以上