こんにちは。技術開発室の與島です。

先日GitHub - heartbeatsjp/go-create-image-backupを公開しました。

go-create-image-backupは、Amazon EC2のバックアップとしてAMI(Amazon Machine Image)の作成と世代管理を行うツールです。
もともとは、同様の機能をもつPython2で書かれたツールが社内で利用されていたのですが、デプロイ作業を省力化するためにバイナリで配布できるGoで作り直しました。

今回はこちらのツールについて紹介したいと思います。

デモの実行環境

以降のデモは以下の環境のEC2インスタンスで実行しています。
また、必要なIAMポリシーが付与されたIAMロールがEC2インスタンスにアタッチされているものとします。

$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

$ go-create-image-backup --version
go-create-image-backup version 1.0.0

go-create-image-backup

インスタンスIDと保持世代数を指定するのが基本的な使い方です。

$ go-create-image-backup -instance-id i-1234567890abcdef0 -backup-generation 7
create image: ami-1234567890abcdef0
deregister images:

出力結果として、作成したAMI IDとローテートによって登録解除したAMI IDが表示されます。
上の例ではderegister imagesに何も表示されていないので、ローテートは行われていませんが、-backup-generationオプションで保持世代数を7に指定していますので、i-1234567890abcdef0のAMIが8を超えた場合は古いAMIが登録解除されます。

ローテートの動きについてもう少し詳しく説明します。

go-create-image-backupでは、作成したAMIとAMIに紐づくスナップショットに以下の3つのタグを付与します。

  • BackupType
  • Name
  • Service

BackupTypeタグの値は、autoという文字列が固定で入ります。
Nameタグの値は、対象インスタンスにNameタグがあればその値、なければインスタンスIDが入ります。
Serviceタグの値は、-service-tagオプションで指定した文字列が入ります。

そして、go-create-image-backupでは、作成済みのAMIのうちNameタグ、Serviceタグの値が同じものを論理的に同じグループとして扱うようにしており、その論理的なグループ内で世代数が管理されます。
日次バックアップと月次バックアップなど、異なるタイミングで取得しているバックアップの世代管理を分けて行うためにこのような仕組みにしています。

実際にgo-create-image-backupで日次、月次バックアップを運用しているケースではcronで次のように設定しています。

0 4 * * * /path/to/go-create-image-backup -instance-id i-1234567890abcdef0 -backup-generation 7 -service-tag Daily -region ap-northeast-1 2>&1 | /usr/bin/logger -t go-create-image-backup-daily
0 4 1 * * /path/to/go-create-image-backup -instance-id i-1234567890abcdef0 -backup-generation 24 -service-tag Monthly -region ap-northeast-1 2>&1 | /usr/bin/logger -t go-create-image-backup-monthly

少し変わり種のオプションとしては、実行中にエラーが発生した場合にメール通知するためのオプションがあります。 通知先のメールアドレスは-mail-toオプションで指定します。

$ go-create-image-backup -mail-to notify@example.com

この機能は、go-create-image-backupを社内利用し始めた時点ではなかったのですが、実際にお客様環境の運用管理を行っている現場のエンジニアから社内GitLabでMerge Requestが送られて来たのをきっかけに追加されました。
バックアップ時のエラー通知についても1つのツールで完結させることで、運用面のメリットもあると考え、機能として組み込んでしまいました。

まとめ

最近では、Amazon Data Lifecycle Manager (Amazon DLM)があり、EBSスナップショットによる定期バックアップを行えるようになっています。
しかし、お客様の環境によってはバックアップをAMIで取得しておきたかったり、取得間隔を柔軟に設定したいなどの要望があり、それに応じてバックアップの仕組みを整えるために、このようなツールを自作しています。

社内ではこのような運用ツールが他にもたくさんありますので、また別の機会に紹介させていただこうと思います。

株式会社ハートビーツのインフラエンジニアから、ちょっとした情報をお届けします。