diff --git a/README.md b/README.md index 7d331f62..d474f107 100644 --- a/README.md +++ b/README.md @@ -469,6 +469,13 @@ 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. +* If you want to deploy `Teamcity` move `layer2-k8s/examples/eks-teamcity.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 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}*"] - } -} -