easy_aws 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,39 @@
1
+ require 'aws-sdk'
2
+
3
+ module EasyAws
4
+ extend self
5
+
6
+ def setup(access_key, secret_key, region='ap-southeast-2')
7
+ AWS::config access_key_id:access_key, secret_access_key:secret_key, region:region
8
+ end
9
+
10
+ def execute
11
+ waited = false
12
+ begin
13
+ yield
14
+ rescue Exception => error
15
+ wait_error = /.*you must wait (\d*) seconds.*/i.match(error.to_s)
16
+ raise error if !wait_error || waited
17
+ secs_to_wait = wait_error[1].to_i
18
+ puts "Told to re-try after #{secs_to_wait} seconds, so will try again"
19
+ sleep secs_to_wait
20
+ waited = true
21
+ retry
22
+ end
23
+ end
24
+
25
+ def retry_until_success(timeout=60, retry_interval=5)
26
+ time_elapsed = 0
27
+ success = false
28
+ start_time = Time.now
29
+
30
+ while time_elapsed < timeout
31
+ success = yield
32
+ break if success
33
+ sleep retry_interval
34
+ time_elapsed = Time.now - start_time
35
+ end
36
+ raise "Operation still not successful after #{timeout} secs" unless success
37
+ end
38
+
39
+ end
@@ -0,0 +1,51 @@
1
+ require 'aws-sdk'
2
+
3
+ module EasyAws
4
+ extend self
5
+
6
+ CNAME_RRS_TYPE = 'CNAME'
7
+
8
+ def create_cname(domain, target, ttl=300)
9
+ domain = qualify_domain domain
10
+ target = qualify_domain target
11
+ zone = zone_for domain
12
+ raise "No existing zone found for #{domain}" if zone.nil?
13
+
14
+ puts "Creating CNAME #{domain} for #{target} in zone #{zone.name}"
15
+ record_sets = zone.resource_record_sets
16
+ cname = record_sets[domain, CNAME_RRS_TYPE]
17
+
18
+ if !cname.nil? && cname.exists?
19
+ puts "CNAME already exists, recreating"
20
+ cname.delete
21
+ end
22
+ record_sets.create(domain, CNAME_RRS_TYPE, ttl:ttl, resource_records:[value:target])
23
+ end
24
+
25
+ def delete_cname(domain)
26
+ domain = qualify_domain domain
27
+ zone = zone_for domain
28
+ return if zone.nil?
29
+
30
+ puts "Deleting CNAME #{domain} from zone #{zone.name}"
31
+ cname = zone.resource_record_sets[domain, CNAME_RRS_TYPE]
32
+ cname.delete if !cname.nil? && cname.exists?
33
+ end
34
+
35
+ private
36
+
37
+ def zone_for(domain)
38
+ zones = route53.hosted_zones
39
+ zone = zones.select {|z| domain.end_with? z.name}.first
40
+ zone
41
+ end
42
+
43
+ def qualify_domain(domain)
44
+ domain << '.' unless domain.end_with? '.'
45
+ end
46
+
47
+ def route53
48
+ AWS::Route53.new
49
+ end
50
+
51
+ end
@@ -0,0 +1,56 @@
1
+ require 'aws-sdk'
2
+ require_relative 'helpers'
3
+
4
+ module EasyAws
5
+ extend self
6
+
7
+ def get_topic(arn)
8
+ sns.topics[arn]
9
+ end
10
+
11
+ def create_or_retrieve_topic(name)
12
+ puts "Creating topic #{name}"
13
+ topic = sns.topics.select { |t| t.name == name }.first
14
+ if topic.nil?
15
+ execute { topic = sns.topics.create name }
16
+ else
17
+ puts "Topic already exists, skipping"
18
+ end
19
+ topic
20
+ end
21
+
22
+ def add_subscribers(topic, new)
23
+ existing = topic.subscriptions.map { |s| s.endpoint }
24
+ to_ignore = new & existing
25
+ if to_ignore.length > 0
26
+ puts "Subscribers exist for topic #{topic.name}, skipping:\n#{to_ignore}"
27
+ end
28
+ new = new - to_ignore
29
+ new.each do |s|
30
+ puts "Subscribing #{s} to topic #{topic.name}"
31
+ topic.subscribe s
32
+ end
33
+ end
34
+
35
+ def add_sqs_subscriber(topic, queue)
36
+ puts "Subscribing queue to topic #{topic.name}"
37
+ topic.subscribe queue
38
+ end
39
+
40
+ def delete_topics_with(prefix)
41
+ puts "Deleting sns topics starting with #{prefix}"
42
+ topics = sns.topics.select { |t| t.name.start_with? prefix }
43
+ delete_topics topics
44
+ end
45
+
46
+ def delete_topics(topics)
47
+ topics.each { |t| t.delete }
48
+ end
49
+
50
+ private
51
+
52
+ def sns
53
+ AWS::SNS.new
54
+ end
55
+
56
+ end
@@ -0,0 +1,68 @@
1
+ require 'aws-sdk'
2
+ require_relative 'helpers'
3
+
4
+ module EasyAws
5
+ extend self
6
+
7
+ def get_queue(name)
8
+ begin
9
+ sqs.queues.named(name)
10
+ rescue Exception => error
11
+ raise error unless error.to_s =~ /.*queue does not exist.*/i
12
+ end
13
+ end
14
+
15
+ def create_queue(name)
16
+ puts "Creating queue #{name}"
17
+ queue = nil
18
+ execute {queue = sqs.queues.create name}
19
+ puts "Verifying queue created"
20
+ retry_until_success { !get_queue(name).nil? }
21
+ queue
22
+ end
23
+
24
+ def create_or_retrieve_queue(name, clear_policies=false)
25
+ puts "Verifying queue exists #{name}"
26
+ queue = get_queue(name)
27
+ if queue.nil?
28
+ queue = create_queue(name)
29
+ else
30
+ puts "Queue already exists, skipping creation"
31
+ queue.policy = nil if clear_policies
32
+ end
33
+ queue
34
+ end
35
+
36
+ def delete_queues_with(prefix)
37
+ puts "Deleting queues starting with #{prefix}"
38
+ queues = sqs.queues.with_prefix(prefix)
39
+ queues.each do |q|
40
+ puts "Deleting queue #{q.arn}"
41
+ q.delete
42
+ end
43
+ puts "Verifying all queues have been deleted"
44
+ verify_queues_deleted prefix
45
+ end
46
+
47
+ def verify_queues_deleted(prefix)
48
+ retry_until_success { sqs.queues.with_prefix(prefix).count == 0 }
49
+ end
50
+
51
+ def clear_queue(queue)
52
+ puts "Clearing queue items #{queue.arn}"
53
+ queue.poll(:idle_timeout => 10) { |msg| puts msg.delete }
54
+ end
55
+
56
+ def get_next_msg_from(queue)
57
+ value = nil
58
+ queue.receive_message(wait_time_seconds:10) { |msg| value = msg }
59
+ value
60
+ end
61
+
62
+ private
63
+
64
+ def sqs
65
+ AWS::SQS.new
66
+ end
67
+
68
+ end
data/lib/easy_aws.rb ADDED
@@ -0,0 +1 @@
1
+ Dir[File.join File.expand_path(File.dirname(__FILE__)), 'easy_aws/**/*.rb'].each {|f| require f}
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy_aws
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Custom Solutions
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: aws-sdk
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.18.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.18.0
30
+ description:
31
+ email: custom.solutions@gs1au.org
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - lib/easy_aws/helpers.rb
37
+ - lib/easy_aws/route53.rb
38
+ - lib/easy_aws/sns.rb
39
+ - lib/easy_aws/sqs.rb
40
+ - lib/easy_aws.rb
41
+ homepage:
42
+ licenses: []
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 1.8.24
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: Helper gem for aws.
65
+ test_files: []