terra_boi 0.0.13 → 1.0.2

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +85 -156
  3. data/lib/generators/extensions.rb +5 -5
  4. data/lib/generators/terra_boi/boilerplate_generator.rb +39 -32
  5. data/lib/generators/terra_boi/dockerfile_generator.rb +19 -18
  6. data/lib/generators/terra_boi/host_initializer_generator.rb +18 -18
  7. data/lib/generators/terra_boi/templates/Dockerfile.erb +4 -23
  8. data/lib/generators/terra_boi/templates/cert/main.tf.erb +32 -0
  9. data/lib/generators/terra_boi/templates/cert/var.tf.erb +15 -0
  10. data/lib/generators/terra_boi/templates/data_storage_config.erb +7 -7
  11. data/lib/generators/terra_boi/templates/ecr/ecs_role.tf.erb +41 -0
  12. data/lib/generators/terra_boi/templates/ecr/main.tf.erb +26 -0
  13. data/lib/generators/terra_boi/templates/ecr/output.tf.erb +11 -0
  14. data/lib/generators/terra_boi/templates/ecr/var.tf.erb +15 -0
  15. data/lib/generators/terra_boi/templates/{data_main.erb → env/data/main.tf.erb} +2 -2
  16. data/lib/generators/terra_boi/templates/{data_output.erb → env/data/output.tf.erb} +1 -1
  17. data/lib/generators/terra_boi/templates/env/ecs_cluster/ecs_cluster.tf.erb +24 -0
  18. data/lib/generators/terra_boi/templates/env/head_worker/ecs.tf.erb +55 -0
  19. data/lib/generators/terra_boi/templates/env/web_app/ecs.tf.erb +59 -0
  20. data/lib/generators/terra_boi/templates/lib/scripts/push_to_ecr.sh.erb +25 -0
  21. data/lib/generators/terra_boi/templates/lib/scripts/update_service_pull_from_ecr.sh.erb +18 -0
  22. data/lib/generators/terra_boi/templates/lib/task_templates/head_worker.json.erb +61 -0
  23. data/lib/generators/terra_boi/templates/lib/task_templates/web_app.json.erb +58 -0
  24. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_cluster/main.tf.erb +12 -0
  25. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_cluster/var.tf.erb +20 -0
  26. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/ecs_role.tf.erb +7 -0
  27. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/load_balancer.tf.erb +92 -0
  28. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/main.tf.erb +134 -0
  29. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/output.tf.erb +11 -0
  30. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/var.tf.erb +63 -0
  31. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/ecs_role.tf.erb +7 -0
  32. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/main.tf.erb +120 -0
  33. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/output.tf.erb +7 -0
  34. data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/var.tf.erb +57 -0
  35. data/lib/generators/terra_boi/templates/state_main.erb +1 -1
  36. data/lib/generators/terra_boi/tf_cert_generator.rb +28 -0
  37. data/lib/generators/terra_boi/tf_ecr_generator.rb +28 -0
  38. data/lib/generators/terra_boi/tf_env_generator.rb +54 -0
  39. data/lib/generators/terra_boi/tf_lib_generator.rb +57 -0
  40. data/lib/generators/terra_boi/tf_state_generator.rb +24 -0
  41. data/lib/tasks/terra_boi_tasks.rake +274 -4
  42. data/lib/terra_boi/railtie.rb +5 -2
  43. data/lib/terra_boi/version.rb +1 -1
  44. metadata +60 -32
  45. data/lib/generators/terra_boi/data_generator.rb +0 -38
  46. data/lib/generators/terra_boi/master_worker_generator.rb +0 -54
  47. data/lib/generators/terra_boi/packer_generator.rb +0 -26
  48. data/lib/generators/terra_boi/state_generator.rb +0 -25
  49. data/lib/generators/terra_boi/templates/master_worker_main.erb +0 -26
  50. data/lib/generators/terra_boi/templates/master_worker_output.erb +0 -14
  51. data/lib/generators/terra_boi/templates/master_worker_start_script.erb +0 -12
  52. data/lib/generators/terra_boi/templates/master_worker_user_data.erb +0 -27
  53. data/lib/generators/terra_boi/templates/packer_ami_build.erb +0 -27
  54. data/lib/generators/terra_boi/templates/packer_application.erb +0 -49
  55. data/lib/generators/terra_boi/templates/web_servers_main.erb +0 -31
  56. data/lib/generators/terra_boi/templates/web_servers_output.erb +0 -14
  57. data/lib/generators/terra_boi/templates/web_servers_user_data.erb +0 -29
  58. data/lib/generators/terra_boi/web_servers_generator.rb +0 -48
