1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GameWithAdvent Calendar 2018

Day 10

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

Last updated at Posted at 2018-12-10

この記事は 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をリクエストして返すスクリプト ですが呼び出しがここまで簡単になるとは正直思っていなかったのでやはり使いやすいなぁという印象です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?