renuo-cli 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/renuo/cli.rb +7 -2
- data/lib/renuo/cli/app/create_aws_project.rb +94 -20
- data/lib/renuo/cli/app/services/cloudfront_config_service.rb +121 -0
- data/lib/renuo/cli/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: adca29c33ee3aac89d50a5caf15553d14e4ae8e5bc42c141077d4ee6871218e8
|
4
|
+
data.tar.gz: 6ab51df5e5254b1d3662bb1623fdfe2bf57a4dde522559c7a91397e904ab9782
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7ad94fe437809b62be431f1862c7f6d02baa55a85deeca1f855e9ce378c4c17461c7cfc91514d283a3f2417c9167a37d44f404bc32e40c00c5a5e3ecc68118f
|
7
|
+
data.tar.gz: 6b6b7c62cdeba54b28abff6e57e30a3ee26299c7becea5ca05784f8220f7d78fbaebdadcb25cdefca76d2b9c422854da439ec3a1293420e0fd3218efcb6952b9
|
data/lib/renuo/cli.rb
CHANGED
@@ -85,19 +85,24 @@ module Renuo
|
|
85
85
|
|
86
86
|
command 'create-aws-project' do |c|
|
87
87
|
c.syntax = 'renuo create-aws-project'
|
88
|
-
c.summary = 'Generates necessary commands for our project setup on AWS.'
|
88
|
+
c.summary = 'Generates necessary commands for our project setup on AWS incl. necessary installations.'
|
89
89
|
c.description = <<-DESCRIPTION
|
90
|
-
This creates commands for creating AWS users, buckets an versioning policies.
|
90
|
+
This creates commands for creating AWS users, buckets an versioning policies and CloudFront.
|
91
|
+
It also guides you to set up the necessary environment.
|
91
92
|
|
92
93
|
You will be asked for:
|
94
|
+
(- installation of aws-cli, if not yet done)
|
95
|
+
(- setting up aws user `renuo-app-setup`, if not yet done)
|
93
96
|
- project name and suffix so that the script can respect our naming conventions
|
94
97
|
- the Redmine project name to tag buckets for AWS billing references
|
98
|
+
- whether you want to setup CloudFront to deliver assets via S3
|
95
99
|
|
96
100
|
The generated commands do the following:
|
97
101
|
- create an IAM user for each environment (master, develop, testing) and add it to the renuo apps group.
|
98
102
|
- create S3 buckets for each user who owns it
|
99
103
|
- tag the buckets
|
100
104
|
- enable versioning for master buckets
|
105
|
+
(- set up a CloudFront distribution for each environment with the default config or plus alias if configured)
|
101
106
|
DESCRIPTION
|
102
107
|
c.example 'Setup a project (you will be asked for details)', 'renuo create-aws-project'
|
103
108
|
c.action do |_args, _options|
|
@@ -1,46 +1,109 @@
|
|
1
|
+
require 'renuo/cli/app/services/cloudfront_config_service'
|
2
|
+
|
1
3
|
class CreateAwsProject
|
2
4
|
def initialize
|
3
|
-
|
4
|
-
|
5
|
+
ensure_aws_setup?
|
6
|
+
ensure_aws_profile_existing?
|
7
|
+
collect_project_information
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
%w[master develop testing].each do |branch|
|
12
|
+
print_setup_commands branch
|
5
13
|
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
6
17
|
|
18
|
+
def collect_project_information
|
19
|
+
say 'We need now some informations to create your s3-bucket:'.colorize :green
|
20
|
+
collect_general_information
|
21
|
+
collect_s3_information
|
22
|
+
collect_cloudfront_information
|
23
|
+
end
|
24
|
+
|
25
|
+
def collect_general_information
|
7
26
|
@project_name = ask('Project name (eg: renuo-cli): ') { |q| q.validate = /.+/ }
|
27
|
+
end
|
28
|
+
|
29
|
+
def collect_s3_information
|
8
30
|
@project_purpose = ask('Suffix describing purpose (eg: assets): ') { |q| q.default = 'none' }
|
9
31
|
@project_purpose = nil if @project_purpose.empty? || @project_purpose == 'none'
|
10
|
-
@redmine_project = ask('Redmine project name for billing (eg: internal): ')
|
32
|
+
@redmine_project = ask('Redmine project name for billing (eg: internal): ') do |q|
|
33
|
+
q.default = @project_name
|
34
|
+
q.validate = /.+/
|
35
|
+
end
|
11
36
|
@aws_profile = 'renuo-app-setup'
|
12
37
|
@aws_region = ask('AWS bucket region: ') { |q| q.default = 'eu-central-1' }
|
13
38
|
@aws_app_group = 'renuo-apps-v2'
|
14
39
|
end
|
15
40
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
41
|
+
def collect_cloudfront_information
|
42
|
+
@setup_cloudfront = agree('Would you like to setup also AWS CloudFront? '\
|
43
|
+
'(Default: yes, if you want to deliver assets/images from S3)')
|
44
|
+
return unless @setup_cloudfront
|
45
|
+
@cloudfront_alias = {}
|
46
|
+
return unless agree('Would you like to use an alias to call your assets/images on S3? (Default: no)')
|
47
|
+
|
48
|
+
%i[master develop testing].each do |branch|
|
49
|
+
cloudfront_alias_for branch
|
50
|
+
end
|
51
|
+
end
|
20
52
|
|
21
|
-
|
22
|
-
|
53
|
+
def cloudfront_alias_for(branch)
|
54
|
+
@cloudfront_alias[branch] = ask("What CF-Alias do you want to use for #{branch}?") { |q| q.validate = /.+/ }
|
55
|
+
end
|
23
56
|
|
24
|
-
|
25
|
-
|
57
|
+
def ensure_aws_setup?
|
58
|
+
ensure_is_setup?('aws --version > /dev/null',
|
59
|
+
'brew install awscli',
|
60
|
+
'Would you like to install aws-cli via `brew install awscli`?')
|
26
61
|
end
|
27
62
|
|
28
|
-
|
63
|
+
def ensure_aws_profile_existing?
|
64
|
+
ensure_is_setup?('aws configure --profile renuo-app-setup list > /dev/null',
|
65
|
+
'aws configure --profile renuo-app-setup',
|
66
|
+
'Would you like set up a profile for AWS '\
|
67
|
+
'`aws configure --profile renuo-app-setup`? (User/Password in keystore)')
|
68
|
+
end
|
29
69
|
|
30
|
-
def
|
31
|
-
|
32
|
-
say tag_setup(@aws_profile, aws_user(branch), @redmine_project)
|
70
|
+
def ensure_is_setup?(installation_check_command, installation_command, agree_text)
|
71
|
+
(system(installation_command) if agree(agree_text)) until system(installation_check_command)
|
33
72
|
end
|
34
73
|
|
35
|
-
def
|
36
|
-
say
|
74
|
+
def print_setup_commands(branch)
|
75
|
+
say "\n# AWS #{branch} \n".colorize :green
|
76
|
+
# wrap_at inserts newlines, after that, the command is no longer copyable
|
77
|
+
# rubocop:disable Style/GlobalVars
|
78
|
+
$terminal.wrap_at = nil
|
79
|
+
say aws_iam_setup(@aws_profile, @aws_region, aws_user(branch), @aws_app_group)
|
80
|
+
say tag_setup(aws_user(branch), @redmine_project)
|
81
|
+
say versioning_setup(@aws_profile, aws_user('master')) if branch == 'master'
|
82
|
+
cloudfront_setup(branch)
|
83
|
+
$terminal.wrap_at = :auto
|
84
|
+
# rubocop:enable Style/GlobalVars
|
85
|
+
end
|
86
|
+
|
87
|
+
def cloudfront_setup(branch)
|
88
|
+
return unless @setup_cloudfront
|
89
|
+
say setup_cloudfront(@aws_profile, branch)
|
90
|
+
if @cloudfront_alias[branch.to_sym]
|
91
|
+
say "\nWarning: Don't forget to set up `#{cloudfront_alias(branch)}` on the DNS if not yet done".colorize :yellow
|
92
|
+
else
|
93
|
+
say "\nHint: The domain name for your S3 files, can be found after running the" \
|
94
|
+
' commands on https://console.aws.amazon.com/cloudfront/home'.colorize :yellow
|
95
|
+
end
|
37
96
|
end
|
38
97
|
|
39
98
|
def aws_user(branch)
|
40
99
|
[@project_name, branch, @project_purpose].compact.join('-')
|
41
100
|
end
|
42
101
|
|
43
|
-
def
|
102
|
+
def cloudfront_alias(branch)
|
103
|
+
@cloudfront_alias[branch.to_sym]
|
104
|
+
end
|
105
|
+
|
106
|
+
def aws_iam_setup(profile, region, user, app_group)
|
44
107
|
<<-SETUP_COMMANDS
|
45
108
|
aws --profile #{profile} iam create-user --user-name #{user}
|
46
109
|
aws --profile #{profile} iam add-user-to-group --user-name #{user} --group-name #{app_group}
|
@@ -49,15 +112,26 @@ class CreateAwsProject
|
|
49
112
|
SETUP_COMMANDS
|
50
113
|
end
|
51
114
|
|
115
|
+
def setup_cloudfront(profile, branch)
|
116
|
+
<<-SETUP_COMMANDS
|
117
|
+
aws cloudfront create-distribution --profile #{profile} --cli-input-json '#{cloudfront_config_string(aws_user(branch), branch)}'
|
118
|
+
SETUP_COMMANDS
|
119
|
+
end
|
120
|
+
|
52
121
|
def versioning_setup(profile, bucket)
|
53
122
|
<<-VERSIONING_COMMANDS
|
54
123
|
aws --profile #{profile} s3api put-bucket-versioning --bucket #{bucket} --versioning-configuration Status=Enabled
|
55
124
|
VERSIONING_COMMANDS
|
56
125
|
end
|
57
126
|
|
58
|
-
def tag_setup(
|
127
|
+
def tag_setup(bucket, redmine_project)
|
128
|
+
tag_set = "[{Key=redmine_project,Value=#{redmine_project}}]"
|
59
129
|
<<-TAGGING_COMMANDS
|
60
|
-
aws --profile #{
|
130
|
+
aws --profile #{@aws_profile} s3api put-bucket-tagging --bucket #{bucket} --tagging "TagSet=#{tag_set}"
|
61
131
|
TAGGING_COMMANDS
|
62
132
|
end
|
133
|
+
|
134
|
+
def cloudfront_config_string(bucket, branch)
|
135
|
+
CloudfrontConfigService.new(bucket, cloudfront_alias(branch)).to_s
|
136
|
+
end
|
63
137
|
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
class CloudfrontConfigService
|
2
|
+
def initialize(bucket, bucket_alias)
|
3
|
+
@bucket = bucket
|
4
|
+
@bucket_alias = bucket_alias
|
5
|
+
end
|
6
|
+
|
7
|
+
def to_s
|
8
|
+
bucket_config.to_json.strip
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# rubocop:disable Metrics/MethodLength
|
14
|
+
def bucket_config
|
15
|
+
{
|
16
|
+
"DistributionConfig": {
|
17
|
+
"CallerReference": unique_caller_reference,
|
18
|
+
"Aliases": bucket_aliases,
|
19
|
+
"Origins": {
|
20
|
+
"Quantity": 1,
|
21
|
+
"Items": [
|
22
|
+
{
|
23
|
+
"Id": "S3-#{@bucket}",
|
24
|
+
"DomainName": "#{@bucket}.s3.amazonaws.com",
|
25
|
+
"OriginPath": '',
|
26
|
+
"CustomHeaders": {
|
27
|
+
"Quantity": 0
|
28
|
+
},
|
29
|
+
"S3OriginConfig": {
|
30
|
+
"OriginAccessIdentity": ''
|
31
|
+
}
|
32
|
+
}
|
33
|
+
]
|
34
|
+
},
|
35
|
+
"DefaultCacheBehavior": {
|
36
|
+
"TargetOriginId": "S3-#{@bucket}",
|
37
|
+
"ForwardedValues": {
|
38
|
+
"QueryString": false,
|
39
|
+
"Cookies": {
|
40
|
+
"Forward": 'none'
|
41
|
+
},
|
42
|
+
"Headers": {
|
43
|
+
"Quantity": 0
|
44
|
+
},
|
45
|
+
"QueryStringCacheKeys": {
|
46
|
+
"Quantity": 0
|
47
|
+
}
|
48
|
+
},
|
49
|
+
"TrustedSigners": {
|
50
|
+
"Enabled": false,
|
51
|
+
"Quantity": 0
|
52
|
+
},
|
53
|
+
"ViewerProtocolPolicy": 'redirect-to-https',
|
54
|
+
"MinTTL": 0,
|
55
|
+
"AllowedMethods": {
|
56
|
+
"Quantity": 2,
|
57
|
+
"Items": %w[
|
58
|
+
HEAD
|
59
|
+
GET
|
60
|
+
],
|
61
|
+
"CachedMethods": {
|
62
|
+
"Quantity": 2,
|
63
|
+
"Items": %w[
|
64
|
+
HEAD
|
65
|
+
GET
|
66
|
+
]
|
67
|
+
}
|
68
|
+
},
|
69
|
+
"SmoothStreaming": false,
|
70
|
+
"DefaultTTL": 86_400,
|
71
|
+
"MaxTTL": 31_536_000,
|
72
|
+
"Compress": true,
|
73
|
+
"LambdaFunctionAssociations": {
|
74
|
+
"Quantity": 0
|
75
|
+
}
|
76
|
+
},
|
77
|
+
"CacheBehaviors": {
|
78
|
+
"Quantity": 0
|
79
|
+
},
|
80
|
+
"CustomErrorResponses": {
|
81
|
+
"Quantity": 0
|
82
|
+
},
|
83
|
+
"Comment": '',
|
84
|
+
"Logging": {
|
85
|
+
"Enabled": false,
|
86
|
+
"IncludeCookies": false,
|
87
|
+
"Bucket": '',
|
88
|
+
"Prefix": ''
|
89
|
+
},
|
90
|
+
"PriceClass": 'PriceClass_100',
|
91
|
+
"Enabled": true,
|
92
|
+
"ViewerCertificate": {
|
93
|
+
"CloudFrontDefaultCertificate": true,
|
94
|
+
"MinimumProtocolVersion": 'TLSv1.2_2018',
|
95
|
+
"CertificateSource": 'cloudfront'
|
96
|
+
},
|
97
|
+
"Restrictions": {
|
98
|
+
"GeoRestriction": {
|
99
|
+
"RestrictionType": 'none',
|
100
|
+
"Quantity": 0
|
101
|
+
}
|
102
|
+
},
|
103
|
+
"WebACLId": '',
|
104
|
+
"HttpVersion": 'http2',
|
105
|
+
"IsIPV6Enabled": true
|
106
|
+
}
|
107
|
+
}
|
108
|
+
end
|
109
|
+
# rubocop:enable Metrics/MethodLength
|
110
|
+
|
111
|
+
def unique_caller_reference
|
112
|
+
"#{Time.now.getutc.to_i}-#{@bucket}"
|
113
|
+
end
|
114
|
+
|
115
|
+
def bucket_aliases
|
116
|
+
{
|
117
|
+
"Quantity": @bucket_alias ? 1 : 0,
|
118
|
+
"Items": @bucket_alias ? [@bucket_alias] : []
|
119
|
+
}
|
120
|
+
end
|
121
|
+
end
|
data/lib/renuo/cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renuo-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Elmer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -230,6 +230,7 @@ files:
|
|
230
230
|
- lib/renuo/cli/app/local_storage.rb
|
231
231
|
- lib/renuo/cli/app/name_display.rb
|
232
232
|
- lib/renuo/cli/app/release_project.rb
|
233
|
+
- lib/renuo/cli/app/services/cloudfront_config_service.rb
|
233
234
|
- lib/renuo/cli/app/services/markdown_parser_service.rb
|
234
235
|
- lib/renuo/cli/app/upgrade_laptop.rb
|
235
236
|
- lib/renuo/cli/app/upgrade_laptop/run_command.rb
|
@@ -257,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
257
258
|
version: '0'
|
258
259
|
requirements: []
|
259
260
|
rubyforge_project:
|
260
|
-
rubygems_version: 2.
|
261
|
+
rubygems_version: 2.7.5
|
261
262
|
signing_key:
|
262
263
|
specification_version: 4
|
263
264
|
summary: The Renuo CLI automates some commonly used workflows by providing a command
|