@@ -2,26 +2,26 @@ require "generators/extensions"
2
2
 
3
3
  module TerraBoi
4
4
  class HostInitializerGenerator < Rails::Generators::Base
5
- attr_accessor :application_name, :class_options
6
- class_option :domain_name, type: :string
7
- source_root File.expand_path('templates', __dir__)
5
+ attr_accessor :application_name, :class_options
6
+ class_option :domain_name, type: :string, default: 'example.com', aliases: ["d"]
7
+ source_root File.expand_path('templates', __dir__)
8
8
 
9
- desc (<<-EOF
10
- Generate host initializer rails file
11
-
12
- To execute, run rails generate terra_boi:host_initializer --domain_name example.com
13
- EOF
14
- .gsub(/\t/, '')
15
- )
9
+ desc (<<-EOF
10
+ Generate host initializer rails file
11
+
12
+ To execute, run rails generate terra_boi:host_initializer --domain_name example.com
13
+ EOF
14
+ .gsub(/\t/, '')
15
+ )
16
16
 
17
- def init
18
- # defined in lib/generators/extensions
19
- self.application_name = generate_application_name
20
- self.class_options = options
21
- end
17
+ def init
18
+ # defined in lib/generators/extensions
19
+ self.application_name = generate_application_name
20
+ self.class_options = options
21
+ end
22
22
 
23
- def create_host_initializer_file
24
- template "host_initializer.erb", "config/initializers/hosts.rb"
25
- end
23
+ def create_host_initializer_file
24
+ template "host_initializer.erb", "config/initializers/hosts.rb"
25
+ end
26
26
  end
27
27
  end
@@ -1,26 +1,7 @@
1
1
  FROM ruby:<%= class_options[:ruby_version] %>
2
2
 
3
- # replace shell with bash so we can source files
4
- RUN rm /bin/sh && ln -s /bin/bash /bin/sh
5
-
6
- RUN apt-get update -qq && apt-get install -y build-essential && apt-get install -y cron
7
-
8
- # # for postgres
9
- # RUN apt-get install -y libpq-dev
10
-
11
- # # for nokogiri
12
- # RUN apt-get install -y libxml2-dev libxslt1-dev
13
-
14
- # # for capybara-webkit
15
- # RUN apt-get install -y libqtwebkit4 libqt4-dev xvfb
16
-
17
- # for a JS runtime
18
- RUN curl -sL https://deb.nodesource.com/setup_11.x | bash -
19
- RUN apt-get install -y nodejs
20
-
21
- RUN node -v
22
- RUN npm -v
23
-
3
+ RUN apt-get update -qq && apt-get install -y npm build-essential cron
4
+ RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && apt-get install -y nodejs
24
5
  RUN npm install yarn -g
25
6
 
26
7
  ENV APP_HOME /<%= application_name %>
@@ -29,13 +10,13 @@ WORKDIR $APP_HOME
29
10
 
30
11
  ADD Gemfile* $APP_HOME/
31
12
  RUN bundle install
13
+ RUN yarn install --check-files
32
14
 
33
15
  ADD . $APP_HOME
34
16
 
35
- RUN yarn install --check-files
36
17
  RUN RAILS_ENV=production rails assets:precompile
37
18
  RUN service cron start
38
19
 
39
20
  EXPOSE 3000
40
21
 
