aws-go-sdk を使ってRDSをちょっとだけ操作できる「rds-try」というツールを作ってみた #jawsug #aws #golang
会社では色々と思い考えるところもあり、楽しみが欲しかったので自分の中の現在最強二択、AWSとgolangを使ってちょっと手を動かしてみました。SDKやAPIを使って操作するのってやっぱり楽しいなー
これは何?
The Go Programming Language
aws−sdk−goとgolangを使ってAmazon RDSをちょっとだけ操作できる「rds−try」というツールを作ってみました。
Amazon RDS(リレーショナルデータベースサービス Amazon Relational Database Service) | アマゾン ウェブ サービス(AWS 日本語)
ちょこっとだけというのは、現状だとAmazon RDS for MySQLのみの対応だったり動作しているRDSのインスタンスが必須だったりと制限事項が多々あります。
このあたりは元々自分用+社内で利用ぐらいを考えていたのである程度はしょうがないところもありつつ、思うところもあったので公開してみました。
何が出来る?
細かいところは README.md に書いてあるのでそちらを確認してください。ここでは簡単に出来ることを書いてみました。
es コマンド
スナップショットからRDSインスタンスを復元して、復元したインスタンスに対してSQLを実行して実行時間の計測と、実行結果を取得することができます。
スナップショットはコマンド実行時にも取得可能です。復元する際に動作中のインスタンスから情報を取得して設定しているため、動作中のRDSインスタンスが必要となります。
ls コマンド
es コマンドで作成したRDSインスタンスとスナップショットの一覧を表示します。一覧表示の対象となるのは作成時にTag付けした内容を確認し、es コマンドで作成されたと判断されたものだけになります。
Tagが編集されていたり、万が一同じ内容のTagが既に付けられていた場合にはls コマンドの対象となりますので注意してください。
rm コマンド
ls コマンドと同様にes コマンドで作成したRDSインスタンスとスナップショットの一覧を削除対象として表示します。一覧表示の対象となるのはls コマンドと同様となります。
削除を実行すると、削除対象として一覧表示されていたRDSインスタンスとスナップショットすべてを削除しますので実行には注意してください。
何に使うの?
半年ほど前まで担当していた自社認証系サービスで、通常時の登録・認証処理はトラフィックがあまりないので小さいサイズのインスタンスを使っていたのですが、ある程度登録数が増えてくると集計や抽出処理でインスタンスサイズが小さすぎてボトルネックになっていました。
そういった場合に、AWSであればAWS Data Pipelineを使って他のサービスでの処理や、RDSだけでもスナップショットを利用して処理用のインスタンスを利用時だけ作成することも可能です。
また、現在であればAWS CLIが非常に便利で強力なのでCLIを利用して上記のような処理を自動化すれば要件を満たせるかと思います。
じゃー何に使うのかって話ですが、golangはクロスコンパイル出来てバイナリ1つで実行可能なので、このポータビリティーを生かしてちょっと試したりバッチ実行だけの為にいろいろとインストールする手間をかけたくない時には有効だと思います。
作ってみて
golangらしい部分があまりないコードとなってますが、golangは書いてて楽しい!
そしてaws−sdk−goがAPIの薄いラッパー層 となっている印象なので、APIリファレンスを見ながらサクサク書けてこっちも楽しい!
また、APIを触ることでAWSサービスへの理解も深まりました。すごくお勧めです。
今後
いろいろと制限事項があるのでそれを可能な限り取り除くこと。
また、結局はちょっと動かして終了となる感じの使い方になるのでさらに手軽に使えるようにしたいなぁと。
スポットインスタンス作成 → rds-try実行 → 結果をS3に → 通知 → 利用したものを削除なんかが普通っぽいのかな?
EC2起動しないでAWS Lambda使えるようになると楽しそうだなーAWS LambdaのJavaScript意外の言語対応をのんびり待ってます。golangについてはWebアプリを作ってみたいなーと。
AWS Lambda (コードの実行、リソース自動管理プラットフォーム) | アマゾン ウェブ サービス(AWS 日本語)
参考にした情報
golangにしろAWSにしろ、Web上にめちゃくちゃ情報があって凄い助かります。ユーザー活動?が活発だとほんと有難い。
確認できるだけで他にもたくさんWebの情報見ました。いろいろ勉強になりましたーあざっす。
CI-as-a-ServiceでGo言語プロジェクトの最新ビルドを継続的に提供する | SOTA
http://deeeet.com/writing/2014/10/16/golang-in-ci-as-a-service/
RDSのSnapshotミラー&テストツール [RDS TestRunner] をGoで実装した話 :: Crocos Engineering Blog
http://engineering.crocos.jp/post/95813111405/rds-snapshot-rds-testrunner-go