My Note

自己理解のためのブログ

GoでAWSのAMIとSnapshotとLaunchConfigを自動削除するツールを作った

目的

AWSでPackerでAMI作成、Ansibleでインスタンスのプロビジョニング、スクリプトで起動設定(LC)の作成、AutoScalingの起動設定の差し替えの処理を CodePiplineで定期的におこなっている。この処理で、パイプラインを回すたびに、AMIとスナップショット、起動設定が作成される。 不要になったリソースを手動て定期的に削除するのは面倒で大変なため、Goでaws-sdk-goでコードを書き、Lambdaで実行する自動削除ツールを作った。

削除ツールの作りと実行条件

  • aws-sdk-goを使ってAMIとSnapshotと起動設定を削除するツール

    • SSMパラメータに登録されている_base_amiのkye名が含まれるAMIは削除しない
    • AutoScalingGroupで保持している起動設定(LC)にセットされているAMIは削除しない
    • AutoSalingGroupで保持している起動設定(LC)は削除しない
    • 実行した日時よりAMIEXPIREDATELCEXPIREDATEより前に作成されたものを削除する
    • 東京リージョンのLambdaで実行する
    • 結果をSlackに投稿する
  • 処理を停止させる条件 (意図しない削除を防ぐため)

    • Slack関連の環境変数(SLACKURL/CHANNEL/USERNAME)以外の値がセットされていない場合
    • ssmパラメータからsource-amiが取得できなかった場合
    • AutoScalingGroup数より起動設定の除外リスト数が少なかった場合

GitHub ( ソースコード )

ターミナルで実行した結果

  • AWS Lambda実行する形に変えているので, main(){} に変更する必要があります。

Alt Text

SSMパラメータのAMI-ID (削除しないAMI)

Alt Text

SLACKURL      = os.Getenv("SLACKURL")       // SlackのWebhookURL
CHANNEL       = os.Getenv("CHANNEL")        // Slackのチャンネル名
USERNAME      = os.Getenv("USERNAME")       // Slackに表示する名前
AMIEXPIREDATE = os.Getenv("AMIEXPIREDATE")  // AMIの有効期限
LCEXPIREDATE  = os.Getenv("LCEXPIREDATE")   // 起動設定の有効期限
SSMPAGE       = os.Getenv("SSMPAGE")        // 3 ( Page数 )
LCPAGE        = os.Getenv("LCPAGE")         // 4 ( Page数 )

Lambdaへのデプロイ手順

$ make setup cross-build
$ zip -j deployment.zip ./build/pkg/_linux_amd64/GoAWSDeleteAmisLaunchConfigsTool
$ aws lambda update-function-code --function-name ${LAMBDA_FUNCTION_NAME} --zip-file fileb://deployment.zip --region ap-northeast-1

※ ${LAMBDA_FUNCTION_NAME}はLambdaで作ったfunction名

Lambdaに必要な設定

  • デプロイするLambda関数は事前に関数作成が必要
    • 関数名: deleteAMISnapshotLC
  • ランタイムをGo 1.xを選択
  • IAMロールを付与
    • AmazonEC2FullAccess
    • AutoScalingFullAccess
    • IAMReadOnlyAccess
    • AmazonSSMReadOnlyAccess
  • タイムアウト時間は削除するリソース量に応じて設定する
  • ハンドラは main にする。
  • 環境変数を追加する。(設定する環境変数は以下に記載)
  • Cloudwatch-Eventを連携させて定期実行させる

Lambdaでの環境変数値をセット

Alt Text

Slack通知

Alt Text

GitHubにリリースする

$ export GITHUB_TOKEN=17a9c0d24aXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ echo $GITHUB_TOKEN
17a9c0d24aXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ make release
rm -rf ./build/pkg
gox -os= -arch="386 amd64" -output="./build/pkg/_{{.OS}}_{{.Arch}}/{{.Dir}}"
Number of parallel builds: 3

-->      darwin/386: _/Users/hidetoshi/myrepo/GoAWSDeleteAmisLaunchConfigsTool
-->    netbsd/amd64: _/Users/hidetoshi/myrepo/GoAWSDeleteAmisLaunchConfigsTool
-->   freebsd/amd64: _/Users/hidetoshi/myrepo/GoAWSDeleteAmisLaunchConfigsTool
-->       linux/386: _/Users/hidetoshi/myrepo/GoAWSDeleteAmisLaunchConfigsTool
・・・
rm -rf ./build/dist
mkdir ./build/dist
pushd ./build/pkg > /dev/null && \
        for P in `ls | xargs basename`; do zip -r /Users/hidetoshi/myrepo/GoAWSDeleteAmisLaunchConfigsTool/./build/dist/$P.zip $P; done && \
        popd > /dev/null
  adding: _darwin_386/ (stored 0%)
  adding: _darwin_386/GoAWSDeleteAmisLaunchConfigsTool (deflated 61%)
  adding: _darwin_amd64/ (stored 0%)
  adding: _darwin_amd64/GoAWSDeleteAmisLaunchConfigsTool (deflated 66%)
  adding: _freebsd_386/ (stored 0%)
  adding: _freebsd_386/GoAWSDeleteAmisLaunchConfigsTool (deflated 62%)
  adding: _freebsd_amd64/ (stored 0%)
 ・・・
 hr -u yhidetoshi -r GoAWSDeleteAmisLaunchConfigsTool v0.0.1 ./build/dist
==> Create a new release
--> Uploading: _darwin_386.zip
--> Uploading: _windows_amd64.zip
--> Uploading: _netbsd_amd64.zip
--> Uploading: _freebsd_amd64.zip
--> Uploading: _darwin_amd64.zip
--> Uploading: _freebsd_386.zip

f:id:yhidetoshi:20190618074928p:plain
github-release

まとめ

AWS-Lmabdaとaws-sdk-goを活用してインフラCI/CDで発生するリソースを定期的に削除するツールを作成しました。 リソースを削除するツールですので、もしご利用される場合は自己責任でお願いします。