41
- ENTRYPOINT bin/rails server --port 3000 -b 0.0.0.0
22
+ ENTRYPOINT rake db:migrate && bin/rails server --port 3000 -b 0.0.0.0
@@ -0,0 +1,32 @@
1
+ provider "aws" {
2
+ version = "~> 2.0"
3
+ region = var.region
4
+ }
5
+
6
+ # ---------------------------------------------------------------------------------------------------------------------
7
+ # 1. STATE
8
+ # ---------------------------------------------------------------------------------------------------------------------
9
+
10
+ terraform {
11
+ backend "s3" {
12
+ bucket = "<%= application_name %>-terraform-state-storage"
13
+ key = "terraform/terra-boi-cert"
14
+ region = "us-east-2"
15
+ dynamodb_table = "<%= application_name %>-terraform-state-lock"
16
+ encrypt = true
17
+ }
18
+ }
19
+
20
+ # ---------------------------------------------------------------------------------------------------------------------
21
+ # 2. CERT
22
+ # ---------------------------------------------------------------------------------------------------------------------
23
+
24
+ resource "aws_acm_certificate_validation" "cert" {
25
+ certificate_arn = aws_acm_certificate.cert.arn
26
+ }
27
+
28
+ resource "aws_acm_certificate" "cert" {
29
+ domain_name = "*.${var.domain_name}"
30
+ subject_alternative_names = ["${var.domain_name}"]
31
+ validation_method = "DNS"
32
+ }
@@ -0,0 +1,15 @@
1
+ # -----------------------------
2
+ # 1. GENERAL
3
+ # -----------------------------
4
+
5
+ # Optional
6
+
7
+ variable "region" {
8
+ type = string
9
+ default = "us-east-2"
10
+ }
11
+
12
+ variable "domain_name" {
13
+ type = string
14
+ default = "<%= class_options[:domain_name] %>"
15
+ }
@@ -1,31 +1,31 @@
1
1
  test:
2
2
  service: Disk
3
- root: <%%= Rails.root.join("tmp/storage") %>
3
+ root: <%= Rails.root.join("tmp/storage") %>
4
4
 
5
5
  local:
6
6
  service: Disk
7
- root: <%%= Rails.root.join("storage") %>
7
+ root: <%= Rails.root.join("storage") %>
8
8
 
9
9
  # Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
10
10
  amazon:
11
11
  service: S3
12
- access_key_id: <%%= ENV["AWS_ACCESS_KEY_ID"] %>
13
- secret_access_key: <%%= ENV["AWS_SECRET_ACCESS_KEY"] %>
12
+ access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
13
+ secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
14
14
  region: us-east-2
15
- bucket: <%= application_name %>-<%%= ENV["INFRASTRUCTURE_ENV"] %>-web-assets
15
+ bucket: testsweet-<%= ENV["INFRASTRUCTURE_ENV"] %>-web-assets-assets
16
16
 
17
17
  # Remember not to checkin your GCS keyfile to a repository
18
18
  # google:
19
19
  # service: GCS
20
20
  # project: your_project
21
- # credentials: <%%= Rails.root.join("path/to/gcs.keyfile") %>
21
+ # credentials: <%= Rails.root.join("path/to/gcs.keyfile") %>
22
22
  # bucket: your_own_bucket
23
23
 
24
24
  # Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key)
25
25
  # microsoft:
26
26
  # service: AzureStorage
27
27
  # storage_account_name: your_account_name
28
- # storage_access_key: <%%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
28
+ # storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
29
29
  # container: your_container_name
30
30
 
31
31
  # mirror:
