運用ツールとしてGo言語を使ってAWSの起動設定とAMI数を返すツールを作った
背景
- AWS環境でインフラCIとして、CodePipeline + CodeBuild + CodeDeployを使っている
- CodeDeployでBlue/Greenデプロイをしていると起動設定がどんどん増えていく
- CodeBuildでPackerを動かしており、AMIがどんどん増える
課題
- AWSのリソース上限値に達するとデプロイにコケる..
- 自動で削除することもできるが、AutoScalingGroupで指定している起動設定やAMIを削除すると困る
- 週1程度でslackに通知して数が増えてきたら消すように運用者に促すようにする
ここでは、起動設定数とAMIの数を取得するツールの部分の紹介 ( 実際はLambdaで定期実行し出力を工夫してSlackに投稿している )
実行環境
以下、作成したコードです。 (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