Miscellaneous notes

主に技術的な雑記的な

AWS SDK for Goで貧者のためのEC2バックアップCLIツールを作ってみた

AWS SDK for Go(のベータ版)が出たので触ってみたくて作ってみました。

最近の(自分の周りの)EC2バックアップ事情

EC2の定期バックアップは特に受託案件だとほぼ必須で各社・各個人で色々な方法でやっていることと思います。

最近だとお金があるなら「Cloud Automator使え」ってなるんですが、僕らのような貧者は昔からEC2のタグを見てバックアップを行うスクリプトをcronで回していたり、Jenkinsおじさんにお願いしたりするわけです。

で、一括管理できるようにアカウント横断で共用サーバ上で回すのが楽なわけですが、必ずしもそうできないような場面も会って、そうなるとスクリプトを別のサーバに仕込むわけです。

ただ、そうやってバックアップスクリプトが増殖していくと、そのうちAPI仕様変更とかSDKのバージョン違いによるバグ踏んじゃったりとか、Chefとかがあるとはいえそのためだけに何かしらの言語ランタイム入れないと…とか、ツラい未来(一部現在進行形)が色々想像できちゃうわけです。

Goで書いてみた理由

その点、Goなら言語ランタイムは要らないし、API仕様変更は無理ですがSDKのバージョン違いによるバグはテスト済みでコンパイルされたバイナリを使っている限り起きえませんし、万が一何かあってもバイナリ差し替えるだけなので楽です。

WindowsでもLinuxでも同じコードベースで動くのでWindows Server一台案件とかでも問題ありません。

あと、今までのはこのへんを参考に作っていたりするのですが、Nameタグを制御に使うのは微妙だと前々から思っていたので書き直したかった。

ということで作ってみました。

marcy-go/ec2backup · GitHub

使い方

前提

以下の権限のIAM Roleを有するEC2インスタンス

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateImage",
        "ec2:CreateSnapshot",
        "ec2:CreateTags",
        "ec2:DeleteSnapshot",
        "ec2:DeregisterImage",
        "ec2:DescribeImages",
        "ec2:DescribeInstances",
        "ec2:RegisterImage"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
1. バックアップ対象のEC2にBackup-Generationタグを設定

f:id:FumblePerson:20150217232147p:plain
※Valueはバックアップ世代数

2. バイナリを取得してEC2上に配置
バージョン ダウンロード元
HEAD Downloads | ec2backup
Release Releases · marcy-go/ec2backup · GitHub

※実行するOSとArch(amd64 or 386)によってバイナリが別なので注意

3. コマンド実行
/path/to/ec2backup self
  • Linuxアカウント全体
/path/to/ec2backup all
C:¥path¥to¥ec2backup.exe self
C:¥path¥to¥ec2backup.exe all

今後対応したいやつ

  • credentialsファイル指定、profile切り替え
  • Backup-Generationタグを無視するオプション
  • コマンドからの Backup-Generationタグ設定

以上です。
お金がある方はCloud Automator、無い方は良かったら使ってみてください。