Ruby Sample for AWS Cloud9

「そもそもAWS Cloud9、Ruby on Railsサポートしてないんじゃない?テンプレ消えてない??」
って言われたので方向転換してとりあえずAWS Cloud9上でRubyを動かしてみようと思います。

トライするのはこれ。 docs.aws.amazon.com

Step 1: Install Required Tools

kabe:~/environment $ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

Rubyは入ってるので(知ってる)、yumの最新化だけしとく。

Step 2: Add Code

f:id:kabe1087:20171208154611p:plain

Step 3: Run the Code

f:id:kabe1087:20171208154743p:plain 普通にうごくね。

Step 4: Install and Configure the AWS SDK for Ruby

AWS SDK for RubyをつかってAWSの他のサービスを操作してみる。
まずはAWS SDK for Rubyのインストール

kabe:~/environment $ gem --version
2.6.14
kabe:~/environment $ sudo gem install aws-sdk
Fetching: jmespath-1.3.1.gem (100%)
〜中略〜
135 gems installed

スムーズにすすむ(´;ω;`)
ここで他のAWSサービスを操作するための権限設定をしなくてはならないのでIAMコンソールに移動。

After you install the AWS SDK for Ruby, you must set up credentials management in your environment. The AWS SDK for Ruby needs these credentials to interact with AWS services.

docs.aws.amazon.com

Create and Use an Instance Profile to Manage Temporary Credentials
To create an instance profile

Cloud9はEC2でいいのかな??? f:id:kabe1087:20171208162001p:plain

To attach an instance profile to an instance

Cloud9のEC2インスタンスにさっき作ったRoleをアタッチする f:id:kabe1087:20171208162433p:plain Cloud9に戻ってaws configureを実行

kabe:~/environment $ aws configure
AWS Access Key ID [****************R27Q]: 
AWS Secret Access Key [****************WYVB]: 
Default region name [ap-southeast-1]: ap-southeast-1
Default output format [None]: 

Step 5: Add AWS SDK Code

Roleの設定ができたのでRuby Sampleに戻ります。
YOUR_REGIONを環境に合わせて書き換えるの忘れないで。 f:id:kabe1087:20171208163337p:plain

Step 6: Run the AWS SDK Code

f:id:kabe1087:20171208163537p:plain Oh...エラー出ちゃった…
どうもさっきインストールしたaws-sdkにパスが通ってない??
aws-sdk自体は/usr/local/share/ruby/gems/2.0/gemsにインストールされている模様

kabe:~/environment $ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.14
  - RUBY VERSION: 2.4.1 (2017-03-22 patchlevel 111) [x86_64-linux]
  - INSTALLATION DIRECTORY: /usr/local/rvm/gems/ruby-2.4.1
  - USER INSTALLATION DIRECTORY: /home/ec2-user/.gem/ruby/2.4.0
  - RUBY EXECUTABLE: /usr/local/rvm/rubies/ruby-2.4.1/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/local/rvm/gems/ruby-2.4.1/bin
  - SPEC CACHE DIRECTORY: /home/ec2-user/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /usr/local/rvm/rubies/ruby-2.4.1/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /usr/local/rvm/gems/ruby-2.4.1
     - /usr/local/rvm/gems/ruby-2.4.1@global
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
  - SHELL PATH:
     - /home/ec2-user/.nvm/versions/node/v6.11.4/bin
     - /usr/local/rvm/gems/ruby-2.4.1/bin
     - /usr/local/rvm/gems/ruby-2.4.1@global/bin
     - /usr/local/rvm/rubies/ruby-2.4.1/bin
     - /usr/local/bin
     - /bin
     - /usr/bin
     - /home/ec2-user/.local/bin
     - /home/ec2-user/bin
     - /usr/local/sbin
     - /usr/sbin
     - /sbin
     - /opt/aws/bin
     - /usr/local/rvm/bin
     - /home/ec2-user/.local/bin
     - /home/ec2-user/bin
     - /home/ec2-user/.local/bin
     - /home/ec2-user/bin
kabe:~ $ which gem
/usr/local/rvm/rubies/ruby-2.4.1/bin/gem

そうだよねぇ…そこにないもんねぇ。なんで違うとこにインストールされちゃったのかな。
いったんPATH通してみる。

kabe:~/ $ export RUBYLIB=/usr/local/share/ruby/gems/2.0/gems
kabe:~ $ source .bashrc
function

f:id:kabe1087:20171208165616p:plain うーん、ダメでした。そもそもrvmで管理してるgemの置き場所じゃないところにaws-sdkをインストールしちゃってるのがダメなのかな??
てかINSTALLATION DIRECTORYにインストールされるはずなんだけど、なんで違うとこに入っちゃうの??

kabe:~ $ gem install aws-sdk
〜略〜
kabe:~ $ find /usr/local/ -name "aws-sdk-s3-1.8.0*"
/usr/local/share/ruby/gems/2.0/specifications/aws-sdk-s3-1.8.0.gemspec
/usr/local/share/ruby/gems/2.0/cache/aws-sdk-s3-1.8.0.gem
/usr/local/share/ruby/gems/2.0/gems/aws-sdk-s3-1.8.0
/usr/local/share/ruby/gems/2.0/doc/aws-sdk-s3-1.8.0
/usr/local/rvm/gems/ruby-2.4.1/specifications/aws-sdk-s3-1.8.0.gemspec
/usr/local/rvm/gems/ruby-2.4.1/cache/aws-sdk-s3-1.8.0.gem
/usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-s3-1.8.0
/usr/local/rvm/gems/ruby-2.4.1/doc/aws-sdk-s3-1.8.0

sudoしないでgem installし直したら治った。なんなのよ(´;ω;`)

/usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call': The AWS Access Key Id you provided does not exist in our records. (Aws::S3::Errors::InvalidAccessKeyId)
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-s3-1.8.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:22:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-s3-1.8.0/lib/aws-sdk-s3/plugins/dualstack.rb:26:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:20:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/aws-sdk-core/plugins/idempotency_token.rb:17:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/aws-sdk-core/plugins/param_converter.rb:24:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/aws-sdk-core/plugins/response_paging.rb:10:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/seahorse/client/plugins/response_target.rb:23:in `call'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-core-3.11.0/lib/seahorse/client/request.rb:70:in `send_request'
        from /usr/local/rvm/gems/ruby-2.4.1/gems/aws-sdk-s3-1.8.0/lib/aws-sdk-s3/client.rb:3321:in `list_buckets'
        from /home/ec2-user/environment/s3.rb:9:in `list_my_buckets'
        from /home/ec2-user/environment/s3.rb:18:in `<main>'


Process exited with code: 1

違うエラーになったよ!
アクセスキーが無効…。ロールのアタッチのときにアクセスキーの発行までやったっけ???
つーことで、もっかい↓に戻ります。
Calling AWS Services from an Environment in AWS Cloud9 - AWS Cloud9

Create and Store Permanent Access Credentials in an Environment