b.l0g.jp     About     Archive     Feed

AWSのEBSボリュームのスナップショットを定期的に取る

小ネタだけど、久しぶりに技術的な内容の記事を書いてみる。最近はこういうのはQiitaに書くのが流行り?

EBSボリュームのスナップショット

インスタンスストレージ(インスタンスに無料で付いてくるローカルストレージ)と比べてEBSを使うことの利点の一つに、スナップショットを取れるというのがある。これはもちろんAWSのコンソールからの操作でも、awscliのようなツールを使ってもできるんだけど、いちいちこれらの操作をやるのは面倒になってくる。そうすると、

  • 自動で定期的にスナップショットを取りたい
  • 古いスナップショットは自動的に消したい
  • 複数のEBSボリュームのスナップショットをまとめて取りたい
  • 全ボリュームのスナップショットを取る必要はなく、一部だけ取っておきたい

みたいな話が出てくる。

そういう時にはもちろんawscliや各言語のSDKを使って自分でこれを実装してもいいのだが、AWS Missing Toolsと言う、AWSに関するちょっと痒いところに手が届くツール集があって、これに含まれるEBSスナップショット取得用のスクリプト ec2-automate-backup.sh を使うと便利。

ec2-automate-backup.shの使い方

拡張子でわかる通り単なるシェルスクリプトで、中ではawscliを駆使して処理を行っている。なので、前提としてawscliがインストールされていて、credentialの設定が終わっている必要がある。awscliのインストール方法については割愛。

awscliの用意が済んだら、リポジトリをクローンしてきてコマンドを叩けばよい。

  
git clone https://github.com/colinbjohnson/aws-missing-tools.git
  
cd aws-missing-tools/ec2-automate-backup
  

コマンドのオプションはREADMEに書いてあるが、イマイチわかりにくい。最低限以下がわかればとりあえずのバックアップは取れる。

  • -s [volumeid|tag] : バックアップ対象のボリュームをボリュームID指定するか、特定のタグが付いているもので指定するかを選択する。tagを選んでおくと、例えば「Backup=true」と付いているボリュームを一括でバックアップする、ということが可能。
  • -v ボリュームID : -s volumeidを指定した場合にボリュームIDを指定する。
  • -t 'タグ名,Values=値' : -s tagを指定した場合にタグ名を指定する。上の例のように「Backup=true」のタグが付いているボリュームをバックアップする場合、-t 'Backup,Values=true'と指定する。ここちょっとわかりにくい。なお、タグはEC2インスタンスではなくEBSボリュームに付ける
  • -r リージョン : リージョン指定。ap-northeast-1とか。
  • -n : タグ指定でスナップショットを取った時、スナップショットのNameタグに、元のボリュームIDを入れる
  • -k 日数 : 指定した日数以上経過したスナップショットは削除可能タグが付けられる
  • -p : -kで指定した日数以上経過したスナップショットを実際に削除する

具体的には、以下のようにコマンドを実行する。これは「Backup=trueタグが付いたボリュームのスナップショットを作成し、7日以上経過したスナップショットを削除する」例。

  
bash ec2-automate-backup.sh -s tag -t 'Backup,Values=true' -r ap-northeast-1 -n -k 7 -p
  

実際の挙動的には、-k 7オプションがあるので7日経つとスナップショットにPurgeAllow=trueタグが付けられ、次の実行で-pオプションが効いてPurgeAllow=trueがついているスナップショットが消される、という流れになる。

これをcrontabに書いておくなりJenkinsで定期実行するなりしておけば、うっかりファイルを消してしまったとか、データベースがぶっ壊れたみたいな時にもサクッと戻せて幸せになれる。

Twitterボットを作るのがひそかな趣味

 

プログラミングの勉強にと思ってTwitterボットを作ってみたら、ことあるごとに「あっ、これもボットになってたら便利そう」と思うようになってしまって、さらにいくつか作るという流れ。それなりに便利なのができると、ほっといてもフォロワーが増えていくのが楽しくなってしまう。今まで作ったボットのまとめ。

深田久弥bot  @fukadakyuya_bot

TLでフォロワーのみなさまと盛り上がったのがきっかけで、初めて作ったTwitterボット。ボットをフォローしているユーザが深田久弥の著書「日本百名山 (新潮文庫)」に含まれる山名を含んだつぶやきをすると、同書の中からその山の特徴などを表した部分をリプライする。また、1日1回7:00にはランダムに抜粋をつぶやく。

最初はPHPで書いたのだがいつの間にかうまく動かなくなったりして、Rubyで書き換えた。ソースコードはGithubに上げてある。作った頃はRubyのエコシステムが良く分かってなくて、bundler使わずにやってたりして、自分でもどうやって動いてるのか理解してなかったなあw リプライする山名にどういう傾向があるのか気になったので、山名ごとにリプライ数を集計する仕組みも作ってみた。基本的に富士山がダントツに多いのだが、例えば最近だと吾妻山や蔵王山(火山活動活発化)、立山(アルペンルート開通)といったように、急にリプライ数が増えた山があると、大体そこでは何かあったということが分かって面白い。

山の天気 @yamatenki

毎朝7:30前後に、その週末に天気がいい(登山日和になりそうな)山を地域ごとにツイートする。 土曜と日曜それぞれ分けて判断するようになっている。祝日などの連休にも対応させたいが、めんどくさそうなので先送りしてしまっている。

