main.tf 4.7 KB

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