main.tf 2.8 KB

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