運用ツールとしてGo言語を使ってAWSの起動設定とAMI数を返すツールを作ってみた
-
背景
- AWS環境でインフラCIとして、CodePipeline + CodeBuild + CodeDeployを使っている
- CodeDeployでBlue/Greenデプロイをしていると起動設定がどんどん増えていく
- CodeBuildでPackerを動かしており、AMIがどんどん増える
-
課題
- AWSのリソース上限値に達するとデプロイにコケる..
- 自動で削除することもできるが、AutoScalingGroupで指定している起動設定やAMIを削除すると困る
- 週1程度でslackに通知して数が増えてきたら消すように運用者に促すようにする
ここでは、起動設定数とAMIの数を取得するツールの部分の紹介 ( 実際はLambdaで定期実行し出力を工夫してSlackに投稿している )
- 実行環境
- Mac ( high sierra )
- go version: go1.10.3
- aws-sdk-go
- ローカルにawsのapiを叩くために必要な情報をセットしている必要あり
以下、作成したコードです。 (Goを勉強をしながら作成しています)
main.go
package main
import (
"fmt"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/autoscaling"
"github.com/aws/aws-sdk-go/service/ec2"
)
const (
PAGE = 4
)
var (
config = aws.Config{Region: aws.String("ap-northeast-1")}
svcEc2 = ec2.New(session.New(&config))
svcAsg = autoscaling.New(session.New(&config))
)
type Get interface {
GetAmiNums() int
GetLCNums() int
}
type Nums struct {
amiNumbers int
lcNumbers int
}
func main() {
n := &Nums{}
fmt.Printf("AMIs %d\n", n.GetAmiNums())
fmt.Printf("LCs %d\n", n.GetLCNums())
}
func (n *Nums) GetAmiNums() int {
var owner, images []*string
var _owner []string = []string{"self"}
owner = aws.StringSlice(_owner)
params := &ec2.DescribeImagesInput{
ImageIds: images,
Owners: owner,
}
res, err := svcEc2.DescribeImages(params)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
n.amiNumbers = len(res.Images)
return n.amiNumbers
}
func (n *Nums) GetLCNums() int {
pageNum := 0
sumLcs := 0
params := &autoscaling.DescribeLaunchConfigurationsInput{}
err := svcAsg.DescribeLaunchConfigurationsPages(params,
func(page *autoscaling.DescribeLaunchConfigurationsOutput, lastPage bool) bool {
sumLcs += len(page.LaunchConfigurations)
pageNum++
return pageNum <= PAGE // MAX = 50 * PAGE
})
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
n.lcNumbers = sumLcs
return n.lcNumbers
}
- 実行結果
AMIs 3
LCs 1