@swovohq/fuel 0.2.2-alpha.9 → 0.2.2-alpha.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +108 -4
  2. package/dist/bin/fuel.js +76 -30
  3. package/dist/bin/fuel.js.map +1 -1
  4. package/dist/commands/config-verify.d.ts.map +1 -1
  5. package/dist/commands/config-verify.js +14 -6
  6. package/dist/commands/config-verify.js.map +1 -1
  7. package/dist/commands/create-app.d.ts.map +1 -1
  8. package/dist/commands/create-app.js +36 -4
  9. package/dist/commands/create-app.js.map +1 -1
  10. package/dist/commands/infra-deploy.d.ts +15 -1
  11. package/dist/commands/infra-deploy.d.ts.map +1 -1
  12. package/dist/commands/infra-deploy.js +144 -15
  13. package/dist/commands/infra-deploy.js.map +1 -1
  14. package/dist/commands/infra-destroy.js +3 -3
  15. package/dist/commands/infra-destroy.js.map +1 -1
  16. package/dist/commands/infra-init.d.ts +91 -0
  17. package/dist/commands/infra-init.d.ts.map +1 -1
  18. package/dist/commands/infra-init.js +510 -80
  19. package/dist/commands/infra-init.js.map +1 -1
  20. package/dist/commands/infra-pull.d.ts +8 -0
  21. package/dist/commands/infra-pull.d.ts.map +1 -0
  22. package/dist/commands/infra-pull.js +80 -0
  23. package/dist/commands/infra-pull.js.map +1 -0
  24. package/dist/engines/convention.d.ts +2 -2
  25. package/dist/engines/convention.d.ts.map +1 -1
  26. package/dist/engines/convention.js +6 -4
  27. package/dist/engines/convention.js.map +1 -1
  28. package/dist/engines/dependencies.d.ts +2 -0
  29. package/dist/engines/dependencies.d.ts.map +1 -1
  30. package/dist/engines/dependencies.js.map +1 -1
  31. package/dist/infra/azure-defaults.d.ts +49 -0
  32. package/dist/infra/azure-defaults.d.ts.map +1 -0
  33. package/dist/infra/azure-defaults.js +52 -0
  34. package/dist/infra/azure-defaults.js.map +1 -0
  35. package/dist/infra/azure-keyvault-client.d.ts +4 -0
  36. package/dist/infra/azure-keyvault-client.d.ts.map +1 -0
  37. package/dist/infra/azure-keyvault-client.js +57 -0
  38. package/dist/infra/azure-keyvault-client.js.map +1 -0
  39. package/dist/infra/azure-rbac.d.ts +11 -0
  40. package/dist/infra/azure-rbac.d.ts.map +1 -0
  41. package/dist/infra/azure-rbac.js +47 -0
  42. package/dist/infra/azure-rbac.js.map +1 -0
  43. package/dist/infra/azure-state-storage.d.ts +20 -0
  44. package/dist/infra/azure-state-storage.d.ts.map +1 -0
  45. package/dist/infra/azure-state-storage.js +229 -0
  46. package/dist/infra/azure-state-storage.js.map +1 -0
  47. package/dist/infra/credentials.d.ts +2 -2
  48. package/dist/infra/credentials.d.ts.map +1 -1
  49. package/dist/infra/credentials.js +8 -4
  50. package/dist/infra/credentials.js.map +1 -1
  51. package/dist/infra/deployment-detect.d.ts +9 -0
  52. package/dist/infra/deployment-detect.d.ts.map +1 -0
  53. package/dist/infra/deployment-detect.js +53 -0
  54. package/dist/infra/deployment-detect.js.map +1 -0
  55. package/dist/infra/git-client.d.ts.map +1 -1
  56. package/dist/infra/git-client.js +6 -10
  57. package/dist/infra/git-client.js.map +1 -1
  58. package/dist/infra/github-client.d.ts +7 -0
  59. package/dist/infra/github-client.d.ts.map +1 -1
  60. package/dist/infra/github-client.js +44 -4
  61. package/dist/infra/github-client.js.map +1 -1
  62. package/dist/infra/github-token-link.d.ts +4 -0
  63. package/dist/infra/github-token-link.d.ts.map +1 -0
  64. package/dist/infra/github-token-link.js +28 -0
  65. package/dist/infra/github-token-link.js.map +1 -0
  66. package/dist/infra/orchestrator.d.ts +4 -1
  67. package/dist/infra/orchestrator.d.ts.map +1 -1
  68. package/dist/infra/orchestrator.js +209 -59
  69. package/dist/infra/orchestrator.js.map +1 -1
  70. package/dist/infra/preflight.d.ts.map +1 -1
  71. package/dist/infra/preflight.js +17 -9
  72. package/dist/infra/preflight.js.map +1 -1
  73. package/dist/infra/remote-secret.d.ts +14 -0
  74. package/dist/infra/remote-secret.d.ts.map +1 -0
  75. package/dist/infra/remote-secret.js +42 -0
  76. package/dist/infra/remote-secret.js.map +1 -0
  77. package/dist/infra/template-engine.d.ts +14 -5
  78. package/dist/infra/template-engine.d.ts.map +1 -1
  79. package/dist/infra/template-engine.js +145 -39
  80. package/dist/infra/template-engine.js.map +1 -1
  81. package/dist/infra/tofu-runner.d.ts +4 -3
  82. package/dist/infra/tofu-runner.d.ts.map +1 -1
  83. package/dist/infra/tofu-runner.js +36 -27
  84. package/dist/infra/tofu-runner.js.map +1 -1
  85. package/dist/infra/types.d.ts +240 -16
  86. package/dist/infra/types.d.ts.map +1 -1
  87. package/dist/infra/types.js +207 -18
  88. package/dist/infra/types.js.map +1 -1
  89. package/dist/infra-templates/TODO-azure-prod.md +119 -0
  90. package/dist/infra-templates/modules/azure-container-app/main.tf +124 -0
  91. package/dist/infra-templates/modules/azure-container-app/outputs.tf +24 -0
  92. package/dist/infra-templates/modules/azure-container-app/variables.tf +80 -0
  93. package/dist/infra-templates/modules/azure-container-apps-environment/main.tf +18 -0
  94. package/dist/infra-templates/modules/azure-container-apps-environment/outputs.tf +14 -0
  95. package/dist/infra-templates/modules/azure-container-apps-environment/variables.tf +24 -0
  96. package/dist/infra-templates/modules/azure-container-registry/main.tf +10 -0
  97. package/dist/infra-templates/modules/azure-container-registry/outputs.tf +14 -0
  98. package/dist/infra-templates/modules/azure-container-registry/variables.tf +20 -0
  99. package/dist/infra-templates/modules/azure-front-door/main.tf +80 -0
  100. package/dist/infra-templates/modules/azure-front-door/outputs.tf +20 -0
  101. package/dist/infra-templates/modules/azure-front-door/variables.tf +26 -0
  102. package/dist/infra-templates/modules/azure-github-oidc/main.tf +48 -0
  103. package/dist/infra-templates/modules/azure-github-oidc/outputs.tf +9 -0
  104. package/dist/infra-templates/modules/azure-github-oidc/variables.tf +69 -0
  105. package/dist/infra-templates/modules/azure-key-vault/main.tf +21 -0
  106. package/dist/infra-templates/modules/azure-key-vault/outputs.tf +11 -0
  107. package/dist/infra-templates/modules/azure-key-vault/variables.tf +43 -0
  108. package/dist/infra-templates/modules/azure-monitor/main.tf +29 -0
  109. package/dist/infra-templates/modules/azure-monitor/outputs.tf +17 -0
  110. package/dist/infra-templates/modules/azure-monitor/variables.tf +32 -0
  111. package/dist/infra-templates/modules/azure-network/main.tf +134 -0
  112. package/dist/infra-templates/modules/azure-network/outputs.tf +44 -0
  113. package/dist/infra-templates/modules/azure-network/variables.tf +56 -0
  114. package/dist/infra-templates/modules/azure-postgresql-flexible/main.tf +34 -0
  115. package/dist/infra-templates/modules/azure-postgresql-flexible/outputs.tf +20 -0
  116. package/dist/infra-templates/modules/azure-postgresql-flexible/variables.tf +54 -0
  117. package/dist/infra-templates/modules/azure-redis-cache/main.tf +32 -0
  118. package/dist/infra-templates/modules/azure-redis-cache/outputs.tf +15 -0
  119. package/dist/infra-templates/modules/azure-redis-cache/variables.tf +30 -0
  120. package/dist/infra-templates/modules/azure-resource-group/main.tf +5 -0
  121. package/dist/infra-templates/modules/azure-resource-group/outputs.tf +11 -0
  122. package/dist/infra-templates/modules/azure-resource-group/variables.tf +16 -0
  123. package/dist/infra-templates/modules/azure-sql-database/main.tf +63 -0
  124. package/dist/infra-templates/modules/azure-sql-database/outputs.tf +20 -0
  125. package/dist/infra-templates/modules/azure-sql-database/variables.tf +78 -0
  126. package/dist/infra-templates/modules/azure-storage-account/main.tf +13 -0
  127. package/dist/infra-templates/modules/azure-storage-account/outputs.tf +16 -0
  128. package/dist/infra-templates/modules/azure-storage-account/variables.tf +38 -0
  129. package/dist/infra-templates/modules/cloud-watch/event-bridge.tf +15 -0
  130. package/dist/infra-templates/modules/cloud-watch/lambda.tf +84 -0
  131. package/dist/infra-templates/modules/cloud-watch/lambda_function.zip +0 -0
  132. package/dist/infra-templates/modules/cloud-watch/lambda_function_deploy.zip +0 -0
  133. package/dist/infra-templates/modules/cloud-watch/main.tf +156 -0
  134. package/dist/infra-templates/modules/cloud-watch/sns.tf +3 -0
  135. package/dist/infra-templates/modules/cloud-watch/variables.tf +38 -0
  136. package/dist/infra-templates/modules/ecs-core/alb.tf +126 -0
  137. package/dist/infra-templates/modules/ecs-core/cloudwatch.tf +48 -0
  138. package/dist/infra-templates/modules/ecs-core/iam.tf +95 -0
  139. package/dist/infra-templates/modules/ecs-core/main.tf +12 -0
  140. package/dist/infra-templates/modules/ecs-core/outputs.tf +44 -0
  141. package/dist/infra-templates/modules/ecs-core/secrets.tf +9 -0
  142. package/dist/infra-templates/modules/ecs-core/security_groups.tf +73 -0
  143. package/dist/infra-templates/modules/ecs-core/variables.tf +96 -0
  144. package/dist/infra-templates/modules/ecs-service/ecs_autoscaling.tf +51 -0
  145. package/dist/infra-templates/modules/ecs-service/ecs_service.tf +39 -0
  146. package/dist/infra-templates/modules/ecs-service/ecs_task_definition.tf +56 -0
  147. package/dist/infra-templates/modules/ecs-service/variables.tf +170 -0
  148. package/dist/infra-templates/modules/elastic-container-registry/main.tf +32 -0
  149. package/dist/infra-templates/modules/elastic-container-registry/outputs.tf +9 -0
  150. package/dist/infra-templates/modules/elastic-container-registry/variables.tf +25 -0
  151. package/dist/infra-templates/modules/github-oidc-role/main.tf +46 -0
  152. package/dist/infra-templates/modules/github-oidc-role/outputs.tf +4 -0
  153. package/dist/infra-templates/modules/github-oidc-role/variables.tf +11 -0
  154. package/dist/infra-templates/modules/guardduty/main.tf +8 -0
  155. package/dist/infra-templates/modules/iam/main.tf +205 -0
  156. package/dist/infra-templates/modules/iam/outputs.tf +3 -0
  157. package/dist/infra-templates/modules/iam/variables.tf +4 -0
  158. package/dist/infra-templates/modules/random-key/main.tf +11 -0
  159. package/dist/infra-templates/modules/random-key/outputs.tf +4 -0
  160. package/dist/infra-templates/modules/random-key/variables.tf +10 -0
  161. package/dist/infra-templates/modules/redis/main.tf +47 -0
  162. package/dist/infra-templates/modules/redis/outputs.tf +8 -0
  163. package/dist/infra-templates/modules/redis/variables.tf +20 -0
  164. package/dist/infra-templates/modules/relational-database-service/main.tf +44 -0
  165. package/dist/infra-templates/modules/relational-database-service/outputs.tf +13 -0
  166. package/dist/infra-templates/modules/relational-database-service/security-group.tf +15 -0
  167. package/dist/infra-templates/modules/relational-database-service/variables.tf +50 -0
  168. package/dist/infra-templates/modules/secret/main.tf +14 -0
  169. package/dist/infra-templates/modules/secret/outputs.tf +3 -0
  170. package/dist/infra-templates/modules/secret/variables.tf +8 -0
  171. package/dist/infra-templates/modules/simple-storage-service/main.tf +28 -0
  172. package/dist/infra-templates/modules/simple-storage-service/variables.tf +4 -0
  173. package/dist/infra-templates/modules/vpc/data.tf +2 -0
  174. package/dist/infra-templates/modules/vpc/main.tf +76 -0
  175. package/dist/infra-templates/modules/vpc/outputs.tf +23 -0
  176. package/dist/infra-templates/modules/vpc/variables.tf +5 -0
  177. package/dist/infra-templates/package.json +6 -0
  178. package/dist/infra-templates/templates/azure/MANUAL_DEPLOY.md +168 -0
  179. package/dist/infra-templates/templates/azure/backend.tf +8 -0
  180. package/dist/infra-templates/templates/azure/data.tf +21 -0
  181. package/dist/infra-templates/templates/azure/default.tfvars +0 -0
  182. package/dist/infra-templates/templates/azure/locals.tf +116 -0
  183. package/dist/infra-templates/templates/azure/main.tf +421 -0
  184. package/dist/infra-templates/templates/azure/outputs.tf +40 -0
  185. package/dist/infra-templates/templates/azure/providers.tf +65 -0
  186. package/dist/infra-templates/templates/azure/variables.tf +69 -0
  187. package/dist/infra-templates/templates/azure/workflows/build_and_deploy.yml +155 -0
  188. package/dist/infra-templates/templates/azure/workflows/tests.yml +63 -0
  189. package/dist/infra-templates/templates/ecs/README.md +225 -0
  190. package/dist/infra-templates/templates/ecs/backend.tf +7 -0
  191. package/dist/infra-templates/templates/ecs/data.tf +6 -0
  192. package/dist/infra-templates/templates/ecs/default.tfvars +1 -0
  193. package/dist/infra-templates/templates/ecs/locals.tf +97 -0
  194. package/dist/infra-templates/templates/ecs/main.tf +185 -0
  195. package/dist/infra-templates/templates/ecs/outputs.tf +42 -0
  196. package/dist/infra-templates/templates/ecs/providers.tf +21 -0
  197. package/dist/infra-templates/templates/ecs/variables.tf +105 -0
  198. package/dist/infra-templates/templates/ecs/workflows/build_and_deploy.yml +188 -0
  199. package/dist/infra-templates/templates/ecs/workflows/tests.yml +65 -0
  200. package/package.json +10 -2
  201. package/schema/fuel.schema.json +570 -91
