KEMBAR78
JAWS-UG静岡 #1 Introduction to AWS SDK for Ruby | PDF
Introduction
           to AWS SDK
             for Ruby
                        ISOBE Kazuhiko
                          (cloudpack)
                         JAWS-UG静岡 2011-11-27
Powered by Rabbit 1.0.4 and COZMIXNG
提供

     このLTはcloudpackの提供で
        お送りいたします



01                        36
cloudpack
     AWS導入・構築支援、コンサル
     ティング、システム構築サービス
     2010年4月 サービス開始
     2011年1月 AWS ソリューション
     プロバイダ認定
02                         36
cloudpack

     月額費用固定型
     日本円で請求書発行

     フルマネージドホスティング

03                   36
cloudpack


        詳しくはWebで!

     http://cloudpack.jp/


04                          36
自己紹介

     Twitter: muramasa64
     cloudpackでAWSを運用
     好きなAWSサービス: API

05                         36
AWS SDK for Ruby

     AWS公式のSDK
      2011年7月14日に初リリース
      最新版は1.2.3

06                       36
できること
     RubyからAWSのAPIを実行できる
     EC2, ELB, S3, SNS, SQS, STS,
     SES, IAM, SimpleDB, VPCに対
     応
      RDS未対応が惜しい
07                                  36
できること
     Ruby on Rails の ActiveRecord
     で、SimpleDBが使える
     まだリリースから間もないので、
     他のSDKに比べてできることはや
     や少なめ
08                                  36
入手方法

     gem
             gem install aws-sdk
     github
      git clone git://github.com/amazonwebservices/aws-sdk-for-ruby.git


09                                                                        36
使う準備

     config.yml
      access_key_id: <YOUR_ACCESS_KEY>
      secret_access_key: <YOUR_SECRET_KEY>



10                                           36
ライブラリと設定

     require 'aws-sdk'

     AWS.config(
       YAML.load(File.read('config.yml')))

      
11                                           36
EC2

     EC2を起動する
     ec2 = AWS::EC2.new
     ec2.instances.create(
       :image_id => 'ami-f49623f5'
       :key_name => 'keypair_name'
       :security_group_ids => ['default'])

12                                           36
Snapshot

     各ボリュームのスナップショットを
     作成する
      ec2.volumes.each do |v|
        v.create_snapshot(
          "from #{v.id} at #{Time.now}")
      end

13                                         36
Security Group
     IPアドレスを一括で置換する
      src_ip = 'x.x.x.x/32'
      dst_ip = 'y.y.y.y/32'

      ec2.security_groups.each do |src_sg|
        puts "#{src_sg.id}, #{src_sg.name}"

        src_sg.ip_permissions.each do |p|
          if p.ip_ranges.include? src_ip
            src_sg.authorize_ingress(p.protocol, p.port_range, dst_ip)
            src_sg.revoke_ingress(p.protocol, p.port_range, src_ip)
          end
        end
      end
14                                                                       36
S3

     期間限定URIを生成
      s3 = AWS::S3.new
      b = s3.buckets['your-bucket-name']
      o = b.objects['object-name']
      puts o.url_for(:read, :expires => 60*60*24*31)


      一ヶ月間有効なURLが生成される
15                                                     36
S3 Presignd-URL
     https://your-bucket-
     name.s3.amazonaws.com/
     object-name?
     AWSAccessKeyId=AKIAIFCOKT
     CTDSDMPX2A&Expires=13151
     25436&Signature=zEmS9f4%
     2Fm%2BFLgxEsVA9ppfQDhks
16   %3D                         36
ちょっとしたハマり所


     AWS SDK for Rubyで遭遇した 
     ハマった事例


17                            36
最新のSnapshot
     as = []
     ec2.volumes.each do |v|
       v.attachments.each do |a|
         as << a
       end
     end

     ss = {}
     r.snapshots.sort {|a,b|
       b.start_time <=> a.start_time
     }.map do |s|
       ss[s.volume_id] = s unless ss.include? s.volume_id
     end

     as.each do |a|
       vid = a.volume.id
       if ss.include? vid
         puts "#{a.instance.id} => (#{ss[vid].start_time})"
       end
     end
