main.tf 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. locals {
  2. azs = slice(data.aws_availability_zones.available.names,0,2)
  3. subnets = [
  4. cidrsubnet(var.vpc_info["cidr"],3,0),
  5. cidrsubnet(var.vpc_info["cidr"],3,1),
  6. cidrsubnet(var.vpc_info["cidr"],3,2),
  7. cidrsubnet(var.vpc_info["cidr"],3,3),
  8. cidrsubnet(var.vpc_info["cidr"],3,4),
  9. cidrsubnet(var.vpc_info["cidr"],3,5),
  10. cidrsubnet(var.vpc_info["cidr"],3,6),
  11. cidrsubnet(var.vpc_info["cidr"],3,7),
  12. ]
  13. vpc_name = "${ var.vpc_info["name"] }-${ var.account_name }"
  14. }
  15. data "aws_availability_zones" "available" {
  16. state = "available"
  17. }
  18. module "vpc" {
  19. source = "terraform-aws-modules/vpc/aws"
  20. version = "~> v2.0"
  21. name = local.vpc_name
  22. cidr = var.vpc_info["cidr"]
  23. azs = local.azs
  24. # 2 private and 2 public here, but 2 more of each will be created after in the same azs
  25. private_subnets = [
  26. local.subnets[0],
  27. local.subnets[1],
  28. ]
  29. private_subnet_tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  30. public_subnets = [
  31. local.subnets[4],
  32. local.subnets[5]
  33. ]
  34. public_subnet_tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  35. enable_nat_gateway = false
  36. enable_vpn_gateway = false
  37. enable_dns_hostnames = true
  38. enable_s3_endpoint = true
  39. enable_dynamodb_endpoint = false
  40. enable_sts_endpoint = false
  41. enable_kms_endpoint = false
  42. enable_dhcp_options = true
  43. enable_ec2_endpoint = true # PA likes a local ec2 endpoint
  44. ec2_endpoint_security_group_ids = [ module.aws_endpoints_sg.this_security_group_id ]
  45. dhcp_options_domain_name = var.dns_info["private"]["zone"]
  46. tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  47. }
  48. resource "aws_flow_log" "flowlogs" {
  49. iam_role_arn = "arn:${var.aws_partition}:iam::${var.aws_account_id}:role/aws_services/flowlogs"
  50. log_destination = "arn:${var.aws_partition}:logs:${var.aws_region}:${var.aws_account_id}:log-group:vpc_flow_logs"
  51. traffic_type = "REJECT" # ALL is very noisy, and CIS only requires rejects.
  52. vpc_id = module.vpc.vpc_id
  53. tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  54. }
  55. resource "aws_subnet" "mgmt" {
  56. count = 2
  57. depends_on = [ module.vpc ]
  58. vpc_id = module.vpc.vpc_id
  59. cidr_block = local.subnets[6 + count.index]
  60. availability_zone = local.azs[count.index]
  61. tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  62. }
  63. resource "aws_route_table_association" "mgmt-to-internet" {
  64. count = 2
  65. depends_on = [ aws_subnet.mgmt, module.vpc ]
  66. subnet_id = aws_subnet.mgmt[count.index].id
  67. route_table_id = module.vpc.public_route_table_ids[0] # only 1 public route table
  68. }
  69. resource "aws_subnet" "standalone_tgw" {
  70. # A standalone private subnet that could be connected to the tgw
  71. count = 2
  72. depends_on = [ module.vpc ]
  73. vpc_id = module.vpc.vpc_id
  74. cidr_block = local.subnets[2 + count.index]
  75. availability_zone = local.azs[count.index]
  76. tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  77. }