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

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 (232) hide show
  1. package/README.md +173 -69
  2. package/dist/bin/fuel.js +77 -31
  3. package/dist/bin/fuel.js.map +1 -1
  4. package/dist/cleanup/finalize.d.ts.map +1 -1
  5. package/dist/cleanup/finalize.js +11 -3
  6. package/dist/cleanup/finalize.js.map +1 -1
  7. package/dist/commands/config-verify.d.ts.map +1 -1
  8. package/dist/commands/config-verify.js +14 -6
  9. package/dist/commands/config-verify.js.map +1 -1
  10. package/dist/commands/create-app.d.ts.map +1 -1
  11. package/dist/commands/create-app.js +41 -7
  12. package/dist/commands/create-app.js.map +1 -1
  13. package/dist/commands/infra-deploy.d.ts +15 -1
  14. package/dist/commands/infra-deploy.d.ts.map +1 -1
  15. package/dist/commands/infra-deploy.js +164 -18
  16. package/dist/commands/infra-deploy.js.map +1 -1
  17. package/dist/commands/infra-destroy.d.ts.map +1 -1
  18. package/dist/commands/infra-destroy.js +3 -3
  19. package/dist/commands/infra-destroy.js.map +1 -1
  20. package/dist/commands/infra-init.d.ts +91 -0
  21. package/dist/commands/infra-init.d.ts.map +1 -1
  22. package/dist/commands/infra-init.js +644 -113
  23. package/dist/commands/infra-init.js.map +1 -1
  24. package/dist/commands/infra-pull.d.ts +8 -0
  25. package/dist/commands/infra-pull.d.ts.map +1 -0
  26. package/dist/commands/infra-pull.js +81 -0
  27. package/dist/commands/infra-pull.js.map +1 -0
  28. package/dist/commands/list-modules.d.ts.map +1 -1
  29. package/dist/commands/list-modules.js +10 -3
  30. package/dist/commands/list-modules.js.map +1 -1
  31. package/dist/engines/convention.d.ts +2 -2
  32. package/dist/engines/convention.d.ts.map +1 -1
  33. package/dist/engines/convention.js +8 -6
  34. package/dist/engines/convention.js.map +1 -1
  35. package/dist/engines/dependencies.d.ts +2 -0
  36. package/dist/engines/dependencies.d.ts.map +1 -1
  37. package/dist/engines/dependencies.js.map +1 -1
  38. package/dist/engines/monorepo.d.ts.map +1 -1
  39. package/dist/engines/monorepo.js.map +1 -1
  40. package/dist/engines/template-source.d.ts.map +1 -1
  41. package/dist/engines/template-source.js +3 -1
  42. package/dist/engines/template-source.js.map +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/infra/azure-defaults.d.ts +49 -0
  46. package/dist/infra/azure-defaults.d.ts.map +1 -0
  47. package/dist/infra/azure-defaults.js +52 -0
  48. package/dist/infra/azure-defaults.js.map +1 -0
  49. package/dist/infra/azure-keyvault-client.d.ts +4 -0
  50. package/dist/infra/azure-keyvault-client.d.ts.map +1 -0
  51. package/dist/infra/azure-keyvault-client.js +57 -0
  52. package/dist/infra/azure-keyvault-client.js.map +1 -0
  53. package/dist/infra/azure-rbac.d.ts +11 -0
  54. package/dist/infra/azure-rbac.d.ts.map +1 -0
  55. package/dist/infra/azure-rbac.js +49 -0
  56. package/dist/infra/azure-rbac.js.map +1 -0
  57. package/dist/infra/azure-state-storage.d.ts +20 -0
  58. package/dist/infra/azure-state-storage.d.ts.map +1 -0
  59. package/dist/infra/azure-state-storage.js +229 -0
  60. package/dist/infra/azure-state-storage.js.map +1 -0
  61. package/dist/infra/config-loader.d.ts.map +1 -1
  62. package/dist/infra/config-loader.js.map +1 -1
  63. package/dist/infra/config-writer.js +1 -1
  64. package/dist/infra/credentials.d.ts +2 -2
  65. package/dist/infra/credentials.d.ts.map +1 -1
  66. package/dist/infra/credentials.js +8 -4
  67. package/dist/infra/credentials.js.map +1 -1
  68. package/dist/infra/dependency-checker.d.ts.map +1 -1
  69. package/dist/infra/dependency-checker.js.map +1 -1
  70. package/dist/infra/deployment-detect.d.ts +9 -0
  71. package/dist/infra/deployment-detect.d.ts.map +1 -0
  72. package/dist/infra/deployment-detect.js +53 -0
  73. package/dist/infra/deployment-detect.js.map +1 -0
  74. package/dist/infra/git-client.d.ts.map +1 -1
  75. package/dist/infra/git-client.js +6 -10
  76. package/dist/infra/git-client.js.map +1 -1
  77. package/dist/infra/github-client.d.ts +7 -0
  78. package/dist/infra/github-client.d.ts.map +1 -1
  79. package/dist/infra/github-client.js +47 -7
  80. package/dist/infra/github-client.js.map +1 -1
  81. package/dist/infra/github-secrets-client.d.ts.map +1 -1
  82. package/dist/infra/github-secrets-client.js +2 -2
  83. package/dist/infra/github-secrets-client.js.map +1 -1
  84. package/dist/infra/github-token-link.d.ts +4 -0
  85. package/dist/infra/github-token-link.d.ts.map +1 -0
  86. package/dist/infra/github-token-link.js +32 -0
  87. package/dist/infra/github-token-link.js.map +1 -0
  88. package/dist/infra/orchestrator.d.ts +4 -1
  89. package/dist/infra/orchestrator.d.ts.map +1 -1
  90. package/dist/infra/orchestrator.js +218 -63
  91. package/dist/infra/orchestrator.js.map +1 -1
  92. package/dist/infra/port-utils.d.ts.map +1 -1
  93. package/dist/infra/port-utils.js.map +1 -1
  94. package/dist/infra/preflight.d.ts.map +1 -1
  95. package/dist/infra/preflight.js +25 -11
  96. package/dist/infra/preflight.js.map +1 -1
  97. package/dist/infra/remote-secret.d.ts +14 -0
  98. package/dist/infra/remote-secret.d.ts.map +1 -0
  99. package/dist/infra/remote-secret.js +42 -0
  100. package/dist/infra/remote-secret.js.map +1 -0
  101. package/dist/infra/s3-state-bucket.d.ts.map +1 -1
  102. package/dist/infra/s3-state-bucket.js +8 -4
  103. package/dist/infra/s3-state-bucket.js.map +1 -1
  104. package/dist/infra/secrets-manager-client.d.ts.map +1 -1
  105. package/dist/infra/secrets-manager-client.js +8 -5
  106. package/dist/infra/secrets-manager-client.js.map +1 -1
  107. package/dist/infra/subprocess.js +1 -1
  108. package/dist/infra/template-engine.d.ts +14 -5
  109. package/dist/infra/template-engine.d.ts.map +1 -1
  110. package/dist/infra/template-engine.js +157 -39
  111. package/dist/infra/template-engine.js.map +1 -1
  112. package/dist/infra/tofu-runner.d.ts +4 -3
  113. package/dist/infra/tofu-runner.d.ts.map +1 -1
  114. package/dist/infra/tofu-runner.js +40 -34
  115. package/dist/infra/tofu-runner.js.map +1 -1
  116. package/dist/infra/types.d.ts +241 -17
  117. package/dist/infra/types.d.ts.map +1 -1
  118. package/dist/infra/types.js +419 -22
  119. package/dist/infra/types.js.map +1 -1
  120. package/dist/infra-templates/TODO-azure-prod.md +127 -0
  121. package/dist/infra-templates/modules/azure-container-app/main.tf +124 -0
  122. package/dist/infra-templates/modules/azure-container-app/outputs.tf +24 -0
  123. package/dist/infra-templates/modules/azure-container-app/variables.tf +80 -0
  124. package/dist/infra-templates/modules/azure-container-apps-environment/main.tf +18 -0
  125. package/dist/infra-templates/modules/azure-container-apps-environment/outputs.tf +14 -0
  126. package/dist/infra-templates/modules/azure-container-apps-environment/variables.tf +24 -0
  127. package/dist/infra-templates/modules/azure-container-registry/main.tf +10 -0
  128. package/dist/infra-templates/modules/azure-container-registry/outputs.tf +14 -0
  129. package/dist/infra-templates/modules/azure-container-registry/variables.tf +20 -0
  130. package/dist/infra-templates/modules/azure-front-door/main.tf +80 -0
  131. package/dist/infra-templates/modules/azure-front-door/outputs.tf +20 -0
  132. package/dist/infra-templates/modules/azure-front-door/variables.tf +26 -0
  133. package/dist/infra-templates/modules/azure-github-oidc/main.tf +48 -0
  134. package/dist/infra-templates/modules/azure-github-oidc/outputs.tf +9 -0
  135. package/dist/infra-templates/modules/azure-github-oidc/variables.tf +69 -0
  136. package/dist/infra-templates/modules/azure-key-vault/main.tf +21 -0
  137. package/dist/infra-templates/modules/azure-key-vault/outputs.tf +11 -0
  138. package/dist/infra-templates/modules/azure-key-vault/variables.tf +43 -0
  139. package/dist/infra-templates/modules/azure-monitor/main.tf +29 -0
  140. package/dist/infra-templates/modules/azure-monitor/outputs.tf +17 -0
  141. package/dist/infra-templates/modules/azure-monitor/variables.tf +32 -0
  142. package/dist/infra-templates/modules/azure-network/main.tf +134 -0
  143. package/dist/infra-templates/modules/azure-network/outputs.tf +44 -0
  144. package/dist/infra-templates/modules/azure-network/variables.tf +56 -0
  145. package/dist/infra-templates/modules/azure-postgresql-flexible/main.tf +34 -0
  146. package/dist/infra-templates/modules/azure-postgresql-flexible/outputs.tf +20 -0
  147. package/dist/infra-templates/modules/azure-postgresql-flexible/variables.tf +54 -0
  148. package/dist/infra-templates/modules/azure-redis-cache/main.tf +32 -0
  149. package/dist/infra-templates/modules/azure-redis-cache/outputs.tf +15 -0
  150. package/dist/infra-templates/modules/azure-redis-cache/variables.tf +30 -0
  151. package/dist/infra-templates/modules/azure-resource-group/main.tf +5 -0
  152. package/dist/infra-templates/modules/azure-resource-group/outputs.tf +11 -0
  153. package/dist/infra-templates/modules/azure-resource-group/variables.tf +16 -0
  154. package/dist/infra-templates/modules/azure-sql-database/main.tf +63 -0
  155. package/dist/infra-templates/modules/azure-sql-database/outputs.tf +20 -0
  156. package/dist/infra-templates/modules/azure-sql-database/variables.tf +78 -0
  157. package/dist/infra-templates/modules/azure-storage-account/main.tf +13 -0
  158. package/dist/infra-templates/modules/azure-storage-account/outputs.tf +16 -0
  159. package/dist/infra-templates/modules/azure-storage-account/variables.tf +38 -0
  160. package/dist/infra-templates/modules/cloud-watch/event-bridge.tf +15 -0
  161. package/dist/infra-templates/modules/cloud-watch/lambda.tf +84 -0
  162. package/dist/infra-templates/modules/cloud-watch/lambda_function.zip +0 -0
  163. package/dist/infra-templates/modules/cloud-watch/lambda_function_deploy.zip +0 -0
  164. package/dist/infra-templates/modules/cloud-watch/main.tf +156 -0
  165. package/dist/infra-templates/modules/cloud-watch/sns.tf +3 -0
  166. package/dist/infra-templates/modules/cloud-watch/variables.tf +38 -0
  167. package/dist/infra-templates/modules/ecs-core/alb.tf +126 -0
  168. package/dist/infra-templates/modules/ecs-core/cloudwatch.tf +48 -0
  169. package/dist/infra-templates/modules/ecs-core/iam.tf +95 -0
  170. package/dist/infra-templates/modules/ecs-core/main.tf +12 -0
  171. package/dist/infra-templates/modules/ecs-core/outputs.tf +44 -0
  172. package/dist/infra-templates/modules/ecs-core/secrets.tf +9 -0
  173. package/dist/infra-templates/modules/ecs-core/security_groups.tf +73 -0
  174. package/dist/infra-templates/modules/ecs-core/variables.tf +96 -0
  175. package/dist/infra-templates/modules/ecs-service/ecs_autoscaling.tf +51 -0
  176. package/dist/infra-templates/modules/ecs-service/ecs_service.tf +39 -0
  177. package/dist/infra-templates/modules/ecs-service/ecs_task_definition.tf +56 -0
  178. package/dist/infra-templates/modules/ecs-service/variables.tf +170 -0
  179. package/dist/infra-templates/modules/elastic-container-registry/main.tf +32 -0
  180. package/dist/infra-templates/modules/elastic-container-registry/outputs.tf +9 -0
  181. package/dist/infra-templates/modules/elastic-container-registry/variables.tf +25 -0
  182. package/dist/infra-templates/modules/github-oidc-role/main.tf +46 -0
  183. package/dist/infra-templates/modules/github-oidc-role/outputs.tf +4 -0
  184. package/dist/infra-templates/modules/github-oidc-role/variables.tf +11 -0
  185. package/dist/infra-templates/modules/guardduty/main.tf +8 -0
  186. package/dist/infra-templates/modules/iam/main.tf +205 -0
  187. package/dist/infra-templates/modules/iam/outputs.tf +3 -0
  188. package/dist/infra-templates/modules/iam/variables.tf +4 -0
  189. package/dist/infra-templates/modules/random-key/main.tf +11 -0
  190. package/dist/infra-templates/modules/random-key/outputs.tf +4 -0
  191. package/dist/infra-templates/modules/random-key/variables.tf +10 -0
  192. package/dist/infra-templates/modules/redis/main.tf +47 -0
  193. package/dist/infra-templates/modules/redis/outputs.tf +8 -0
  194. package/dist/infra-templates/modules/redis/variables.tf +20 -0
  195. package/dist/infra-templates/modules/relational-database-service/main.tf +44 -0
  196. package/dist/infra-templates/modules/relational-database-service/outputs.tf +13 -0
  197. package/dist/infra-templates/modules/relational-database-service/security-group.tf +15 -0
  198. package/dist/infra-templates/modules/relational-database-service/variables.tf +50 -0
  199. package/dist/infra-templates/modules/secret/main.tf +14 -0
  200. package/dist/infra-templates/modules/secret/outputs.tf +3 -0
  201. package/dist/infra-templates/modules/secret/variables.tf +8 -0
  202. package/dist/infra-templates/modules/simple-storage-service/main.tf +28 -0
  203. package/dist/infra-templates/modules/simple-storage-service/variables.tf +4 -0
  204. package/dist/infra-templates/modules/vpc/data.tf +2 -0
  205. package/dist/infra-templates/modules/vpc/main.tf +76 -0
  206. package/dist/infra-templates/modules/vpc/outputs.tf +23 -0
  207. package/dist/infra-templates/modules/vpc/variables.tf +5 -0
  208. package/dist/infra-templates/package.json +6 -0
  209. package/dist/infra-templates/templates/azure/MANUAL_DEPLOY.md +168 -0
  210. package/dist/infra-templates/templates/azure/backend.tf +8 -0
  211. package/dist/infra-templates/templates/azure/data.tf +21 -0
  212. package/dist/infra-templates/templates/azure/default.tfvars +0 -0
  213. package/dist/infra-templates/templates/azure/locals.tf +116 -0
  214. package/dist/infra-templates/templates/azure/main.tf +421 -0
  215. package/dist/infra-templates/templates/azure/outputs.tf +40 -0
  216. package/dist/infra-templates/templates/azure/providers.tf +65 -0
  217. package/dist/infra-templates/templates/azure/variables.tf +69 -0
  218. package/dist/infra-templates/templates/azure/workflows/build_and_deploy.yml +155 -0
  219. package/dist/infra-templates/templates/azure/workflows/tests.yml +63 -0
  220. package/dist/infra-templates/templates/ecs/README.md +235 -0
  221. package/dist/infra-templates/templates/ecs/backend.tf +7 -0
  222. package/dist/infra-templates/templates/ecs/data.tf +6 -0
  223. package/dist/infra-templates/templates/ecs/default.tfvars +1 -0
  224. package/dist/infra-templates/templates/ecs/locals.tf +97 -0
  225. package/dist/infra-templates/templates/ecs/main.tf +185 -0
  226. package/dist/infra-templates/templates/ecs/outputs.tf +42 -0
  227. package/dist/infra-templates/templates/ecs/providers.tf +21 -0
  228. package/dist/infra-templates/templates/ecs/variables.tf +105 -0
  229. package/dist/infra-templates/templates/ecs/workflows/build_and_deploy.yml +188 -0
  230. package/dist/infra-templates/templates/ecs/workflows/tests.yml +65 -0
  231. package/package.json +10 -2
  232. package/schema/fuel.schema.json +570 -91
