main.tf 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. locals {
  2. vpc_name = "${ var.vpc_info["name"] }-${ var.account_name }"
  3. }
  4. data "aws_availability_zones" "available" {
  5. state = "available"
  6. }
  7. module "vpc" {
  8. source = "terraform-aws-modules/vpc/aws"
  9. version = "~> v2.0"
  10. name = "${local.vpc_name}"
  11. cidr = "${var.vpc_info["cidr"]}"
  12. azs = slice(data.aws_availability_zones.available.names,0,3)
  13. private_subnets = [
  14. "${cidrsubnet(var.vpc_info["cidr"],3,0)}",
  15. "${cidrsubnet(var.vpc_info["cidr"],3,1)}",
  16. "${cidrsubnet(var.vpc_info["cidr"],3,2)}",
  17. ]
  18. # Potentially, we could route all accounts through the transit gateway to
  19. # save costs and provide one point of exit to the Internet. But at this time,
  20. # I'm keeping it consistent with our legacy accounts.
  21. #
  22. # If we decide to do that, we should consider either dropping to a /23 per customer,
  23. # or a /24 for each subnet (seems wasteful).
  24. #public_subnets = [ ]
  25. public_subnets = [
  26. "${cidrsubnet(var.vpc_info["cidr"],3,4)}",
  27. "${cidrsubnet(var.vpc_info["cidr"],3,5)}",
  28. "${cidrsubnet(var.vpc_info["cidr"],3,6)}",
  29. ]
  30. enable_nat_gateway = false
  31. enable_vpn_gateway = false
  32. enable_dns_hostnames = true
  33. enable_s3_endpoint = true
  34. enable_dynamodb_endpoint = true
  35. enable_sts_endpoint = true
  36. enable_kms_endpoint = true
  37. enable_dhcp_options = true
  38. enable_ec2_endpoint = true
  39. ec2_endpoint_private_dns_enabled = true
  40. kms_endpoint_private_dns_enabled = true
  41. sts_endpoint_private_dns_enabled = true
  42. ec2_endpoint_security_group_ids = [ "${module.aws_endpoints_sg.this_security_group_id}" ]
  43. kms_endpoint_security_group_ids = [ "${module.aws_endpoints_sg.this_security_group_id}" ]
  44. sts_endpoint_security_group_ids = [ "${module.aws_endpoints_sg.this_security_group_id}" ]
  45. dhcp_options_domain_name = var.dns_info["private"]["zone"]
  46. dhcp_options_domain_name_servers = var.dns_servers
  47. dhcp_options_ntp_servers = [ "169.254.169.123" ]
  48. dhcp_options_tags = merge(var.standard_tags, var.tags)
  49. tags = merge(var.standard_tags, var.tags, { "Purpose" = var.vpc_info["purpose"] })
  50. nat_eip_tags = {
  51. "eip_type" = "natgw"
  52. Name = local.vpc_name
  53. }
  54. }
  55. resource "aws_flow_log" "flowlogs" {
  56. iam_role_arn = "arn:${var.aws_partition}:iam::${var.aws_account_id}:role/aws_services/flowlogs"
  57. log_destination = "arn:${var.aws_partition}:logs:${var.aws_region}:${var.aws_account_id}:log-group:vpc_flow_logs"
  58. traffic_type = "REJECT" # ALL is very noisy, and CIS only requires rejects.
  59. vpc_id = module.vpc.vpc_id
  60. tags = merge(var.standard_tags, var.tags)
  61. }
  62. resource "aws_vpc_endpoint" "ec2messages" {
  63. vpc_id = module.vpc.vpc_id
  64. service_name = "com.amazonaws.${var.aws_region}.ec2messages"
  65. vpc_endpoint_type = "Interface"
  66. subnet_ids = slice(module.vpc.public_subnets,0,3)
  67. security_group_ids = [
  68. module.aws_endpoints_sg.this_security_group_id
  69. ]
  70. private_dns_enabled = true
  71. }
  72. resource "aws_vpc_endpoint" "ssm" {
  73. vpc_id = module.vpc.vpc_id
  74. service_name = "com.amazonaws.${var.aws_region}.ssm"
  75. vpc_endpoint_type = "Interface"
  76. subnet_ids = slice(module.vpc.public_subnets,0,3)
  77. security_group_ids = [
  78. module.aws_endpoints_sg.this_security_group_id
  79. ]
  80. private_dns_enabled = true
  81. }
  82. data "aws_vpc_endpoint_service" "ecr_api_endpoint" {
  83. service = "ecr.api"
  84. }
  85. data "aws_vpc_endpoint_service" "ecr_dkr_endpoint" {
  86. service = "ecr.dkr"
  87. }
  88. resource "aws_vpc_endpoint" "ecr_api" {
  89. vpc_id = module.vpc.vpc_id
  90. service_name = data.aws_vpc_endpoint_service.ecr_api_endpoint.service_name
  91. vpc_endpoint_type = "Interface"
  92. subnet_ids = module.vpc.private_subnets
  93. security_group_ids = [
  94. module.aws_endpoints_sg.this_security_group_id
  95. ]
  96. private_dns_enabled = true
  97. }
  98. resource "aws_vpc_endpoint" "ecr_dkr" {
  99. vpc_id = module.vpc.vpc_id
  100. service_name = data.aws_vpc_endpoint_service.ecr_dkr_endpoint.service_name
  101. vpc_endpoint_type = "Interface"
  102. subnet_ids = module.vpc.private_subnets
  103. security_group_ids = [
  104. module.aws_endpoints_sg.this_security_group_id
  105. ]
  106. private_dns_enabled = true
  107. }
  108. data "aws_vpc_endpoint_service" "logs_endpoint" {
  109. service = "logs"
  110. }
  111. resource "aws_vpc_endpoint" "logs" {
  112. vpc_id = module.vpc.vpc_id
  113. service_name = data.aws_vpc_endpoint_service.logs_endpoint.service_name
  114. vpc_endpoint_type = "Interface"
  115. subnet_ids = module.vpc.private_subnets
  116. security_group_ids = [
  117. module.aws_endpoints_sg.this_security_group_id
  118. ]
  119. private_dns_enabled = true
  120. }
  121. data "aws_vpc_endpoint_service" "monitoring_endpoint" {
  122. service = "monitoring"
  123. }
  124. resource "aws_vpc_endpoint" "monitoring" {
  125. vpc_id = module.vpc.vpc_id
  126. service_name = data.aws_vpc_endpoint_service.monitoring_endpoint.service_name
  127. vpc_endpoint_type = "Interface"
  128. subnet_ids = module.vpc.private_subnets
  129. security_group_ids = [
  130. module.aws_endpoints_sg.this_security_group_id
  131. ]
  132. private_dns_enabled = true
  133. }