elastic_beans 0.12.0 → 0.13.0.alpha1
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/README.md +4 -4
- data/lib/elastic_beans/cli.rb +4 -4
- data/lib/elastic_beans/command/configure.rb +74 -16
- data/lib/elastic_beans/command/set_env.rb +14 -0
- data/lib/elastic_beans/configuration_template/base.rb +25 -27
- data/lib/elastic_beans/configuration_template/exec.rb +9 -5
- data/lib/elastic_beans/configuration_template/scheduler.rb +8 -4
- data/lib/elastic_beans/configuration_template/webserver.rb +22 -18
- data/lib/elastic_beans/configuration_template/worker.rb +12 -8
- data/lib/elastic_beans/configuration_template.rb +26 -5
- data/lib/elastic_beans/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 104398081411188937dfc9c983fcde0cc98de988
|
4
|
+
data.tar.gz: ecce5ec7acf41af00e8310f05ba1b47f945e2428
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ece21d2d195d9d0650189a2eef7af0eb2aed66ac0ef05f7392381f9b401dd37588f0dfc6d34e1e42f402cba0d24893027ddecfb1b6492e3fc4d272a1cef76859
|
7
|
+
data.tar.gz: 70984a0532380942a69d23aca621f9664b3144986e5c21cba1c1777de128fc5bdfebf8885027ce9452dc3906cfe8b81f6804ea8e5dc096daf92bf268dd23c6c0
|
data/README.md
CHANGED
@@ -24,8 +24,8 @@ As the SDK documentation suggests, using environment variables is recommended.
|
|
24
24
|
|
25
25
|
# Pre-configure the application before creating environments
|
26
26
|
beans configure -n myapp-networking -a myapp \
|
27
|
-
-p INTERNAL_PUBLIC_KEY -s SSL_CERTIFICATE_ARN \
|
28
|
-
|
27
|
+
-p INTERNAL_PUBLIC_KEY -s SSL_CERTIFICATE_ARN -k KEYPAIR \
|
28
|
+
[-o 'OPTION_SETTING_NAMESPACE/OPTION_NAME=VALUE'...]
|
29
29
|
beans setenv -a myapp \
|
30
30
|
DATABASE_URL=mysql2://db.example.com:3306/myapp \
|
31
31
|
SECRET_KEY_BASE=abc123
|
@@ -65,8 +65,8 @@ As the SDK documentation suggests, using environment variables is recommended.
|
|
65
65
|
|
66
66
|
# Update all existing environments and configuration
|
67
67
|
beans configure -n myapp-networking -a myapp \
|
68
|
-
[-p INTERNAL_PUBLIC_KEY] [-s SSL_CERTIFICATE_ARN] \
|
69
|
-
[-
|
68
|
+
[-p INTERNAL_PUBLIC_KEY] [-s SSL_CERTIFICATE_ARN] [-k KEYPAIR] \
|
69
|
+
[-o 'OPTION_SETTING_NAMESPACE/OPTION_NAME=VALUE'...]
|
70
70
|
|
71
71
|
### API
|
72
72
|
|
data/lib/elastic_beans/cli.rb
CHANGED
@@ -16,21 +16,21 @@ class ElasticBeans::CLI < Thor
|
|
16
16
|
long_desc ElasticBeans::Command::Configure::LONG_DESC
|
17
17
|
option :application, aliases: %w(-a), required: true, desc: APPLICATION_DESC
|
18
18
|
option :network, aliases: %w(-n), required: true, desc: "The name of the CloudFormation stack that contains networking settings"
|
19
|
-
option :image_id, aliases: %w(-i), desc: "A custom AMI to use instead of the default Ruby Elastic Beanstalk AMI"
|
20
|
-
option :instance_type, aliases: %w(-t), desc: "A default instance type to use for all environments instead of c4.large"
|
21
19
|
option :internal, type: :boolean, desc: "Configure the webserver to only be available for internal VPC access"
|
22
20
|
option :keypair, aliases: %w(-k), desc: "Required on first run. The EC2 keypair to use for Elastic Beanstalk instances"
|
21
|
+
option :option_settings, aliases: %w(-o), type: :array, default: [], desc: "Option settings to configure, format is NAMESPACE/OPTION_NAME=VALUE, e.g. aws:ec2:vpc/ELBScheme=internal"
|
22
|
+
option :option_settings_to_remove, aliases: %w(-r), type: :array, default: [], desc: "Option settings to remove, format is NAMESPACE/OPTION_NAME, e.g. aws:ec2:vpc/ELBScheme"
|
23
23
|
option :public_key, aliases: %w(-p), desc: "For end-to-end encryption. The public key of the SSL certificate the ELB will verify to communicate with your Rails app"
|
24
24
|
option :ssl_certificate_arn, aliases: %w(-s), desc: "The ARN of the SSL server certificate stored in IAM to attach to the ELB"
|
25
25
|
def configure
|
26
26
|
@verbose = options[:verbose]
|
27
27
|
ElasticBeans::Command::Configure.new(
|
28
|
-
image_id: options[:image_id],
|
29
|
-
instance_type: options[:instance_type],
|
30
28
|
internal: options[:internal],
|
31
29
|
keypair: options[:keypair],
|
32
30
|
public_key: options[:public_key],
|
33
31
|
ssl_certificate_arn: options[:ssl_certificate_arn],
|
32
|
+
option_settings: options[:option_settings],
|
33
|
+
option_settings_to_remove: options[:option_settings_to_remove],
|
34
34
|
application: application(name: options[:application]),
|
35
35
|
network: network(stack_name: options[:network]),
|
36
36
|
elastic_beanstalk: elastic_beanstalk_client,
|
@@ -16,24 +16,24 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
16
16
|
LONG_DESC
|
17
17
|
|
18
18
|
def initialize(
|
19
|
-
image_id:,
|
20
|
-
instance_type:,
|
21
19
|
internal:,
|
22
20
|
keypair:,
|
23
21
|
public_key:,
|
24
22
|
ssl_certificate_arn:,
|
23
|
+
option_settings:,
|
24
|
+
option_settings_to_remove:,
|
25
25
|
application:,
|
26
26
|
network:,
|
27
27
|
elastic_beanstalk:,
|
28
28
|
iam:,
|
29
29
|
ui:
|
30
30
|
)
|
31
|
-
@image_id = image_id
|
32
|
-
@instance_type = instance_type
|
33
31
|
@internal = internal
|
34
32
|
@keypair = keypair
|
35
33
|
@public_key = public_key
|
36
34
|
@ssl_certificate_arn = ssl_certificate_arn
|
35
|
+
@option_setting_strings = option_settings
|
36
|
+
@option_strings_to_remove = option_settings_to_remove
|
37
37
|
@application = application
|
38
38
|
@network = network
|
39
39
|
@elastic_beanstalk = elastic_beanstalk
|
@@ -71,9 +71,9 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
71
71
|
)
|
72
72
|
base_config.upsert(
|
73
73
|
network: network,
|
74
|
-
image_id: image_id,
|
75
|
-
instance_type: instance_type,
|
76
74
|
keypair: keypair,
|
75
|
+
option_settings: option_settings,
|
76
|
+
options_to_remove: options_to_remove,
|
77
77
|
iam: iam,
|
78
78
|
)
|
79
79
|
progressbar.increment
|
@@ -85,10 +85,10 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
85
85
|
)
|
86
86
|
webserver_config.upsert(
|
87
87
|
network: network,
|
88
|
-
image_id: image_id,
|
89
|
-
instance_type: instance_type,
|
90
88
|
internal: internal,
|
91
89
|
keypair: keypair,
|
90
|
+
option_settings: option_settings,
|
91
|
+
options_to_remove: options_to_remove,
|
92
92
|
iam: iam,
|
93
93
|
public_key: public_key,
|
94
94
|
ssl_certificate_arn: ssl_certificate_arn,
|
@@ -109,9 +109,9 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
109
109
|
)
|
110
110
|
exec_config.upsert(
|
111
111
|
network: network,
|
112
|
-
image_id: image_id,
|
113
|
-
instance_type: instance_type,
|
114
112
|
keypair: keypair,
|
113
|
+
option_settings: option_settings,
|
114
|
+
options_to_remove: options_to_remove,
|
115
115
|
iam: iam,
|
116
116
|
)
|
117
117
|
exec_environment = exec_config.environment
|
@@ -130,9 +130,9 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
130
130
|
)
|
131
131
|
scheduler_config.upsert(
|
132
132
|
network: network,
|
133
|
-
image_id: image_id,
|
134
|
-
instance_type: instance_type,
|
135
133
|
keypair: keypair,
|
134
|
+
option_settings: option_settings,
|
135
|
+
options_to_remove: options_to_remove,
|
136
136
|
iam: iam,
|
137
137
|
)
|
138
138
|
scheduler_environment = scheduler_config.environment
|
@@ -153,9 +153,9 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
153
153
|
)
|
154
154
|
worker_config.upsert(
|
155
155
|
network: network,
|
156
|
-
image_id: image_id,
|
157
|
-
instance_type: instance_type,
|
158
156
|
keypair: keypair,
|
157
|
+
option_settings: option_settings,
|
158
|
+
options_to_remove: options_to_remove,
|
159
159
|
iam: iam,
|
160
160
|
)
|
161
161
|
worker_environment = worker_config.environment
|
@@ -175,8 +175,6 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
175
175
|
|
176
176
|
attr_reader(
|
177
177
|
:application,
|
178
|
-
:image_id,
|
179
|
-
:instance_type,
|
180
178
|
:internal,
|
181
179
|
:keypair,
|
182
180
|
:network,
|
@@ -186,6 +184,66 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
186
184
|
:iam,
|
187
185
|
:ui,
|
188
186
|
)
|
187
|
+
|
188
|
+
# Coerces +@option_setting_strings+ into object format.
|
189
|
+
def option_settings
|
190
|
+
@option_settings ||= @option_setting_strings.map { |option_setting_string|
|
191
|
+
setting, value = option_setting_string.split('=', 2)
|
192
|
+
if !setting || setting.empty? || !value || value.empty?
|
193
|
+
raise InvalidOptionSettingFormatError
|
194
|
+
end
|
195
|
+
namespace, option_name = setting.split('/', 2)
|
196
|
+
if !namespace || namespace.empty? || !option_name || option_name.empty?
|
197
|
+
raise InvalidOptionSettingFormatError
|
198
|
+
end
|
199
|
+
{namespace: namespace, option_name: option_name, value: value}
|
200
|
+
}
|
201
|
+
end
|
202
|
+
|
203
|
+
# Coerces +@option_strings_to_remove+ into object format.
|
204
|
+
def options_to_remove
|
205
|
+
@options_to_remove ||= @option_strings_to_remove.map { |option_setting_string|
|
206
|
+
namespace, option_name = option_setting_string.split('/', 2)
|
207
|
+
if !namespace || namespace.empty? || !option_name || option_name.empty? || option_name.include?('=')
|
208
|
+
raise InvalidOptionSettingFormatError
|
209
|
+
end
|
210
|
+
{namespace: namespace, option_name: option_name}
|
211
|
+
}
|
212
|
+
end
|
213
|
+
|
214
|
+
# :nodoc: all
|
215
|
+
# @!visibility private
|
216
|
+
class InvalidOptionSettingFormatError < ElasticBeans::Error
|
217
|
+
def message
|
218
|
+
require "elastic_beans/cli"
|
219
|
+
require "elastic_beans/cli/string_shell"
|
220
|
+
<<-MESSAGE
|
221
|
+
Invalid format for --option-settings.
|
222
|
+
Option settings should in the format 'NAMESPACE/OPTION_NAME=VALUE', e.g. 'aws:autoscaling:asg/Cooldown=180'.
|
223
|
+
If you'd like to *remove* option settings, use --option-settings-to-remove 'NAMESPACE/OPTION_NAME'.
|
224
|
+
Please re-run `#{command_as_string "configure"}` with updated syntax.
|
225
|
+
|
226
|
+
#{command_help "configure"}
|
227
|
+
MESSAGE
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
# :nodoc: all
|
232
|
+
# @!visibility private
|
233
|
+
class InvalidOptionSettingsToRemoveFormatError < ElasticBeans::Error
|
234
|
+
def message
|
235
|
+
require "elastic_beans/cli"
|
236
|
+
require "elastic_beans/cli/string_shell"
|
237
|
+
<<-MESSAGE
|
238
|
+
Invalid format for --option-settings-to-remove.
|
239
|
+
Option settings to remove should in the format 'NAMESPACE/OPTION_NAME', e.g. 'aws:autoscaling:asg/Cooldown'.
|
240
|
+
If you'd like to *set* option settings, use --option-settings 'NAMESPACE/OPTION_NAME=VALUE'.
|
241
|
+
Please re-run `#{command_as_string "configure"}` with updated syntax.
|
242
|
+
|
243
|
+
#{command_help "configure"}
|
244
|
+
MESSAGE
|
245
|
+
end
|
246
|
+
end
|
189
247
|
end
|
190
248
|
end
|
191
249
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "ruby-progressbar"
|
2
|
+
require "elastic_beans/error"
|
2
3
|
require "elastic_beans/error/environments_not_ready"
|
3
4
|
|
4
5
|
module ElasticBeans
|
@@ -75,10 +76,23 @@ Requires AWS credentials to be set in the environment, i.e. AWS_ACCESS_KEY_ID an
|
|
75
76
|
def pairs_as_hash(pairs)
|
76
77
|
pairs.reduce({}) { |acc, pair|
|
77
78
|
key, value = pair.split('=', 2)
|
79
|
+
raise MissingValueError.new(key: key) if value.nil?
|
78
80
|
acc[key] = value
|
79
81
|
acc
|
80
82
|
}
|
81
83
|
end
|
84
|
+
|
85
|
+
class MissingValueError < ElasticBeans::Error
|
86
|
+
def initialize(key:)
|
87
|
+
@key = key
|
88
|
+
end
|
89
|
+
|
90
|
+
def message
|
91
|
+
"Missing value for key '#{@key}'. " \
|
92
|
+
"Should it be part of the previous value? " \
|
93
|
+
"You may need to quote the key/value pair (e.g. 'MYVAR=myvalue, myvalue2') or escape a space (e.g. 'MYVAR=myvalue,\\ myvalue2')."
|
94
|
+
end
|
95
|
+
end
|
82
96
|
end
|
83
97
|
end
|
84
98
|
end
|
@@ -18,20 +18,19 @@ module ElasticBeans
|
|
18
18
|
network: nil,
|
19
19
|
keypair: nil,
|
20
20
|
iam: nil,
|
21
|
-
image_id: nil,
|
22
|
-
instance_type: nil,
|
23
21
|
min_size: nil,
|
24
22
|
max_size: nil,
|
23
|
+
option_settings: [],
|
25
24
|
**_
|
26
25
|
)
|
27
26
|
template = configuration_settings_description("base")
|
28
27
|
|
29
|
-
instance_profile_setting = template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "IamInstanceProfile", override: instance_profile(iam))
|
28
|
+
instance_profile_setting = template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "IamInstanceProfile", override: instance_profile(iam), new_settings: option_settings)
|
30
29
|
if instance_profile_setting[:value].nil?
|
31
30
|
raise MissingInstanceProfileError
|
32
31
|
end
|
33
32
|
|
34
|
-
keypair_setting = template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "EC2KeyName", override: keypair)
|
33
|
+
keypair_setting = template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "EC2KeyName", override: keypair, new_settings: option_settings)
|
35
34
|
if keypair_setting[:value].nil?
|
36
35
|
raise MissingOptionsError.new(
|
37
36
|
keypair: keypair_setting[:value],
|
@@ -39,32 +38,31 @@ module ElasticBeans
|
|
39
38
|
end
|
40
39
|
|
41
40
|
config_path = "#{application.bucket_name}/#{application.env_vars.s3_key}"
|
42
|
-
|
43
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:command", option_name: "BatchSize", default: "1"),
|
44
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:command", option_name: "BatchSizeType", default: "Fixed"),
|
45
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:command", option_name: "DeploymentPolicy", default: "Rolling"),
|
46
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", default: "true"),
|
47
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:application:environment", option_name: "ELASTIC_BEANS_ENV_VARS", default: config_path),
|
48
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:environment", option_name: "ServiceRole", default: "aws-elasticbeanstalk-service-role"),
|
49
|
-
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:healthreporting:system", option_name: "SystemType", default: "enhanced"),
|
50
|
-
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "AssociatePublicIpAddress", default: "false"),
|
51
|
-
template_option_setting(template: template, namespace: "aws:autoscaling:asg", option_name: "MinSize", default: "1", override: min_size),
|
52
|
-
template_option_setting(template: template, namespace: "aws:autoscaling:asg", option_name: "MaxSize", default: "4", override: max_size),
|
53
|
-
template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "
|
54
|
-
template_option_setting(template: template, namespace: "aws:autoscaling:
|
55
|
-
template_option_setting(template: template, namespace: "aws:autoscaling:updatepolicy:rollingupdate", option_name: "
|
56
|
-
template_option_setting(template: template, namespace: "aws:autoscaling:
|
57
|
-
template_option_setting(template: template, namespace: "aws:
|
58
|
-
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "
|
59
|
-
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "
|
60
|
-
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "VPCId", override: vpc_id(network)),
|
41
|
+
super + [
|
42
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:command", option_name: "BatchSize", default: "1", new_settings: option_settings),
|
43
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:command", option_name: "BatchSizeType", default: "Fixed", new_settings: option_settings),
|
44
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:command", option_name: "DeploymentPolicy", default: "Rolling", new_settings: option_settings),
|
45
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", default: "true", new_settings: option_settings),
|
46
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:application:environment", option_name: "ELASTIC_BEANS_ENV_VARS", default: config_path, new_settings: option_settings),
|
47
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:environment", option_name: "ServiceRole", default: "aws-elasticbeanstalk-service-role", new_settings: option_settings),
|
48
|
+
template_option_setting(template: template, namespace: "aws:elasticbeanstalk:healthreporting:system", option_name: "SystemType", default: "enhanced", new_settings: option_settings),
|
49
|
+
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "AssociatePublicIpAddress", default: "false", new_settings: option_settings),
|
50
|
+
template_option_setting(template: template, namespace: "aws:autoscaling:asg", option_name: "MinSize", default: "1", override: min_size, new_settings: option_settings),
|
51
|
+
template_option_setting(template: template, namespace: "aws:autoscaling:asg", option_name: "MaxSize", default: "4", override: max_size, new_settings: option_settings),
|
52
|
+
template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "SSHSourceRestriction", default: "tcp, 22, 22, 0.0.0.0/32", new_settings: option_settings),
|
53
|
+
template_option_setting(template: template, namespace: "aws:autoscaling:updatepolicy:rollingupdate", option_name: "RollingUpdateType", default: "Health", new_settings: option_settings),
|
54
|
+
template_option_setting(template: template, namespace: "aws:autoscaling:updatepolicy:rollingupdate", option_name: "RollingUpdateEnabled", default: "true", new_settings: option_settings),
|
55
|
+
template_option_setting(template: template, namespace: "aws:autoscaling:launchconfiguration", option_name: "SecurityGroups", override: security_groups(network), new_settings: option_settings),
|
56
|
+
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "ELBSubnets", override: elb_subnets(network), new_settings: option_settings),
|
57
|
+
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "Subnets", override: subnets(network), new_settings: option_settings),
|
58
|
+
template_option_setting(template: template, namespace: "aws:ec2:vpc", option_name: "VPCId", override: vpc_id(network), new_settings: option_settings),
|
61
59
|
instance_profile_setting,
|
62
60
|
keypair_setting,
|
63
61
|
]
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
end
|
63
|
+
|
64
|
+
def source_configuration
|
65
|
+
nil
|
68
66
|
end
|
69
67
|
|
70
68
|
private
|
@@ -12,14 +12,18 @@ module ElasticBeans
|
|
12
12
|
protected
|
13
13
|
|
14
14
|
# Constructs the configuration for the exec environment.
|
15
|
-
def build_option_settings(**_)
|
15
|
+
def build_option_settings(option_settings: [], **_)
|
16
16
|
super + [
|
17
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTP:80/"),
|
18
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", override: "false"),
|
19
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "ELASTIC_BEANS_EXEC_QUEUE_URL", override: application.exec_queue_url),
|
20
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "true"),
|
17
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTP:80/", new_settings: option_settings),
|
18
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", override: "false", new_settings: option_settings),
|
19
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "ELASTIC_BEANS_EXEC_QUEUE_URL", override: application.exec_queue_url, new_settings: option_settings),
|
20
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "true", new_settings: option_settings),
|
21
21
|
]
|
22
22
|
end
|
23
|
+
|
24
|
+
def source_configuration
|
25
|
+
SOURCE_CONFIGURATION
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
@@ -11,13 +11,17 @@ module ElasticBeans
|
|
11
11
|
|
12
12
|
# Constructs the configuration for the scheduler environment.
|
13
13
|
# No special options here!
|
14
|
-
def build_option_settings(**_)
|
14
|
+
def build_option_settings(option_settings: [], **_)
|
15
15
|
super + [
|
16
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTP:80/"),
|
17
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", override: "false"),
|
18
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "true"),
|
16
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTP:80/", new_settings: option_settings),
|
17
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", override: "false", new_settings: option_settings),
|
18
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "true", new_settings: option_settings),
|
19
19
|
]
|
20
20
|
end
|
21
|
+
|
22
|
+
def source_configuration
|
23
|
+
SOURCE_CONFIGURATION
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
23
27
|
end
|
@@ -13,35 +13,35 @@ module ElasticBeans
|
|
13
13
|
|
14
14
|
# Constructs the configuration for the webserver environment.
|
15
15
|
# All arguments are required on first run.
|
16
|
-
def build_option_settings(network: nil, public_key: nil, ssl_certificate_arn: nil, internal: nil, **_)
|
17
|
-
public_key_policy_names_setting = template_option_setting(namespace: "aws:elb:policies:backendencryption", option_name: "PublicKeyPolicyNames", default: "backendkey")
|
18
|
-
public_key_setting = template_option_setting(namespace: "aws:elb:policies:#{public_key_policy_names_setting[:value]}", option_name: "PublicKey", override: public_key)
|
19
|
-
ssl_certificate_setting = template_option_setting(namespace: "aws:elb:listener:443", option_name: "SSLCertificateId", override: ssl_certificate_arn)
|
16
|
+
def build_option_settings(network: nil, public_key: nil, ssl_certificate_arn: nil, internal: nil, option_settings: [], **_)
|
17
|
+
public_key_policy_names_setting = template_option_setting(namespace: "aws:elb:policies:backendencryption", option_name: "PublicKeyPolicyNames", default: "backendkey", new_settings: option_settings)
|
18
|
+
public_key_setting = template_option_setting(namespace: "aws:elb:policies:#{public_key_policy_names_setting[:value]}", option_name: "PublicKey", override: public_key, new_settings: option_settings)
|
19
|
+
ssl_certificate_setting = template_option_setting(namespace: "aws:elb:listener:443", option_name: "SSLCertificateId", override: ssl_certificate_arn, new_settings: option_settings)
|
20
20
|
if public_key_setting[:value].nil? || ssl_certificate_setting[:value].nil?
|
21
21
|
raise NoEncryptionSettingsError
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTPS:443/", allow_blank: false),
|
26
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_ASSET_COMPILATION", default: "false"),
|
27
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "false"),
|
28
|
-
template_option_setting(namespace: "aws:elb:listener:443", option_name: "InstancePort", default: "443"),
|
29
|
-
template_option_setting(namespace: "aws:elb:listener:443", option_name: "InstanceProtocol", default: "HTTPS"),
|
30
|
-
template_option_setting(namespace: "aws:elb:listener:443", option_name: "ListenerProtocol", default: "HTTPS"),
|
31
|
-
template_option_setting(namespace: "aws:elb:loadbalancer", option_name: "ManagedSecurityGroup", override: managed_security_group(network)),
|
32
|
-
template_option_setting(namespace: "aws:elb:loadbalancer", option_name: "SecurityGroups", override: elb_security_groups(network)),
|
33
|
-
template_option_setting(namespace: "aws:elb:policies", option_name: "ConnectionDrainingEnabled", default: "true"),
|
34
|
-
template_option_setting(namespace: "aws:elb:policies:backendencryption", option_name: "InstancePorts", default: "443"),
|
24
|
+
settings = [
|
25
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTPS:443/", allow_blank: false, new_settings: option_settings),
|
26
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_ASSET_COMPILATION", default: "false", new_settings: option_settings),
|
27
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "false", new_settings: option_settings),
|
28
|
+
template_option_setting(namespace: "aws:elb:listener:443", option_name: "InstancePort", default: "443", new_settings: option_settings),
|
29
|
+
template_option_setting(namespace: "aws:elb:listener:443", option_name: "InstanceProtocol", default: "HTTPS", new_settings: option_settings),
|
30
|
+
template_option_setting(namespace: "aws:elb:listener:443", option_name: "ListenerProtocol", default: "HTTPS", new_settings: option_settings),
|
31
|
+
template_option_setting(namespace: "aws:elb:loadbalancer", option_name: "ManagedSecurityGroup", override: managed_security_group(network), new_settings: option_settings),
|
32
|
+
template_option_setting(namespace: "aws:elb:loadbalancer", option_name: "SecurityGroups", override: elb_security_groups(network), new_settings: option_settings),
|
33
|
+
template_option_setting(namespace: "aws:elb:policies", option_name: "ConnectionDrainingEnabled", default: "true", new_settings: option_settings),
|
34
|
+
template_option_setting(namespace: "aws:elb:policies:backendencryption", option_name: "InstancePorts", default: "443", new_settings: option_settings),
|
35
35
|
public_key_policy_names_setting,
|
36
36
|
public_key_setting,
|
37
37
|
ssl_certificate_setting,
|
38
38
|
]
|
39
39
|
if internal
|
40
|
-
internal_setting = template_option_setting(namespace: "aws:ec2:vpc", option_name: "ELBScheme", override: "internal")
|
41
|
-
|
40
|
+
internal_setting = template_option_setting(namespace: "aws:ec2:vpc", option_name: "ELBScheme", override: "internal", new_settings: option_settings)
|
41
|
+
settings << internal_setting
|
42
42
|
end
|
43
43
|
|
44
|
-
super +
|
44
|
+
super + settings
|
45
45
|
end
|
46
46
|
|
47
47
|
# Removes the "internal" ELB scheme if explicitly disabled with --no-internal.
|
@@ -64,6 +64,10 @@ module ElasticBeans
|
|
64
64
|
network.elb_security_groups[0] if network
|
65
65
|
end
|
66
66
|
|
67
|
+
def source_configuration
|
68
|
+
SOURCE_CONFIGURATION
|
69
|
+
end
|
70
|
+
|
67
71
|
# :nodoc: all
|
68
72
|
# @!visibility private
|
69
73
|
class NoEncryptionSettingsError < ElasticBeans::Error
|
@@ -24,17 +24,21 @@ module ElasticBeans
|
|
24
24
|
# Constructs the configuration for the worker environments.
|
25
25
|
# No special arguments, the +queue+ name is stored from the initializer and is used to look up the appropriate
|
26
26
|
# URL.
|
27
|
-
def build_option_settings(**_)
|
27
|
+
def build_option_settings(option_settings: [], **_)
|
28
28
|
super + [
|
29
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTP:80/"),
|
30
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", override: "false"),
|
31
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "true"),
|
32
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "InactivityTimeout", default: "1800"),
|
33
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "MaxRetries", default: "10"),
|
34
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "VisibilityTimeout", default: "1800"),
|
35
|
-
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "WorkerQueueURL", override: application.worker_queue_url(queue)),
|
29
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application", option_name: "Application Healthcheck URL", default: "HTTP:80/", new_settings: option_settings),
|
30
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "DISABLE_SQS_CONSUMER", override: "false", new_settings: option_settings),
|
31
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:application:environment", option_name: "RAILS_SKIP_MIGRATIONS", default: "true", new_settings: option_settings),
|
32
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "InactivityTimeout", default: "1800", new_settings: option_settings),
|
33
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "MaxRetries", default: "10", new_settings: option_settings),
|
34
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "VisibilityTimeout", default: "1800", new_settings: option_settings),
|
35
|
+
template_option_setting(namespace: "aws:elasticbeanstalk:sqsd", option_name: "WorkerQueueURL", override: application.worker_queue_url(queue), new_settings: option_settings),
|
36
36
|
]
|
37
37
|
end
|
38
|
+
|
39
|
+
def source_configuration
|
40
|
+
SOURCE_CONFIGURATION
|
41
|
+
end
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
@@ -12,6 +12,9 @@ module ElasticBeans
|
|
12
12
|
class ConfigurationTemplate
|
13
13
|
# The solution stack used for a new application. Should not be hardcoded, but here we are.
|
14
14
|
SOLUTION_STACK_NAME = "64bit Amazon Linux 2016.09 v2.2.0 running Ruby 2.3 (Puma)"
|
15
|
+
# The source configuration for new configuration templates.
|
16
|
+
# Set to ElasticBeans::ConfigurationTemplate::Base to include all custom configuration that has already been performed.
|
17
|
+
SOURCE_CONFIGURATION = {template_name: "base"}
|
15
18
|
# :category: Internal
|
16
19
|
WORKER_TEMPLATE_NAME_PATTERN = /\Aworker-(?<queue>\w+)\z/
|
17
20
|
|
@@ -120,6 +123,7 @@ module ElasticBeans
|
|
120
123
|
application_name: application.name,
|
121
124
|
template_name: name,
|
122
125
|
solution_stack_name: SOLUTION_STACK_NAME,
|
126
|
+
source_configuration: source_configuration,
|
123
127
|
option_settings: option_settings,
|
124
128
|
)
|
125
129
|
end
|
@@ -135,12 +139,17 @@ module ElasticBeans
|
|
135
139
|
# :category: Internal
|
136
140
|
attr_reader :elastic_beanstalk
|
137
141
|
|
138
|
-
|
139
|
-
|
142
|
+
# Returns option settings that should be set on the template.
|
143
|
+
def build_option_settings(option_settings: [], **_)
|
144
|
+
option_settings
|
140
145
|
end
|
141
146
|
|
142
|
-
|
143
|
-
|
147
|
+
# Returns option settings that should be removed from the template.
|
148
|
+
# Will not remove settings that beans has defaults for, even if they aren't being changed right now.
|
149
|
+
def build_options_to_remove(options_to_remove: [], **_)
|
150
|
+
options_to_remove.reject { |setting|
|
151
|
+
option_settings.any? { |new_setting| new_setting[:namespace] == setting[:namespace] && new_setting[:option_name] == setting[:option_name] }
|
152
|
+
}
|
144
153
|
end
|
145
154
|
|
146
155
|
def configuration_settings_description(template_name = name)
|
@@ -181,6 +190,10 @@ module ElasticBeans
|
|
181
190
|
retry
|
182
191
|
end
|
183
192
|
|
193
|
+
def source_configuration
|
194
|
+
SOURCE_CONFIGURATION
|
195
|
+
end
|
196
|
+
|
184
197
|
def template_option_setting(
|
185
198
|
template: configuration_settings_description,
|
186
199
|
environment: environment_configuration_settings_description,
|
@@ -188,13 +201,21 @@ module ElasticBeans
|
|
188
201
|
option_name:,
|
189
202
|
default: nil,
|
190
203
|
override: nil,
|
191
|
-
allow_blank: true
|
204
|
+
allow_blank: true,
|
205
|
+
new_settings:
|
192
206
|
)
|
193
207
|
option_setting = {namespace: namespace, option_name: option_name, value: default}
|
194
208
|
if override
|
195
209
|
return option_setting.merge!(value: override)
|
196
210
|
end
|
197
211
|
|
212
|
+
new_setting = new_settings.find { |setting|
|
213
|
+
setting[:namespace] == namespace && setting[:option_name] == option_name
|
214
|
+
}
|
215
|
+
if new_setting
|
216
|
+
return new_setting
|
217
|
+
end
|
218
|
+
|
198
219
|
existing_settings = []
|
199
220
|
if environment
|
200
221
|
# Persist changes made directly to the environment from the AWS console UI
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastic_beans
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0.alpha1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Stegman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -250,9 +250,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
250
250
|
version: '0'
|
251
251
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
252
252
|
requirements:
|
253
|
-
- - "
|
253
|
+
- - ">"
|
254
254
|
- !ruby/object:Gem::Version
|
255
|
-
version:
|
255
|
+
version: 1.3.1
|
256
256
|
requirements: []
|
257
257
|
rubyforge_project:
|
258
258
|
rubygems_version: 2.6.11
|