2024-05-30 17:09:10 +08:00
|
|
|
data "aws_availability_zones" "available" {}
|
|
|
|
|
2024-05-30 18:27:52 +08:00
|
|
|
locals {
|
|
|
|
PrivataSubnets = cidrsubnets(var.VpcCidr, 8, 8)
|
|
|
|
}
|
|
|
|
|
2024-05-30 17:09:10 +08:00
|
|
|
module "Vpc" {
|
|
|
|
source = "terraform-aws-modules/vpc/aws"
|
|
|
|
version = "5.8.1"
|
|
|
|
|
|
|
|
name = var.VpcName
|
|
|
|
cidr = var.VpcCidr
|
|
|
|
azs = slice(data.aws_availability_zones.available.names, 0, 2)
|
|
|
|
|
2024-05-30 18:27:52 +08:00
|
|
|
private_subnets = local.PrivataSubnets
|
|
|
|
private_subnet_names = [for k, v in local.PrivataSubnets : "${var.VpcName}Private${k}"]
|
2024-05-30 17:09:10 +08:00
|
|
|
enable_dns_hostnames = true
|
|
|
|
enable_dns_support = true
|
|
|
|
enable_nat_gateway = false
|
|
|
|
enable_dhcp_options = true
|
|
|
|
dhcp_options_domain_name = "${var.VpcName}.aws"
|
|
|
|
}
|
|
|
|
|
|
|
|
module "VpcEndpoints" {
|
|
|
|
source = "terraform-aws-modules/vpc/aws//modules/vpc-endpoints"
|
|
|
|
version = "5.8.1"
|
|
|
|
|
|
|
|
vpc_id = module.Vpc.vpc_id
|
|
|
|
create_security_group = false
|
|
|
|
endpoints = {
|
|
|
|
s3 = {
|
|
|
|
service = "s3"
|
|
|
|
service_type = "Gateway"
|
|
|
|
route_table_ids = flatten([
|
|
|
|
module.Vpc.intra_route_table_ids, module.Vpc.private_route_table_ids, module.Vpc.public_route_table_ids
|
|
|
|
])
|
|
|
|
policy = data.aws_iam_policy_document.s3_endpoint_policy.json
|
|
|
|
tags = { Name = "S3VpcEp" }
|
|
|
|
},
|
|
|
|
dynamodb = {
|
|
|
|
service = "dynamodb"
|
|
|
|
service_type = "Gateway"
|
|
|
|
route_table_ids = flatten([
|
|
|
|
module.Vpc.intra_route_table_ids, module.Vpc.private_route_table_ids, module.Vpc.public_route_table_ids
|
|
|
|
])
|
|
|
|
policy = data.aws_iam_policy_document.dynamodb_endpoint_policy.json
|
|
|
|
tags = { Name = "DynamodbVpcEp" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
data "aws_iam_policy_document" "s3_endpoint_policy" {
|
|
|
|
statement {
|
|
|
|
effect = "Deny"
|
|
|
|
actions = ["s3:*"]
|
|
|
|
resources = ["*"]
|
|
|
|
|
|
|
|
principals {
|
|
|
|
type = "*"
|
|
|
|
identifiers = ["*"]
|
|
|
|
}
|
|
|
|
|
|
|
|
condition {
|
|
|
|
test = "StringNotEquals"
|
|
|
|
variable = "aws:sourceVpc"
|
|
|
|
|
|
|
|
values = [module.Vpc.vpc_id]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
data "aws_iam_policy_document" "dynamodb_endpoint_policy" {
|
|
|
|
statement {
|
|
|
|
effect = "Deny"
|
|
|
|
actions = ["dynamodb:*"]
|
|
|
|
resources = ["*"]
|
|
|
|
|
|
|
|
principals {
|
|
|
|
type = "*"
|
|
|
|
identifiers = ["*"]
|
|
|
|
}
|
|
|
|
|
|
|
|
condition {
|
|
|
|
test = "StringNotEquals"
|
|
|
|
variable = "aws:sourceVpc"
|
|
|
|
|
|
|
|
values = [module.Vpc.vpc_id]
|
|
|
|
}
|
|
|
|
}
|
2024-05-30 18:27:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
resource "null_resource" "CloudflareIps" {
|
|
|
|
provisioner "local-exec" {
|
|
|
|
command = "wget -qO CfIps.json https://api.cloudflare.com/client/v4/ips"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
locals {
|
|
|
|
CfIpJson = jsondecode(file("${path.module}/CfIps.json"))
|
|
|
|
}
|
|
|
|
|
|
|
|
resource "aws_ec2_managed_prefix_list" "pl1" {
|
|
|
|
name = "CloudflareIpRanges"
|
|
|
|
address_family = "IPv4"
|
|
|
|
max_entries = 20
|
|
|
|
dynamic "entry" {
|
|
|
|
for_each = local.CfIpJson.result.ipv4_cidrs
|
|
|
|
content {
|
|
|
|
cidr = entry.value
|
|
|
|
description = "Cloudflare IP"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module "CloudflareSg" {
|
|
|
|
source = "../../Modules/Compute/security_group"
|
|
|
|
description = "Cloudflare Ip Ranges"
|
|
|
|
egress = {
|
|
|
|
}
|
|
|
|
ingress = {
|
|
|
|
r1 = "tcp,443,443,${aws_ec2_managed_prefix_list.pl1.id},Cloudflare Prefix List"
|
|
|
|
}
|
|
|
|
name = "cloudflare-ips"
|
|
|
|
vpc-id = module.Vpc.vpc_id
|
2024-05-30 17:09:10 +08:00
|
|
|
}
|