18                                                            36
タイムアウトして失敗
     Snapshotの作成日時を参照する
     たびにAPIが呼び出されてしまう
     らしい
     大量にあるSnapshotをソートすると、
     必ずタイムアウトしてしまう
     APIの呼び出し制限?
19                           36
AWS.memoize
     AWS.memoize do
       ss = {}
       r.snapshots.sort {|a,b|
         b.start_time <=> a.start_time
       }.map do |s|
         ss[s.volume_id] = s unless ss.include? s.volume_id
       end
     end


     ソートしている部分を
     AWS.memoizeで囲むだけ
20                                                            36
Snapshotの一覧
     自分のSnapshotの一覧が欲しい
      ec2.snapshots.each do |s|
        # ...
      end
     これだと、publicなSnapshotも取
21
     れてしまう!                       36
AWS Developer
              Forum

         Forum: Ruby Development
          https://forums.aws.amazon.com/forum.jspa?forumID=125


      

22                                                               36
質問した




23          36
次の日
24   36
AWSの中の人から回答




25                 36
Snapshotの一覧
     解決策: filter
      ec2.snapshots.filter(
        'owner-id', 'YOUR_ACCOUNT_NUMBER').each do |s|
        # ...
      end


     自分のアカウント番号を指定すると
     自分のSnapshotのみ取得できる。
26                                                       36
公式のSDKのメリット


      AWSのサポートが得られる



27                    36
16日後
28   36
AWS SDK for Ruby
       1.1.0 Release




29                      36
Release Note




30                  36
forumにもコメント




31                 36
自分のSnapshotの取得
     が簡単に
      ec2.snapshots.with_owner(:self).each do |s|
        # ...
      end


     AMIの一覧も同じようにできます。
      
32                                                  36
公式SDKのメリット

      フォーラムに困ってることや要望
     を書きこむと、新しい機能が実装さ
     れることも!

33                      36
困ったことや要望があっ
    たら

     フォーラムに書くなどのフィード
     バックしよう
     次のリリースに反映されるかも
34                     36
サンタクラウド



     #jawsug #サンタクラウド
     集計ページ
     http://www.suz-lab.com/santacloud/
35                                        36
 


           ご静聴ありがとうございました



36                                         36

Powered by Rabbit 1.0.4 and COZMIXNG

