terra_boi 0.0.13 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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