MovableInkAWS 2.2.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +11 -11
- data/lib/movable_ink/aws.rb +5 -1
- data/lib/movable_ink/aws/errors.rb +1 -1
- data/lib/movable_ink/aws/metadata.rb +29 -33
- data/lib/movable_ink/version.rb +1 -1
- data/spec/aws_spec.rb +21 -1
- data/spec/ec2_spec.rb +12 -4
- data/spec/metadata_spec.rb +13 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46d76e882265a792568c24853fbc6953bcfa54c4677d67b8aaf97d009896cb24
|
4
|
+
data.tar.gz: f02414993d6c9509bd72f5ec246e6bf99fc60c20a036487be9336cb41e780e8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b987bbb77c3fd5d2c1fc23c84c62e3af00df58074dbbdc9db21fd05fc8181c23f10bf096665f197ee98f79deaf4aaaaabc3fea1418ffcb85f0f256145fe13260
|
7
|
+
data.tar.gz: ddc7c1eff50e05f3d1cd83cb65df72f688c6aadbed822dc3a87cd9e2096451ab23f62293092443f9d22f4e76a84eb7073da2ffb41117987341bfb2663915cc25
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
MovableInkAWS (2.
|
4
|
+
MovableInkAWS (2.3.0)
|
5
5
|
aws-sdk-athena (~> 1)
|
6
6
|
aws-sdk-autoscaling (~> 1)
|
7
7
|
aws-sdk-cloudwatch (~> 1)
|
@@ -24,47 +24,47 @@ GEM
|
|
24
24
|
addressable (2.7.0)
|
25
25
|
public_suffix (>= 2.0.2, < 5.0)
|
26
26
|
aws-eventstream (1.1.1)
|
27
|
-
aws-partitions (1.
|
27
|
+
aws-partitions (1.445.0)
|
28
28
|
aws-sdk-athena (1.37.0)
|
29
29
|
aws-sdk-core (~> 3, >= 3.112.0)
|
30
30
|
aws-sigv4 (~> 1.1)
|
31
|
-
aws-sdk-autoscaling (1.
|
31
|
+
aws-sdk-autoscaling (1.60.0)
|
32
32
|
aws-sdk-core (~> 3, >= 3.112.0)
|
33
33
|
aws-sigv4 (~> 1.1)
|
34
|
-
aws-sdk-cloudwatch (1.
|
34
|
+
aws-sdk-cloudwatch (1.51.0)
|
35
35
|
aws-sdk-core (~> 3, >= 3.112.0)
|
36
36
|
aws-sigv4 (~> 1.1)
|
37
|
-
aws-sdk-core (3.
|
37
|
+
aws-sdk-core (3.114.0)
|
38
38
|
aws-eventstream (~> 1, >= 1.0.2)
|
39
39
|
aws-partitions (~> 1, >= 1.239.0)
|
40
40
|
aws-sigv4 (~> 1.1)
|
41
41
|
jmespath (~> 1.0)
|
42
|
-
aws-sdk-ec2 (1.
|
42
|
+
aws-sdk-ec2 (1.234.0)
|
43
43
|
aws-sdk-core (~> 3, >= 3.112.0)
|
44
44
|
aws-sigv4 (~> 1.1)
|
45
45
|
aws-sdk-eks (1.51.0)
|
46
46
|
aws-sdk-core (~> 3, >= 3.112.0)
|
47
47
|
aws-sigv4 (~> 1.1)
|
48
|
-
aws-sdk-elasticache (1.
|
48
|
+
aws-sdk-elasticache (1.55.0)
|
49
49
|
aws-sdk-core (~> 3, >= 3.112.0)
|
50
50
|
aws-sigv4 (~> 1.1)
|
51
51
|
aws-sdk-kms (1.43.0)
|
52
52
|
aws-sdk-core (~> 3, >= 3.112.0)
|
53
53
|
aws-sigv4 (~> 1.1)
|
54
|
-
aws-sdk-rds (1.
|
54
|
+
aws-sdk-rds (1.118.0)
|
55
55
|
aws-sdk-core (~> 3, >= 3.112.0)
|
56
56
|
aws-sigv4 (~> 1.1)
|
57
|
-
aws-sdk-route53 (1.
|
57
|
+
aws-sdk-route53 (1.49.0)
|
58
58
|
aws-sdk-core (~> 3, >= 3.112.0)
|
59
59
|
aws-sigv4 (~> 1.1)
|
60
|
-
aws-sdk-s3 (1.
|
60
|
+
aws-sdk-s3 (1.93.1)
|
61
61
|
aws-sdk-core (~> 3, >= 3.112.0)
|
62
62
|
aws-sdk-kms (~> 1)
|
63
63
|
aws-sigv4 (~> 1.1)
|
64
64
|
aws-sdk-sns (1.39.0)
|
65
65
|
aws-sdk-core (~> 3, >= 3.112.0)
|
66
66
|
aws-sigv4 (~> 1.1)
|
67
|
-
aws-sdk-ssm (1.
|
67
|
+
aws-sdk-ssm (1.108.0)
|
68
68
|
aws-sdk-core (~> 3, >= 3.112.0)
|
69
69
|
aws-sigv4 (~> 1.1)
|
70
70
|
aws-sigv4 (1.2.3)
|
data/lib/movable_ink/aws.rb
CHANGED
@@ -103,7 +103,11 @@ module MovableInk
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def my_region
|
106
|
-
@my_region ||=
|
106
|
+
@my_region ||= if ENV['AWS_REGION'].nil?
|
107
|
+
availability_zone.chop
|
108
|
+
else
|
109
|
+
ENV['AWS_REGION']
|
110
|
+
end
|
107
111
|
end
|
108
112
|
|
109
113
|
def datacenter(region: my_region)
|
@@ -3,7 +3,7 @@ module MovableInk
|
|
3
3
|
module Errors
|
4
4
|
class ServiceError < StandardError; end
|
5
5
|
class FailedWithBackoff < StandardError; end
|
6
|
-
class
|
6
|
+
class MetadataTimeout < StandardError; end
|
7
7
|
class NoEnvironmentTagError < StandardError; end
|
8
8
|
class InvalidDiscoveryTypeError < StandardError; end
|
9
9
|
class RoleNameRequiredError < StandardError; end
|
@@ -3,59 +3,55 @@ require 'net/http'
|
|
3
3
|
module MovableInk
|
4
4
|
class AWS
|
5
5
|
module Metadata
|
6
|
-
def http
|
7
|
-
@http
|
6
|
+
def http(timeout_seconds: 1)
|
7
|
+
@http = begin
|
8
8
|
http = Net::HTTP.new("169.254.169.254", 80)
|
9
|
-
http.open_timeout =
|
10
|
-
http.read_timeout =
|
9
|
+
http.open_timeout = timeout_seconds
|
10
|
+
http.read_timeout = timeout_seconds
|
11
11
|
http
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def retrieve_metadata(key)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
def retrieve_metadata(key, tries: 3)
|
16
|
+
tries.times do |num|
|
17
|
+
num += 1
|
18
|
+
request = Net::HTTP::Get.new("/latest/meta-data/#{key}")
|
19
|
+
request['X-aws-ec2-metadata-token'] = imds_token
|
20
|
+
response = http(timeout_seconds: num * 3).request(request)
|
21
|
+
return response.body
|
22
|
+
rescue Net::OpenTimeout, Net::ReadTimeout, Errno::EHOSTDOWN
|
23
|
+
sleep(num * 2)
|
24
|
+
end
|
25
|
+
|
26
|
+
raise MovableInk::AWS::Errors::MetadataTimeout
|
22
27
|
end
|
23
28
|
|
24
29
|
def availability_zone
|
25
|
-
@availability_zone ||=
|
26
|
-
az = retrieve_metadata('placement/availability-zone')
|
27
|
-
raise(MovableInk::AWS::Errors::EC2Required) if az.empty?
|
28
|
-
az
|
29
|
-
end
|
30
|
+
@availability_zone ||= retrieve_metadata('placement/availability-zone')
|
30
31
|
end
|
31
32
|
|
32
33
|
def instance_id
|
33
|
-
@instance_id ||=
|
34
|
-
id = retrieve_metadata('instance-id')
|
35
|
-
raise(MovableInk::AWS::Errors::EC2Required) if id.empty?
|
36
|
-
id
|
37
|
-
end
|
34
|
+
@instance_id ||= retrieve_metadata('instance-id')
|
38
35
|
end
|
39
36
|
|
40
37
|
def private_ipv4
|
41
|
-
@ipv4 ||=
|
42
|
-
ipv4 = retrieve_metadata('local-ipv4')
|
43
|
-
raise(MovableInk::AWS::Errors::EC2Required) if ipv4.empty?
|
44
|
-
ipv4
|
45
|
-
end
|
38
|
+
@ipv4 ||= retrieve_metadata('local-ipv4')
|
46
39
|
end
|
47
40
|
|
48
41
|
private
|
49
42
|
|
50
|
-
def imds_token
|
51
|
-
|
52
|
-
|
43
|
+
def imds_token(tries: 3)
|
44
|
+
tries.times do |num|
|
45
|
+
num += 1
|
46
|
+
request = Net::HTTP::Get.new('/latest/api/token')
|
53
47
|
request['X-aws-ec2-metadata-token-ttl-seconds'] = 120
|
54
|
-
response = http.request(request)
|
55
|
-
response.body
|
56
|
-
rescue
|
57
|
-
|
48
|
+
response = http(timeout_seconds: num * 3).request(request)
|
49
|
+
return response.body
|
50
|
+
rescue Net::OpenTimeout, Net::ReadTimeout, Errno::EHOSTDOWN
|
51
|
+
sleep(num * 2)
|
58
52
|
end
|
53
|
+
|
54
|
+
raise MovableInk::AWS::Errors::MetadataTimeout
|
59
55
|
end
|
60
56
|
end
|
61
57
|
end
|
data/lib/movable_ink/version.rb
CHANGED
data/spec/aws_spec.rb
CHANGED
@@ -1,17 +1,37 @@
|
|
1
1
|
require_relative '../lib/movable_ink/aws'
|
2
|
+
require 'webmock/rspec'
|
2
3
|
|
3
4
|
describe MovableInk::AWS do
|
4
5
|
context "outside EC2" do
|
6
|
+
before(:each) do
|
7
|
+
allow_any_instance_of(MovableInk::AWS).to receive(:sleep).and_return(true)
|
8
|
+
end
|
9
|
+
|
10
|
+
after(:each) { ENV['AWS_REGION'] = nil }
|
11
|
+
|
5
12
|
it 'doesnt raise an error if instance_id is set' do
|
6
13
|
aws = MovableInk::AWS.new(instance_id: 'i-987654321')
|
7
14
|
expect(aws.instance_id).to eq('i-987654321')
|
8
15
|
end
|
16
|
+
|
17
|
+
it 'doesnt raise if AWS_REGION is set' do
|
18
|
+
ENV['AWS_REGION'] = 'us-east-1'
|
19
|
+
miaws = MovableInk::AWS.new
|
20
|
+
expect(miaws.my_region).to eq('us-east-1')
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'raises when AWS_REGION is not set and the metadata service is not available' do
|
24
|
+
miaws = MovableInk::AWS.new
|
25
|
+
# stub an error making a request to the metadata api
|
26
|
+
stub_request(:get, 'http://169.254.169.254/latest/api/token').to_raise(Net::OpenTimeout)
|
27
|
+
expect { miaws.my_region }.to raise_error(MovableInk::AWS::Errors::MetadataTimeout)
|
28
|
+
end
|
9
29
|
end
|
10
30
|
|
11
31
|
context "inside EC2" do
|
12
32
|
it "should find the datacenter by region" do
|
13
33
|
aws = MovableInk::AWS.new
|
14
|
-
expect(aws).to receive(:
|
34
|
+
expect(aws).to receive(:availability_zone).and_return("us-east-1a")
|
15
35
|
expect(aws.datacenter).to eq('iad')
|
16
36
|
end
|
17
37
|
|
data/spec/ec2_spec.rb
CHANGED
@@ -2,12 +2,16 @@ require_relative '../lib/movable_ink/aws'
|
|
2
2
|
require 'webmock/rspec'
|
3
3
|
|
4
4
|
describe MovableInk::AWS::EC2 do
|
5
|
+
before(:each) do
|
6
|
+
allow_any_instance_of(MovableInk::AWS).to receive(:sleep).and_return(true)
|
7
|
+
end
|
8
|
+
|
5
9
|
context "outside EC2" do
|
6
10
|
it "should raise an error if trying to load mi_env outside of EC2" do
|
7
11
|
aws = MovableInk::AWS.new
|
8
|
-
|
9
|
-
|
10
|
-
expect{ aws.mi_env }.to raise_error(MovableInk::AWS::Errors::
|
12
|
+
# stub an error making a request to the metadata api
|
13
|
+
stub_request(:get, 'http://169.254.169.254/latest/api/token').to_raise(Net::OpenTimeout)
|
14
|
+
expect{ aws.mi_env }.to raise_error(MovableInk::AWS::Errors::MetadataTimeout)
|
11
15
|
end
|
12
16
|
|
13
17
|
it "should use the provided environment" do
|
@@ -17,12 +21,16 @@ describe MovableInk::AWS::EC2 do
|
|
17
21
|
|
18
22
|
it "should not find a 'me'" do
|
19
23
|
aws = MovableInk::AWS.new
|
24
|
+
# stub an error making a request to the metadata api
|
25
|
+
stub_request(:get, 'http://169.254.169.254/latest/api/token').to_raise(Net::OpenTimeout)
|
20
26
|
expect(aws.me).to eq(nil)
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
24
30
|
context "inside EC2" do
|
25
|
-
WebMock.allow_net_connect!
|
31
|
+
before(:each) { WebMock.allow_net_connect! }
|
32
|
+
after(:each) { WebMock.disable_net_connect! }
|
33
|
+
|
26
34
|
let(:aws) { MovableInk::AWS.new }
|
27
35
|
let(:ec2) { Aws::EC2::Client.new(stub_responses: true) }
|
28
36
|
let(:tag_data) { ec2.stub_data(:describe_tags, tags: [
|
data/spec/metadata_spec.rb
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
require_relative '../lib/movable_ink/aws'
|
2
|
+
require 'webmock/rspec'
|
2
3
|
|
3
4
|
describe MovableInk::AWS::Metadata do
|
5
|
+
before(:each) do
|
6
|
+
allow_any_instance_of(MovableInk::AWS).to receive(:sleep).and_return(true)
|
7
|
+
end
|
8
|
+
|
4
9
|
context 'outside ec2' do
|
5
|
-
it 'should raise an error if
|
10
|
+
it 'should raise an error if the metadata service times out' do
|
6
11
|
aws = MovableInk::AWS.new
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
expect{ aws.
|
11
|
-
expect{ aws.availability_zone }.to raise_error(MovableInk::AWS::Errors::EC2Required)
|
12
|
+
# stub an error making a request to the metadata api
|
13
|
+
stub_request(:get, 'http://169.254.169.254/latest/api/token').to_raise(Net::OpenTimeout)
|
14
|
+
expect{ aws.instance_id }.to raise_error(MovableInk::AWS::Errors::MetadataTimeout)
|
15
|
+
expect{ aws.availability_zone }.to raise_error(MovableInk::AWS::Errors::MetadataTimeout)
|
12
16
|
end
|
13
17
|
|
14
18
|
it 'should raise an error if trying to load private_ipv4 outside of EC2' do
|
15
19
|
aws = MovableInk::AWS.new
|
16
|
-
|
17
|
-
|
20
|
+
# stub an error making a request to the metadata api
|
21
|
+
stub_request(:get, 'http://169.254.169.254/latest/api/token').to_raise(Net::OpenTimeout)
|
22
|
+
expect{ aws.private_ipv4 }.to raise_error(MovableInk::AWS::Errors::MetadataTimeout)
|
18
23
|
end
|
19
24
|
end
|
20
25
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: MovableInkAWS
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Chesler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|
@@ -276,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
276
276
|
- !ruby/object:Gem::Version
|
277
277
|
version: '0'
|
278
278
|
requirements: []
|
279
|
-
rubygems_version: 3.0.3
|
279
|
+
rubygems_version: 3.0.3.1
|
280
280
|
signing_key:
|
281
281
|
specification_version: 4
|
282
282
|
summary: AWS Utility methods for MovableInk
|