easy_eb 0.2.0 → 0.3.0

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 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