JAWS-UG静岡 #1 Introduction to AWS SDK for Ruby

  • 1.
    Introduction to AWS SDK for Ruby ISOBE Kazuhiko (cloudpack) JAWS-UG静岡 2011-11-27 Powered by Rabbit 1.0.4 and COZMIXNG
  • 2.
    提供 このLTはcloudpackの提供で お送りいたします 01 36
  • 3.
    cloudpack AWS導入・構築支援、コンサル ティング、システム構築サービス 2010年4月 サービス開始 2011年1月 AWS ソリューション プロバイダ認定 02 36
  • 4.
    cloudpack 月額費用固定型 日本円で請求書発行 フルマネージドホスティング 03 36
  • 5.
    cloudpack 詳しくはWebで! http://cloudpack.jp/ 04 36
  • 6.
    自己紹介 Twitter: muramasa64 cloudpackでAWSを運用 好きなAWSサービス: API 05 36
  • 7.
    AWS SDK forRuby AWS公式のSDK 2011年7月14日に初リリース 最新版は1.2.3 06 36
  • 8.
    できること RubyからAWSのAPIを実行できる EC2, ELB, S3, SNS, SQS, STS, SES, IAM, SimpleDB, VPCに対 応 RDS未対応が惜しい 07 36
  • 9.
    できること Ruby on Rails の ActiveRecord で、SimpleDBが使える まだリリースから間もないので、 他のSDKに比べてできることはや や少なめ 08 36
  • 10.
    入手方法 gem gem install aws-sdk github git clone git://github.com/amazonwebservices/aws-sdk-for-ruby.git 09 36
  • 11.
    使う準備 config.yml access_key_id: <YOUR_ACCESS_KEY> secret_access_key: <YOUR_SECRET_KEY> 10 36
  • 12.
    ライブラリと設定 require 'aws-sdk' AWS.config( YAML.load(File.read('config.yml')))   11 36
  • 13.
    EC2 EC2を起動する ec2 = AWS::EC2.new ec2.instances.create( :image_id => 'ami-f49623f5' :key_name => 'keypair_name' :security_group_ids => ['default']) 12 36
  • 14.
    Snapshot 各ボリュームのスナップショットを 作成する ec2.volumes.each do |v| v.create_snapshot( "from #{v.id} at #{Time.now}") end 13 36
  • 15.
    Security Group IPアドレスを一括で置換する src_ip = 'x.x.x.x/32' dst_ip = 'y.y.y.y/32' ec2.security_groups.each do |src_sg| puts "#{src_sg.id}, #{src_sg.name}" src_sg.ip_permissions.each do |p| if p.ip_ranges.include? src_ip src_sg.authorize_ingress(p.protocol, p.port_range, dst_ip) src_sg.revoke_ingress(p.protocol, p.port_range, src_ip) end end end 14 36
  • 16.
    S3 期間限定URIを生成 s3 = AWS::S3.new b = s3.buckets['your-bucket-name'] o = b.objects['object-name'] puts o.url_for(:read, :expires => 60*60*24*31) 一ヶ月間有効なURLが生成される 15 36
  • 17.
    S3 Presignd-URL https://your-bucket- name.s3.amazonaws.com/ object-name? AWSAccessKeyId=AKIAIFCOKT CTDSDMPX2A&Expires=13151 25436&Signature=zEmS9f4% 2Fm%2BFLgxEsVA9ppfQDhks 16 %3D 36
  • 18.
    ちょっとしたハマり所 AWS SDK for Rubyで遭遇した  ハマった事例 17 36
  • 19.
    最新のSnapshot as = [] ec2.volumes.each do |v| v.attachments.each do |a| as << a end end ss = {} r.snapshots.sort {|a,b| b.start_time <=> a.start_time }.map do |s| ss[s.volume_id] = s unless ss.include? s.volume_id end as.each do |a| vid = a.volume.id if ss.include? vid puts "#{a.instance.id} => (#{ss[vid].start_time})" end end 18 36
  • 20.
    タイムアウトして失敗 Snapshotの作成日時を参照する たびにAPIが呼び出されてしまう らしい 大量にあるSnapshotをソートすると、 必ずタイムアウトしてしまう APIの呼び出し制限? 19 36
  • 21.
    AWS.memoize AWS.memoize do ss = {} r.snapshots.sort {|a,b| b.start_time <=> a.start_time }.map do |s| ss[s.volume_id] = s unless ss.include? s.volume_id end end ソートしている部分を AWS.memoizeで囲むだけ 20 36
  • 22.
    Snapshotの一覧 自分のSnapshotの一覧が欲しい ec2.snapshots.each do |s| # ... end これだと、publicなSnapshotも取 21 れてしまう! 36
  • 23.
    AWS Developer Forum Forum: Ruby Development https://forums.aws.amazon.com/forum.jspa?forumID=125   22 36
  • 24.
  • 25.
  • 26.
  • 27.
    Snapshotの一覧 解決策: filter ec2.snapshots.filter( 'owner-id', 'YOUR_ACCOUNT_NUMBER').each do |s| # ... end 自分のアカウント番号を指定すると 自分のSnapshotのみ取得できる。 26 36
  • 28.
    公式のSDKのメリット AWSのサポートが得られる 27 36
  • 29.
  • 30.
    AWS SDK forRuby 1.1.0 Release 29 36
  • 31.
  • 32.
  • 33.
    自分のSnapshotの取得 が簡単に ec2.snapshots.with_owner(:self).each do |s| # ... end AMIの一覧も同じようにできます。   32 36
  • 34.
    公式SDKのメリット  フォーラムに困ってることや要望 を書きこむと、新しい機能が実装さ れることも! 33 36
  • 35.
    困ったことや要望があっ たら フォーラムに書くなどのフィード バックしよう 次のリリースに反映されるかも 34 36
  • 36.
    サンタクラウド #jawsug #サンタクラウド 集計ページ http://www.suz-lab.com/santacloud/ 35 36
  • 37.
      ご静聴ありがとうございました 36 36 Powered by Rabbit 1.0.4 and COZMIXNG