AWS SDK for RubyでのAPI操作をインタラクティブに実行する

2015.07.08

AWS SDKを使うと、各種プログラミング言語からAWSのリソースを操作することが出来ます。

現時点(2015年7月時点)でサポートされいる言語/プラットフォームとしてはJava、.NET、Node.js、PHP、Python、Ruby、Go、Javascript(in Browser)、Android、iOS、Unityがありますが、この中では私はAWS SDK for Rubyを使用する機会が多いです。(個人的な趣味趣向です。)

Rubyなので(というかスクリプト言語なので)、APIのテストをする時もスクリプトを作成してはテスト実行というサイクルを割とカジュアルに回せはするのですが、とは言え、ちょっとこのAPIの戻り値を確認したいな〜という時など、いちいちスクリプトを作成して実行するのが面倒な場合も結構あります。

AWS CLIを使うが如く、AWS SDK for Rubyを使ってもっとカジュアルにAPIを呼び出せればよいのに、、、そんなときに登場するのが、今回ご紹介するaws.rbです。

aws.rbとは

AWS SDK for Rubyに付属のコマンドで、irbまたはPryを使ってAWS SDK for Rubyを対話形式で実行できるツールです。(いわゆるREPLを提供してくれるツールです。)

コマンドライン上で対話形式でAPIにアクセスできるので、ちょっとしたAPIのテスト時などに重宝します。

aws.rbの使い方

前提となる環境

  • OS : OS X Yosemite 10.10.4
  • Ruby : 2.2.2(rbenvでインストール)
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]

インストール

前述のとおり、aws.rbはAWS SDK for Rubyの付属品ですので、AWS SDK for Rubyをインストールすれば使えるようになります。Pryを使いたい場合は、こちらもインストールしておきます。

$ gem install aws-sdk
$ gem install pry

事前準備

クレデンシャル情報を~/.aws/credentialsに設定しておきます。

AWS SDK for Ruby V2 - Configuration

[default]
aws_access_key_id =
aws_secret_access_key =

起動方法

引数にリージョンを指定して、aws.rbを実行します。

$ aws.rb --region ap-northeast-1
Aws>

aws.rbデフォルトではPryを使用します。irbを使いたい場合は引数に--repl irbを指定してaws.rbを起動します。

## irbを指定して起動
$ aws.rb --region ap-northeast-1 --repl irb
irb(main):001:0>

## pryを明示的に指定して起動
$ aws.rb --region ap-northeast-1 --repl pry
Aws>

APIへのアクセス

aws.rbでは、全てのサービスクラスで、各種サービスのクライアントオブジェクトを新規に生成するためのヘルパーメソッドが定義されています。

ヘルパーメソッド名はサービスモジュール名を小文字にしたものとなっています。

サービスモジュール名 ヘルパーメソッド名
Aws::S3 s3
Aws::EC2 ec2
Aws::Lambda lambda

と言った感じです。

例えば、通常SDKでS3のAPIにアクセスするためには以下のようにS3のクライアントオブジェクトをnewしてやる必要があるわけですが、

s3 = Aws::S3::Client.new(region: 'ap-northeast-1a')

aws.rbではいちいちnewしなくてもいきなりこのs3が使える、というイメージです。

実際にaws.rbをからS3のバケット一覧を取得してみます。list_bucketsを使います。

Aws>s3.list_buckets
[Aws::S3::Client 200 0.736553 0 retries] list_buckets()
=> # buckets=
[#,
#,
#,
#],
owner=
#>

クライアントオブジェクト生成のステップが無いので、AWS CLIに近い感覚でAWS SDK for Rubyが使えます。

続いてバケットの名前だけを取り出して表示してみます。(結果が見易くなるように、最後に;nilをつけて、戻り値のオブジェクトが表示されないようにしています。)

Aws>s3.list_buckets[0].each {|bucket| puts bucket.name};nil
[Aws::S3::Client 200 0.697434 0 retries] list_buckets()
yy.config-bucket
yy-redshift-audit-logs
yy.lambda-test-source
yy.lambda-test-sourceresized)
=> nil

バケットを新規に作成してみます。

Aws>s3.create_bucket({bucket: "yy-aws.rb-test"})
[Aws::S3::Client 200 1.921468 0 retries] create_bucket(bucket:"yy-aws.rb-test",create_bucket_configuration:{location_constraint:"ap-northeast-1"})
=> #

Aws>s3.list_buckets[0].each {|bucket| puts bucket.name};nil
[Aws::S3::Client 200 0.697434 0 retries] list_buckets()
yy.config-bucket
yy-aws.rb-test
yy-redshift-audit-logs
yy.lambda-test-source
yy.lambda-test-sourceresized)
=> nil

EC2のAPIも同様に操作してみます。インスタンスIDの一覧を表示します。

Aws>ec2.describe_instances.reservations.each { |reserv| puts reserv.instances[0].instance_id };nil
i-715d8883
i-725c8980
i-2c5c89de
=> nil

まとめ

AWS SDK for Rubyを使ったAPIコールの引数や戻り値などは、ドキュメントを読んだだけではピンと来ないものがたまにあったりします。そんな時はこのaws.rbを使ってAPIのテストを実行し、引数の意味や戻り値(オブジェクトの中身)を確認してみるのが良いかと思います。

参考