@@ -0,0 +1,41 @@
1
+ # ---------------------------------------------------------------------------------------------------------------------
2
+ # 1. ECS IAM ROLE
3
+ # ---------------------------------------------------------------------------------------------------------------------
4
+
5
+ resource "aws_iam_role_policy" "ecs_execution_role" {
6
+ name = "ecs_${var.app_name}_policy"
7
+ role = aws_iam_role.ecs_execution_role.id
8
+
9
+ policy = <<-EOF
10
+ {
11
+ "Version": "2012-10-17",
12
+ "Statement": [
13
+ {
14
+ "Effect": "Allow",
15
+ "Action": "*",
16
+ "Resource": "*"
17
+ }
18
+ ]
19
+ }
20
+ EOF
21
+ }
22
+
23
+ resource "aws_iam_role" "ecs_execution_role" {
24
+ name = "ecs_${var.app_name}_execution_role"
25
+
26
+ assume_role_policy = <<-EOF
27
+ {
28
+ "Version": "2012-10-17",
29
+ "Statement": [
30
+ {
31
+ "Action": "sts:AssumeRole",
32
+ "Principal": {
33
+ "Service": "ecs-tasks.amazonaws.com"
34
+ },
35
+ "Effect": "Allow",
36
+ "Sid": ""
37
+ }
38
+ ]
39
+ }
40
+ EOF
41
+ }
@@ -0,0 +1,26 @@
1
+ provider "aws" {
2
+ version = "~> 2.0"
3
+ region = var.region
4
+ }
5
+
6
+ # ---------------------------------------------------------------------------------------------------------------------
7
+ # 1. STATE
8
+ # ---------------------------------------------------------------------------------------------------------------------
9
+
10
+ terraform {
11
+ backend "s3" {
12
+ bucket = "<%= application_name %>-terraform-state-storage"
13
+ key = "terraform/<%= config[:env] %>-state/terra-boi-ecr"
14
+ region = "us-east-2"
15
+ dynamodb_table = "<%= application_name %>-terraform-state-lock"
16
+ encrypt = true
17
+ }
18
+ }
19
+
20
+ # --------------------------------------
21
+ # 2. ECR Repository
22
+ # --------------------------------------
23
+
24
+ resource "aws_ecr_repository" "ecr_repo" {
25
+ name = "${var.app_name}-ecr-repo"
26
+ }
@@ -0,0 +1,11 @@
1
+ output "aws_region" {
2
+ value = var.region
3
+ }
4
+
5
+ output "ecr_repo_url" {
6
+ value = aws_ecr_repository.ecr_repo.repository_url
7
+ }
8
+
9
+ output "ecr_repo_name" {
10
+ value = aws_ecr_repository.ecr_repo.name
11
+ }
@@ -0,0 +1,15 @@
1
+ # -----------------------------
2
+ # 1. GENERAL
3
+ # -----------------------------
4
+
5
+ # Optional
6
+
7
+ variable "region" {
8
+ type = string
9
+ default = "us-east-2"
10
+ }
11
+
12
+ variable "app_name" {
13
+ type = string
14
+ default = "<%= application_name %>"
15
+ }
@@ -5,7 +5,7 @@
5
5
  terraform {
6
6
  backend "s3" {
7
7
  bucket = "<%= application_name %>-terraform-state-storage"
8
- key = "terraform/<%= config[:env] %>-state/data"
8
+ key = "terraform/<%= config[:env] %>-state/terra-boi-data"
9
9
  region = "us-east-2"
10
10
  dynamodb_table = "<%= application_name %>-terraform-state-lock"
11
11
  encrypt = true
@@ -20,7 +20,7 @@ variable "db_username" {}
20
20
  variable "db_password" {}
21
21
 
22
22
  module "db_and_s3" {
23
- source = "github.com/charliereese/terraform_modules//data?ref=v0.0.24"
23
+ source = "github.com/charliereese/terraform_modules//data?ref=v0.0.27"
24
24
 
25
25
  env = "<%= config[:env] %>"
26
26
  app_name = "<%= application_name %>"
@@ -21,4 +21,4 @@ output "endpoint" {
21
21
  output "db_name" {
22
22
  value = module.db_and_s3.db_name
23
23
  description = "The name of the database"
24
- }
24
+ }
@@ -0,0 +1,24 @@
1
+ # --------------------------------------
2
+ # 1. STATE
3
+ # --------------------------------------
4
+
5
+ terraform {
6
+ backend "s3" {
7
+ bucket = "<%= application_name %>-terraform-state-storage"
8
+ key = "terraform/<%= config[:env] %>-state/terra-boi-ecs-cluster"
9
+ region = "us-east-2"
10
+ dynamodb_table = "<%= application_name %>-terraform-state-lock"
11
+ encrypt = true
12
+ }
13
+ }
14
+
15
+ # --------------------------------------
16
+ # 2. Cluster
17
+ # --------------------------------------
18
+
19
+ module "ecs_cluster" {
20
+ source = "../../lib/terraform_modules/ecs_cluster"
21
+
22
+ app_name = "<%= application_name %>"
23
+ environment = "<%= config[:env] %>"
24
+ }
@@ -0,0 +1,55 @@
1
+ # --------------------------------------
2
+ # 1. STATE
3
+ # --------------------------------------
4
+
5
+ terraform {
6
+ backend "s3" {
7
+ bucket = "<%= application_name %>-terraform-state-storage"
8
+ key = "terraform/<%= config[:env] %>-state/terra-boi-ecs-service-head-worker"
9
+ region = "us-east-2"
10
+ dynamodb_table = "<%= application_name %>-terraform-state-lock"
11
+ encrypt = true
12
+ }
13
+ }
14
+
15
+ # --------------------------------------
16
+ # 2. Cluster
17
+ # --------------------------------------
18
+
19
+ module "head_worker" {
20
+ source = "../../lib/terraform_modules/ecs_worker"
21
+
22
+ app_name = "<%= application_name %>"
23
+ environment = "<%= config[:env] %>"
24
+ app_type = "head_worker"
25
+ template_filename = "head_worker.json"
26
+ db_password = var.db_password
27
+ aws_access_key = var.aws_access_key
28
+ aws_secret_key = var.aws_secret_key
29
+ worker_task = {
30
+ memory = 512
31
+ cpu = 256
32
+ desired_count = 1 # Should always be 1. If increased, cron jobs will run multiple times. If you need more workers, create a new fargate task for your child_worker (using the same ecs_worker source) with the entrypoint ["sh", "-c", "rake db:migrate && rake jobs:work"]
33
+ }
34
+ }
35
+
36
+ output "ecs_service_name" {
37
+ value = module.head_worker.ecs_service_name
38
+ }
39
+
40
+ output "ecs_cluster_name" {
41
+ value = module.head_worker.ecs_cluster_name
42
+ }
43
+
44
+ variable "db_password" {
45
+ description = "The password for the database"
46
+ type = string
47
+ }
48
+
49
+ variable "aws_access_key" {
50
+ type = string
51
+ }
52
+
53
+ variable "aws_secret_key" {
54
+ type = string
55
+ }
@@ -0,0 +1,59 @@
1
+ # --------------------------------------
2
+ # 1. STATE
3
+ # --------------------------------------
4
+
5
+ terraform {
6
+ backend "s3" {
7
+ bucket = "<%= application_name %>-terraform-state-storage"
8
+ key = "terraform/<%= config[:env] %>-state/terra-boi-ecs-service-web-app"
9
+ region = "us-east-2"
10
+ dynamodb_table = "<%= application_name %>-terraform-state-lock"
11
+ encrypt = true
12
+ }
13
+ }
14
+
15
+ # --------------------------------------
16
+ # 2. Cluster
17
+ # --------------------------------------
18
+
19
+ module "web_app" {
20
+ source = "../../lib/terraform_modules/ecs_web_app"
21
+
22
+ app_name = "<%= application_name %>"
23
+ environment = "<%= config[:env] %>"
24
+ app_type = "web_app"
25
+ db_password = var.db_password
26
+ aws_access_key = var.aws_access_key
27
+ aws_secret_key = var.aws_secret_key
28
+ web_app_task = {
29
+ memory = 512
30
+ cpu = 256
31
+ desired_count = 2
32
+ port = 3000
33
+ }
34
+ }
35
+
36
+ output "ecs_service_name" {
37
+ value = module.web_app.ecs_service_name
38
+ }
39
+
40
+ output "ecs_cluster_name" {
41
+ value = module.web_app.ecs_cluster_name
42
+ }
43
+
44
+ output "alb_dns" {
45
+ value = module.web_app.alb_dns
46
+ }
47
+
48
+ variable "db_password" {
49
+ description = "The password for the database"
50
+ type = string
51
+ }
52
+
53
+ variable "aws_access_key" {
54
+ type = string
55
+ }
56
+
57
+ variable "aws_secret_key" {
58
+ type = string
59
+ }
@@ -0,0 +1,25 @@
1
+ # Requires AWS cli >= v2.x.x
2
+ # https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
3
+
4
+ SCRIPT_DIR=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
5
+ cd $SCRIPT_DIR/../../ecr
6
+
7
+ # Retrieve an authentication token and authenticate your Docker client to your registry.
8
+ AWS_REGION=$(terraform output aws_region)
9
+ AWS_ECR_REPO_URL=$(terraform output ecr_repo_url)
10
+ AWS_ECR_REPO_NAME=$(terraform output ecr_repo_name)
11
+ aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REPO_URL
12
+
13
+ # Build your Docker image using the following command
14
+ DOCKERFILE_PATH="$SCRIPT_DIR/../../../."
15
+ if ! docker build -t $AWS_ECR_REPO_NAME $DOCKERFILE_PATH; then
16
+ echo "TERRA_BOI | Command failed. Pruning Docker memory then retrying!"
17
+ echo "TERRA_BOI | Pruning may take a couple minutes..."
18
+ docker system prune -a && docker build -t $AWS_ECR_REPO_NAME $DOCKERFILE_PATH
19
+ fi
20
+
21
+ # After the build completes, tag your image so you can push the image to this repository:
22
+ docker tag $AWS_ECR_REPO_NAME:latest $AWS_ECR_REPO_URL:latest
23
+
24
+ # Run the following command to push this image to your newly created AWS repository:
25
+ docker push $AWS_ECR_REPO_URL:latest