My Note

自己理解のためのブログ

運用ツールとして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
  • ローカルにawsapiを叩くために必要な情報をセットしている必要あり

以下、作成したコードです。 (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