山名を含んだメンションを送ると、少し詳しい天気予報をリプライしてくれる。

こちらも最初はPHPで作ったが今はRuby製。天気が一覧で見れるページも定期的に生成している。 深田久弥botと違ってうざくない作りなのもあってか、フォロワーが4600以上(2015年5月)もいて、自分の作ったボットの中では一番多い。

hatebu english @hatebu_e

はてなブックマークが一定数以上付いた日本語以外の(正確には、タイトルと本文に全角文字を含まない)記事をツイートする。Yakstという主に英語のブログ記事などを翻訳して公開するサイトを解説しているのだが、そのネタ探しの足しになるかと思って作った。

誰得なのかよく分からないボットなので、フォロワーは少ないw

AWS障害情報(全リージョン) @awsstatusjp_all

AWS障害情報(東京リージョン) @awsstatusjp

仕事でAWSを本格的に使い始めたので、手軽にAWSのステータス情報を知れる手段がないかと思ったのだが、いい感じのボットがなかったので作った。時刻を日本時間に直し、定型的な文言はなるべく日本語に翻訳するようにしている。GCPとかのボットもなければ作ってみようかな。

ちなみに、プロジェクトでHipchatやSlackなどのチャットツールを使っている場合、それぞれのTwitter連携機能を使ってこのボットのツイートを拾うようにすれば、AWSの障害情報が流れてくるようになって便利。

ボットを作ると、プログラミングの基礎もだが、Twitter APIやスクレイピングのテクニックなど、作るボットに応じて色々な技術が必要とされるので、新しい言語を覚える人とか、そもそもプログラミング初心者にはもってこいの課題になる。オススメです。

「SQLパフォーマンス詳解」という本を翻訳しました

 

sqlperformanceexplainedja題の通り、「SQLパフォーマンス詳解」(原文タイトルSQL Performance Explained)という本を翻訳しました。PDF版と印刷版が上記サイトから購入できます。

(追記 2017年9月から、渋谷のBOOK LAB TOKYOさんでも印刷版を販売していただいています。輸送コストの関係で、サイトから購入するより若干安くなっています)

リレーショナルデータベースにおいて、SQLとインデックスがどのように関連し、どのようにすればSQLのパフォーマンスを良くできるのかを解説した本です。特定のデータベース製品に焦点を当てた本は多数ありますが、この本ではOracle Database、PostgreSQL、MySQL、SQL Serverの4つのメジャーなリレーショナルデータベース製品を同時に扱っていて、それぞれのクセや特徴も分かるように書かれている点が非常にユニークになっています。また、ORMが生成するSQL文の違いなどにも言及されています。

前書きにもあるように、データへのアクセスパスを知っているのは他ならぬ開発者なので、開発者自身がSQLとインデックスについての知識を深めなければ本当の高速化はできない、というのが著者の考えのようですが、もちろんアプリ開発者だけでなくインフラエンジニア、データベースエンジニアの方々にもおすすめできる内容だと思います。

目次とそれぞれの内容は以下の通りです。

  • 第1章 インデックスの内部構造
    • インデックスとはそもそも何か、インデックスはどのような仕組みか
  • 第2章 where句
    • where句とインデックスの関連、例えば=を使った場合、likeを使った場合など演算子の違いによるインデックスの活用方法など
  • 第3章 パフォーマンスとスケーラビリティ
    • インデックスの作り方の違いによるパフォーマンスとスケーラビリティの違い
  • 第4章 結合処理
    • 結合(join)とインデックスの関連
  • 第5章 データのクラスタリング
    • データのクラスタリング(HAクラスタなどではなく、いわゆるクラスタリングインデックスのこと)
  • 第6章 ソートとグルーピング
    • ソート(order by)やグルーピング(group by)とインデックスの関連
  • 第7章 部分結果
    • MySQLで言うlimitやPostgreSQLのfetch firstのような、結果の一部分を取得するSQL文とインデックスの関連
  • 第8章 データの変更
    • update, insert, deleteといった更新処理とインデックスの関連
  • 付録A 実行計画
    • 各データベース製品での実行計画の表示方法とその読み方

既にご存知の方もいるかもしれませんが、Use The Index, Lukeという名でほぼ全文がWeb上で公開されています。とはいえWeb上で通しで読むのはかなり辛いですし、PDFあるいは印刷版を購入いただければ、作者・訳者とも嬉しい限りです。

私は、Yakstというサイトで海外のブログ記事などを翻訳して公開するというのをやっているのですが、原著者(Markus Winandさん)が書かれたブログ記事を翻訳させてもらったのがきっかけで、この本の翻訳をやることになりました。オンライン販売だけの予定なので書店に本が並ぶわけではないとは言え、自分が訳した本が人に読まれることになるというのは、不思議な感覚です。Markusさんはオーストリア人で英語のネイティブスピーカーではないこともあり、原文は非常に分かりやすい英語で書かれているのですが、それでも翻訳の難しさ、自分の未熟さをひしひしと感じました。素晴らしい本を書いてくださった原著者のMarkusさん、私のつたない訳を丁寧にレビューしてくださった@matsuuさん、ありがとうございました!

訳の問題など、ご意見ご感想ありましたら@dblmktまでいつでもご連絡ください。

ちなみに、海外の有益な技術系ブログを翻訳して公開しているYakstで、翻訳を一緒にやっていただける仲間も募集しておりますので、良かったらそちらも是非よろしくお願いします。