@@ -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
+ }
@@ -0,0 +1,13 @@
1
+ output "db_hostname" {
2
+ value = module.db.db_instance_endpoint
3
+ description = "The database hostname (endpoint) for staging. Will be 'N/A' if not created."
4
+ }
5
+
6
+ output "db_password" {
7
+ value = local.effective_db_password
8
+ sensitive = true
9
+ }
10
+
11
+ output "app_name" {
12
+ value = var.app_name
13
+ }
@@ -0,0 +1,15 @@
1
+ resource "aws_security_group" "this" {
2
+ name = "${var.app_name}-rds-security-group"
3
+ description = "Security group for RDS instance"
4
+ vpc_id = var.vpc_id
5
+ }
6
+
7
+ resource "aws_security_group_rule" "ingress" {
8
+ count = var.allowed_ip_list != "" ? 1 : 0
9
+ type = "ingress"
10
+ from_port = 5432
11
+ to_port = 5432
12
+ protocol = "tcp"
13
+ cidr_blocks = split(",", var.allowed_ip_list)
14
+ security_group_id = aws_security_group.this.id
15
+ }
@@ -0,0 +1,50 @@
1
+ variable "app_name" {
2
+ description = "A unique name for your project. This will be used as part of resource names."
3
+ default = ""
4
+ }
5
+
6
+ variable "allowed_ip_list" {
7
+ description = "The list of IP which can get access into database"
8
+ default = ""
9
+ }
10
+
11
+ variable "vpc_id" {
12
+ description = "The id of environment VPC"
13
+ default = ""
14
+ }
15
+
16
+ variable "subnet_ids" {
17
+ description = "Public subnet IDs"
18
+ default = ""
19
+ }
20
+
21
+ variable "vpc_security_group_default" {
22
+ description = "The id of VPC where create security group for RDS access"
23
+ default = ""
24
+ }
25
+
26
+ variable "db_password" {
27
+ description = "Master database password. Leave empty to auto-generate."
28
+ default = ""
29
+ sensitive = true
30
+ }
31
+
32
+ variable "db_username" {
33
+ description = "Username for db"
34
+ default = ""
35
+ }
36
+
37
+ variable "db_name" {
38
+ description = "Name of db"
39
+ default = ""
40
+ }
41
+
42
+ variable "db_instance_type" {
43
+ description = "Database instance type"
44
+ default = "db.t3.small"
45
+ }
46
+
47
+ variable "db_allocated_storage" {
48
+ description = "Database allocated storage"
49
+ default = 30
50
+ }
@@ -0,0 +1,14 @@
1
+ resource "random_id" "secret_suffix" {
2
+ byte_length = 4
3
+ }
4
+
5
+ resource "aws_secretsmanager_secret" "app" {
6
+ name = "${var.name}-${random_id.secret_suffix.hex}"
7
+ description = "This is a ${var.name} secret"
8
+ recovery_window_in_days = 0
9
+ }
10
+
11
+ resource "aws_secretsmanager_secret_version" "app" {
12
+ secret_id = aws_secretsmanager_secret.app.id
13
+ secret_string = jsonencode(var.env_vars)
14
+ }
@@ -0,0 +1,3 @@
1
+ output "secret_arn" {
2
+ value = aws_secretsmanager_secret.app.arn
3
+ }
@@ -0,0 +1,8 @@
1
+ variable "name" {
2
+ description = "Secret Name"
3
+ }
4
+
5
+ variable "env_vars" {
6
+ type = map(string)
7
+ default = {}
8
+ }
@@ -0,0 +1,28 @@
1
+ resource "random_id" "bucket_suffix" {
2
+ byte_length = 4
3
+ }
4
+
5
+ module "s3_bucket" {
6
+ source = "terraform-aws-modules/s3-bucket/aws"
7
+ version = "5.9.1"
8
+
9
+ bucket = "${var.project_name}-${random_id.bucket_suffix.hex}"
10
+ acl = "private"
11
+
12
+ control_object_ownership = true
13
+ object_ownership = "ObjectWriter"
14
+
15
+ versioning = {
16
+ enabled = true
17
+ }
18
+
19
+ cors_rule = [
20
+ {
21
+ allowed_headers = ["Content-Type"]
22
+ allowed_methods = ["PUT", "POST", "GET"]
23
+ allowed_origins = ["*"]
24
+ expose_headers = ["ETag"]
25
+ max_age_seconds = 3000
26
+ }
27
+ ]
28
+ }
@@ -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,2 @@
1
+ data "aws_availability_zones" "available" {
2
+ }