moomerman-aws 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,49 @@
1
+ h1. AWS - Amazon Web Services client library for Ruby
2
+
3
+ h2. Currently implemented:
4
+
5
+ EC2
6
+ - EC2 API
7
+ - Cloud Watch
8
+ - Elastic Load Balancing
9
+ - Auto Scaling
10
+
11
+ h2. Usage
12
+
13
+ Simply provide your amazon access key and amazon secret key to start making calls:
14
+
15
+ <pre><code>client = AWS::EC2::Client.new(
16
+ :access_key_id => ACCESS_KEY_ID,
17
+ :secret_access_key => SECRET_ACCESS_KEY
18
+ )
19
+ client.describe_regions
20
+
21
+ => {"regionInfo"=>{
22
+ "item"=>[
23
+ {"regionName"=>"eu-west-1", "regionEndpoint"=>"eu-west-1.ec2.amazonaws.com"},
24
+ {"regionName"=>"us-east-1", "regionEndpoint"=>"us-east-1.ec2.amazonaws.com"}
25
+ ]
26
+ },
27
+ "requestId"=>"c6b5e7b4-421d-4484-932c-dcf32e66a2ab",
28
+ "xmlns"=>"http://ec2.amazonaws.com/doc/2009-04-04/"
29
+ }
30
+ </code></pre>
31
+
32
+ You can also specify a region to make calls in a specific region:
33
+ <pre><code>client = AWS::EC2::Client.new(
34
+ :access_key_id => ACCESS_KEY_ID,
35
+ :secret_access_key => SECRET_ACCESS_KEY,
36
+ :region => 'eu-west-1'
37
+ )
38
+ client.describe_availability_zones
39
+
40
+ => {"availabilityZoneInfo"=>{
41
+ "item"=>[
42
+ {"zoneName"=>"eu-west-1a", "regionName"=>"eu-west-1", "zoneState"=>"available"},
43
+ {"zoneName"=>"eu-west-1b", "regionName"=>"eu-west-1", "zoneState"=>"available"}
44
+ ]
45
+ },
46
+ "requestId"=>"ed31f360-bb07-4417-b976-5f5bd1740e6e",
47
+ "xmlns"=>"http://ec2.amazonaws.com/doc/2009-04-04/"
48
+ }
49
+ </code></pre>
@@ -0,0 +1 @@
1
+ require 'aws/ec2/client'
@@ -0,0 +1,55 @@
1
+ module AWS
2
+ module EC2
3
+ API = {
4
+ :ec2 => {
5
+ :host => 'ec2.amazonaws.com',
6
+ :documentation => 'http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/',
7
+ :regions => ['us-east-1', 'eu-west-1'],
8
+ :version => '2009-04-04',
9
+ :methods => [
10
+ :allocate_address, :associate_address, :attach_volume, :authorize_security_group_ingress,
11
+ :bundle_instance, :cancel_bundle_task, :confirm_product_instance, :create_key_pair,
12
+ :create_security_group, :create_snapshot, :create_volume, :delete_key_pair, :delete_security_group,
13
+ :delete_snapshot, :delete_volume, :deregister_image, :describe_addresses, :describe_availability_zones,
14
+ :describe_bundle_tasks, :describe_image_attribute, :describe_images, :describe_instances, :describe_key_pairs,
15
+ :describe_regions, :describe_reserved_instances, :describe_reserved_instances_offerings, :describe_security_groups,
16
+ :describe_snapshots, :describe_volumes, :detach_volume, :disassociate_address, :get_console_output,
17
+ :modify_image_attribute, :monitor_instances, :purchase_reserved_instances_offering, :reboot_instances,
18
+ :register_image, :release_address, :reset_image_attribute, :revoke_security_group_ingress,
19
+ :run_instances, :terminate_instances, :unmonitor_instances
20
+ ]
21
+ },
22
+
23
+ :elastic_load_balancing => {
24
+ :host => 'elasticloadbalancing.amazonaws.com',
25
+ :documentation => 'http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/',
26
+ :version => '2009-05-15',
27
+ :methods => [
28
+ :configure_health_check, :create_load_balancer, :delete_load_balancer, :deregister_instances_from_load_balancer,
29
+ :describe_load_balancers, :describe_instance_health, :disable_availability_zones_for_load_balancer,
30
+ :enable_availability_zones_for_load_balancer, :register_instances_with_load_balancer
31
+ ]
32
+ },
33
+
34
+ :cloud_watch => {
35
+ :host => 'monitoring.amazonaws.com',
36
+ :documentation => 'http://docs.amazonwebservices.com/AmazonCloudWatch/latest/DeveloperGuide/',
37
+ :version => '2009-05-15',
38
+ :methods => [:get_metric_statistics, :list_metrics]
39
+ },
40
+
41
+ :auto_scaling => {
42
+ :host => 'autoscaling.amazonaws.com',
43
+ :documentation => 'http://docs.amazonwebservices.com/AutoScaling/latest/DeveloperGuide/',
44
+ :version => '2009-05-15',
45
+ :methods => [
46
+ :create_auto_scaling_group, :create_launch_configuration, :create_or_update_scaling_trigger,
47
+ :delete_auto_scaling_group, :delete_launch_configuration, :delete_trigger,
48
+ :describe_auto_scaling_groups, :describe_launch_configurations, :describe_scaling_activities,
49
+ :describe_triggers, :set_desired_capacity, :terminate_instance_in_auto_scaling_group,
50
+ :update_auto_scaling_group
51
+ ]
52
+ }
53
+ }
54
+ end
55
+ end
@@ -0,0 +1,47 @@
1
+ require 'aws/ec2/request'
2
+ require 'aws/ec2/parser'
3
+ require 'aws/ec2/api'
4
+
5
+ module AWS
6
+ module EC2
7
+ class Client
8
+ include EC2
9
+ include EC2::Request
10
+ include EC2::Parser
11
+
12
+ def initialize(options = {})
13
+ @access_key_id = options[:access_key_id]
14
+ @secret_access_key = options[:secret_access_key]
15
+ @region = options[:region]
16
+ @debug = options[:debug] || false
17
+ end
18
+
19
+ def method_missing(method_name, *args)
20
+ action = camelize(method_name)
21
+
22
+ config = EC2::API.find{|x, y| y[:methods].include?(method_name.to_sym)}
23
+
24
+ raise ArgumentError, "Unknown Method: #{method_name}" unless config
25
+
26
+ host = config.last[:host]
27
+ regions = config.last[:regions] || []
28
+ host = @region + '.' + host if @region and regions.include?(@region)
29
+ version = config.last[:version]
30
+
31
+ user_options = args[0] || {}
32
+ user_options.merge!(:action => action, :version => version)
33
+ camelized_options = {}
34
+ user_options.each{|key, value| camelized_options[camelize(key).to_sym] = value}
35
+
36
+ puts "calling host=#{host}, params=#{camelized_options.inspect}" if @debug
37
+
38
+ xml_response = aws_request(host, camelized_options)
39
+ parse(xml_response)
40
+ end
41
+
42
+ def camelize(key)
43
+ key.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'xmlsimple'
3
+
4
+ class Hash
5
+ def method_missing(meth, *args, &block)
6
+ if args.size == 0
7
+ self[meth.to_s] || self[meth.to_sym]
8
+ end
9
+ end
10
+ end
11
+
12
+ module AWS
13
+ module EC2
14
+ module Parser
15
+ def parse(xml_response)
16
+ result = XmlSimple.xml_in(xml_response, { 'forcearray' => ['item'], 'suppressempty' => nil, 'keeproot' => false })
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,68 @@
1
+ require 'time'
2
+ require 'openssl'
3
+ require 'digest/sha1'
4
+ require 'base64'
5
+ require 'uri'
6
+ require 'net/https'
7
+ require 'cgi'
8
+
9
+ module AWS
10
+ module EC2
11
+ module Request
12
+
13
+ def aws_request(host, params)
14
+
15
+ params.merge!(
16
+ :AWSAccessKeyId => @access_key_id,
17
+ :SignatureVersion => 2,
18
+ :SignatureMethod => 'HmacSHA1',
19
+ :Timestamp => Time.now.getutc.iso8601
20
+ )
21
+ request_params_string = params_to_request_string(params)
22
+ string_to_sign = prepare_sign_string(host, request_params_string)
23
+ request_params_string += "&Signature=#{sign(string_to_sign)}"
24
+
25
+ post(host, request_params_string)
26
+ end
27
+
28
+ private
29
+ def sign(str)
30
+ digest = OpenSSL::Digest::Digest.new('sha1')
31
+ b64_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, @secret_access_key, str)).gsub("\n","")
32
+ CGI::escape(b64_hmac)
33
+ end
34
+
35
+ def params_to_request_string(params)
36
+ sorted_params = params.sort {|x,y| x[0].to_s <=> y[0].to_s}
37
+ escaped_params = sorted_params.collect do |p|
38
+ encoded = (CGI::escape(p[0].to_s) + "=" + CGI::escape(p[1].to_s))
39
+ encoded.gsub('+', '%20')
40
+ end
41
+ escaped_params.join('&')
42
+ end
43
+
44
+ def post(host, params)
45
+ http = Net::HTTP.new(host, 443)
46
+ http.use_ssl = true
47
+
48
+ http.start do
49
+ req = Net::HTTP::Post.new('/')
50
+ req.content_type = 'application/x-www-form-urlencoded'
51
+ req['User-Agent'] = "moomerman-aws-gem"
52
+
53
+ response = http.request(req, params)
54
+
55
+ return response.body
56
+ end
57
+ end
58
+
59
+ def prepare_sign_string(host, params)
60
+ string_to_sign =
61
+ 'POST' + "\n" +
62
+ host + "\n" +
63
+ '/' + "\n" +
64
+ params
65
+ end
66
+ end
67
+ end
68
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moomerman-aws
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.4
5
+ platform: ruby
6
+ authors:
7
+ - Richard Taylor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-20 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: xml-simple
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.0.11
24
+ version:
25
+ description: aws is a Amazon Web Services client library for Ruby.
26
+ email: moomerman@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - README.textile
35
+ - lib/aws.rb
36
+ - lib/aws
37
+ - lib/aws/ec2
38
+ - lib/aws/ec2/api.rb
39
+ - lib/aws/ec2/client.rb
40
+ - lib/aws/ec2/parser.rb
41
+ - lib/aws/ec2/request.rb
42
+ has_rdoc: false
43
+ homepage: http://github.com/moomerman/aws
44
+ post_install_message:
45
+ rdoc_options:
46
+ - --inline-source
47
+ - --charset=UTF-8
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ version:
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ requirements: []
63
+
64
+ rubyforge_project: aws
65
+ rubygems_version: 1.2.0
66
+ signing_key:
67
+ specification_version: 2
68
+ summary: aws is a Amazon Web Services client library for Ruby.
69
+ test_files: []
70
+