terra_boi 0.0.15 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +83 -158
- data/lib/generators/extensions.rb +5 -5
- data/lib/generators/terra_boi/boilerplate_generator.rb +39 -32
- data/lib/generators/terra_boi/dockerfile_generator.rb +19 -18
- data/lib/generators/terra_boi/host_initializer_generator.rb +18 -18
- data/lib/generators/terra_boi/templates/Dockerfile.erb +4 -23
- data/lib/generators/terra_boi/templates/cert/main.tf.erb +32 -0
- data/lib/generators/terra_boi/templates/cert/var.tf.erb +15 -0
- data/lib/generators/terra_boi/templates/data_storage_config.erb +7 -7
- data/lib/generators/terra_boi/templates/ecr/ecs_role.tf.erb +41 -0
- data/lib/generators/terra_boi/templates/ecr/main.tf.erb +26 -0
- data/lib/generators/terra_boi/templates/ecr/output.tf.erb +11 -0
- data/lib/generators/terra_boi/templates/ecr/var.tf.erb +15 -0
- data/lib/generators/terra_boi/templates/{data_main.erb → env/data/main.tf.erb} +2 -2
- data/lib/generators/terra_boi/templates/{data_output.erb → env/data/output.tf.erb} +1 -1
- data/lib/generators/terra_boi/templates/env/ecs_cluster/ecs_cluster.tf.erb +24 -0
- data/lib/generators/terra_boi/templates/env/head_worker/ecs.tf.erb +55 -0
- data/lib/generators/terra_boi/templates/env/web_app/ecs.tf.erb +59 -0
- data/lib/generators/terra_boi/templates/lib/scripts/push_to_ecr.sh.erb +21 -0
- data/lib/generators/terra_boi/templates/lib/scripts/update_service_pull_from_ecr.sh.erb +18 -0
- data/lib/generators/terra_boi/templates/lib/task_templates/head_worker.json.erb +61 -0
- data/lib/generators/terra_boi/templates/lib/task_templates/web_app.json.erb +58 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_cluster/main.tf.erb +12 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_cluster/var.tf.erb +20 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/ecs_role.tf.erb +7 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/load_balancer.tf.erb +92 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/main.tf.erb +134 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/output.tf.erb +11 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_web_app/var.tf.erb +63 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/ecs_role.tf.erb +7 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/main.tf.erb +120 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/output.tf.erb +7 -0
- data/lib/generators/terra_boi/templates/lib/terraform_modules/ecs_worker/var.tf.erb +57 -0
- data/lib/generators/terra_boi/tf_cert_generator.rb +28 -0
- data/lib/generators/terra_boi/tf_ecr_generator.rb +28 -0
- data/lib/generators/terra_boi/tf_env_generator.rb +54 -0
- data/lib/generators/terra_boi/tf_lib_generator.rb +57 -0
- data/lib/generators/terra_boi/tf_state_generator.rb +24 -0
- data/lib/tasks/terra_boi_tasks.rake +280 -4
- data/lib/terra_boi/railtie.rb +5 -2
- data/lib/terra_boi/version.rb +1 -1
- metadata +56 -28
- data/lib/generators/terra_boi/data_generator.rb +0 -38
- data/lib/generators/terra_boi/master_worker_generator.rb +0 -54
- data/lib/generators/terra_boi/packer_generator.rb +0 -26
- data/lib/generators/terra_boi/state_generator.rb +0 -25
- data/lib/generators/terra_boi/templates/master_worker_main.erb +0 -26
- data/lib/generators/terra_boi/templates/master_worker_output.erb +0 -14
- data/lib/generators/terra_boi/templates/master_worker_start_script.erb +0 -12
- data/lib/generators/terra_boi/templates/master_worker_user_data.erb +0 -27
- data/lib/generators/terra_boi/templates/packer_ami_build.erb +0 -27
- data/lib/generators/terra_boi/templates/packer_application.erb +0 -49
- data/lib/generators/terra_boi/templates/web_servers_main.erb +0 -31
- data/lib/generators/terra_boi/templates/web_servers_output.erb +0 -14
- data/lib/generators/terra_boi/templates/web_servers_user_data.erb +0 -29
- 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
|
-
|
6
|
-
|
7
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
4
|
-
RUN
|
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:
|
3
|
+
root: <%= Rails.root.join("tmp/storage") %>
|
4
4
|
|
5
5
|
local:
|
6
6
|
service: Disk
|
7
|
-
root:
|
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:
|
13
|
-
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:
|
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:
|
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:
|
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,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.
|
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 %>"
|
@@ -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,21 @@
|
|
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
|
+
docker build -t $AWS_ECR_REPO_NAME $DOCKERFILE_PATH
|
16
|
+
|
17
|
+
# After the build completes, tag your image so you can push the image to this repository:
|
18
|
+
docker tag $AWS_ECR_REPO_NAME:latest $AWS_ECR_REPO_URL:latest
|
19
|
+
|
20
|
+
# Run the following command to push this image to your newly created AWS repository:
|
21
|
+
docker push $AWS_ECR_REPO_URL:latest
|