easy_aws 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|