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.
- data/lib/easy_aws/helpers.rb +39 -0
- data/lib/easy_aws/route53.rb +51 -0
- data/lib/easy_aws/sns.rb +56 -0
- data/lib/easy_aws/sqs.rb +68 -0
- data/lib/easy_aws.rb +1 -0
- metadata +65 -0
@@ -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
|
data/lib/easy_aws/sns.rb
ADDED
@@ -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
|
data/lib/easy_aws/sqs.rb
ADDED
@@ -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: []
|