aws-go-sdk を使ってRDSをちょっとだけ操作できる「rds-try」というツールを作ってみた #jawsug #aws #golang

会社では色々と思い考えるところもあり、楽しみが欲しかったので自分の中の現在最強二択、AWSgolangを使ってちょっと手を動かしてみました。SDKAPIを使って操作するのってやっぱり楽しいなー

github.com

これは何?


awslabs/aws-sdk-go · GitHub

The Go Programming Language

http://golang.org/

awssdk−goとgolangを使ってAmazon RDSをちょっとだけ操作できる「rds−try」というツールを作ってみました。


Amazon RDS(リレーショナルデータベースサービス Amazon Relational Database Service) | アマゾン ウェブ サービス(AWS 日本語)

ちょこっとだけというのは、現状だとAmazon RDS for MySQLのみの対応だったり動作しているRDSのインスタンスが必須だったりと制限事項が多々あります。

このあたりは元々自分用+社内で利用ぐらいを考えていたのである程度はしょうがないところもありつつ、思うところもあったので公開してみました。

何が出来る?

細かいところは README.md に書いてあるのでそちらを確認してください。ここでは簡単に出来ることを書いてみました。

es コマンド

f:id:uchimanajet7:20150303193810g:plain

スナップショットからRDSインスタンスを復元して、復元したインスタンスに対してSQLを実行して実行時間の計測と、実行結果を取得することができます。

スナップショットはコマンド実行時にも取得可能です。復元する際に動作中のインスタンスから情報を取得して設定しているため、動作中のRDSインスタンスが必要となります。

ls コマンド

f:id:uchimanajet7:20150303193816g:plain

es コマンドで作成したRDSインスタンスとスナップショットの一覧を表示します。一覧表示の対象となるのは作成時にTag付けした内容を確認し、es コマンドで作成されたと判断されたものだけになります。

Tagが編集されていたり、万が一同じ内容のTagが既に付けられていた場合にはls コマンドの対象となりますので注意してください。

rm コマンド

f:id:uchimanajet7:20150303193824g:plain

ls コマンドと同様にes コマンドで作成したRDSインスタンスとスナップショットの一覧を削除対象として表示します。一覧表示の対象となるのはls コマンドと同様となります。

削除を実行すると、削除対象として一覧表示されていたRDSインスタンスとスナップショットすべてを削除しますので実行には注意してください。

何に使うの? 

半年ほど前まで担当していた自社認証系サービスで、通常時の登録・認証処理はトラフィックがあまりないので小さいサイズのインスタンスを使っていたのですが、ある程度登録数が増えてくると集計や抽出処理でインスタンスサイズが小さすぎてボトルネックになっていました。

そういった場合に、AWSであればAWS Data Pipelineを使って他のサービスでの処理や、RDSだけでもスナップショットを利用して処理用のインスタンスを利用時だけ作成することも可能です。

また、現在であればAWS CLIが非常に便利で強力なのでCLIを利用して上記のような処理を自動化すれば要件を満たせるかと思います。


AWS | Amazon Data Pipeline – データワークフローオーケストレーションサービス

AWS コマンドラインインターフェイス

http://aws.amazon.com/jp/cli/

じゃー何に使うのかって話ですが、golangはクロスコンパイル出来てバイナリ1つで実行可能なので、このポータビリティーを生かしてちょっと試したりバッチ実行だけの為にいろいろとインストールする手間をかけたくない時には有効だと思います。

作ってみて

golangらしい部分があまりないコードとなってますが、golangは書いてて楽しい!

そしてawssdk−goがAPIの薄いラッパー層 となっている印象なので、APIリファレンスを見ながらサクサク書けてこっちも楽しい!

また、APIを触ることでAWSサービスへの理解も深まりました。すごくお勧めです。


Welcome - Amazon Relational Database Service


Welcome - AWS Identity and Access Management

今後

いろいろと制限事項があるのでそれを可能な限り取り除くこと。

また、結局はちょっと動かして終了となる感じの使い方になるのでさらに手軽に使えるようにしたいなぁと。

スポットインスタンス作成 → rds-try実行 → 結果をS3に → 通知 → 利用したものを削除なんかが普通っぽいのかな?

EC2起動しないでAWS Lambda使えるようになると楽しそうだなーAWS LambdaのJavaScript意外の言語対応をのんびり待ってます。golangについてはWebアプリを作ってみたいなーと。

AWS Lambda (コードの実行、リソース自動管理プラットフォーム) | アマゾン ウェブ サービス(AWS 日本語)

http://aws.amazon.com/jp/lambda/

参考にした情報 

golangにしろAWSにしろ、Web上にめちゃくちゃ情報があって凄い助かります。ユーザー活動?が活発だとほんと有難い。

確認できるだけで他にもたくさんWebの情報見ました。いろいろ勉強になりましたーあざっす。

CI-as-a-ServiceでGo言語プロジェクトの最新ビルドを継続的に提供する | SOTA

http://deeeet.com/writing/2014/10/16/golang-in-ci-as-a-service/


Mocking HTTP Responses in Golang | Keighl


Big Sky :: golang で複数のエラーをハンドリングする方法


golang - os.Exit()とdefer - Qiita


golang - cliパッケージでサブコマンドを作る - Qiita


mitchellh/cli · GitHub


Google グループ


go - sort golang map values by keys - Stack Overflow


Go言語のchannelって一体何よ ~基礎編~【golang】 - DRYな備忘録


インタフェースの実装パターン #golang - Qiita


Golang logging library - Qiita


Go言語でエラーを書くときに気をつけること - taknb2nchのメモ


Go言語のコマンドライン引数の使い方(サブコマンド等) - 小野マトペの納豆ペペロンチーノ日記


golang - Go言語で幸せになれる10のテクニック - Qiita

AWS Account Numberを取得するN個の方法 

RDSのSnapshotミラー&テストツール [RDS TestRunner] をGoで実装した話 :: Crocos Engineering Blog 

http://engineering.crocos.jp/post/95813111405/rds-snapshot-rds-testrunner-go

 

github.com

github.com