From 160adcf033ec89b087923a2d650b3721cb635153 Mon Sep 17 00:00:00 2001 From: maxim Date: Tue, 26 Oct 2021 15:59:33 +0600 Subject: [PATCH 1/4] fix: fix aws-iam-user-with-policy terraform module --- .../aws-iam-user-with-policy/iam-user.tf | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/terraform/modules/aws-iam-user-with-policy/iam-user.tf b/terraform/modules/aws-iam-user-with-policy/iam-user.tf index 76ce54ca..377b68fd 100644 --- a/terraform/modules/aws-iam-user-with-policy/iam-user.tf +++ b/terraform/modules/aws-iam-user-with-policy/iam-user.tf @@ -12,34 +12,3 @@ resource "aws_iam_user_policy" "this" { policy = var.policy } - -data "aws_iam_policy_document" "user_policy" { - - statement { - actions = [ - "s3:ListBucket", - "s3:GetBucketLocation", - "s3:ListBucketMultipartUploads", - "s3:ListBucketVersions" - ] - effect = "Allow" - resources = [ - for buckets in var.bucket_names : - "arn:aws:s3:::${buckets}"] - } - - statement { - actions = [ - "s3:GetObject", - "s3:PutObject", - "s3:DeleteObject", - "s3:AbortMultipartUpload", - "s3:ListMultipartUploadParts" - ] - effect = "Allow" - resources = [ - for buckets in var.bucket_names : - "arn:aws:s3:::${buckets}/${var.path}*"] - } -} - From a3daaea60dd0c0249a972ba9516700908680b67d Mon Sep 17 00:00:00 2001 From: maxim Date: Tue, 26 Oct 2021 16:04:58 +0600 Subject: [PATCH 2/4] refactor: delete unused examples --- README.md | 6 + terraform/layer1-aws/examples/aws-ecr.tf | 38 --- .../layer1-aws/examples/aws-eks-fargate.tf | 7 - .../layer1-aws/examples/aws-rds-postgresql.tf | 252 ----------------- terraform/layer1-aws/examples/aws-rds-wp.tf | 195 ------------- .../layer2-k8s/eks-kube-prometheus-stack.tf | 2 +- terraform/layer2-k8s/eks-loki-stack.tf | 2 +- .../layer2-k8s/examples/eks-apm-server.tf | 24 -- .../layer2-k8s/examples/eks-elasticsearch.tf | 25 -- .../examples/eks-elk-k8s-resources.tf | 107 ------- terraform/layer2-k8s/examples/eks-filebeat.tf | 20 -- .../examples/eks-k8s-resources-wp.tf | 40 --- terraform/layer2-k8s/examples/eks-kibana.tf | 53 ---- .../layer2-k8s/examples/eks-metricbeat.tf | 20 -- .../examples/eks-mysql-backup-wp.tf | 77 ----- .../layer2-k8s/examples/eks-oauth2-proxy.tf | 42 --- .../examples/eks-postgresql-backups.tf | 21 -- .../examples/eks-prometheus-mysql-exporter.tf | 20 -- .../eks-prometheus-postgresql-exporter.tf | 81 ------ .../templates/elastic/apm-values.yaml | 55 ---- .../elastic/elasticsearch-values.yaml | 77 ----- .../templates/elastic/filebeat-values.yaml | 51 ---- .../templates/elastic/kibana-values.yaml | 262 ------------------ .../templates/elastic/metricbeat-values.yaml | 110 -------- ...-values.tmpl => gitlab-runner-values.yaml} | 0 ...ack-values.tmpl => loki-stack-values.yaml} | 0 .../templates/mysql-backup-values.yaml | 19 -- .../templates/oauth2-proxy-values.yaml | 31 --- .../templates/postgresql-backups-values.tmpl | 43 --- .../postgresql-exporter-user-script.tmpl | 29 -- .../templates/prometheus-mysql-exporter.yaml | 15 - .../prometheus-postgresql-exporter.tmpl | 26 -- ...eus-values.tmpl => prometheus-values.yaml} | 0 33 files changed, 8 insertions(+), 1742 deletions(-) delete mode 100644 terraform/layer1-aws/examples/aws-ecr.tf delete mode 100644 terraform/layer1-aws/examples/aws-eks-fargate.tf delete mode 100644 terraform/layer1-aws/examples/aws-rds-postgresql.tf delete mode 100644 terraform/layer1-aws/examples/aws-rds-wp.tf delete mode 100644 terraform/layer2-k8s/examples/eks-apm-server.tf delete mode 100644 terraform/layer2-k8s/examples/eks-elasticsearch.tf delete mode 100644 terraform/layer2-k8s/examples/eks-elk-k8s-resources.tf delete mode 100644 terraform/layer2-k8s/examples/eks-filebeat.tf delete mode 100644 terraform/layer2-k8s/examples/eks-k8s-resources-wp.tf delete mode 100644 terraform/layer2-k8s/examples/eks-kibana.tf delete mode 100644 terraform/layer2-k8s/examples/eks-metricbeat.tf delete mode 100644 terraform/layer2-k8s/examples/eks-mysql-backup-wp.tf delete mode 100644 terraform/layer2-k8s/examples/eks-oauth2-proxy.tf delete mode 100644 terraform/layer2-k8s/examples/eks-postgresql-backups.tf delete mode 100644 terraform/layer2-k8s/examples/eks-prometheus-mysql-exporter.tf delete mode 100644 terraform/layer2-k8s/examples/eks-prometheus-postgresql-exporter.tf delete mode 100644 terraform/layer2-k8s/templates/elastic/apm-values.yaml delete mode 100644 terraform/layer2-k8s/templates/elastic/elasticsearch-values.yaml delete mode 100644 terraform/layer2-k8s/templates/elastic/filebeat-values.yaml delete mode 100644 terraform/layer2-k8s/templates/elastic/kibana-values.yaml delete mode 100644 terraform/layer2-k8s/templates/elastic/metricbeat-values.yaml rename terraform/layer2-k8s/templates/{gitlab-runner-values.tmpl => gitlab-runner-values.yaml} (100%) rename terraform/layer2-k8s/templates/{loki-stack-values.tmpl => loki-stack-values.yaml} (100%) delete mode 100644 terraform/layer2-k8s/templates/mysql-backup-values.yaml delete mode 100644 terraform/layer2-k8s/templates/oauth2-proxy-values.yaml delete mode 100644 terraform/layer2-k8s/templates/postgresql-backups-values.tmpl delete mode 100644 terraform/layer2-k8s/templates/postgresql-exporter-user-script.tmpl delete mode 100644 terraform/layer2-k8s/templates/prometheus-mysql-exporter.yaml delete mode 100644 terraform/layer2-k8s/templates/prometheus-postgresql-exporter.tmpl rename terraform/layer2-k8s/templates/{prometheus-values.tmpl => prometheus-values.yaml} (100%) diff --git a/README.md b/README.md index 7d331f62..8869a36d 100644 --- a/README.md +++ b/README.md @@ -469,6 +469,12 @@ Each layer has an `examples/` directory that contains working examples that expa This will allow you to expand your basic functionality by launching a monitoring system based on ELK or Prometheus Stack, etc. + +* If you want to deploy **`ELK stack`**, move `layer1-aws/examples/aws-s3-bucket-elastic-stack.tf` and `layer2-k8s/examples/eks-elk.tf` to the root of the layers. +* If you want to deploy **`Pritunl VPN`** server just move `layer1-aws/examples/aws-ec2-pritunl.tf` to the root of the layer. +* If you want to deploy **`Gitlab runner`** that runs workers as k8s pods (in EKS cluster), move `layer1-aws/examples/aws-s3-bucket-gitlab-runner-cache.tf` and `layer2-k8s/examples/eks-gitlab-runner.tf` to the root of the layers. +* If you want to deploy `Istio Operator` move `layer2-k8s/examples/eks-istio.tf` to the root of the layer. + ## TFSEC We use GitHub Actions and [tfsec](https://github.com/aquasecurity/tfsec) to check our terraform code using static analysis to spot potential security issues. However, we needed to skip some checks. The list of those checks is below: diff --git a/terraform/layer1-aws/examples/aws-ecr.tf b/terraform/layer1-aws/examples/aws-ecr.tf deleted file mode 100644 index 9fe4bb47..00000000 --- a/terraform/layer1-aws/examples/aws-ecr.tf +++ /dev/null @@ -1,38 +0,0 @@ -resource "aws_ecr_repository" "main" { - count = length(var.ecr_repos) - name = format("${local.name}/%s", var.ecr_repos[count.index]) - - image_scanning_configuration { - scan_on_push = true - } -} - -resource "aws_ecr_lifecycle_policy" "main" { - count = length(var.ecr_repos) - repository = aws_ecr_repository.main.*.name[count.index] - policy = <","repository": "s3_repository","config": {"ignore_unavailable": false,"include_global_state": false},"retention": {"expire_after": "${snapshot_retention_days}d","min_count": 5,"max_count": 50}}''' - image: appropriate/curl:latest - imagePullPolicy: IfNotPresent - env: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password - - name: delete-old-indicies - command: - - /bin/sh - - -c - - 'curl -X PUT -k -u $ELASTICSEARCH_USERNAME:$ELASTICSEARCH_PASSWORD https://elasticsearch-master:9200/_ilm/policy/delete_old_indicies -H ''Content-Type: application/json'' - -d ''{"policy": {"phases": {"hot": {"actions": {"set_priority": {"priority": 100 }}}, "delete": { "min_age": "${index_retention_days}d", "actions": {"delete": {} }}}}}''' - image: appropriate/curl:latest - imagePullPolicy: IfNotPresent - env: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password - - name: filebeat-template - command: - - /bin/sh - - -c - - 'curl -X PUT -k -u $ELASTICSEARCH_USERNAME:$ELASTICSEARCH_PASSWORD https://elasticsearch-master:9200/_template/filebeat?pretty -H ''Content-Type: application/json'' - -d ''{"index_patterns": ["filebeat-*"], "settings": {"number_of_shards": 1,"number_of_replicas": 1,"index.lifecycle.name": "delete_old_indicies" }}''' - image: appropriate/curl:latest - imagePullPolicy: IfNotPresent - env: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password - - name: apm-template - command: - - /bin/sh - - -c - - 'curl -X PUT -k -u $ELASTICSEARCH_USERNAME:$ELASTICSEARCH_PASSWORD https://elasticsearch-master:9200/_template/apm?pretty -H ''Content-Type: application/json'' - -d ''{"index_patterns": ["apm-*"], "settings": {"number_of_shards": 1,"number_of_replicas": 1,"index.lifecycle.name": "delete_old_indicies" }}''' - image: appropriate/curl:latest - imagePullPolicy: IfNotPresent - env: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password - - name: metricbeat-template - command: - - /bin/sh - - -c - - 'curl -X PUT -k -u $ELASTICSEARCH_USERNAME:$ELASTICSEARCH_PASSWORD https://elasticsearch-master:9200/_template/metricbeat?pretty -H ''Content-Type: application/json'' - -d ''{"index_patterns": ["metricbeat-*"], "settings": {"number_of_shards": 1,"number_of_replicas": 1,"index.lifecycle.name": "delete_old_indicies" }}''' - image: appropriate/curl:latest - imagePullPolicy: IfNotPresent - env: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password diff --git a/terraform/layer2-k8s/templates/elastic/metricbeat-values.yaml b/terraform/layer2-k8s/templates/elastic/metricbeat-values.yaml deleted file mode 100644 index a7145ac7..00000000 --- a/terraform/layer2-k8s/templates/elastic/metricbeat-values.yaml +++ /dev/null @@ -1,110 +0,0 @@ -daemonset: - extraEnvs: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password - # Allows you to add any config files in /usr/share/metricbeat - # such as metricbeat.yml for daemonset - metricbeatConfig: - metricbeat.yml: | - metricbeat.modules: - - module: kubernetes - metricsets: - - container - - node - - pod - - system - - volume - period: 10s - host: "$${NODE_NAME}" - hosts: ["https://$${NODE_NAME}:10250"] - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - ssl.verification_mode: "none" - # If using Red Hat OpenShift remove ssl.verification_mode entry and - # uncomment these settings: - #ssl.certificate_authorities: - #- /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt - processors: - - add_kubernetes_metadata: ~ - - module: kubernetes - enabled: true - metricsets: - - event - - module: system - period: 10s - metricsets: - - cpu - - load - - memory - - network - - process - - process_summary - processes: ['.*'] - process.include_top_n: - by_cpu: 5 - by_memory: 5 - - module: system - period: 1m - metricsets: - - filesystem - - fsstat - processors: - - drop_event.when.regexp: - system.filesystem.mount_point: '^/(sys|cgroup|proc|dev|etc|host|lib)($|/)' - output.elasticsearch: - username: '$${ELASTICSEARCH_USERNAME}' - password: '$${ELASTICSEARCH_PASSWORD}' - protocol: https - hosts: ["elasticsearch-master:9200"] - ssl.verification_mode: none - - secretMounts: - - name: elastic-certificates - secretName: elastic-certificates - path: /usr/share/metricbeat/config/certs - -deployment: - extraEnvs: - - name: 'ELASTICSEARCH_USERNAME' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: username - - name: 'ELASTICSEARCH_PASSWORD' - valueFrom: - secretKeyRef: - name: elastic-credentials - key: password - # Allows you to add any config files in /usr/share/metricbeat - # such as metricbeat.yml for deployment - metricbeatConfig: - metricbeat.yml: | - metricbeat.modules: - - module: kubernetes - enabled: true - metricsets: - - state_node - - state_deployment - - state_replicaset - - state_pod - - state_container - period: 10s - hosts: ["$${KUBE_STATE_METRICS_HOSTS}"] - output.elasticsearch: - username: '$${ELASTICSEARCH_USERNAME}' - password: '$${ELASTICSEARCH_PASSWORD}' - protocol: https - hosts: ["elasticsearch-master:9200"] - ssl.verification_mode: none - - secretMounts: - - name: elastic-certificates - secretName: elastic-certificates - path: /usr/share/metricbeat/config/certs \ No newline at end of file diff --git a/terraform/layer2-k8s/templates/gitlab-runner-values.tmpl b/terraform/layer2-k8s/templates/gitlab-runner-values.yaml similarity index 100% rename from terraform/layer2-k8s/templates/gitlab-runner-values.tmpl rename to terraform/layer2-k8s/templates/gitlab-runner-values.yaml diff --git a/terraform/layer2-k8s/templates/loki-stack-values.tmpl b/terraform/layer2-k8s/templates/loki-stack-values.yaml similarity index 100% rename from terraform/layer2-k8s/templates/loki-stack-values.tmpl rename to terraform/layer2-k8s/templates/loki-stack-values.yaml diff --git a/terraform/layer2-k8s/templates/mysql-backup-values.yaml b/terraform/layer2-k8s/templates/mysql-backup-values.yaml deleted file mode 100644 index 0fb26662..00000000 --- a/terraform/layer2-k8s/templates/mysql-backup-values.yaml +++ /dev/null @@ -1,19 +0,0 @@ -mysql: - port: 3306 - host: ${db_host} - database: ${db_name} - secret: - name: mysql-connection - keys: - user: db-user - password: db-password - -s3: - enabled: true - bucket: ${bucket_name} - filePrefix: mysqldump - secret: - name: mysql-backup-s3-creds - keys: - accessKeyId: accessKeyId - secretAccessKey: secretAccessKey diff --git a/terraform/layer2-k8s/templates/oauth2-proxy-values.yaml b/terraform/layer2-k8s/templates/oauth2-proxy-values.yaml deleted file mode 100644 index 677f828b..00000000 --- a/terraform/layer2-k8s/templates/oauth2-proxy-values.yaml +++ /dev/null @@ -1,31 +0,0 @@ -image: - tag: "v6.0.0" - -config: - existingSecret: kibana-oauth2-secrets - -extraArgs: - provider: gitlab - email-domain: "*" - gitlab-group: "${gitlab_group}" - redirect-url: "https://${domain_name}/oauth2/callback" - upstream: "https://${domain_name}/" - approval-prompt: auto - -ingress: - enabled: true - path: /oauth2 - hosts: - - ${domain_name} - annotations: - kubernetes.io/ingress.class: nginx - nginx.ingress.kubernetes.io/force-ssl-redirect: "true" - nginx.ingress.kubernetes.io/backend-protocol: "HTTP" - -resources: - limits: - cpu: 100m - memory: 256Mi - requests: - cpu: 100m - memory: 256Mi diff --git a/terraform/layer2-k8s/templates/postgresql-backups-values.tmpl b/terraform/layer2-k8s/templates/postgresql-backups-values.tmpl deleted file mode 100644 index b295a084..00000000 --- a/terraform/layer2-k8s/templates/postgresql-backups-values.tmpl +++ /dev/null @@ -1,43 +0,0 @@ -image: - repository: dymokd/pg-backups-s3 - tag: latest - pullPolicy: IfNotPresent - -ExternalSecret: - enabled: true - Envs: - - key: /${name_wo_region}/infra/alertmanager/slack_url - name: SLACK_URL - - key: /${name_wo_region}/env/pg_host - name: PG_HOST - - key: /${name_wo_region}/env/pg_port - name: PG_PORT - - key: /${name_wo_region}/env/pg_user - name: PG_USER - - key: /${name_wo_region}/env/pg_database - name: PG_DATABASE - - key: /${name_wo_region}/env/pg_pass - name: PG_PASS - - key: /${name_wo_region}/env/s3/pg_backups_bucket_name - name: AWS_BUCKET_NAME - - key: /${name_wo_region}/env/s3/pg_backups_bucket_region - name: AWS_BUCKET_REGION - - key: /${name_wo_region}/env/s3/access_key_id - name: AWS_ACCESS_KEY_ID - - key: /${name_wo_region}/env/s3/access_secret_key - name: AWS_SECRET_ACCESS_KEY - -scheduler: - enabled: true - schedule: "00 17 * * *" - resources: - limits: - cpu: 100m - memory: 256Mi - requests: - cpu: 100m - memory: 256Mi - successfulJobsHistoryLimit: 5 - concurrencyPolicy: Forbid - failedJobsHistoryLimit: 5 - restartPolicy: OnFailure diff --git a/terraform/layer2-k8s/templates/postgresql-exporter-user-script.tmpl b/terraform/layer2-k8s/templates/postgresql-exporter-user-script.tmpl deleted file mode 100644 index a602c1c9..00000000 --- a/terraform/layer2-k8s/templates/postgresql-exporter-user-script.tmpl +++ /dev/null @@ -1,29 +0,0 @@ -image: - repository: dymokd/pg-exporter-user - tag: latest - pullPolicy: IfNotPresent - -ttlSecondsAfterFinished: 0 -activeDeadlineSeconds: 3600 -backoffLimit: 6 - -Envs: - - name: PG_HOST - value: "${pg_host}" - - name: PG_PORT - value: "${pg_port}" - - name: PG_USER - value: "${pg_user}" - - name: PG_PASS - value: "${pg_pass}" - - name: PG_DATABASE - value: "${pg_database}" - - name: PG_EXPORTER_PASS - value: "${pg_exporter_pass}" - - -command: ["/bin/bash", "-c"] - -args: ["PGPASSWORD=$PG_PASS psql --set=generate_pass=$PG_EXPORTER_PASS -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -f /app/pg_exporter_user.sql"] - - diff --git a/terraform/layer2-k8s/templates/prometheus-mysql-exporter.yaml b/terraform/layer2-k8s/templates/prometheus-mysql-exporter.yaml deleted file mode 100644 index b76e3a92..00000000 --- a/terraform/layer2-k8s/templates/prometheus-mysql-exporter.yaml +++ /dev/null @@ -1,15 +0,0 @@ -serviceMonitor: - enabled: true - -mysql: - existingSecret: mysql-exporter - -affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: eks.amazonaws.com/capacityType - operator: In - values: - - SPOT diff --git a/terraform/layer2-k8s/templates/prometheus-postgresql-exporter.tmpl b/terraform/layer2-k8s/templates/prometheus-postgresql-exporter.tmpl deleted file mode 100644 index 6bc0ccae..00000000 --- a/terraform/layer2-k8s/templates/prometheus-postgresql-exporter.tmpl +++ /dev/null @@ -1,26 +0,0 @@ -config: - datasource: - host: ${pg_host} - user: "postgres_exporter" - password: ${pg_pass} - port: ${pg_port} - database: ${pg_database} - sslmode: disable - -serviceMonitor: - enabled: true - namespace: monitoring - interval: 30s - telemetryPath: /metrics - timeout: 10s - -affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: eks.amazonaws.com/capacityType - operator: In - values: - - SPOT - diff --git a/terraform/layer2-k8s/templates/prometheus-values.tmpl b/terraform/layer2-k8s/templates/prometheus-values.yaml similarity index 100% rename from terraform/layer2-k8s/templates/prometheus-values.tmpl rename to terraform/layer2-k8s/templates/prometheus-values.yaml From 6899b9f24affaea214f02140d6d4e1f391752a81 Mon Sep 17 00:00:00 2001 From: maxim Date: Tue, 26 Oct 2021 16:38:25 +0600 Subject: [PATCH 3/4] refactor: delete variables related to ecr repos --- terraform/layer1-aws/variables.tf | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/terraform/layer1-aws/variables.tf b/terraform/layer1-aws/variables.tf index 7d33435a..7d2b4f71 100644 --- a/terraform/layer1-aws/variables.tf +++ b/terraform/layer1-aws/variables.tf @@ -245,17 +245,3 @@ variable "eks_cluster_encryption_config_enable" { default = false description = "Enable or not encryption for k8s secrets with aws-kms" } - -# ECR -variable "ecr_repos" { - type = list(any) - default = ["demo"] - description = "List of docker repositories" -} - -variable "ecr_repo_retention_count" { - type = number - default = 50 - description = "number of images to store in ECR" -} - From f61ec8ba0020ccaae19b5891606cda047af68c13 Mon Sep 17 00:00:00 2001 From: maxim Date: Tue, 26 Oct 2021 16:51:16 +0600 Subject: [PATCH 4/4] add notes in doc how to deploy teamcity --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8869a36d..d474f107 100644 --- a/README.md +++ b/README.md @@ -474,6 +474,7 @@ This will allow you to expand your basic functionality by launching a monitoring * If you want to deploy **`Pritunl VPN`** server just move `layer1-aws/examples/aws-ec2-pritunl.tf` to the root of the layer. * If you want to deploy **`Gitlab runner`** that runs workers as k8s pods (in EKS cluster), move `layer1-aws/examples/aws-s3-bucket-gitlab-runner-cache.tf` and `layer2-k8s/examples/eks-gitlab-runner.tf` to the root of the layers. * If you want to deploy `Istio Operator` move `layer2-k8s/examples/eks-istio.tf` to the root of the layer. +* If you want to deploy `Teamcity` move `layer2-k8s/examples/eks-teamcity.tf` to the root of the layer. ## TFSEC