easy_eb 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e88dd48e8beca6807ae1c0fe0c71bcc066d753c32e13b688855b2f43f84c7b9
4
- data.tar.gz: 590e3505829161464449c23785b8f491f0cf8dc64b1613311d19fecbad67cae4
3
+ metadata.gz: de397e90eac0d556add92272f97f6a114bc7e672969965ba3bf1b01bd043f928
4
+ data.tar.gz: dbfb95e0c53d3e3cf9186eae8c1ce3c771d75307ebbfee00e7084e0ce46a52c3
5
5
  SHA512:
6
- metadata.gz: 9c862c6cb7d703f1c823577558862b1f57bff8fe3d86511be013fc3e2077aa4675c25f0f911db1336197df9b87501b350fb2915a137744e4c81661107a584cc2
7
- data.tar.gz: 984b21ae1ac2296e84bb2f1a3507e0fe55c7acc4438645708e0ed214efa05c80f4acf3150478465119caca9e4884f0acb16b36465db8bb486a98e7490e253046
6
+ metadata.gz: 9c3f9969320c8983f85f28361122d96eb07fc3539be7e98b7f1ee5e060774cde047958b02eae06e8a7cf81af68ea23a9f7067a9f7864fa419a9ebde37e1d0a56
7
+ data.tar.gz: 3d60ad3a820cb8564c806ace141bf5ea4cdc670a4043a9618cb62290935a9d0ca4f2ad22ffddeb59259b4d3f37c8c1fba200c37e11f9a234adb4cb20534079d7
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- easy_eb (0.2.0)
4
+ easy_eb (0.3.0)
5
5
  thor
6
6
 
7
7
  GEM
data/lib/easy_eb/cli.rb CHANGED
@@ -4,22 +4,31 @@ module EasyEb
4
4
  class CLI < Thor
5
5
  desc "create-environment TARGET [--slug SLUG]", "Creates an EB environment for the target stack (e.g. staging or production) with a unique slug appended"
6
6
  option :slug, type: :string
7
+ option :region, type: :string
7
8
  def create_environment(target)
8
9
  EasyEb::Environment.create!(target: target, **options.transform_keys(&:to_sym))
9
10
  end
10
11
 
12
+ desc "dns ENVIRONMENT DOMAIN", "Updates or creates a DNS record to point at the specified environment"
13
+ option :slug, type: :string
14
+ option :region, type: :string
15
+ def dns(environment, domain)
16
+ EasyEb::Dns.create!(environment: environment, domain: domain, **options.transform_keys(&:to_sym))
17
+ end
18
+
19
+ desc "install", "Install essential eb helpers to be checked into your repo"
20
+ def install
21
+ EasyEb::Generators::Install.start
22
+ end
23
+
11
24
  desc "ssh [--environment ENVIRONMENT] [COMMAND]", "Intelligent ssh for elastic beanstalk"
12
25
  option :environment, type: :string
26
+ option :region, type: :string
13
27
  option :ssh, type: :string
14
28
  option :eb_flags, type: :string
15
29
  option :env_command, type: :string
16
30
  def ssh(*command)
17
31
  EasyEb::Ssh.start!(command: command.any? ? command.join(" ") : nil, **options.transform_keys(&:to_sym))
18
32
  end
19
-
20
- desc "install", "Install essential eb helpers to be checked into your repo"
21
- def install
22
- EasyEb::Generators::Install.start
23
- end
24
33
  end
25
34
  end
