"
13 | * region = "eu-central-1"
14 | * configs = {} # the default should work, but there are some dependencies, like aws secret should be created already
15 | * }
16 | * ```
17 | *
18 | *
19 | **/
20 |
21 | resource "helm_release" "this" {
22 | name = var.name
23 | repository = "https://dasmeta.github.io/helm"
24 | chart = "namespaces-and-docker-auth"
25 | namespace = var.namespace
26 | version = var.chart_version
27 | create_namespace = false
28 | atomic = var.atomic
29 | wait = var.wait
30 |
31 | values = [jsonencode(module.custom_default_configs_deep.merged)]
32 | }
33 |
34 | module "custom_default_configs_deep" {
35 | source = "cloudposse/config/yaml//modules/deepmerge"
36 | version = "1.0.2"
37 |
38 | maps = [
39 | {
40 | dockerAuth = {
41 | serviceAccountRoleArn = try(module.dockerhub_auth_secret_iam_eks_role[0].iam_role_arn, null)
42 | region = local.region
43 | }
44 | },
45 | var.configs
46 | ]
47 | }
48 |
--------------------------------------------------------------------------------
/modules/namespaces-and-docker-auth/outputs.tf:
--------------------------------------------------------------------------------
1 | output "helm_metadata" {
2 | value = helm_release.this.metadata
3 | description = "Helm release metadata"
4 | }
5 |
--------------------------------------------------------------------------------
/modules/namespaces-and-docker-auth/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.3.0"
3 |
4 | required_providers {
5 | helm = ">= 2.0"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/modules/nginx-ingress-controller/tests/basic/README.md:
--------------------------------------------------------------------------------
1 | # basic
2 |
3 |
4 | ## Requirements
5 |
6 | No requirements.
7 |
8 | ## Providers
9 |
10 | No providers.
11 |
12 | ## Modules
13 |
14 | | Name | Source | Version |
15 | |------|--------|---------|
16 | | [this](#module\_this) | ../../ | n/a |
17 |
18 | ## Resources
19 |
20 | No resources.
21 |
22 | ## Inputs
23 |
24 | No inputs.
25 |
26 | ## Outputs
27 |
28 | No outputs.
29 |
30 |
--------------------------------------------------------------------------------
/modules/nginx-ingress-controller/tests/basic/main.tf:
--------------------------------------------------------------------------------
1 | module "this" {
2 | source = "../../"
3 |
4 | }
5 |
--------------------------------------------------------------------------------
/modules/nginx-ingress-controller/variables.tf:
--------------------------------------------------------------------------------
1 | variable "name" {
2 | type = string
3 | default = "nginx"
4 | description = "Name"
5 | }
6 |
7 | variable "namespace" {
8 | type = string
9 | default = "ingress-nginx"
10 | description = "Namespace name"
11 | }
12 |
13 | variable "chart_version" {
14 | type = string
15 | default = "4.12.0"
16 | description = "The app chart version"
17 | }
18 |
19 | variable "create_namespace" {
20 | type = bool
21 | default = true
22 | description = "Create namespace or use existing one"
23 | }
24 |
25 | variable "replicacount" {
26 | type = number
27 | default = 3
28 | description = "Nginx Ingress controller replica count"
29 | }
30 |
31 | variable "metrics_enabled" {
32 | type = bool
33 | default = true
34 | description = "Enable metric export"
35 | }
36 |
37 | variable "configs" {
38 | type = any
39 | default = {}
40 | description = "Configurations to pass and override default ones. Check the helm chart available configs here: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx/4.12.0?modal=values"
41 | }
42 |
--------------------------------------------------------------------------------
/modules/nginx-ingress-controller/version.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_providers {
3 | helm = ">= 2.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/README.md:
--------------------------------------------------------------------------------
1 | # Node Problem detector
2 | Component will detect and report issues to k8s api server and prometheus.
3 |
4 | See helm and git repos for details.
5 | https://github.com/kubernetes/node-problem-detector
6 | https://artifacthub.io/packages/helm/deliveryhero/node-problem-detector
7 |
8 | ## Requirements
9 |
10 | | Name | Version |
11 | |------|---------|
12 | | [terraform](#requirement\_terraform) | >= 1.0.0 |
13 |
14 | ## Providers
15 |
16 | No providers.
17 |
18 | ## Modules
19 |
20 | | Name | Source | Version |
21 | |------|--------|---------|
22 | | [node-problem-detector](#module\_node-problem-detector) | terraform-module/release/helm | 2.8.2 |
23 |
24 | ## Resources
25 |
26 | No resources.
27 |
28 | ## Inputs
29 |
30 | | Name | Description | Type | Default | Required |
31 | |------|-------------|------|---------|:--------:|
32 | | [chart\_version](#input\_chart\_version) | The app chart version to use | `string` | `"2.3.14"` | no |
33 |
34 | ## Outputs
35 |
36 | No outputs.
37 |
38 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/main.tf:
--------------------------------------------------------------------------------
1 | module "node-problem-detector" {
2 | source = "terraform-module/release/helm"
3 | version = "2.8.2"
4 |
5 | namespace = "kube-system"
6 | repository = "https://charts.deliveryhero.io/"
7 |
8 | app = {
9 | name = "node-problem-detector"
10 | version = var.chart_version
11 | chart = "node-problem-detector"
12 | force_update = true
13 | wait = true
14 | recreate_pods = false
15 | deploy = 1
16 | }
17 | values = [templatefile("${path.module}/values.yaml", {})]
18 |
19 | set = []
20 |
21 | set_sensitive = []
22 | }
23 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/tests/basic/0-setup.tf:
--------------------------------------------------------------------------------
1 | # data
2 | provider "helm" {
3 | kubernetes {
4 | config_path = "~/.kube/config"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/tests/basic/1-example.tf:
--------------------------------------------------------------------------------
1 | module "basic" {
2 | source = "../.."
3 | }
4 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/tests/basic/README.md:
--------------------------------------------------------------------------------
1 | # basic
2 |
3 |
4 | ## Requirements
5 |
6 | No requirements.
7 |
8 | ## Providers
9 |
10 | No providers.
11 |
12 | ## Modules
13 |
14 | | Name | Source | Version |
15 | |------|--------|---------|
16 | | [basic](#module\_basic) | ../.. | n/a |
17 |
18 | ## Resources
19 |
20 | No resources.
21 |
22 | ## Inputs
23 |
24 | No inputs.
25 |
26 | ## Outputs
27 |
28 | No outputs.
29 |
30 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/values.yaml:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasmeta/terraform-aws-eks/4c42afc69b954ee111fc89dcdce0184b42d7ce43/modules/node-problem-detector/values.yaml
--------------------------------------------------------------------------------
/modules/node-problem-detector/variables.tf:
--------------------------------------------------------------------------------
1 | variable "chart_version" {
2 | type = string
3 | default = "2.3.14"
4 | description = "The app chart version to use"
5 | }
6 |
--------------------------------------------------------------------------------
/modules/node-problem-detector/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.0.0"
3 | }
4 |
--------------------------------------------------------------------------------
/modules/olm/README.md:
--------------------------------------------------------------------------------
1 | # olm
2 |
3 |
4 | ## Requirements
5 |
6 | | Name | Version |
7 | |------|---------|
8 | | [kubernetes](#requirement\_kubernetes) | ~>2.23 |
9 |
10 | ## Providers
11 |
12 | | Name | Version |
13 | |------|---------|
14 | | [kubernetes](#provider\_kubernetes) | ~>2.23 |
15 |
16 | ## Modules
17 |
18 | | Name | Source | Version |
19 | |------|--------|---------|
20 | | [yaml](#module\_yaml) | dasmeta/helpers/null//modules/yaml | 0.0.1 |
21 |
22 | ## Resources
23 |
24 | | Name | Type |
25 | |------|------|
26 | | [kubernetes_manifest.olm](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/manifest) | resource |
27 |
28 | ## Inputs
29 |
30 | | Name | Description | Type | Default | Required |
31 | |------|-------------|------|---------|:--------:|
32 | | [version\_tag](#input\_version\_tag) | OlM version | `string` | `"v0.30.0"` | no |
33 |
34 | ## Outputs
35 |
36 | No outputs.
37 |
38 |
--------------------------------------------------------------------------------
/modules/olm/crds.tf:
--------------------------------------------------------------------------------
1 | module "yaml" {
2 | source = "dasmeta/helpers/null//modules/yaml"
3 | version = "0.0.1"
4 |
5 | files = [
6 | "https://raw.githubusercontent.com/operator-framework/operator-lifecycle-manager/${var.version_tag}/deploy/upstream/quickstart/crds.yaml",
7 | "https://raw.githubusercontent.com/operator-framework/operator-lifecycle-manager/${var.version_tag}/deploy/upstream/quickstart/olm.yaml"
8 | ]
9 | }
10 |
11 | resource "kubernetes_manifest" "olm" {
12 | for_each = toset(module.yaml.yamls)
13 |
14 | manifest = yamldecode(each.value)
15 | }
16 |
--------------------------------------------------------------------------------
/modules/olm/main.tf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasmeta/terraform-aws-eks/4c42afc69b954ee111fc89dcdce0184b42d7ce43/modules/olm/main.tf
--------------------------------------------------------------------------------
/modules/olm/tests/basic/1-example.tf:
--------------------------------------------------------------------------------
1 | module "olm-simple" {
2 | source = "../../"
3 | }
4 |
--------------------------------------------------------------------------------
/modules/olm/tests/basic/README.md:
--------------------------------------------------------------------------------
1 | # basic
2 |
3 |
4 | ## Requirements
5 |
6 | No requirements.
7 |
8 | ## Providers
9 |
10 | No providers.
11 |
12 | ## Modules
13 |
14 | | Name | Source | Version |
15 | |------|--------|---------|
16 | | [olm-simple](#module\_olm-simple) | ../../ | n/a |
17 |
18 | ## Resources
19 |
20 | No resources.
21 |
22 | ## Inputs
23 |
24 | No inputs.
25 |
26 | ## Outputs
27 |
28 | No outputs.
29 |
30 |
--------------------------------------------------------------------------------
/modules/olm/variables.tf:
--------------------------------------------------------------------------------
1 | variable "version_tag" {
2 | type = string
3 | default = "v0.30.0"
4 | description = "OlM version"
5 | }
6 |
--------------------------------------------------------------------------------
/modules/olm/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_providers {
3 | kubernetes = {
4 | source = "hashicorp/kubernetes"
5 | version = "~>2.23"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/modules/portainer/README.md:
--------------------------------------------------------------------------------
1 | # portainer
2 |
3 |
4 | ## Requirements
5 |
6 | | Name | Version |
7 | |------|---------|
8 | | [helm](#requirement\_helm) | >= 2.0 |
9 |
10 | ## Providers
11 |
12 | | Name | Version |
13 | |------|---------|
14 | | [helm](#provider\_helm) | >= 2.0 |
15 |
16 | ## Modules
17 |
18 | No modules.
19 |
20 | ## Resources
21 |
22 | | Name | Type |
23 | |------|------|
24 | | [helm_release.portainer](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource |
25 |
26 | ## Inputs
27 |
28 | | Name | Description | Type | Default | Required |
29 | |------|-------------|------|---------|:--------:|
30 | | [chart\_version](#input\_chart\_version) | The app chart version | `string` | `"1.0.62"` | no |
31 | | [enable\_ingress](#input\_enable\_ingress) | Weather create ingress or not in k8s | `bool` | `true` | no |
32 | | [host](#input\_host) | Ingress host name | `string` | `"portainer.dasmeta.com"` | no |
33 |
34 | ## Outputs
35 |
36 | | Name | Description |
37 | |------|-------------|
38 | | [portainer\_host](#output\_portainer\_host) | n/a |
39 |
40 |
--------------------------------------------------------------------------------
/modules/portainer/main.tf:
--------------------------------------------------------------------------------
1 | resource "helm_release" "portainer" {
2 | name = "portainer"
3 | repository = "https://portainer.github.io/k8s/"
4 | chart = "portainer"
5 | version = var.chart_version
6 | create_namespace = true
7 | namespace = "portainer"
8 |
9 | set {
10 | name = "service.type"
11 | value = "NodePort"
12 | }
13 |
14 | set {
15 | name = "tls.force"
16 | value = "true"
17 | }
18 |
19 | set {
20 | name = "ingress.enabled"
21 | value = "true" ? var.enable_ingress : "false"
22 | }
23 |
24 | set {
25 | name = "ingress.annotations.alb\\.ingress\\.kubernetes\\.io/group\\.name"
26 | value = "portainer"
27 | }
28 |
29 | set {
30 | name = "ingress.annotations.kubernetes\\.io/ingress\\.class"
31 | value = "alb"
32 | }
33 |
34 | set {
35 | name = "ingress.annotations.alb\\.ingress\\.kubernetes\\.io/listen-ports"
36 | value = "[{'HTTPS':443}]"
37 | }
38 |
39 | set {
40 | name = "ingress.hosts[0].host"
41 | value = local.host
42 | }
43 |
44 | set {
45 | name = "ingress.hosts[0].paths[0].path"
46 | value = "/"
47 | }
48 |
49 | set {
50 | name = "persistence.size"
51 | value = "10Gi"
52 | }
53 |
54 | set {
55 | name = "persistence.storageClass"
56 | value = "gp2"
57 | }
58 | }
59 |
60 | locals {
61 | host = join("\\.", split(".", var.host))
62 | }
63 |
--------------------------------------------------------------------------------
/modules/portainer/outputs.tf:
--------------------------------------------------------------------------------
1 | output "portainer_host" {
2 | value = var.host
3 | }
4 |
--------------------------------------------------------------------------------
/modules/portainer/variables.tf:
--------------------------------------------------------------------------------
1 | variable "host" {
2 | description = "Ingress host name"
3 | type = string
4 | default = "portainer.dasmeta.com"
5 | }
6 |
7 | variable "enable_ingress" {
8 | description = "Weather create ingress or not in k8s"
9 | type = bool
10 | default = true
11 | }
12 |
13 | variable "chart_version" {
14 | type = string
15 | default = "1.0.62"
16 | description = "The app chart version"
17 | }
18 |
--------------------------------------------------------------------------------
/modules/portainer/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_providers {
3 | helm = ">= 2.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/modules/priority-class/README.md:
--------------------------------------------------------------------------------
1 | # priority-class
2 |
3 |
4 | ## Requirements
5 |
6 | | Name | Version |
7 | |------|---------|
8 | | [kubernetes](#requirement\_kubernetes) | ~>2.23 |
9 |
10 | ## Providers
11 |
12 | | Name | Version |
13 | |------|---------|
14 | | [kubernetes](#provider\_kubernetes) | ~>2.23 |
15 |
16 | ## Modules
17 |
18 | No modules.
19 |
20 | ## Resources
21 |
22 | | Name | Type |
23 | |------|------|
24 | | [kubernetes_priority_class.this](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/priority_class) | resource |
25 |
26 | ## Inputs
27 |
28 | | Name | Description | Type | Default | Required |
29 | |------|-------------|------|---------|:--------:|
30 | | [additional\_priority\_classes](#input\_additional\_priority\_classes) | Defines Priority Classes in Kubernetes, used to assign different levels of priority to pods. By default, this module creates three Priority Classes: 'high'(1000000), 'medium'(500000) and 'low'(250000) . You can also provide a custom list of Priority Classes if needed. | list(object({
name = string
value = string # number in string form
}))
| `[]` | no |
31 |
32 | ## Outputs
33 |
34 | | Name | Description |
35 | |------|-------------|
36 | | [priority\_class](#output\_priority\_class) | n/a |
37 |
38 |
--------------------------------------------------------------------------------
/modules/priority-class/main.tf:
--------------------------------------------------------------------------------
1 | locals {
2 | priority_class_default = [
3 | {
4 | name = "high"
5 | value = "1000000"
6 | },
7 | {
8 | name = "medium"
9 | value = "500000"
10 | },
11 | {
12 | name = "low"
13 | value = "250000"
14 | }
15 | ]
16 | priority_class = concat(local.priority_class_default, var.additional_priority_classes)
17 | }
18 |
19 | resource "kubernetes_priority_class" "this" {
20 | # Transform the list of maps into a key-value map suitable for for_each
21 | for_each = { for pc in local.priority_class : pc.name => pc }
22 |
23 | metadata {
24 | name = each.key
25 | }
26 |
27 | value = each.value.value
28 | }
29 |
--------------------------------------------------------------------------------
/modules/priority-class/output.tf:
--------------------------------------------------------------------------------
1 | output "priority_class" {
2 | value = local.priority_class
3 | }
4 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/add-new-priority-class/README.md:
--------------------------------------------------------------------------------
1 | # add-new-priority-class
2 |
3 |
4 | ## Requirements
5 |
6 | No requirements.
7 |
8 | ## Providers
9 |
10 | | Name | Version |
11 | |------|---------|
12 | | [aws](#provider\_aws) | n/a |
13 |
14 | ## Modules
15 |
16 | | Name | Source | Version |
17 | |------|--------|---------|
18 | | [test](#module\_test) | ../../ | n/a |
19 |
20 | ## Resources
21 |
22 | | Name | Type |
23 | |------|------|
24 | | [aws_eks_cluster.test-cluster](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/eks_cluster) | data source |
25 | | [aws_eks_cluster_auth.test-cluster](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/eks_cluster_auth) | data source |
26 | | [aws_iam_openid_connect_provider.test-cluster-oidc-provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_openid_connect_provider) | data source |
27 |
28 | ## Inputs
29 |
30 | No inputs.
31 |
32 | ## Outputs
33 |
34 | | Name | Description |
35 | |------|-------------|
36 | | [priority\_class](#output\_priority\_class) | n/a |
37 |
38 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/add-new-priority-class/main.tf:
--------------------------------------------------------------------------------
1 | module "test" {
2 | source = "../../"
3 |
4 | additional_priority_classes = [
5 | {
6 | name = "important"
7 | value = "2000000"
8 | },
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/add-new-priority-class/output.tf:
--------------------------------------------------------------------------------
1 | output "priority_class" {
2 | value = module.test.priority_class
3 | }
4 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/add-new-priority-class/providers.tf:
--------------------------------------------------------------------------------
1 | locals {
2 | cluster_name = "stage"
3 | }
4 |
5 | data "aws_eks_cluster" "test-cluster" {
6 | name = local.cluster_name
7 | }
8 |
9 | data "aws_eks_cluster_auth" "test-cluster" {
10 | name = local.cluster_name
11 | }
12 |
13 | data "aws_iam_openid_connect_provider" "test-cluster-oidc-provider" {
14 | url = data.aws_eks_cluster.test-cluster.identity[0].oidc[0].issuer
15 | }
16 |
17 | provider "kubernetes" {
18 | host = data.aws_eks_cluster.test-cluster.endpoint
19 | cluster_ca_certificate = base64decode(data.aws_eks_cluster.test-cluster.certificate_authority.0.data)
20 | token = data.aws_eks_cluster_auth.test-cluster.token
21 |
22 | exec {
23 | api_version = "client.authentication.k8s.io/v1beta1"
24 | args = ["eks", "--region", "eu-central-1", "get-token", "--cluster-name", local.cluster_name]
25 | command = "aws"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/basic/README.md:
--------------------------------------------------------------------------------
1 | # basic
2 |
3 |
4 | ## Requirements
5 |
6 | No requirements.
7 |
8 | ## Providers
9 |
10 | | Name | Version |
11 | |------|---------|
12 | | [aws](#provider\_aws) | n/a |
13 |
14 | ## Modules
15 |
16 | | Name | Source | Version |
17 | |------|--------|---------|
18 | | [test](#module\_test) | ../../ | n/a |
19 |
20 | ## Resources
21 |
22 | | Name | Type |
23 | |------|------|
24 | | [aws_eks_cluster.test-cluster](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/eks_cluster) | data source |
25 | | [aws_eks_cluster_auth.test-cluster](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/eks_cluster_auth) | data source |
26 | | [aws_iam_openid_connect_provider.test-cluster-oidc-provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_openid_connect_provider) | data source |
27 |
28 | ## Inputs
29 |
30 | No inputs.
31 |
32 | ## Outputs
33 |
34 | | Name | Description |
35 | |------|-------------|
36 | | [priority\_class](#output\_priority\_class) | n/a |
37 |
38 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/basic/main.tf:
--------------------------------------------------------------------------------
1 | module "test" {
2 | source = "../../"
3 | }
4 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/basic/output.tf:
--------------------------------------------------------------------------------
1 | output "priority_class" {
2 | value = module.test.priority_class
3 | }
4 |
--------------------------------------------------------------------------------
/modules/priority-class/tests/basic/providers.tf:
--------------------------------------------------------------------------------
1 | locals {
2 | cluster_name = "stage"
3 | }
4 |
5 | data "aws_eks_cluster" "test-cluster" {
6 | name = local.cluster_name
7 | }
8 |
9 | data "aws_eks_cluster_auth" "test-cluster" {
10 | name = local.cluster_name
11 | }
12 |
13 | data "aws_iam_openid_connect_provider" "test-cluster-oidc-provider" {
14 | url = data.aws_eks_cluster.test-cluster.identity[0].oidc[0].issuer
15 | }
16 |
17 | provider "kubernetes" {
18 | host = data.aws_eks_cluster.test-cluster.endpoint
19 | cluster_ca_certificate = base64decode(data.aws_eks_cluster.test-cluster.certificate_authority.0.data)
20 | token = data.aws_eks_cluster_auth.test-cluster.token
21 |
22 | exec {
23 | api_version = "client.authentication.k8s.io/v1beta1"
24 | args = ["eks", "--region", "eu-central-1", "get-token", "--cluster-name", local.cluster_name]
25 | command = "aws"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/modules/priority-class/variables.tf:
--------------------------------------------------------------------------------
1 | variable "additional_priority_classes" {
2 | type = list(object({
3 | name = string
4 | value = string # number in string form
5 | }))
6 | description = "Defines Priority Classes in Kubernetes, used to assign different levels of priority to pods. By default, this module creates three Priority Classes: 'high'(1000000), 'medium'(500000) and 'low'(250000) . You can also provide a custom list of Priority Classes if needed."
7 | default = []
8 | }
9 |
--------------------------------------------------------------------------------
/modules/priority-class/version.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_providers {
3 | kubernetes = {
4 | source = "hashicorp/kubernetes"
5 | version = "~>2.23"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/modules/s3-csi/data.tf:
--------------------------------------------------------------------------------
1 | data "aws_region" "current" {
2 | count = var.region == null ? 1 : 0
3 | }
4 |
5 | data "aws_eks_addon_version" "this" {
6 | count = var.addon_version == null ? 1 : 0
7 |
8 | addon_name = local.addon_name
9 | kubernetes_version = var.cluster_version
10 | most_recent = var.most_recent
11 | }
12 |
13 | data "aws_s3_bucket" "this" {
14 | count = length(var.s3_buckets)
15 |
16 | bucket = var.s3_buckets[count.index]
17 | }
18 |
--------------------------------------------------------------------------------
/modules/s3-csi/examples/basic/0-setup.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 1.3.0"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.31, < 6.0.0"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/modules/s3-csi/examples/basic/1-example.tf:
--------------------------------------------------------------------------------
1 | module "this" {
2 | source = "../.."
3 |
4 | cluster_name = "test-cluster-with-karpenter"
5 | oidc_provider_arn = ""
6 | }
7 |
--------------------------------------------------------------------------------
/modules/s3-csi/examples/basic/README.md:
--------------------------------------------------------------------------------
1 | # basic
2 |
3 |
4 | ## Requirements
5 |
6 | | Name | Version |
7 | |------|---------|
8 | | [terraform](#requirement\_terraform) | >= 1.3.0 |
9 | | [aws](#requirement\_aws) | >= 3.31, < 6.0.0 |
10 |
11 | ## Providers
12 |
13 | No providers.
14 |
15 | ## Modules
16 |
17 | | Name | Source | Version |
18 | |------|--------|---------|
19 | | [this](#module\_this) | ../.. | n/a |
20 |
21 | ## Resources
22 |
23 | No resources.
24 |
25 | ## Inputs
26 |
27 | No inputs.
28 |
29 | ## Outputs
30 |
31 | No outputs.
32 |
33 |
--------------------------------------------------------------------------------
/modules/s3-csi/locals.tf:
--------------------------------------------------------------------------------
1 | locals {
2 | addon_name = "aws-mountpoint-s3-csi-driver"
3 |
4 | mountpoint_s3_csi_bucket_arns = length(var.s3_buckets) > 0 ? data.aws_s3_bucket.this.*.arn : ["arn:aws:s3:::*"]
5 | mountpoint_s3_csi_path_arns = [for item in local.mountpoint_s3_csi_bucket_arns : "${item}/*"]
6 |
7 | region = coalesce(var.region, try(data.aws_region.current[0].name, null))
8 | }
9 |
--------------------------------------------------------------------------------
/modules/s3-csi/main.tf:
--------------------------------------------------------------------------------
1 | module "iam_role_for_service_accounts_eks" {
2 | source = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
3 | version = "5.55.0"
4 |
5 | role_name = "eks-s3-csi-${var.cluster_name}-${local.region}"
6 |
7 | attach_mountpoint_s3_csi_policy = true
8 | mountpoint_s3_csi_bucket_arns = local.mountpoint_s3_csi_bucket_arns
9 | mountpoint_s3_csi_path_arns = local.mountpoint_s3_csi_path_arns
10 |
11 | oidc_providers = {
12 | one = {
13 | provider_arn = var.oidc_provider_arn
14 | namespace_service_accounts = ["${var.namespace}:${var.serviceAccount}"]
15 | }
16 | }
17 | }
18 |
19 | resource "aws_eks_addon" "this" {
20 | cluster_name = var.cluster_name
21 | addon_name = local.addon_name
22 | addon_version = coalesce(var.addon_version, try(data.aws_eks_addon_version.this[0].version, null))
23 | resolve_conflicts_on_create = "OVERWRITE"
24 | resolve_conflicts_on_update = "OVERWRITE"
25 | service_account_role_arn = module.iam_role_for_service_accounts_eks.iam_role_arn
26 | configuration_values = jsonencode(var.configs)
27 | }
28 |
--------------------------------------------------------------------------------
/modules/s3-csi/outputs.tf:
--------------------------------------------------------------------------------
1 | output "addon_arn" {
2 | value = aws_eks_addon.this.arn
3 | description = "The arn of installed/created addon"
4 | }
5 |
6 | output "role_arn" {
7 | value = module.iam_role_for_service_accounts_eks.iam_role_arn
8 | description = "The arn of service account role"
9 | }
10 |
--------------------------------------------------------------------------------
/modules/sso-rbac/account-assignment.tf:
--------------------------------------------------------------------------------
1 | module "sso_account_assignments" {
2 | source = "./terraform-aws-sso/modules/account-assignments"
3 | for_each = { for kr in var.bindings : "${kr.namespace}-${kr.group}" => kr }
4 | account_assignments = [
5 | {
6 | permission_set_name = "ps-${each.value.namespace}-${each.value.group}"
7 | account = var.account_id
8 | permission_set_arn = module.permission_sets[each.key].permission_sets["ps-${each.key}"].arn
9 | principal_type = "GROUP",
10 | principal_name = "${each.value.group}"
11 | }
12 | ]
13 | }
14 |
15 | data "aws_ssoadmin_instances" "this" {}
16 |
17 | data "aws_identitystore_group" "this" {
18 | for_each = { for as in var.bindings : "${as.namespace}-${as.group}" => as }
19 | identity_store_id = tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0]
20 |
21 | filter {
22 | attribute_path = local.attribute_path
23 | attribute_value = each.value.group
24 | }
25 | }
26 |
27 |
28 |
29 | locals {
30 | attribute_path = "DisplayName"
31 | principal_type = "GROUP"
32 | target_type = "AWS_ACCOUNT"
33 | permission_set_role = local.arns_without_path
34 | }
35 |
--------------------------------------------------------------------------------
/modules/sso-rbac/krole.tf:
--------------------------------------------------------------------------------
1 | resource "kubernetes_role_v1" "k8s-rbac" {
2 |
3 | for_each = { for bind in var.bindings : "${bind.namespace}-${bind.group}" => bind }
4 |
5 | metadata {
6 | name = each.key
7 | namespace = each.value.namespace
8 | }
9 |
10 | dynamic "rule" {
11 | for_each = var.roles
12 |
13 | content {
14 | api_groups = [""]
15 | resources = rule.value.resources
16 | verbs = rule.value.actions
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/modules/sso-rbac/krolebinding.tf:
--------------------------------------------------------------------------------
1 | resource "kubernetes_role_binding" "example" {
2 |
3 | for_each = { for bind in var.bindings : "${bind.namespace}-${bind.group}" => bind }
4 |
5 | metadata {
6 | name = each.value.group
7 | namespace = each.value.namespace
8 | }
9 |
10 | subject {
11 | kind = "Group"
12 | name = each.value.group
13 | api_group = "rbac.authorization.k8s.io"
14 | }
15 |
16 | role_ref {
17 | api_group = "rbac.authorization.k8s.io"
18 | kind = "Role"
19 | name = each.key
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/modules/sso-rbac/main.tf:
--------------------------------------------------------------------------------
1 | /**
2 | * ### This is basic usage of module `sso-rbac`
3 | *
4 | * ```
5 | * module "sso-rbac" {
6 | * source = "dasmeta/eks/aws//modules/sso-rbac"
7 | * roles = var.roles
8 | * bindings = var.bindings
9 | * eks_module = module.eks-cluster.eks_module
10 | * account_id = var.account_id
11 | * }
12 | *
13 | * locals {
14 | *
15 | * roles = [{
16 | * name = "viewers"
17 | * actions = ["get", "list", "watch"]
18 | * resources = ["deployments"]
19 | * }, {
20 | * name = "editors"
21 | * actions = ["get", "list", "watch"]
22 | * resources = ["pods"]
23 | * }]
24 | *
25 | * bindings = [{
26 | * group = "developers"
27 | * namespace = "development"
28 | * roles = ["viewers", "editors"]
29 | *
30 | * }, {
31 | * group = "accountants"
32 | * namespace = "accounting"
33 | * roles = ["editors"]
34 | * }]
35 | * }
36 | * ```
37 | **/
38 |
--------------------------------------------------------------------------------
/modules/sso-rbac/outputs.tf:
--------------------------------------------------------------------------------
1 | output "role_arns_without_path" {
2 | value = local.arns_without_path
3 | }
4 |
5 | output "role_arns" {
6 | value = data.aws_iam_roles.sso.arns
7 | }
8 |
9 | output "config_yaml" {
10 | value = module.eks_auth.aws_auth_configmap_yaml
11 | }
12 |
--------------------------------------------------------------------------------
/modules/sso-rbac/permission-set.tf:
--------------------------------------------------------------------------------
1 | module "permission_sets" {
2 | source = "./terraform-aws-sso/modules/permission-sets"
3 |
4 | for_each = { for kr in var.bindings : "${kr.namespace}-${kr.group}" => kr }
5 | permission_sets = [
6 | {
7 | name = "ps-${each.value.namespace}-${each.value.group}"
8 | tags = {},
9 | policy_attachments = ["arn:aws:iam::aws:policy/PowerUserAccess"]
10 | customer_managed_policy_attachments = []
11 | description = "ps-${each.value.namespace}-${each.value.group}"
12 | inline_policy = ""
13 | session_duration = "PT12H"
14 | relay_state = ""
15 | }
16 | ]
17 | }
18 |
19 | locals {
20 | value = module.permission_sets
21 | }
22 |
23 | locals {
24 | arns = tolist(data.aws_iam_roles.sso.arns)
25 |
26 | arns_without_path = [
27 | for parts in [for arn in data.aws_iam_roles.sso.arns : split("/", arn)] :
28 | format("%s/%s", parts[0], element(parts, length(parts) - 1))
29 | ]
30 |
31 | names = [
32 | for parts in [for arn in local.arns : split("_", arn)] :
33 | join("_", slice(parts, 1, length(parts) - 1))
34 | ]
35 | }
36 |
37 | data "aws_iam_roles" "sso" {
38 | depends_on = [module.permission_sets]
39 | name_regex = "AWSReservedSSO_.*"
40 | }
41 |
--------------------------------------------------------------------------------
/modules/sso-rbac/provisioner.tf:
--------------------------------------------------------------------------------
1 | module "eks_auth" {
2 | source = "aidanmelen/eks-auth/aws"
3 | eks = var.eks_module
4 | version = "1.0.0"
5 |
6 | map_roles = [for role_binding in var.bindings : {
7 | rolearn = [for role_arn in local.arns_without_path : role_arn if length(regexall(".+AWSReservedSSO_ps-${role_binding.namespace}-${role_binding.group}.+", role_arn)) > 0][0]
8 | username = role_binding.group
9 | groups = [role_binding.group]
10 | }
11 | ]
12 | }
13 |
--------------------------------------------------------------------------------
/modules/sso-rbac/terraform-aws-sso/modules/account-assignments/outputs.tf:
--------------------------------------------------------------------------------
1 | output "assignments" {
2 | value = aws_ssoadmin_account_assignment.this
3 | }
4 |
--------------------------------------------------------------------------------
/modules/sso-rbac/terraform-aws-sso/modules/account-assignments/variables.tf:
--------------------------------------------------------------------------------
1 | variable "account_assignments" {
2 | type = list(object({
3 | account = string
4 | permission_set_name = string
5 | permission_set_arn = string
6 | principal_name = string
7 | principal_type = string
8 | }))
9 | }
10 |
--------------------------------------------------------------------------------
/modules/sso-rbac/terraform-aws-sso/modules/account-assignments/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 0.13.0"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.26.0, < 6.0.0"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/modules/sso-rbac/terraform-aws-sso/modules/permission-sets/outputs.tf:
--------------------------------------------------------------------------------
1 | output "permission_sets" {
2 | value = aws_ssoadmin_permission_set.this
3 | }
4 |
--------------------------------------------------------------------------------
/modules/sso-rbac/terraform-aws-sso/modules/permission-sets/variables.tf:
--------------------------------------------------------------------------------
1 | variable "permission_sets" {
2 | type = list(object({
3 | name = string
4 | description = string
5 | relay_state = string
6 | session_duration = string
7 | tags = map(string)
8 | inline_policy = string
9 | policy_attachments = list(string)
10 | customer_managed_policy_attachments = list(object({
11 | name = string
12 | path = string
13 | }))
14 | }))
15 |
16 | default = []
17 | }
18 |
--------------------------------------------------------------------------------
/modules/sso-rbac/terraform-aws-sso/modules/permission-sets/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = ">= 0.13.0"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 4.30.0"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/modules/sso-rbac/variables.tf:
--------------------------------------------------------------------------------
1 | variable "bindings" {
2 | description = "Bindings to bind namespace and roles and then pass to kubernetes objects"
3 | type = list(object({
4 | group = string
5 | namespace = string
6 | roles = list(string)
7 |
8 | }))
9 | }
10 |
11 | variable "roles" {
12 | description = "Roles to provide kubernetes object"
13 | type = list(object({
14 | actions = list(string)
15 | resources = list(string)
16 | }))
17 | }
18 |
19 | variable "eks_module" {
20 | description = "terraform-aws-eks module to used for aws-auth update"
21 | type = any
22 | }
23 |
24 | variable "account_id" {
25 | description = "Account Id to apply changes into"
26 | type = string
27 | }
28 |
29 | variable "map_roles" {
30 | description = "Additional IAM roles to add to the aws-auth configmap."
31 | type = list(object({
32 | rolearn = string
33 | username = string
34 | groups = list(string)
35 | }))
36 | default = []
37 | }
38 |
39 | variable "map_users" {
40 | description = "Additional IAM users to add to the aws-auth configmap."
41 | type = list(object({
42 | userarn = string
43 | username = string
44 | groups = list(string)
45 | }))
46 | default = []
47 | }
48 |
--------------------------------------------------------------------------------
/modules/sso-rbac/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_providers {
3 | aws = {
4 | source = "hashicorp/aws"
5 | version = ">= 4.0"
6 | }
7 | kubernetes = {
8 | source = "hashicorp/kubernetes"
9 | version = "~>2.23"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/modules/weave-scope/examples/README.md:
--------------------------------------------------------------------------------
1 | # examples
2 |
3 |
4 | ## Requirements
5 |
6 | No requirements.
7 |
8 | ## Providers
9 |
10 | No providers.
11 |
12 | ## Modules
13 |
14 | | Name | Source | Version |
15 | |------|--------|---------|
16 | | [weave-scope-minimal](#module\_weave-scope-minimal) | ./modules/weave-scope | n/a |
17 | | [weave-scope-with-ingress](#module\_weave-scope-with-ingress) | ./modules/weave-scope | n/a |
18 |
19 | ## Resources
20 |
21 | No resources.
22 |
23 | ## Inputs
24 |
25 | No inputs.
26 |
27 | ## Outputs
28 |
29 | No outputs.
30 |
31 |
--------------------------------------------------------------------------------
/modules/weave-scope/examples/minimal.tf:
--------------------------------------------------------------------------------
1 | module "weave-scope-minimal" {
2 | source = "./modules/weave-scope"
3 | }
4 |
--------------------------------------------------------------------------------
/modules/weave-scope/examples/service-nodeport.tf:
--------------------------------------------------------------------------------
1 | module "weave-scope-with-ingress" {
2 | source = "../"
3 |
4 | service_type = "NodePort"
5 | }
6 |
--------------------------------------------------------------------------------
/modules/weave-scope/examples/with-ingress.tf:
--------------------------------------------------------------------------------
1 | module "weave-scope-with-ingress" {
2 | source = "./modules/weave-scope"
3 | ingress_class = "nginx"
4 | ingress_host = "www.weave-scope.com"
5 | ingress_name = "weave-ingress"
6 | }
7 |
--------------------------------------------------------------------------------
/modules/weave-scope/resources/values.yaml.tpl:
--------------------------------------------------------------------------------
1 | global:
2 | image:
3 | repository: weaveworks/scope
4 | tag: 1.10.1
5 | pullPolicy: "IfNotPresent"
6 | service:
7 | port: 80
8 | type: ${service_type}
9 | weave-scope-frontend:
10 | enabled: true
11 |
12 | ingress:
13 | enabled: enabled
14 | name: ${ingress_name}
15 | host: ${ingress_host}
16 | path: "/"
17 | className: ${ingress_class}
18 | extraPaths: ""
19 | annotations:
20 | %{~ for config_key, config_value in config ~}
21 | "${config_key}": "${config_value}"
22 | %{~ endfor ~}
23 |
24 | service:
25 | serviceName: weave-weave-scope
26 | servicePort: 80
27 | externalPort: 8080
28 |
29 | weave-scope-agent:
30 | enabled: true
31 | dockerBridge: "docker0"
32 | scopeFrontendAddr: ""
33 | probeToken: ""
34 | rbac:
35 | create: true
36 | readOnly: ${read_only}
37 | serviceAccount:
38 | create: true
39 |
--------------------------------------------------------------------------------
/modules/weave-scope/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_providers {
3 | helm = ">= 2.0"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/nginx-ingress-controller.tf:
--------------------------------------------------------------------------------
1 | module "nginx-ingress-controller" {
2 | source = "./modules/nginx-ingress-controller/"
3 |
4 | count = var.create && var.nginx_ingress_controller_config.enabled ? 1 : 0
5 |
6 | name = var.nginx_ingress_controller_config.name
7 | create_namespace = var.nginx_ingress_controller_config.create_namespace
8 | namespace = var.nginx_ingress_controller_config.namespace
9 | replicacount = var.nginx_ingress_controller_config.replicacount
10 | metrics_enabled = var.nginx_ingress_controller_config.metrics_enabled
11 | configs = var.nginx_ingress_controller_config.configs
12 |
13 | depends_on = [module.alb-ingress-controller]
14 | }
15 |
--------------------------------------------------------------------------------
/node-problem-detector.tf:
--------------------------------------------------------------------------------
1 | module "node-problem-detector" {
2 | source = "./modules/node-problem-detector"
3 |
4 | count = var.enable_node_problem_detector ? 1 : 0
5 |
6 | depends_on = [module.eks-core-components]
7 | }
8 |
--------------------------------------------------------------------------------
/olm.tf:
--------------------------------------------------------------------------------
1 | module "olm" {
2 | source = "./modules/olm"
3 |
4 | count = var.create && var.enable_olm ? 1 : 0
5 |
6 | depends_on = [module.eks-core-components]
7 | }
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "app",
3 | "devDependencies": {
4 | "@commitlint/cli": "^17.0.3",
5 | "@commitlint/config-conventional": "^17.0.3",
6 | "husky": "^8.0.1",
7 | "@semantic-release/github": "^8.0.4",
8 | "semantic-release": "^19.0.3"
9 | },
10 | "release": {
11 | "branches": [
12 | "main", "master", "next"
13 | ]
14 | },
15 | "private": true,
16 | "plugins": [
17 | "@semantic-release/commit-analyzer",
18 | "@semantic-release/release-notes-generator",
19 | "@semantic-release/github",
20 | "@semantic-release/npm"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/pre-commit.yaml:
--------------------------------------------------------------------------------
1 | on:
2 | pull_request:
3 | push:
4 | branches: [main, test*]
5 |
6 | jobs:
7 | main:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - uses: actions/checkout@v2
11 | - uses: actions/setup-python@v3
12 | - name: self test action
13 | uses: dasmeta/reusable-actions-workflows/pre-commit@0.0.6
14 | with:
15 | repo-token: ${{ secrets.GITHUB_TOKEN }}
16 |
--------------------------------------------------------------------------------
/priority-class.tf:
--------------------------------------------------------------------------------
1 | module "priority_class" {
2 | source = "./modules/priority-class/"
3 |
4 | additional_priority_classes = var.additional_priority_classes
5 |
6 | depends_on = [module.eks-core-components]
7 | }
8 |
--------------------------------------------------------------------------------
/providers.tf:
--------------------------------------------------------------------------------
1 | provider "kubernetes" {
2 | host = try(module.eks-cluster[0].host, null)
3 | cluster_ca_certificate = try(module.eks-cluster[0].certificate, null)
4 | token = try(module.eks-cluster[0].token, null)
5 | # load_config_file = false
6 | }
7 |
8 | provider "kubectl" {
9 | host = try(module.eks-cluster[0].host, null)
10 | cluster_ca_certificate = try(module.eks-cluster[0].certificate, null)
11 | token = try(module.eks-cluster[0].token, null)
12 | load_config_file = false
13 | }
14 |
15 | provider "helm" {
16 | kubernetes {
17 | host = try(module.eks-cluster[0].host, null)
18 | cluster_ca_certificate = try(module.eks-cluster[0].certificate, null)
19 | token = try(module.eks-cluster[0].token, null)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/versions.tf:
--------------------------------------------------------------------------------
1 | terraform {
2 | required_version = "~> 1.3"
3 |
4 | required_providers {
5 | aws = {
6 | source = "hashicorp/aws"
7 | version = ">= 3.31, < 6.0.0"
8 | }
9 |
10 | helm = {
11 | source = "hashicorp/helm"
12 | version = ">= 2.4.1"
13 | }
14 |
15 | kubectl = {
16 | source = "gavinbunney/kubectl"
17 | version = "~>1.14"
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/wave-scope-dashboard.tf:
--------------------------------------------------------------------------------
1 | module "weave-scope" {
2 | count = var.weave_scope_enabled ? 1 : 0
3 | source = "./modules/weave-scope"
4 | namespace = var.weave_scope_config.namespace
5 | create_namespace = var.weave_scope_config.create_namespace
6 | release_name = var.weave_scope_config.weave_helm_release_name
7 | ingress_class = var.weave_scope_config.ingress_class
8 | ingress_host = var.weave_scope_config.ingress_host
9 | ingress_name = var.weave_scope_config.ingress_name
10 | annotations = var.weave_scope_config.annotations
11 | service_type = var.weave_scope_config.service_type
12 |
13 | depends_on = [module.eks-core-components]
14 | }
15 |
--------------------------------------------------------------------------------