← azuredeploy

Add terrafrom files/terragrunt for aks deployment

ff91a10785e0691569ecf809bda35507aba54ad0 · ovidiucs · Jun 14, 2024 17:54

+1034 · 25 files changed

  • .gitignore +4 −0
  • terraform/.terraform.lock.hcl +101 −0
  • terraform/deployment/aks/.terraform.lock.hcl +101 −0
  • terraform/deployment/aks/README.md +46 −0
  • terraform/deployment/aks/main.tf +65 −0
  • terraform/deployment/aks/modules/terraforn-azurerm-aks/main.tf +36 −0
  • terraform/deployment/aks/modules/vm/vm.tf +76 −0
  • terraform/deployment/aks/outputs.tf +9 −0
  • terraform/deployment/aks/terraform.tfvars +14 −0
  • terraform/deployment/aks/terragrunt.hcl +17 −0
  • terraform/deployment/aks/variables.tf +120 −0
  • terraform/deployment/aks/versions.tf +8 −0
  • terraform/deployment/eventhubs/.terraform.lock.hcl +22 −0
  • terraform/deployment/eventhubs/eventhub.tf +8 −0
  • terraform/deployment/eventhubs/modules/eventhub/eventhub.tf +12 −0
  • terraform/deployment/eventhubs/modules/eventhub/terraform.tfvars +32 −0
  • terraform/deployment/eventhubs/modules/eventhub/variables.tf +47 −0
  • terraform/deployment/eventhubs/modules/eventhub/versions.tf +8 −0
  • terraform/deployment/eventhubs/terragrunt.hcl +17 −0
  • terraform/deployment/eventhubs/versions.tf +8 −0
  • terraform/deployment/harness-delegate.yml +259 −0
  • terraform/deployment/kubectl-cfg/clusterrolebining.yaml +12 −0
  • terraform/deployment/kubectl-cfg/secret.yaml +7 −0
  • terraform/deployment/kubectl-cfg/serviceaccount.yaml +5 −0
  • terraform/deployment/main.hcl +0 −0
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4887369
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+**/.terragrunt-cache
+**/.terraform
+**/*.tfstate
+**/*.tfstate.backup
diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl
new file mode 100644
index 0000000..df8113c
--- /dev/null
+++ b/terraform/.terraform.lock.hcl
@@ -0,0 +1,101 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/azure/azapi" {
+  version     = "1.12.1"
+  constraints = ">= 1.4.0, < 2.0.0"
+  hashes = [
+    "h1:Gv1HwQMV7+3ctMPr1nKmOhEGu+UWb6FlQmrgaHxknJ4=",
+    "zh:1cf52e685ceb04e73e13fbf3f3036bff23a3274a4ceda8693c0612076a588166",
+    "zh:321b59c2a67c6cb4e5cf0dbe2cc978f5389d781e8b391f9b75bf4d830abd2ffe",
+    "zh:49046bd8020c3b44c6b5dc67041f181e4fff45e3bc1a9ff0646dd20c21c8ce47",
+    "zh:5784d0c326ec4825571577bc39b253019bd3b1030c19d67ca3436df2d7ba01c8",
+    "zh:5ad7e18d26f170c01888d8e65dab7aa475089aac7bf0106526fd57cdd56533bc",
+    "zh:6695854f4f655673bea85e37444bf0c070b440dba4bc269aa144d0f6b7c1cc5f",
+    "zh:7f372c897da6b9ad90869a8eb85b37dad4dff2d5d311b3eca1a2e6373e2271ed",
+    "zh:8afa1a2be1dada4e8be4ab72d9d56f36af1e486c9353d04aabf6e79db7310125",
+    "zh:90809364619238c45185bff25c7d9c4fde34253561d8183ebbe797456c44bc9c",
+    "zh:9338d44650c9e68e10a6bc2d69f7beacd5059e6ac681d2e388e80a1652d9c183",
+    "zh:c94ee6fb1df2c1d35f338107b5e73cdba86c4ecf9dcde95e2ca0132cbbd4bd7c",
+    "zh:de231d363b1a664c6b5d3af8d3b9cf542d04d4506fb9458ba6c8ebf94e0e32ae",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/azurerm" {
+  version     = "3.95.0"
+  constraints = ">= 3.84.0, ~> 3.95.0, < 4.0.0"
+  hashes = [
+    "h1:Vcd25+tCcLuRyEVaG9w/eHcSJcFI3oH/T5gwGuCHe74=",
+    "zh:36e96725fb5860b68c4f86d43988eadfe13ece7abfc3368bf01b2f4e253a05f8",
+    "zh:3f416b574518a63793dfda0efa588dd0d2432d4cbea5908d7a479f82f0a89a01",
+    "zh:3f94eb8dc1717bd5af524138258b65bb2011917e05db727a0696623d4a2cdf6f",
+    "zh:4fd395656aeb366830eebc11f10d29b2e9652b4d74e70bbe785768b7cbcf8d5c",
+    "zh:58bc5bd83a984f91faebbc71f27062d3a6ca4e3abfc2fe7fcd40833d8145c5a8",
+    "zh:5bfedb1592056da89c3cfa2cb409cdeadedc2d336a862d39c14a9a2a4424cb8a",
+    "zh:6135572aa2d99e95877a28deaa864742429ba7bba8ca39b5dd8261484d384c06",
+    "zh:8440dbc750cd06e51a640175acd2187ab2816e080c318ea278ef9657c3000675",
+    "zh:9dc9e301319f49c639535da6d5ed5d938a7c8153d4467816419466d343784d01",
+    "zh:e5c99bc6c960d0cc4f4aab4779ccb59ec8cc6802799f2fff9c41c945f2012f85",
+    "zh:e9d55f63a20054c3cbb95f14dc3670c89575893b9747eb2c2ee067e1bc521c48",
+    "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/null" {
+  version     = "3.2.2"
+  constraints = ">= 3.0.0"
+  hashes = [
+    "h1:zT1ZbegaAYHwQa+QwIFugArWikRJI9dqohj8xb0GY88=",
+    "zh:3248aae6a2198f3ec8394218d05bd5e42be59f43a3a7c0b71c66ec0df08b69e7",
+    "zh:32b1aaa1c3013d33c245493f4a65465eab9436b454d250102729321a44c8ab9a",
+    "zh:38eff7e470acb48f66380a73a5c7cdd76cc9b9c9ba9a7249c7991488abe22fe3",
+    "zh:4c2f1faee67af104f5f9e711c4574ff4d298afaa8a420680b0cb55d7bbc65606",
+    "zh:544b33b757c0b954dbb87db83a5ad921edd61f02f1dc86c6186a5ea86465b546",
+    "zh:696cf785090e1e8cf1587499516b0494f47413b43cb99877ad97f5d0de3dc539",
+    "zh:6e301f34757b5d265ae44467d95306d61bef5e41930be1365f5a8dcf80f59452",
+    "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
+    "zh:913a929070c819e59e94bb37a2a253c228f83921136ff4a7aa1a178c7cce5422",
+    "zh:aa9015926cd152425dbf86d1abdbc74bfe0e1ba3d26b3db35051d7b9ca9f72ae",
+    "zh:bb04798b016e1e1d49bcc76d62c53b56c88c63d6f2dfe38821afef17c416a0e1",
+    "zh:c23084e1b23577de22603cff752e59128d83cfecc2e6819edadd8cf7a10af11e",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/random" {
+  version = "3.6.0"
+  hashes = [
+    "h1:R5Ucn26riKIEijcsiOMBR3uOAjuOMfI1x7XvH4P6B1w=",
+    "zh:03360ed3ecd31e8c5dac9c95fe0858be50f3e9a0d0c654b5e504109c2159287d",
+    "zh:1c67ac51254ba2a2bb53a25e8ae7e4d076103483f55f39b426ec55e47d1fe211",
+    "zh:24a17bba7f6d679538ff51b3a2f378cedadede97af8a1db7dad4fd8d6d50f829",
+    "zh:30ffb297ffd1633175d6545d37c2217e2cef9545a6e03946e514c59c0859b77d",
+    "zh:454ce4b3dbc73e6775f2f6605d45cee6e16c3872a2e66a2c97993d6e5cbd7055",
+    "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
+    "zh:91df0a9fab329aff2ff4cf26797592eb7a3a90b4a0c04d64ce186654e0cc6e17",
+    "zh:aa57384b85622a9f7bfb5d4512ca88e61f22a9cea9f30febaa4c98c68ff0dc21",
+    "zh:c4a3e329ba786ffb6f2b694e1fd41d413a7010f3a53c20b432325a94fa71e839",
+    "zh:e2699bc9116447f96c53d55f2a00570f982e6f9935038c3810603572693712d0",
+    "zh:e747c0fd5d7684e5bfad8aa0ca441903f15ae7a98a737ff6aca24ba223207e2c",
+    "zh:f1ca75f417ce490368f047b63ec09fd003711ae48487fba90b4aba2ccf71920e",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/tls" {
+  version     = "4.0.5"
+  constraints = ">= 3.1.0"
+  hashes = [
+    "h1:e4LBdJoZJNOQXPWgOAG0UuPBVhCStu98PieNlqJTmeU=",
+    "zh:01cfb11cb74654c003f6d4e32bbef8f5969ee2856394a96d127da4949c65153e",
+    "zh:0472ea1574026aa1e8ca82bb6df2c40cd0478e9336b7a8a64e652119a2fa4f32",
+    "zh:1a8ddba2b1550c5d02003ea5d6cdda2eef6870ece86c5619f33edd699c9dc14b",
+    "zh:1e3bb505c000adb12cdf60af5b08f0ed68bc3955b0d4d4a126db5ca4d429eb4a",
+    "zh:6636401b2463c25e03e68a6b786acf91a311c78444b1dc4f97c539f9f78de22a",
+    "zh:76858f9d8b460e7b2a338c477671d07286b0d287fd2d2e3214030ae8f61dd56e",
+    "zh:a13b69fb43cb8746793b3069c4d897bb18f454290b496f19d03c3387d1c9a2dc",
+    "zh:a90ca81bb9bb509063b736842250ecff0f886a91baae8de65c8430168001dad9",
+    "zh:c4de401395936e41234f1956ebadbd2ed9f414e6908f27d578614aaa529870d4",
+    "zh:c657e121af8fde19964482997f0de2d5173217274f6997e16389e7707ed8ece8",
+    "zh:d68b07a67fbd604c38ec9733069fbf23441436fecf554de6c75c032f82e1ef19",
+    "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+  ]
+}
diff --git a/terraform/deployment/aks/.terraform.lock.hcl b/terraform/deployment/aks/.terraform.lock.hcl
new file mode 100644
index 0000000..586a4be
--- /dev/null
+++ b/terraform/deployment/aks/.terraform.lock.hcl
@@ -0,0 +1,101 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/azure/azapi" {
+  version     = "1.12.1"
+  constraints = ">= 1.4.0, < 2.0.0"
+  hashes = [
+    "h1:Gv1HwQMV7+3ctMPr1nKmOhEGu+UWb6FlQmrgaHxknJ4=",
+    "zh:1cf52e685ceb04e73e13fbf3f3036bff23a3274a4ceda8693c0612076a588166",
+    "zh:321b59c2a67c6cb4e5cf0dbe2cc978f5389d781e8b391f9b75bf4d830abd2ffe",
+    "zh:49046bd8020c3b44c6b5dc67041f181e4fff45e3bc1a9ff0646dd20c21c8ce47",
+    "zh:5784d0c326ec4825571577bc39b253019bd3b1030c19d67ca3436df2d7ba01c8",
+    "zh:5ad7e18d26f170c01888d8e65dab7aa475089aac7bf0106526fd57cdd56533bc",
+    "zh:6695854f4f655673bea85e37444bf0c070b440dba4bc269aa144d0f6b7c1cc5f",
+    "zh:7f372c897da6b9ad90869a8eb85b37dad4dff2d5d311b3eca1a2e6373e2271ed",
+    "zh:8afa1a2be1dada4e8be4ab72d9d56f36af1e486c9353d04aabf6e79db7310125",
+    "zh:90809364619238c45185bff25c7d9c4fde34253561d8183ebbe797456c44bc9c",
+    "zh:9338d44650c9e68e10a6bc2d69f7beacd5059e6ac681d2e388e80a1652d9c183",
+    "zh:c94ee6fb1df2c1d35f338107b5e73cdba86c4ecf9dcde95e2ca0132cbbd4bd7c",
+    "zh:de231d363b1a664c6b5d3af8d3b9cf542d04d4506fb9458ba6c8ebf94e0e32ae",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/azurerm" {
+  version     = "3.95.0"
+  constraints = ">= 3.84.0, ~> 3.95.0, < 4.0.0"
+  hashes = [
+    "h1:Vcd25+tCcLuRyEVaG9w/eHcSJcFI3oH/T5gwGuCHe74=",
+    "zh:36e96725fb5860b68c4f86d43988eadfe13ece7abfc3368bf01b2f4e253a05f8",
+    "zh:3f416b574518a63793dfda0efa588dd0d2432d4cbea5908d7a479f82f0a89a01",
+    "zh:3f94eb8dc1717bd5af524138258b65bb2011917e05db727a0696623d4a2cdf6f",
+    "zh:4fd395656aeb366830eebc11f10d29b2e9652b4d74e70bbe785768b7cbcf8d5c",
+    "zh:58bc5bd83a984f91faebbc71f27062d3a6ca4e3abfc2fe7fcd40833d8145c5a8",
+    "zh:5bfedb1592056da89c3cfa2cb409cdeadedc2d336a862d39c14a9a2a4424cb8a",
+    "zh:6135572aa2d99e95877a28deaa864742429ba7bba8ca39b5dd8261484d384c06",
+    "zh:8440dbc750cd06e51a640175acd2187ab2816e080c318ea278ef9657c3000675",
+    "zh:9dc9e301319f49c639535da6d5ed5d938a7c8153d4467816419466d343784d01",
+    "zh:e5c99bc6c960d0cc4f4aab4779ccb59ec8cc6802799f2fff9c41c945f2012f85",
+    "zh:e9d55f63a20054c3cbb95f14dc3670c89575893b9747eb2c2ee067e1bc521c48",
+    "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/null" {
+  version     = "3.2.2"
+  constraints = ">= 3.0.0"
+  hashes = [
+    "h1:zT1ZbegaAYHwQa+QwIFugArWikRJI9dqohj8xb0GY88=",
+    "zh:3248aae6a2198f3ec8394218d05bd5e42be59f43a3a7c0b71c66ec0df08b69e7",
+    "zh:32b1aaa1c3013d33c245493f4a65465eab9436b454d250102729321a44c8ab9a",
+    "zh:38eff7e470acb48f66380a73a5c7cdd76cc9b9c9ba9a7249c7991488abe22fe3",
+    "zh:4c2f1faee67af104f5f9e711c4574ff4d298afaa8a420680b0cb55d7bbc65606",
+    "zh:544b33b757c0b954dbb87db83a5ad921edd61f02f1dc86c6186a5ea86465b546",
+    "zh:696cf785090e1e8cf1587499516b0494f47413b43cb99877ad97f5d0de3dc539",
+    "zh:6e301f34757b5d265ae44467d95306d61bef5e41930be1365f5a8dcf80f59452",
+    "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
+    "zh:913a929070c819e59e94bb37a2a253c228f83921136ff4a7aa1a178c7cce5422",
+    "zh:aa9015926cd152425dbf86d1abdbc74bfe0e1ba3d26b3db35051d7b9ca9f72ae",
+    "zh:bb04798b016e1e1d49bcc76d62c53b56c88c63d6f2dfe38821afef17c416a0e1",
+    "zh:c23084e1b23577de22603cff752e59128d83cfecc2e6819edadd8cf7a10af11e",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/random" {
+  version = "3.6.1"
+  hashes = [
+    "h1:1OlP753r4lOKlBprL0HdZGWerm5DCabD5Mli8k8lWAg=",
+    "zh:2a0ec154e39911f19c8214acd6241e469157489fc56b6c739f45fbed5896a176",
+    "zh:57f4e553224a5e849c99131f5e5294be3a7adcabe2d867d8a4fef8d0976e0e52",
+    "zh:58f09948c608e601bd9d0a9e47dcb78e2b2c13b4bda4d8f097d09152ea9e91c5",
+    "zh:5c2a297146ed6fb3fe934c800e78380f700f49ff24dbb5fb5463134948e3a65f",
+    "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
+    "zh:7ce41e26f0603e31cdac849085fc99e5cd5b3b73414c6c6d955c0ceb249b593f",
+    "zh:8c9e8d30c4ef08ee8bcc4294dbf3c2115cd7d9049c6ba21422bd3471d92faf8a",
+    "zh:93e91be717a7ffbd6410120eb925ebb8658cc8f563de35a8b53804d33c51c8b0",
+    "zh:982542e921970d727ce10ed64795bf36c4dec77a5db0741d4665230d12250a0d",
+    "zh:b9d1873f14d6033e216510ef541c891f44d249464f13cc07d3f782d09c7d18de",
+    "zh:cfe27faa0bc9556391c8803ade135a5856c34a3fe85b9ae3bdd515013c0c87c1",
+    "zh:e4aabf3184bbb556b89e4b195eab1514c86a2914dd01c23ad9813ec17e863a8a",
+  ]
+}
+
+provider "registry.terraform.io/hashicorp/tls" {
+  version     = "4.0.5"
+  constraints = ">= 3.1.0"
+  hashes = [
+    "h1:e4LBdJoZJNOQXPWgOAG0UuPBVhCStu98PieNlqJTmeU=",
+    "zh:01cfb11cb74654c003f6d4e32bbef8f5969ee2856394a96d127da4949c65153e",
+    "zh:0472ea1574026aa1e8ca82bb6df2c40cd0478e9336b7a8a64e652119a2fa4f32",
+    "zh:1a8ddba2b1550c5d02003ea5d6cdda2eef6870ece86c5619f33edd699c9dc14b",
+    "zh:1e3bb505c000adb12cdf60af5b08f0ed68bc3955b0d4d4a126db5ca4d429eb4a",
+    "zh:6636401b2463c25e03e68a6b786acf91a311c78444b1dc4f97c539f9f78de22a",
+    "zh:76858f9d8b460e7b2a338c477671d07286b0d287fd2d2e3214030ae8f61dd56e",
+    "zh:a13b69fb43cb8746793b3069c4d897bb18f454290b496f19d03c3387d1c9a2dc",
+    "zh:a90ca81bb9bb509063b736842250ecff0f886a91baae8de65c8430168001dad9",
+    "zh:c4de401395936e41234f1956ebadbd2ed9f414e6908f27d578614aaa529870d4",
+    "zh:c657e121af8fde19964482997f0de2d5173217274f6997e16389e7707ed8ece8",
+    "zh:d68b07a67fbd604c38ec9733069fbf23441436fecf554de6c75c032f82e1ef19",
+    "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+  ]
+}
diff --git a/terraform/deployment/aks/README.md b/terraform/deployment/aks/README.md
new file mode 100644
index 0000000..e7f8d27
--- /dev/null
+++ b/terraform/deployment/aks/README.md
@@ -0,0 +1,46 @@
+### Overall Directory layout for the terraform deployments
+```.
+├── main.tf                 # Entry point of the Terraform configuration, often contains provider configuration
+├── variables.tf            # Defines variables used across the project
+├── outputs.tf              # Defines outputs from your Terraform configuration
+├── terraform.tfvars        # Contains values for the defined variables
+├── backend.tf              # (Optional) Contains backend configuration for state management
+├── versions.tf             # Sets the Terraform version and provider requirements
+├── README.md               # Project documentation for maintainers and users
+└── modules/
+    ├── network/            # Network module, e.g., VNets, subnets, NSGs
+    │   ├── main.tf
+    │   ├── variables.tf
+    │   ├── outputs.tf
+    │   └── ...
+    ├── compute/            # Compute module, e.g., VMs, scale sets
+    │   ├── main.tf
+    │   ├── variables.tf
+    │   ├── outputs.tf
+    │   └── ...
+    └── storage/            # Storage module, e.g., blob storage, disk
+        ├── main.tf
+        ├── variables.tf
+        ├── outputs.tf
+        └── ...
+```
+File and Directory Roles
+
+**main.tf**: This is often the entry point for Terraform configurations. In the root directory, it might contain provider configurations and module invocations. Within modules, it contains the main set of resources that module manages.
+
+**variables.tf:** Defines variables for the module or root configurations, making your configurations flexible and reusable.
+
+**outputs.tf:** Defines output values that you can use to retrieve information about the resources, such as IDs or endpoints, and can be used by other configurations or modules.
+
+**terraform.tfvars:** Contains actual values for the declared variables. Sensitive values should not be committed to version control, so consider using environment variables or encrypted secrets management for those.
+
+**backend.tf:** Optionally specifies backend configuration where Terraform state information is stored. This is crucial for team environments or when using Terraform in automation (CI/CD pipelines).
+
+**versions.tf:** Specifies required versions for Terraform and providers, ensuring consistent behavior across different environments and team members.
+
+**README.md:** Provides documentation for your project, explaining its purpose, how to use it, and any prerequisites or configuration steps.
+
+**Modules Directory:** Contains subdirectories for each modularized component of your infrastructure, like networking or compute resources. This allows you to encapsulate and reuse configurations.
+
+
+Define variables
diff --git a/terraform/deployment/aks/main.tf b/terraform/deployment/aks/main.tf
new file mode 100644
index 0000000..29f740d
--- /dev/null
+++ b/terraform/deployment/aks/main.tf
@@ -0,0 +1,65 @@
+terraform {
+  backend "azurerm" {}
+}
+
+provider "azurerm" {
+  features {}
+}
+
+resource "random_id" "prefix" {
+  byte_length = 8
+}
+
+resource "azurerm_resource_group" "az-rg-lbl" {
+  name     = var.resource_group_name
+  location = var.location
+}
+
+resource "azurerm_virtual_network" "az-aks-net01" {
+  address_space       = ["10.52.0.0/16"]
+  location            = azurerm_resource_group.az-rg-lbl.location
+  name                = "${random_id.prefix.hex}-vn"
+  resource_group_name = azurerm_resource_group.az-rg-lbl.name
+}
+
+resource "azurerm_subnet" "test" {
+  address_prefixes                               = ["10.52.0.0/24"]
+  name                                           = "${random_id.prefix.hex}-sn"
+  resource_group_name                            = azurerm_resource_group.az-rg-lbl.name
+  virtual_network_name                           = azurerm_virtual_network.az-aks-net01.name
+  enforce_private_link_endpoint_network_policies = true
+}
+
+module "aks" {
+  source  = "github.com/Azure/terraform-azurerm-aks"
+
+  resource_group_name = azurerm_resource_group.az-rg-lbl.name
+  location            = azurerm_resource_group.az-rg-lbl.location
+  cluster_name        = var.cluster_name
+  kubernetes_version  = var.kubernetes_version
+  cluster_log_analytics_workspace_name = var.cluster_log_analytics_workspace_name
+  prefix          = var.dns_prefix
+  rbac_aad = false
+  
+  node_pools = {
+    node_pool_a = {
+      name                = var.default_node_pool_name
+      node_count          = var.node_count
+      vm_size             = var.vm_size
+    }
+  }
+
+  admin_username = var.admin_username
+  public_ssh_key = file(var.ssh_public_key)
+
+  tags = var.tags
+
+  depends_on = [azurerm_resource_group.az-rg-lbl]
+}
+
+/*
+module "vm" {
+  source = "./modules/vm"
+  # Add the required variables for the VM module
+}
+*/
diff --git a/terraform/deployment/aks/modules/terraforn-azurerm-aks/main.tf b/terraform/deployment/aks/modules/terraforn-azurerm-aks/main.tf
new file mode 100644
index 0000000..738e939
--- /dev/null
+++ b/terraform/deployment/aks/modules/terraforn-azurerm-aks/main.tf
@@ -0,0 +1,36 @@
+provider "azurerm" {
+  features {}
+  version = "~> 2.0"
+}
+
+module "aks" {
+  source  = "https://github.com/Azure/terraform-azurerm-aks?ref=main"
+  version = "1.0.0" # Use the appropriate version
+
+  resource_group_name = var.resource_group_name
+  location            = var.location
+  cluster_name        = var.cluster_name
+  kubernetes_version  = var.kubernetes_version
+  dns_prefix          = var.dns_prefix
+
+  default_node_pool {
+    name                = var.default_node_pool_name
+    node_count          = var.node_count
+    vm_size             = var.vm_size
+  }
+
+  linux_profile {
+    admin_username = var.admin_username
+    ssh_key {
+      key_data = file(var.ssh_public_key)
+    }
+  }
+
+  service_principal {
+    client_id     = var.client_id
+    client_secret = var.client_secret
+  }
+
+  tags = var.tags
+}
+
diff --git a/terraform/deployment/aks/modules/vm/vm.tf b/terraform/deployment/aks/modules/vm/vm.tf
new file mode 100644
index 0000000..c983a17
--- /dev/null
+++ b/terraform/deployment/aks/modules/vm/vm.tf
@@ -0,0 +1,76 @@
+provider "azurerm" {
+  features {}
+}
+
+resource "azurerm_resource_group" "example" {
+  name     = "example-resources"
+  location = "East US"
+}
+
+resource "azurerm_virtual_network" "example" {
+  name                = "example-network"
+  address_space       = ["10.0.0.0/16"]
+  location            = azurerm_resource_group.example.location
+  resource_group_name = azurerm_resource_group.example.name
+}
+
+resource "azurerm_subnet" "example" {
+  name                 = "example-subnet"
+  resource_group_name  = azurerm_resource_group.example.name
+  virtual_network_name = azurerm_virtual_network.example.name
+  address_prefixes     = ["10.0.2.0/24"]
+}
+
+resource "azurerm_public_ip" "example" {
+  name                = "example-publicip"
+  location            = azurerm_resource_group.example.location
+  resource_group_name = azurerm_resource_group.example.name
+  allocation_method   = "Dynamic"
+}
+
+resource "azurerm_network_security_group" "example" {
+  name                = "example-nsg"
+  location            = azurerm_resource_group.example.location
+  resource_group_name = azurerm_resource_group.example.name
+}
+
+resource "azurerm_network_interface" "example" {
+  name                = "example-nic"
+  location            = azurerm_resource_group.example.location
+  resource_group_name = azurerm_resource_group.example.name
+
+  ip_configuration {
+    name                          = "internal"
+    subnet_id                     = azurerm_subnet.example.id
+    private_ip_address_allocation = "Dynamic"
+    public_ip_address_id          = azurerm_public_ip.example.id
+  }
+}
+
+resource "azurerm_linux_virtual_machine" "example" {
+  name                = "example-vm"
+  resource_group_name = azurerm_resource_group.example.name
+  location            = azurerm_resource_group.example.location
+  size                = "Standard_F2"
+  admin_username      = "adminuser"
+  network_interface_ids = [
+    azurerm_network_interface.example.id,
+  ]
+
+  os_disk {
+    caching              = "ReadWrite"
+    storage_account_type = "Standard_LRS"
+  }
+
+  source_image_reference {
+    publisher = "Canonical"
+    offer     = "UbuntuServer"
+    sku       = "18.04-LTS"
+    version   = "latest"
+  }
+
+  admin_ssh_key {
+    username   = "adminuser"
+    public_key = file("~/.ssh/id_rsa.pub")
+  }
+}
diff --git a/terraform/deployment/aks/outputs.tf b/terraform/deployment/aks/outputs.tf
new file mode 100644
index 0000000..dbf3e92
--- /dev/null
+++ b/terraform/deployment/aks/outputs.tf
@@ -0,0 +1,9 @@
+output "aks_cluster_name" {
+  description = "The name of the AKS cluster"
+  value       = module.aks.aks_name
+}
+
+output "aks_cluster_id" {
+  description = "The ID of the AKS cluster"
+  value       = module.aks.aks_id
+}
diff --git a/terraform/deployment/aks/terraform.tfvars b/terraform/deployment/aks/terraform.tfvars
new file mode 100644
index 0000000..469b936
--- /dev/null
+++ b/terraform/deployment/aks/terraform.tfvars
@@ -0,0 +1,14 @@
+resource_group_name = "AZ-AKS-RG"
+cluster_name        = "AZ-AKS001"
+kubernetes_version  = "1.28.9"
+node_count          = 3
+agents_max_count    = 5
+agents_min_count    = 1
+agents_size         = "Standard_B2s"
+vm_size             = "Standard_B2s"
+client_id           = ""
+client_secret       = ""
+ssh_public_key      = "~/.ssh/azure_test2.pub"
+location            = "eastus2"
+cluster_log_analytics_workspace_name = "AZ-LOG-AN-AKS-A001"
+dns_prefix              = "aks"
diff --git a/terraform/deployment/aks/terragrunt.hcl b/terraform/deployment/aks/terragrunt.hcl
new file mode 100644
index 0000000..e68a1f7
--- /dev/null
+++ b/terraform/deployment/aks/terragrunt.hcl
@@ -0,0 +1,17 @@
+terraform {
+  source = "."
+}
+
+remote_state {
+  backend = "azurerm"
+  config = {
+    resource_group_name  = "AZ-Resource-GRP"
+    storage_account_name = "terragruntstorageaccount"
+    container_name       = "terraform-state"
+    key                  = "aks/terraform.tfstate"
+  }
+}
+
+inputs = {
+  # other input variables for the AKS deployment
+}
diff --git a/terraform/deployment/aks/variables.tf b/terraform/deployment/aks/variables.tf
new file mode 100644
index 0000000..2ab724f
--- /dev/null
+++ b/terraform/deployment/aks/variables.tf
@@ -0,0 +1,120 @@
+variable "azure_region" {
+  description = "azure region"
+  type        = string
+  default     = "eastus2"
+}
+
+variable "name" {
+  description = "name"
+  type        = string
+  default     = "app-failover-and-traffic"
+}
+
+variable "admin_username" {
+  description = "The name of the project"
+  type        = string
+  default     = "subzero"
+}
+
+variable "ssh_public_key" {
+  description = "The path to the SSH Key File"
+  type        = string
+}
+
+variable "project" {
+  description = "The name of the project"
+  type        = string
+  default     = "automation-project-one"
+}
+
+variable "client" {
+  description = "The client for the project"
+  type        = string
+  default     = "public"
+}
+
+variable "owner" {
+  description = "The owner of the project"
+  type        = string
+  default     = "Ovidiu"
+}
+
+variable "environment" {
+  description = "The project environment"
+  type        = string
+  default     = "dev"
+}
+
+variable "resource_group_name" {
+  description = "The name of the resource group"
+  type        = string
+}
+
+variable "cluster_name" {
+  description = "The name of the AKS cluster"
+  type        = string
+}
+
+variable "kubernetes_version" {
+  description = "The Kubernetes version for the AKS cluster"
+  type        = string
+}
+
+variable "node_count" {
+  description = "The number of nodes in the default node pool"
+  type        = number
+}
+
+variable "agents_max_count" {
+  description = "The maximum number of nodes in the default node pool"
+  type        = number
+}
+
+variable "agents_min_count" {
+  description = "The minimum number of nodes in the default node pool"
+  type        = number
+}
+
+variable "vm_size" {
+  description = "The size of the virtual machines in the default node pool"
+  type        = string
+}
+
+variable "client_id" {
+  description = "The client ID of the service principal"
+  type        = string
+}
+
+variable "client_secret" {
+  description = "The client secret of the service principal"
+  type        = string
+}
+
+variable "location" {
+  description = "The location where the resources will be created."
+  type        = string
+}
+
+variable "default_node_pool_name" {
+  description = "The name of the default node pool."
+  type        = string
+  default     = "np1"
+}
+
+variable "tags" {
+  description = "A map of tags to add to all resources."
+  type        = map(string)
+  default     = {}
+}
+
+variable "cluster_log_analytics_workspace_name" {
+     description = "The name of the existing Log Analytics workspace to use for AKS monitoring."
+     type        = string
+     default     = null
+}
+
+variable "dns_prefix" {
+     description = "The prefix to use for naming resources."
+     type        = string
+     default     = null
+}
diff --git a/terraform/deployment/aks/versions.tf b/terraform/deployment/aks/versions.tf
new file mode 100644
index 0000000..4b02eaa
--- /dev/null
+++ b/terraform/deployment/aks/versions.tf
@@ -0,0 +1,8 @@
+terraform {
+  required_providers {
+    azurerm = {
+      source  = "hashicorp/azurerm"
+      version = "~> 3.95.0"
+    }
+  }
+}
diff --git a/terraform/deployment/eventhubs/.terraform.lock.hcl b/terraform/deployment/eventhubs/.terraform.lock.hcl
new file mode 100644
index 0000000..70e96f5
--- /dev/null
+++ b/terraform/deployment/eventhubs/.terraform.lock.hcl
@@ -0,0 +1,22 @@
+# This file is maintained automatically by "terraform init".
+# Manual edits may be lost in future updates.
+
+provider "registry.terraform.io/hashicorp/azurerm" {
+  version     = "3.95.0"
+  constraints = "~> 3.95.0"
+  hashes = [
+    "h1:Vcd25+tCcLuRyEVaG9w/eHcSJcFI3oH/T5gwGuCHe74=",
+    "zh:36e96725fb5860b68c4f86d43988eadfe13ece7abfc3368bf01b2f4e253a05f8",
+    "zh:3f416b574518a63793dfda0efa588dd0d2432d4cbea5908d7a479f82f0a89a01",
+    "zh:3f94eb8dc1717bd5af524138258b65bb2011917e05db727a0696623d4a2cdf6f",
+    "zh:4fd395656aeb366830eebc11f10d29b2e9652b4d74e70bbe785768b7cbcf8d5c",
+    "zh:58bc5bd83a984f91faebbc71f27062d3a6ca4e3abfc2fe7fcd40833d8145c5a8",
+    "zh:5bfedb1592056da89c3cfa2cb409cdeadedc2d336a862d39c14a9a2a4424cb8a",
+    "zh:6135572aa2d99e95877a28deaa864742429ba7bba8ca39b5dd8261484d384c06",
+    "zh:8440dbc750cd06e51a640175acd2187ab2816e080c318ea278ef9657c3000675",
+    "zh:9dc9e301319f49c639535da6d5ed5d938a7c8153d4467816419466d343784d01",
+    "zh:e5c99bc6c960d0cc4f4aab4779ccb59ec8cc6802799f2fff9c41c945f2012f85",
+    "zh:e9d55f63a20054c3cbb95f14dc3670c89575893b9747eb2c2ee067e1bc521c48",
+    "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c",
+  ]
+}
diff --git a/terraform/deployment/eventhubs/eventhub.tf b/terraform/deployment/eventhubs/eventhub.tf
new file mode 100644
index 0000000..82cdc3b
--- /dev/null
+++ b/terraform/deployment/eventhubs/eventhub.tf
@@ -0,0 +1,8 @@
+terraform {
+  backend "azurerm" {}
+}
+
+module "eventhub" {
+       source = "./modules/eventhub"
+       # Pass any required variables to the eventhub module
+     }
diff --git a/terraform/deployment/eventhubs/modules/eventhub/eventhub.tf b/terraform/deployment/eventhubs/modules/eventhub/eventhub.tf
new file mode 100644
index 0000000..da82e2b
--- /dev/null
+++ b/terraform/deployment/eventhubs/modules/eventhub/eventhub.tf
@@ -0,0 +1,12 @@
+module "eventhub" {
+  source  = "avinor/event-hubs/azurerm"
+  version = "3.0.2"
+
+  name                = var.eventhub_name
+  location            = var.location
+  resource_group_name = var.resource_group_name
+  sku                 = var.eventhub_sku
+
+  hubs                = var.eventhub_hubs
+  diagnostics         = var.eventhub_diagnostics
+}
diff --git a/terraform/deployment/eventhubs/modules/eventhub/terraform.tfvars b/terraform/deployment/eventhubs/modules/eventhub/terraform.tfvars
new file mode 100644
index 0000000..98f0931
--- /dev/null
+++ b/terraform/deployment/eventhubs/modules/eventhub/terraform.tfvars
@@ -0,0 +1,32 @@
+eventhub_name         = "my-eventhub"
+location              = "westeurope"
+resource_group_name   = "my-resource-group"
+eventhub_sku          = "Standard"
+
+eventhub_hubs = [
+  {
+    name              = "hub1"
+    partitions        = 8
+    message_retention = 1
+    consumers         = ["app1", "app2"]
+    keys = [
+      {
+        name   = "app1"
+        listen = true
+        send   = false
+      },
+      {
+        name   = "app2"
+        listen = true
+        send   = true
+      }
+    ]
+  }
+]
+
+eventhub_diagnostics = {
+  destination   = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-log-analytics"
+  eventhub_name = null
+  logs          = ["ArchiveLogs", "OperationalLogs", "AutoScaleLogs", "KafkaCoordinatorLogs", "KafkaUserErrorLogs", "EventHubVNetConnectionEvent"]
+  metrics       = ["AllMetrics"]
+}
diff --git a/terraform/deployment/eventhubs/modules/eventhub/variables.tf b/terraform/deployment/eventhubs/modules/eventhub/variables.tf
new file mode 100644
index 0000000..6169abb
--- /dev/null
+++ b/terraform/deployment/eventhubs/modules/eventhub/variables.tf
@@ -0,0 +1,47 @@
+variable "eventhub_name" {
+  description = "Name of the Event Hub namespace"
+  type        = string
+}
+
+variable "location" {
+  description = "Location of the Event Hub namespace"
+  type        = string
+}
+
+variable "resource_group_name" {
+  description = "Name of the resource group to deploy the Event Hub namespace"
+  type        = string
+}
+
+variable "eventhub_sku" {
+  description = "SKU of the Event Hub namespace"
+  type        = string
+  default     = "Standard"
+}
+
+variable "eventhub_hubs" {
+  description = "List of event hubs to create within the namespace"
+  type = list(object({
+    name              = string
+    partitions        = number
+    message_retention = number
+    consumers         = list(string)
+    keys = list(object({
+      name   = string
+      listen = bool
+      send   = bool
+    }))
+  }))
+  default = []
+}
+
+variable "eventhub_diagnostics" {
+  description = "Diagnostic settings for the Event Hub namespace"
+  type = object({
+    destination   = string
+    eventhub_name = string
+    logs          = list(string)
+    metrics       = list(string)
+  })
+  default = null
+}
diff --git a/terraform/deployment/eventhubs/modules/eventhub/versions.tf b/terraform/deployment/eventhubs/modules/eventhub/versions.tf
new file mode 100644
index 0000000..4b02eaa
--- /dev/null
+++ b/terraform/deployment/eventhubs/modules/eventhub/versions.tf
@@ -0,0 +1,8 @@
+terraform {
+  required_providers {
+    azurerm = {
+      source  = "hashicorp/azurerm"
+      version = "~> 3.95.0"
+    }
+  }
+}
diff --git a/terraform/deployment/eventhubs/terragrunt.hcl b/terraform/deployment/eventhubs/terragrunt.hcl
new file mode 100644
index 0000000..9bac083
--- /dev/null
+++ b/terraform/deployment/eventhubs/terragrunt.hcl
@@ -0,0 +1,17 @@
+terraform {
+  source = "."
+}
+
+remote_state {
+  backend = "azurerm"
+  config = {
+    resource_group_name  = "AZ-Resource-GRP"
+    storage_account_name = "terragruntstorageaccount"
+    container_name       = "terraform-state"
+    key                  = "eventhubs/terraform.tfstate"
+  }
+}
+
+inputs = {
+  # other input variables for the Event Hubs deployment
+}
diff --git a/terraform/deployment/eventhubs/versions.tf b/terraform/deployment/eventhubs/versions.tf
new file mode 100644
index 0000000..4b02eaa
--- /dev/null
+++ b/terraform/deployment/eventhubs/versions.tf
@@ -0,0 +1,8 @@
+terraform {
+  required_providers {
+    azurerm = {
+      source  = "hashicorp/azurerm"
+      version = "~> 3.95.0"
+    }
+  }
+}
diff --git a/terraform/deployment/harness-delegate.yml b/terraform/deployment/harness-delegate.yml
new file mode 100644
index 0000000..30cc76b
--- /dev/null
+++ b/terraform/deployment/harness-delegate.yml
@@ -0,0 +1,259 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: harness-delegate-ng
+
+---
+
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: harness-delegate-ng-cluster-admin
+subjects:
+  - kind: ServiceAccount
+    name: default
+    namespace: harness-delegate-ng
+roleRef:
+  kind: ClusterRole
+  name: cluster-admin
+  apiGroup: rbac.authorization.k8s.io
+
+---
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: kubernetes-delegate-account-token
+  namespace: harness-delegate-ng
+type: Opaque
+data:
+  DELEGATE_TOKEN: "MzA5MzNhZGU4MTVhZThhNzA4MTM1ZGE2NDEzMTk5ZmM="
+
+---
+
+# If delegate needs to use a proxy, please follow instructions available in the documentation
+# https://ngdocs.harness.io/article/5ww21ewdt8-configure-delegate-proxy-settings
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    harness.io/name: kubernetes-delegate
+  name: kubernetes-delegate
+  namespace: harness-delegate-ng
+spec:
+  replicas: 1
+  minReadySeconds: 120
+  selector:
+    matchLabels:
+      harness.io/name: kubernetes-delegate
+  template:
+    metadata:
+      labels:
+        harness.io/name: kubernetes-delegate
+      annotations:
+        prometheus.io/scrape: "true"
+        prometheus.io/port: "3460"
+        prometheus.io/path: "/api/metrics"
+    spec:
+      terminationGracePeriodSeconds: 600
+      restartPolicy: Always
+      containers:
+      - image: harness/delegate:24.04.82709
+        imagePullPolicy: Always
+        name: delegate
+        securityContext:
+          allowPrivilegeEscalation: false
+          runAsUser: 0
+        ports:
+          - containerPort: 8080
+        resources:
+          limits:
+            memory: "2048Mi"
+          requests:
+            cpu: "0.5"
+            memory: "2048Mi"
+        livenessProbe:
+          httpGet:
+            path: /api/health
+            port: 3460
+            scheme: HTTP
+          initialDelaySeconds: 10
+          periodSeconds: 10
+          failureThreshold: 3
+        startupProbe:
+          httpGet:
+            path: /api/health
+            port: 3460
+            scheme: HTTP
+          initialDelaySeconds: 30
+          periodSeconds: 10
+          failureThreshold: 15
+        envFrom:
+        - secretRef:
+            name: kubernetes-delegate-account-token
+        env:
+        - name: JAVA_OPTS
+          value: "-Xms64M"
+        - name: ACCOUNT_ID
+          value: vITRJGynSeS9fMreiSRkkQ
+        - name: MANAGER_HOST_AND_PORT
+          value: https://app.harness.io
+        - name: DEPLOY_MODE
+          value: KUBERNETES
+        - name: DELEGATE_NAME
+          value: kubernetes-delegate
+        - name: DELEGATE_TYPE
+          value: "KUBERNETES"
+        - name: DELEGATE_NAMESPACE
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: INIT_SCRIPT
+          value: ""
+        - name: DELEGATE_DESCRIPTION
+          value: ""
+        - name: DELEGATE_TAGS
+          value: ""
+        - name: NEXT_GEN
+          value: "true"
+        - name: CLIENT_TOOLS_DOWNLOAD_DISABLED
+          value: "true"
+        - name: LOG_STREAMING_SERVICE_URL
+          value: "https://app.harness.io/log-service/"
+        - name: DELEGATE_RESOURCE_THRESHOLD
+          value: ""
+        - name: DYNAMIC_REQUEST_HANDLING
+          value: "false"
+
+---
+
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+   name: kubernetes-delegate-hpa
+   namespace: harness-delegate-ng
+   labels:
+       harness.io/name: kubernetes-delegate
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: kubernetes-delegate
+  minReplicas: 1
+  maxReplicas: 1
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 70
+  - type: Resource
+    resource:
+      name: memory
+      target:
+        type: Utilization
+        averageUtilization: 70
+
+---
+
+kind: Role
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: upgrader-cronjob
+  namespace: harness-delegate-ng
+rules:
+  - apiGroups: ["batch", "apps", "extensions"]
+    resources: ["cronjobs"]
+    verbs: ["get", "list", "watch", "update", "patch"]
+  - apiGroups: ["extensions", "apps"]
+    resources: ["deployments"]
+    verbs: ["get", "list", "watch", "create", "update", "patch"]
+
+---
+
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: kubernetes-delegate-upgrader-cronjob
+  namespace: harness-delegate-ng
+subjects:
+  - kind: ServiceAccount
+    name: upgrader-cronjob-sa
+    namespace: harness-delegate-ng
+roleRef:
+  kind: Role
+  name: upgrader-cronjob
+  apiGroup: ""
+
+---
+
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: upgrader-cronjob-sa
+  namespace: harness-delegate-ng
+
+---
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: kubernetes-delegate-upgrader-token
+  namespace: harness-delegate-ng
+type: Opaque
+data:
+  UPGRADER_TOKEN: "MzA5MzNhZGU4MTVhZThhNzA4MTM1ZGE2NDEzMTk5ZmM="
+
+---
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: kubernetes-delegate-upgrader-config
+  namespace: harness-delegate-ng
+data:
+  config.yaml: |
+    mode: Delegate
+    dryRun: false
+    workloadName: kubernetes-delegate
+    namespace: harness-delegate-ng
+    containerName: delegate
+    delegateConfig:
+      accountId: vITRJGynSeS9fMreiSRkkQ
+      managerHost: https://app.harness.io
+
+---
+
+apiVersion: batch/v1
+kind: CronJob
+metadata:
+  labels:
+    harness.io/name: kubernetes-delegate-upgrader-job
+  name: kubernetes-delegate-upgrader-job
+  namespace: harness-delegate-ng
+spec:
+  schedule: "0 */1 * * *"
+  concurrencyPolicy: Forbid
+  startingDeadlineSeconds: 20
+  jobTemplate:
+    spec:
+      template:
+        spec:
+          serviceAccountName: upgrader-cronjob-sa
+          restartPolicy: Never
+          containers:
+          - image: harness/upgrader:latest
+            name: upgrader
+            imagePullPolicy: Always
+            envFrom:
+            - secretRef:
+                name: kubernetes-delegate-upgrader-token
+            volumeMounts:
+              - name: config-volume
+                mountPath: /etc/config
+          volumes:
+            - name: config-volume
+              configMap:
+                name: kubernetes-delegate-upgrader-config
diff --git a/terraform/deployment/kubectl-cfg/clusterrolebining.yaml b/terraform/deployment/kubectl-cfg/clusterrolebining.yaml
new file mode 100644
index 0000000..c3cce2f
--- /dev/null
+++ b/terraform/deployment/kubectl-cfg/clusterrolebining.yaml
@@ -0,0 +1,12 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: aks-binding
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: cluster-admin
+subjects:
+- kind: ServiceAccount
+  name: aks-sa
+  namespace: default
diff --git a/terraform/deployment/kubectl-cfg/secret.yaml b/terraform/deployment/kubectl-cfg/secret.yaml
new file mode 100644
index 0000000..d94fd8b
--- /dev/null
+++ b/terraform/deployment/kubectl-cfg/secret.yaml
@@ -0,0 +1,7 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: my-sa-token
+  annotations:
+    kubernetes.io/service-account.name: aks-sa
+type: kubernetes.io/service-account-token
diff --git a/terraform/deployment/kubectl-cfg/serviceaccount.yaml b/terraform/deployment/kubectl-cfg/serviceaccount.yaml
new file mode 100644
index 0000000..19150e0
--- /dev/null
+++ b/terraform/deployment/kubectl-cfg/serviceaccount.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: aks-sa
+  namespace: default
diff --git a/terraform/deployment/main.hcl b/terraform/deployment/main.hcl
new file mode 100644
index 0000000..e69de29