minimal_pipeline 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/lib/minimal_pipeline.rb +1 -0
- data/lib/minimal_pipeline/ec2.rb +132 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0269cb3b98b76aaa94744fd7afd155f4eb539060bc44805ef93de56a09a403de'
|
4
|
+
data.tar.gz: 314f3eb756620b6a77e77b613e10480c697f42480d975ce8cd264e53b2cae887
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25c1f7a9de134a874a32cc34c40c35ac8346cdd30a32c8e1c54950294eb12044d74890c9368ea63bee1d65fe88d70f934cd7100f0715253031a4c8c6090231f2
|
7
|
+
data.tar.gz: 941b5c26d156a84fc04063ae0225fa0554d05c3f6ec2172e7773ade4c17b066d5507e529e763467bf29cb22cacf792d3f8dc37cf19511469dfcb957cc62b6abf
|
data/lib/minimal_pipeline.rb
CHANGED
@@ -13,6 +13,7 @@ class MinimalPipeline
|
|
13
13
|
autoload(:Cloudformation, 'minimal_pipeline/cloudformation')
|
14
14
|
autoload(:Crossing, 'minimal_pipeline/crossing')
|
15
15
|
autoload(:Docker, 'minimal_pipeline/docker')
|
16
|
+
autoload(:Ec2, 'minimal_pipeline/ec2')
|
16
17
|
autoload(:Keystore, 'minimal_pipeline/keystore')
|
17
18
|
autoload(:Lambda, 'minimal_pipeline/lambda')
|
18
19
|
autoload(:Packer, 'minimal_pipeline/packer')
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
class MinimalPipeline
|
4
|
+
# # For Account 1:
|
5
|
+
# ec2 = MinimalPipeline::Ec2.new
|
6
|
+
# block_device_mappings = ec2.prepare_snapshots_for_account('ami-id',
|
7
|
+
# 'account-id')
|
8
|
+
#
|
9
|
+
# # Promote AMI via SQS
|
10
|
+
# sqs = MinimalPipeline::Sqs.new
|
11
|
+
# sqs.send_message('queue-name', block_device_mappings.to_json)
|
12
|
+
#
|
13
|
+
# # For Account 2, after getting block_device_mappings
|
14
|
+
# ec2 = MinimalPipeline::Ec2.new
|
15
|
+
# new_mappings = ec2.copy_snapshots_in_new_account(block_device_mappings)
|
16
|
+
# ec2.register_ami(new_mappings, 'ami-name')
|
17
|
+
class Ec2
|
18
|
+
# Initializes a `Ec2` client
|
19
|
+
# Requires environment variables `AWS_REGION` or `region` to be set.
|
20
|
+
# Also requires `keystore_table` and `keystore_kms_id`
|
21
|
+
def initialize
|
22
|
+
raise 'You must set env variable AWS_REGION or region.' \
|
23
|
+
if ENV['AWS_REGION'].nil? && ENV['region'].nil?
|
24
|
+
raise 'You must set env variable keystore_kms_id.' \
|
25
|
+
if ENV['inventory_store_key'].nil? && ENV['keystore_kms_id'].nil?
|
26
|
+
|
27
|
+
@region = ENV['AWS_REGION'] || ENV['region']
|
28
|
+
@kms_key_id = ENV['keystore_kms_id'] || ENV['inventory_store_key']
|
29
|
+
@client = Aws::EC2::Client.new(region: 'us-east-1')
|
30
|
+
end
|
31
|
+
|
32
|
+
# Block processing until snapshot until new snapshot is ready
|
33
|
+
#
|
34
|
+
# @param snapshot_id [String] The ID of the new snapshot
|
35
|
+
def wait_for_snapshot(snapshot_id)
|
36
|
+
puts "waiting on new snapshot #{snapshot_id} to be ready"
|
37
|
+
@client.wait_until(:snapshot_completed, snapshot_ids: [snapshot_id])
|
38
|
+
puts "New snapshot #{snapshot_id}is ready"
|
39
|
+
rescue Aws::Waiters::Errors::WaiterFailed => error
|
40
|
+
puts "failed waiting for snapshot to be ready: #{error.message}"
|
41
|
+
end
|
42
|
+
|
43
|
+
# Create a copy of an existing snapshot
|
44
|
+
#
|
45
|
+
# @param snapshot_id [String] The ID of the snapshot to copy
|
46
|
+
# @param encrypted [Boolean] Whether or not the volume is encrypted
|
47
|
+
# @return [String] The ID of the newly created snapshot
|
48
|
+
def copy_snapshot(snapshot_id, encrypted = true)
|
49
|
+
new_snapshot_id = @client.copy_snapshot(
|
50
|
+
encrypted: encrypted,
|
51
|
+
kms_key_id: @kms_key_id,
|
52
|
+
source_region: @region,
|
53
|
+
source_snapshot_id: snapshot_id
|
54
|
+
).snapshot_id
|
55
|
+
|
56
|
+
puts "new snapshot ID: #{new_snapshot_id}"
|
57
|
+
wait_for_snapshot(new_snapshot_id)
|
58
|
+
|
59
|
+
new_snapshot_id
|
60
|
+
end
|
61
|
+
|
62
|
+
# Update permissions to grant access to an AMI on another account
|
63
|
+
#
|
64
|
+
# @param snapshot_id [String] The ID of the snapshot to adjust
|
65
|
+
# @param account_id [String] The AWS account to grant access to
|
66
|
+
def unlock_ami_for_account(snapshot_id, account_id)
|
67
|
+
@client.modify_snapshot_attribute(
|
68
|
+
attribute: 'createVolumePermission',
|
69
|
+
operation_type: 'add',
|
70
|
+
snapshot_id: snapshot_id,
|
71
|
+
user_ids: [account_id]
|
72
|
+
)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Prepare volume snapshots of an AMI for a new account
|
76
|
+
#
|
77
|
+
# @param ami_id [String] The ID of the AMI to prepare
|
78
|
+
# @param account_id [String] The ID of the AWS account to prepare
|
79
|
+
# @return [Array] Block device mappings discovered from the AMI
|
80
|
+
def prepare_snapshots_for_account(ami_id, account_id)
|
81
|
+
images = @client.describe_images(image_ids: [ami_id])
|
82
|
+
block_device_mappings = images.images[0].block_device_mappings
|
83
|
+
new_mappings = []
|
84
|
+
|
85
|
+
block_device_mappings.each do |mapping|
|
86
|
+
snapshot_id = mapping.ebs.snapshot_id
|
87
|
+
puts "old snapshot ID: #{snapshot_id}"
|
88
|
+
new_snapshot_id = copy_snapshot(snapshot_id)
|
89
|
+
puts 'modifying new snapshot attribute'
|
90
|
+
unlock_ami_for_account(new_snapshot_id, account_id)
|
91
|
+
puts "new snapshot has been modified for the #{account_id} account"
|
92
|
+
mapping.ebs.snapshot_id = new_snapshot_id
|
93
|
+
new_mappings << mapping.to_hash
|
94
|
+
puts '==========================================='
|
95
|
+
end
|
96
|
+
|
97
|
+
new_mappings
|
98
|
+
end
|
99
|
+
|
100
|
+
# Register a new AMI based on block device mappings
|
101
|
+
# Currently only supports x86_64 HVM
|
102
|
+
#
|
103
|
+
# @params block_device_mappings [Array] Block device mappings with snapshots
|
104
|
+
# @params ami_name [String] The name of the AMI to create
|
105
|
+
def register_ami(block_device_mappings, ami_name)
|
106
|
+
@client.register_image(
|
107
|
+
architecture: 'x86_64',
|
108
|
+
block_device_mappings: block_device_mappings,
|
109
|
+
name: ami_name,
|
110
|
+
root_device_name: '/dev/sda1',
|
111
|
+
virtualization_type: 'hvm'
|
112
|
+
)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Copy the snapshots from the original account into the new one
|
116
|
+
#
|
117
|
+
# @params block_device_mappings [Array] Block device mappings with snapshots
|
118
|
+
# @return [Array] Block device mappings with updated snapshot ids
|
119
|
+
def copy_snapshots_in_new_account(block_device_mappings)
|
120
|
+
new_mappings = []
|
121
|
+
|
122
|
+
block_device_mappings.each do |mapping|
|
123
|
+
snapshot_id = mapping.ebs.snapshot_id
|
124
|
+
new_snapshot_id = copy_snapshot(snapshots[snapshot_id])
|
125
|
+
mapping.ebs.snapshot_id = new_snapshot_id
|
126
|
+
new_mappings << mapping
|
127
|
+
end
|
128
|
+
|
129
|
+
new_mappings
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minimal_pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mayowa Aladeojebi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-11-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- lib/minimal_pipeline/cloudformation.rb
|
108
108
|
- lib/minimal_pipeline/crossing.rb
|
109
109
|
- lib/minimal_pipeline/docker.rb
|
110
|
+
- lib/minimal_pipeline/ec2.rb
|
110
111
|
- lib/minimal_pipeline/keystore.rb
|
111
112
|
- lib/minimal_pipeline/lambda.rb
|
112
113
|
- lib/minimal_pipeline/packer.rb
|