Edited at
GameWithDay 10

GolangでAWSのコストを通知するツールを作った話

この記事は GameWith Advent Calendar 2018 の10日目です


前段

所属会社のAdventCalendarなんて初めて書くのでどうしたものかなとひたすら悩んでいた @sys_cat です。

今日は弊社の中で地味に利用しているGolangにまつわるお話をしてみたいと思います。

既にいろんな方が書かれているように弊社ではPHPをメインの技術として利用しています。

その為Golangはどちらかというとサブ、ツール系の作成として使っています。

そんな私が作ったツールの中でも楽しかったものをご紹介してみようと思います。


インフラコストの見える化

クラウドサービスを利用する会社の共通命題といいましょうか、インフラコストは頭痛のたねになりやすい問題です。

今までConsoleにログインしてから確認するものを定期的に周知出来るようにしてみようというところからスタートしてみました。

利用するパッケージはこんな感じ

package costviewer

import (
"fmt"
"strconv"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/costexplorer"
)

※詳しいパッケージの解説は この辺り を読みながら進めることをおすすめします。


実装

基本的にはこのような実装になりました。

func New() Client {

cv := Client{Session: session.Must(session.NewSession())}
cv.Cost = costexplorer.New(cv.Session, aws.NewConfig().WithRegion("us-east-2"))
return cv
}

/* CostPerMonthly(month) : get cost explorer per monthly
* month int
*/

func (c *Client) CostPerMonthly(month int) error {
var err error
input := _buildParameters(_getMonthlyVariable(month))
c.Monthly, err = c.Cost.GetCostAndUsage(input)
if err != nil {
return err
}
c.Month = fmt.Sprintf("%d", month)
return nil
}

/* CostPerDaily(date) : get cost explorer per daily
* date time
*/

func (c *Client) CostPerDaily(date time.Time) error {
var err error
input := _buildParameters(_getDailyVariable(date))
c.Daily, err = c.Cost.GetCostAndUsage(input)
if err != nil {
return err
}
c.Date = date.Format("2006-01-02")
return nil
}

 New() を宣言してから CostPerMonthly() ならびに CostPerDaily() を実行することになります。

cost := costviewer.New()

now := time.Now()
month := int(now.Month())
if err := cost.CostPerMonthly(month); err != nil {
     panic(err)
}
if err := cost.CostPerDaily(now); err != nil {
     panic(err)
}

最近色々と言われがちなGolangですが個人的にはスッキリ書けるしエラーハンドリングも理解し始めるとすこぶる楽しめています。

内容としては APIをリクエストして返すスクリプト ですが呼び出しがここまで簡単になるとは正直思っていなかったのでやはり使いやすいなぁという印象です。