@@ -0,0 +1,170 @@
1
+ ########################################################################################################################
2
+ ## Service variables
3
+ ########################################################################################################################
4
+
5
+ variable "app_name" {
6
+ description = "A Docker image-compatible name for the service"
7
+ type = string
8
+ }
9
+
10
+ variable "scenario" {
11
+ description = "Scenario name for tags"
12
+ default = "scenario-ecs-fargate"
13
+ type = string
14
+ }
15
+
16
+ ########################################################################################################################
17
+ ## ECS variables
18
+ ########################################################################################################################
19
+
20
+ variable "ecs_task_desired_count" {
21
+ description = "How many ECS tasks should run in parallel"
22
+ type = number
23
+ default = 1
24
+ }
25
+
26
+ variable "ecs_task_min_count" {
27
+ description = "How many ECS tasks should minimally run in parallel"
28
+ default = 1
29
+ type = number
30
+ }
31
+
32
+ variable "ecs_task_max_count" {
33
+ description = "How many ECS tasks should maximally run in parallel"
34
+ default = 10
35
+ type = number
36
+ }
37
+
38
+ # if you have multiple tasks running this should be 50%, but for 1 task
39
+ # it has to be zero so ecs can drain the task to replace it (making the service unstable for a few minutes)
40
+ variable "ecs_task_deployment_minimum_healthy_percent" {
41
+ description = "How many percent of a service must be running to still execute a safe deployment"
42
+ default = 100
43
+ type = number
44
+ }
45
+
46
+ variable "ecs_task_deployment_maximum_percent" {
47
+ description = "How many additional tasks are allowed to run (in percent) while a deployment is executed"
48
+ default = 200
49
+ type = number
50
+ }
51
+
52
+ variable "cpu_target_tracking_desired_value" {
53
+ description = "Target tracking for CPU usage in %"
54
+ default = 70
55
+ type = number
56
+ }
57
+
58
+ variable "memory_target_tracking_desired_value" {
59
+ description = "Target tracking for memory usage in %"
60
+ default = 80
61
+ type = number
62
+ }
63
+
64
+ variable "target_capacity" {
65
+ description = "Amount of resources of container instances that should be used for task placement in %"
66
+ default = 100
67
+ type = number
68
+ }
69
+
70
+ variable "container_port" {
71
+ description = "Port of the container"
72
+ type = number
73
+ default = 3000
74
+ }
75
+
76
+ variable "cpu_units" {
77
+ description = "Amount of CPU units for a single ECS task"
78
+ default = 1024
79
+ type = number
80
+ }
81
+
82
+ variable "memory" {
83
+ description = "Amount of memory in MB for a single ECS task"
84
+ default = 2048
85
+ type = number
86
+ }
87
+
88
+ variable "aws_region" {
89
+ description = "AWS Region"
90
+ type = string
91
+ }
92
+
93
+ variable "repository_url" {
94
+ description = "Image URL"
95
+ type = string
96
+ }
97
+
98
+ variable "default_security_group_id" {
99
+ description = "VPC Security Group"
100
+ type = string
101
+ }
102
+
103
+ variable "ecs_task_execution_role_arn" {
104
+ description = "ARN for the task execution role"
105
+ type = string
106
+ }
107
+
108
+ variable "ecs_task_role_arn" {
109
+ description = "ARN for the task role"
110
+ type = string
111
+ }
112
+
113
+ variable "ecs_log_group_name" {
114
+ description = "Log group name for ECS"
115
+ type = string
116
+ }
117
+
118
+ variable "ecs_cluster_id" {
119
+ description = "ECS cluster id to attach services to"
120
+ }
121
+
122
+ variable "ecs_cluster_name" {
123
+ description = "ECS cluster name"
124
+ }
125
+
126
+ variable "aws_alb_target_group_arn" {
127
+ description = "AWS ALB target group ARN"
128
+ type = string
129
+ }
130
+
131
+ variable "ecs_container_security_group_id" {
132
+ description = "ECS Container Security Group ID"
133
+ type = string
134
+ }
135
+
136
+ variable "private_subnets" {
137
+ description = "Private subnets for the ECS cluster"
138
+ default = ""
139
+ }
140
+
141
+ variable "ecs_secret_arn" {
142
+ description = "ARN for secrets"
143
+ type = string
144
+ }
145
+
146
+ variable "connect_to_alb" {
147
+ description = "Is this a public service?"
148
+ type = bool
149
+ }
150
+
151
+ variable "secret_name" {
152
+ description = "Name of the secret to use"
153
+ type = string
154
+ }
155
+
156
+ variable "env_vars" {
157
+ type = map(string)
158
+ default = {}
159
+ }
160
+ variable "ecs_circuit_breaker" {
161
+ description = "Enable Circuit Breaker"
162
+ type = bool
163
+ default = true
164
+ }
165
+
166
+ variable "ecs_rollback" {
167
+ description = "Automatically rollback if failure occurs"
168
+ type = bool
169
+ default = true
170
+ }
@@ -0,0 +1,32 @@
1
+ locals {
2
+ all_apps = merge(
3
+ { for app in var.apps : app.app_name => app },
4
+ { for worker in var.workers : worker.worker_name => worker }
5
+ )
6
+ }
7
+
8
+ module "ecr" {
9
+ source = "terraform-aws-modules/ecr/aws"
10
+ version = "2.2.0"
11
+
12
+ repository_name = "${var.project_name}-application"
13
+ repository_force_delete = true
14
+ repository_image_tag_mutability = "MUTABLE"
15
+ repository_lifecycle_policy = jsonencode({
16
+ rules = [
17
+ for idx, app_key in zipmap(range(length(keys(local.all_apps))), keys(local.all_apps)) : {
18
+ rulePriority = idx + 1
19
+ description = "Keep 5 most recent images with prefix '${app_key}'"
20
+ selection = {
21
+ tagStatus = "tagged"
22
+ tagPrefixList = [app_key]
23
+ countType = "imageCountMoreThan"
24
+ countNumber = 5
25
+ }
26
+ action = {
27
+ type = "expire"
28
+ }
29
+ }
30
+ ]
31
+ })
32
+ }
@@ -0,0 +1,9 @@
1
+ output "repository_url" {
2
+ description = "The URL of the repository."
3
+ value = module.ecr.repository_url
4
+ }
5
+
6
+ output "registry_id" {
7
+ description = "The registry ID"
8
+ value = module.ecr.repository_registry_id
9
+ }
@@ -0,0 +1,25 @@
1
+ variable "project_name" {
2
+ description = "Repository name will be created based on project name"
3
+ default = ""
4
+ }
5
+
6
+ variable "apps" {
7
+ description = "An array of apps from config.json"
8
+ type = set(object({
9
+ app_name = string
10
+ technology = string
11
+ dockerfile = string
12
+ build_env = string
13
+ }))
14
+ }
15
+
16
+ variable "workers" {
17
+ description = "An array of workers from config.json"
18
+ type = set(object({
19
+ app_name = string
20
+ technology = string
21
+ dockerfile = string
22
+ worker_name = string
23
+ build_env = string
24
+ }))
25
+ }
@@ -0,0 +1,46 @@
1
+ locals {
2
+ oidc_provider_arn = "arn:aws:iam::${var.aws_account_id}:oidc-provider/token.actions.githubusercontent.com"
3
+ }
4
+
5
+ moved {
6
+ from = aws_iam_openid_connect_provider.github[0]
7
+ to = aws_iam_openid_connect_provider.github
8
+ }
9
+
10
+ resource "aws_iam_openid_connect_provider" "github" {
11
+ url = "https://token.actions.githubusercontent.com"
12
+ client_id_list = ["sts.amazonaws.com"]
13
+ thumbprint_list = ["6938fd4d98bab03faadb97b34396831e3780aea1"]
14
+ }
15
+
16
+ resource "aws_iam_role" "github_actions_role" {
17
+ name = "${var.project_name}-github-actions-role"
18
+
19
+ assume_role_policy = jsonencode({
20
+ Version = "2012-10-17"
21
+ Statement = [
22
+ {
23
+ Effect = "Allow"
24
+ Principal = {
25
+ Federated = local.oidc_provider_arn
26
+ }
27
+ Action = "sts:AssumeRoleWithWebIdentity"
28
+ Condition = {
29
+ StringLike = {
30
+ "token.actions.githubusercontent.com:sub" = "repo:${var.github_organization}/*"
31
+ }
32
+ }
33
+ }
34
+ ]
35
+ })
36
+ }
37
+
38
+ resource "aws_iam_role_policy_attachment" "ecr_image_builder_policy" {
39
+ role = aws_iam_role.github_actions_role.name
40
+ policy_arn = "arn:aws:iam::aws:policy/EC2InstanceProfileForImageBuilderECRContainerBuilds"
41
+ }
42
+
43
+ resource "aws_iam_role_policy_attachment" "ecs_full_access" {
44
+ role = aws_iam_role.github_actions_role.name
45
+ policy_arn = "arn:aws:iam::aws:policy/AmazonECS_FullAccess"
46
+ }
@@ -0,0 +1,4 @@
1
+ output "role_arn" {
2
+ value = aws_iam_role.github_actions_role.arn
3
+ description = "ARN of the GitHub Actions OIDC IAM role"
4
+ }
@@ -0,0 +1,11 @@
1
+ variable "project_name" {
2
+ description = "Project name used as prefix for resource names"
3
+ }
4
+
5
+ variable "github_organization" {
6
+ description = "GitHub organization name for OIDC trust policy"
7
+ }
8
+
9
+ variable "aws_account_id" {
10
+ description = "AWS account ID for constructing OIDC provider ARN"
11
+ }
@@ -0,0 +1,8 @@
1
+ moved {
2
+ from = aws_guardduty_detector.main[0]
3
+ to = aws_guardduty_detector.main
4
+ }
5
+
6
+ resource "aws_guardduty_detector" "main" {
7
+ enable = true
8
+ }
@@ -0,0 +1,205 @@
1
+ resource "aws_iam_policy" "this" {
2
+ name = "${var.project_name}AWSLoadBalancerControllerIAMPolicy"
3
+ description = "IAM policy for Load Balancer"
4
+ policy = jsonencode({
5
+ Version = "2012-10-17"
6
+ Statement = [
7
+ {
8
+ Effect = "Allow"
9
+ Action = [
10
+ "iam:CreateServiceLinkedRole"
11
+ ]
12
+ Resource = "*"
13
+ Condition = {
14
+ StringEquals = {
15
+ "iam:AWSServiceName" : "elasticloadbalancing.amazonaws.com"
16
+ }
17
+ }
18
+ },
19
+ {
20
+ Effect = "Allow"
21
+ Action = [
22
+ "ec2:DescribeAccountAttributes",
23
+ "ec2:DescribeAddresses",
24
+ "ec2:DescribeAvailabilityZones",
25
+ "ec2:DescribeInternetGateways",
26
+ "ec2:DescribeVpcs",
27
+ "ec2:DescribeVpcPeeringConnections",
28
+ "ec2:DescribeSubnets",
29
+ "ec2:DescribeSecurityGroups",
30
+ "ec2:DescribeInstances",
31
+ "ec2:DescribeNetworkInterfaces",
32
+ "ec2:DescribeTags",
33
+ "ec2:GetCoipPoolUsage",
34
+ "ec2:DescribeCoipPools",
35
+ "elasticloadbalancing:DescribeLoadBalancers",
36
+ "elasticloadbalancing:DescribeLoadBalancerAttributes",
37
+ "elasticloadbalancing:DescribeListeners",
38
+ "elasticloadbalancing:DescribeListenerCertificates",
39
+ "elasticloadbalancing:DescribeSSLPolicies",
40
+ "elasticloadbalancing:DescribeRules",
41
+ "elasticloadbalancing:DescribeTargetGroups",
42
+ "elasticloadbalancing:DescribeTargetGroupAttributes",
43
+ "elasticloadbalancing:DescribeTargetHealth",
44
+ "elasticloadbalancing:DescribeTags"
45
+ ]
46
+ Resource = "*"
47
+ },
48
+ {
49
+ Effect = "Allow"
50
+ Action = [
51
+ "cognito-idp:DescribeUserPoolClient",
52
+ "acm:ListCertificates",
53
+ "acm:DescribeCertificate",
54
+ "iam:ListServerCertificates",
55
+ "iam:GetServerCertificate",
56
+ "waf-regional:GetWebACL",
57
+ "waf-regional:GetWebACLForResource",
58
+ "waf-regional:AssociateWebACL",
59
+ "waf-regional:DisassociateWebACL",
60
+ "wafv2:GetWebACL",
61
+ "wafv2:GetWebACLForResource",
62
+ "wafv2:AssociateWebACL",
63
+ "wafv2:DisassociateWebACL",
64
+ "shield:GetSubscriptionState",
65
+ "shield:DescribeProtection",
66
+ "shield:CreateProtection",
67
+ "shield:DeleteProtection"
68
+ ]
69
+ Resource = "*"
70
+ },
71
+ {
72
+ Effect = "Allow"
73
+ Action = [
74
+ "ec2:AuthorizeSecurityGroupIngress",
75
+ "ec2:RevokeSecurityGroupIngress"
76
+ ]
77
+ Resource = "*"
78
+ },
79
+ {
80
+ Effect = "Allow"
81
+ Action = [
82
+ "ec2:CreateSecurityGroup"
83
+ ]
84
+ Resource = "*"
85
+ },
86
+ {
87
+ Effect = "Allow"
88
+ Action = [
89
+ "ec2:CreateTags"
90
+ ]
91
+ Resource = "arn:aws:ec2:*:*:security-group/*"
92
+ Condition = {
93
+ StringEquals = {
94
+ "ec2:CreateAction" : "CreateSecurityGroup"
95
+ }
96
+ }
97
+ },
98
+ {
99
+ Effect = "Allow"
100
+ Action = [
101
+ "ec2:AuthorizeSecurityGroupIngress",
102
+ "ec2:RevokeSecurityGroupIngress",
103
+ "ec2:DeleteSecurityGroup"
104
+ ]
105
+ Resource = "*"
106
+ },
107
+ {
108
+ Effect = "Allow"
109
+ Action = [
110
+ "elasticloadbalancing:CreateLoadBalancer",
111
+ "elasticloadbalancing:CreateTargetGroup"
112
+ ]
113
+ Resource = "*"
114
+ },
115
+ {
116
+ Effect = "Allow"
117
+ Action = [
118
+ "elasticloadbalancing:CreateListener",
119
+ "elasticloadbalancing:DeleteListener",
120
+ "elasticloadbalancing:CreateRule",
121
+ "elasticloadbalancing:DeleteRule"
122
+ ]
123
+ Resource = "*"
124
+ },
125
+ {
126
+ Effect = "Allow"
127
+ Action = [
128
+ "elasticloadbalancing:AddTags",
129
+ "elasticloadbalancing:RemoveTags"
130
+ ]
131
+ Resource = [
132
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
133
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
134
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
135
+ ]
136
+ },
137
+ {
138
+ Effect = "Allow"
139
+ Action = [
140
+ "elasticloadbalancing:AddTags",
141
+ "elasticloadbalancing:RemoveTags"
142
+ ]
143
+ Resource = [
144
+ "arn:aws:elasticloadbalancing:*:*:listener/net/*/*/*",
145
+ "arn:aws:elasticloadbalancing:*:*:listener/app/*/*/*",
146
+ "arn:aws:elasticloadbalancing:*:*:listener-rule/net/*/*/*",
147
+ "arn:aws:elasticloadbalancing:*:*:listener-rule/app/*/*/*"
148
+ ]
149
+ },
150
+ {
151
+ Effect = "Allow"
152
+ Action = [
153
+ "elasticloadbalancing:ModifyLoadBalancerAttributes",
154
+ "elasticloadbalancing:SetIpAddressType",
155
+ "elasticloadbalancing:SetSecurityGroups",
156
+ "elasticloadbalancing:SetSubnets",
157
+ "elasticloadbalancing:DeleteLoadBalancer",
158
+ "elasticloadbalancing:ModifyTargetGroup",
159
+ "elasticloadbalancing:ModifyTargetGroupAttributes",
160
+ "elasticloadbalancing:DeleteTargetGroup"
161
+ ]
162
+ Resource = "*"
163
+ },
164
+ {
165
+ Effect = "Allow"
166
+ Action = [
167
+ "elasticloadbalancing:AddTags"
168
+ ]
169
+ Resource = [
170
+ "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
171
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/net/*/*",
172
+ "arn:aws:elasticloadbalancing:*:*:loadbalancer/app/*/*"
173
+ ]
174
+ Condition = {
175
+ StringEquals = {
176
+ "elasticloadbalancing:CreateAction" : [
177
+ "CreateTargetGroup",
178
+ "CreateLoadBalancer"
179
+ ]
180
+ }
181
+ }
182
+ },
183
+ {
184
+ Effect = "Allow"
185
+ Action = [
186
+ "elasticloadbalancing:RegisterTargets",
187
+ "elasticloadbalancing:DeregisterTargets"
188
+ ]
189
+ Resource = "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*"
190
+ },
191
+ {
192
+ Effect = "Allow"
193
+ Action = [
194
+ "elasticloadbalancing:SetWebAcl",
195
+ "elasticloadbalancing:ModifyListener",
196
+ "elasticloadbalancing:AddListenerCertificates",
197
+ "elasticloadbalancing:RemoveListenerCertificates",
198
+ "elasticloadbalancing:ModifyRule"
199
+ ]
200
+ Resource = "*"
201
+ }
202
+ ]
203
+ })
204
+ }
205
+
@@ -0,0 +1,3 @@
1
+ output "policy_arn" {
2
+ value = aws_iam_policy.this.arn
3
+ }
@@ -0,0 +1,4 @@
1
+ variable "project_name" {
2
+ description = "A unique name for your project. This will be used as part of resource names."
3
+ default = ""
4
+ }
@@ -0,0 +1,11 @@
1
+ resource "random_string" "this" {
2
+ length = var.length
3
+ upper = true
4
+ lower = true
5
+ numeric = true
6
+ special = false
7
+
8
+ keepers = {
9
+ constant = var.name
10
+ }
11
+ }
@@ -0,0 +1,4 @@
1
+ output "value" {
2
+ value = random_string.this.result
3
+ sensitive = true
4
+ }
@@ -0,0 +1,10 @@
1
+ variable "name" {
2
+ type = string
3
+ description = "Keeper value — disambiguates this instance so unrelated random-key module calls don't collide or force each other to regenerate."
4
+ }
5
+
6
+ variable "length" {
7
+ type = number
8
+ description = "Length of the generated random string."
9
+ default = 32
10
+ }
@@ -0,0 +1,47 @@
1
+ resource "aws_security_group" "staging" {
2
+ name = "${var.app_name}-redis-sg"
3
+ description = "Allow Redis traffic"
4
+ vpc_id = var.vpc_id
5
+
6
+ ingress {
7
+ from_port = 6379
8
+ to_port = 6379
9
+ protocol = "tcp"
10
+ cidr_blocks = ["0.0.0.0/0"]
11
+ }
12
+
13
+ egress {
14
+ from_port = 0
15
+ to_port = 0
16
+ protocol = "-1"
17
+ cidr_blocks = ["0.0.0.0/0"]
18
+ }
19
+ }
20
+
21
+ resource "aws_elasticache_subnet_group" "staging" {
22
+ name = "${var.app_name}-ecsg"
23
+ subnet_ids = var.subnet_ids
24
+ }
25
+
26
+ resource "aws_elasticache_cluster" "staging" {
27
+ cluster_id = var.app_name
28
+ engine = "redis"
29
+ node_type = var.node_type
30
+ num_cache_nodes = 1
31
+ parameter_group_name = aws_elasticache_parameter_group.staging.name
32
+ engine_version = "7.1"
33
+ port = 6379
34
+ subnet_group_name = aws_elasticache_subnet_group.staging.name
35
+ security_group_ids = [aws_security_group.staging.id]
36
+ }
37
+
38
+ resource "aws_elasticache_parameter_group" "staging" {
39
+ name = "${var.app_name}-ec-param-group"
40
+ family = "redis7"
41
+ description = "Custom parameter group for Redis cluster"
42
+
43
+ parameter {
44
+ name = "maxmemory-policy"
45
+ value = "noeviction"
46
+ }
47
+ }
@@ -0,0 +1,8 @@
1
+ output "elasticache_cluster_hostname" {
2
+ value = aws_elasticache_cluster.staging.cache_nodes[0].address
3
+ description = "The hostname of the ElastiCache cluster node"
4
+ }
5
+
6
+ output "app_name" {
7
+ value = var.app_name
8
+ }
@@ -0,0 +1,20 @@
1
+ variable "vpc_id" {
2
+ description = "The id of environment VPC"
3
+ default = ""
4
+ }
5
+
6
+ variable "subnet_ids" {
7
+ type = list(string)
8
+ description = "List of private subnet IDs"
9
+ default = []
10
+ }
11
+
12
+ variable "app_name" {
13
+ description = "Cognito user pool name"
14
+ default = ""
15
+ }
16
+
17
+ variable "node_type" {
18
+ description = "ElastiCache node type"
19
+ default = "cache.t3.small"
20
+ }
@@ -0,0 +1,44 @@
1
+ resource "random_password" "db" {
2
+ length = 32
3
+ special = false
4
+
5
+ keepers = {
6
+ app_name = var.app_name
7
+ }
8
+ }
9
+
10
+ locals {
11
+ effective_db_password = coalesce(var.db_password, random_password.db.result)
12
+ }
13
+
14
+ module "db" {
15
+ source = "terraform-aws-modules/rds/aws"
16
+ version = "6.13.1"
17
+
18
+ identifier = var.app_name
19
+
20
+ engine = "postgres"
21
+ engine_version = "14.22"
22
+ instance_class = var.db_instance_type
23
+ allocated_storage = var.db_allocated_storage
24
+
25
+ db_name = var.db_name
26
+ username = var.db_username
27
+ password = local.effective_db_password
28
+
29
+ iam_database_authentication_enabled = false
30
+ manage_master_user_password = false
31
+ publicly_accessible = true
32
+
33
+ vpc_security_group_ids = [aws_security_group.this.id, var.vpc_security_group_default]
34
+
35
+ maintenance_window = "Mon:00:00-Mon:03:00"
36
+ backup_window = "03:00-06:00"
37
+
38
+ create_db_subnet_group = true
39
+ subnet_ids = var.subnet_ids
40
+
41
+ family = "postgres14"
42
+ major_engine_version = "14"
43
+ deletion_protection = false
44
+ }