@@ -0,0 +1,53 @@
1
+ require "json"
2
+
3
+ module EasyEb
4
+ # Data sourced from https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html
5
+ HOSTED_ZONES_BY_REGION = {
6
+ "us-east-1" => "Z117KPS5GTRQ2G",
7
+ "us-east-2" => "Z14LCN19Q5QHIC",
8
+ "us-west-1" => "Z1LQECGX5PH1X",
9
+ "us-west-2" => "Z38NKT9BP95V3O",
10
+ "eu-west-2" => "Z1GKAAAUGATPF1"
11
+ }
12
+
13
+ class Dns
14
+ def self.create!(environment:, domain:, region: nil)
15
+ root_domain = /(?<root>\w+\.\w+)\.?$/.match(domain)&.then { |results| results[:root] }
16
+ raise "Must supply valid domain name." unless root_domain
17
+
18
+ region_flag = region && " --region #{region}"
19
+
20
+ puts hosted_zones = JSON.parse(`aws route53 list-hosted-zones`)
21
+ hosted_zone = hosted_zones.fetch("HostedZones").find { |zone| zone.fetch("Name").start_with?(root_domain) }
22
+ hosted_zone_id = hosted_zone["Id"]
23
+
24
+ puts environments = JSON.parse(`aws#{region_flag} elasticbeanstalk describe-environments --environment-names #{environment}`)
25
+ environment_cname = environments.dig("Environments", 0, "CNAME")
26
+ environment_region = /(?<region>[1-9a-z-]+).elasticbeanstalk.com$/.match(environment_cname)[:region]
27
+
28
+ change_batch = {
29
+ Comment: "Point #{domain} to Elastic Beanstalk Environment #{environment}",
30
+ Changes: [
31
+ {
32
+ Action: :UPSERT,
33
+ ResourceRecordSet: {
34
+ Name: domain,
35
+ Type: :A,
36
+ AliasTarget: {
37
+ HostedZoneId: HOSTED_ZONES_BY_REGION[environment_region],
38
+ DNSName: environment_cname,
39
+ EvaluateTargetHealth: false
40
+ }
41
+ }
42
+ }
43
+ ]
44
+ }
45
+
46
+ system(
47
+ "aws route53 change-resource-record-sets --hosted-zone-id #{hosted_zone_id} --change-batch '#{change_batch.to_json}'".tap do |command|
48
+ puts "Running… \"#{command}\""
49
+ end
50
+ )
51
+ end
52
+ end
53
+ end
@@ -5,7 +5,8 @@ module EasyEb
5
5
  class Environment
6
6
  SLUGS = JSON.parse(File.read("#{__dir__}/firstNames.json")).fetch("firstNames")
7
7
 
8
- def self.create!(target:, slug: SLUGS.sample)
8
+ def self.create!(target:, region: nil, slug: SLUGS.sample)
9
+ region_flag = region && " --region #{region}"
9
10
  eb_config = YAML.safe_load(File.read(".elasticbeanstalk/config.yml"))
10
11
  application_name = eb_config.dig("global", "application_name")
11
12
 
@@ -17,11 +18,11 @@ module EasyEb
17
18
  raise "Failed to create a valid Elastic Beanstalk environment with name '#{environment_name}'. Must be 40 characters or less."
18
19
  end
19
20
 
20
- system("eb config put #{target}", exception: true)
21
- system("eb create #{environment_name} --cfg #{target}", exception: true)
21
+ system("eb config put #{target}#{region_flag}", exception: true)
22
+ system("eb create #{environment_name} --cfg #{target}#{region_flag}", exception: true)
22
23
 
23
24
  puts("Success! Now you may want to run elastic beanstalk commands like this:")
24
- puts("eb deploy #{environment_name}")
25
+ puts("eb deploy #{environment_name}#{region_flag}")
25
26
  end
26
27
  end
27
28
  end
data/lib/easy_eb/ssh.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module EasyEb
2
2
  class Ssh
3
- def self.start!(environment: nil, command: nil, ssh: nil, eb_flags: nil, env_command: "bin/ebenv")
3
+ def self.start!(environment: nil, command: nil, ssh: nil, eb_flags: nil, env_command: "bin/ebenv", region: nil)
4
4
  bash_args = command && "-c \\\"#{env_command} #{command}\\\""
5
5
  tty_flag = command && "-t"
6
6
  ssh_flag = ssh && "-e #{ssh}"
@@ -10,6 +10,7 @@ module EasyEb
10
10
  ].compact.join(" ")
11
11
 
12
12
  args = [
13
+ region && "--region #{region}",
13
14
  eb_flags,
14
15
  environment,
15
16
  ssh_flag,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EasyEb
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/easy_eb.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "easy_eb/dns"
3
4
  require_relative "easy_eb/environment"
4
5
  require_relative "easy_eb/generators/install"
5
6
  require_relative "easy_eb/ssh"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_eb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaleb Lape
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-11 00:00:00.000000000 Z
11
+ date: 2022-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -45,6 +45,7 @@ files:
45
45
  - exe/ezeb
46
46
  - lib/easy_eb.rb
47
47
  - lib/easy_eb/cli.rb
48
+ - lib/easy_eb/dns.rb
48
49
  - lib/easy_eb/environment.rb
49
50
  - lib/easy_eb/firstNames.json
50
51
  - lib/easy_eb/generators/install.rb