easy_aws 0.1.0

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,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: []