tl;dr

たまたま aws-sdk-ruby に含まれている .travis.yml を見ていたら, 以下のように JRuby 環境でもテストを行っているようなので, 手元の環境でも JRuby 環境下で aws-sdk-ruby を試してみたメモ.

... 略 ...
rvm:
  - 1.9.3
  - 2.0.0
  - 2.1
  - 2.2
  - 2.3
  - 2.4
  - 2.5
  - jruby-9.1.16.0
... 略 ...

特にギョームで JRuby を使う予定は無い為, 本当にあくまでも興味本位として動かしてみた系のお話. 特に深堀はせずにとりあえず動いていることが確認出来れば OK という感じで進める.

尚, お試しの環境は以下の通り.

$ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
$ jruby --version
jruby 9.2.0.0 (2.5.0) 2018-05-24 81156a8 OpenJDK 64-Bit Server VM 25.171-b11 on 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11 +jit [linux-x86_64]

JRuby の導入

導入方法は幾つかあるが, 今回は rbenv を使って導入した.

$ rbenv install jruby-9.2.0.0
$ rbenv local jruby-9.2.0.0

これだけ.

aws-sdk-ruby の導入

とりあえず, aws-sdk-s3 のみを導入してみる.

$ jruby -S gem install aws-sdk-s3 --no-ri --no-rdoc -V

これだけ. 画面への出力については, 特に CRuby との違いはなく, 何の問題もなくインストールが完了する.

ちなみに, -S オプションは以下の通り.

-S                look for the script in bin or using PATH environment variable

サンプル

aws-sdk-s3 を使って, S3 バケットの一覧を取得するサンプルを以下のように作成する.

require 'aws-sdk-s3'

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

p s3.list_buckets.buckets.map(&:name)

これを sample.rb というファイル名で保存して, 以下のように実行する.

$ jruby sample.rb

まず JVM が起動する為, CRuby で実行するよりも実行時間を要するが, 以下のように無事にバケットの一覧を取得出来た.

$ jruby sample.rb 
["sample1", "sample2", "sample3"]

おおー, いい感じ.

awspec は動くのか

せっかくなので

awspec が JRuby 上で動作するのか試してみたい. 尚, あくまでもお試しである為, 完全に動作を保証するものではない. ご注意下さいまし.

awspec の導入

先ほどの aws-sdk-s3 導入と同様に, 以下のように awspec を導入する.

$ jruby -S gem install awspec --no-ri --no-rdoc -V

特に問題無くインストールが完了した.

awspec init

awspec に必要なディレクトリ等を作成する.

$ jruby -S awspec init

以下のように出力され, 必要なディレクトリ等が作成される. やはり, CRuby で実行するよりも時間はかかる.

$ jruby -S awspec init
 + spec/
 + spec/spec_helper.rb
 + Rakefile
 + spec/.gitignore
 + .rspec

テストを実行する

以下のような spec を書いた. S3 バケットが存在しているかどうかをテストする.

require 'spec_helper'

describe s3_bucket('my-bucket') do
  it { should exist }
end

以下のようにテストを実行する.

$ jruby -S rspec spec

以下のように出力されて, テストが動いていることを確認出来た.

# 存在しないバケットでテスト
$ jruby -S rspec spec

s3_bucket 'my-bucket'
  should exist (FAILED - 1)

Failures:

  1) s3_bucket 'my-bucket' should exist
     Failure/Error: it { should exist }
       expected s3_bucket 'my-bucket' to exist
     # ./spec/s3_spec.rb:4:in `block in (root)'

Finished in 2.3 seconds (files took 10.68 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/s3_spec.rb:4 # s3_bucket 'my-bucket' should exist

# 存在しているバケットでテスト
$ jruby -S rspec spec

s3_bucket 'sample1'
  should exist

Finished in 2.11 seconds (files took 10.69 seconds to load)
1 example, 0 failures

いい感じですな.

注意

以下の issue に言及されている通り, awspec は JRuby 上での動作は正式にはサポートされていない.

Hi. Looks like the way JRuby computes module names messes with this code here: https://github.com/k1LoW/awspec/blob/master/lib/awspec/helper/finder.rb#L55 "#{Aws::Lambda::Client}" comes o...

github.com

また, JVM の起動の遅さに引きづられてしまい, 簡単なテストでも 10 秒くらい掛かってしまうので, 現時点では実用的ではないと思われる.

以上

興味本位で試してみた系でした. JRuby だからって, あんまり構える必要は無いんだなって思った.

元記事はこちら

JRuby で aws-sdk-ruby を動かす