initial commit of replacement infrastructure automation
[awsible] / infrastructure / modules / tf_aws_vpc / main.tf
diff --git a/infrastructure/modules/tf_aws_vpc/main.tf b/infrastructure/modules/tf_aws_vpc/main.tf
new file mode 100644 (file)
index 0000000..4b36310
--- /dev/null
@@ -0,0 +1,239 @@
+resource "aws_vpc_dhcp_options" "default" {
+       count = "${var.enable_domain_name}"
+       domain_name = "ec2.internal ${var.r53_domain_name}"
+       domain_name_servers = ["AmazonProvidedDNS"]
+       tags {
+               Name = "${var.project}-${var.environment}-dhcp_options_set"
+               service = "${var.project}-${var.environment}-dhcp_options_set"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               role = "dhcp_options_set"
+       }
+}
+
+resource "aws_vpc_dhcp_options_association" "default" {
+       count = "${var.enable_domain_name}"
+       vpc_id = "${aws_vpc.default.id}"
+       dhcp_options_id = "${aws_vpc_dhcp_options.default.id}"
+}
+
+resource "aws_vpc" "default" {
+       cidr_block = "${var.cidr}"
+       enable_dns_hostnames = "${var.enable_dns_hostnames}"
+       enable_dns_support = "${var.enable_dns_support}"
+       instance_tenancy = "default"
+       tags {
+               Name = "${var.project}-${var.environment}-vpc"
+               service = "${var.project}-${var.environment}-vpc"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               role = "vpc"
+       }
+}
+
+resource "aws_internet_gateway" "default" {
+       vpc_id = "${aws_vpc.default.id}"
+       tags {
+               Name = "${var.project}-${var.environment}-igw"
+               service = "${var.project}-${var.environment}-igw"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               role = "igw"
+       }
+}
+
+data "aws_vpc_peering_connection" "peer" {
+       count = "${length(var.peering_connection_ids)}"
+       id = "${element(var.peering_connection_ids, count.index)}"
+}
+
+resource "aws_default_route_table" "default" {
+       default_route_table_id = "${aws_vpc.default.default_route_table_id}"
+}
+
+resource "aws_route" "default_gateway" {
+       route_table_id = "${aws_default_route_table.default.id}"
+       destination_cidr_block = "0.0.0.0/0"
+       gateway_id = "${aws_internet_gateway.default.id}"
+}
+
+resource "aws_route" "default_peer" {
+       count = "${length(var.peering_connection_ids)}"
+       route_table_id = "${aws_default_route_table.default.id}"
+       destination_cidr_block = "${element(data.aws_vpc_peering_connection.peer.*.cidr_block, count.index)}"
+       vpc_peering_connection_id = "${element(data.aws_vpc_peering_connection.peer.*.id, count.index)}"
+}
+
+resource "aws_route_table" "public" {
+       vpc_id = "${aws_vpc.default.id}"
+       tags {
+               Name = "${var.project}-${var.environment}-public"
+               service = "${var.project}-${var.environment}-route-table"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               role = "route-table"
+       }
+}
+
+resource "aws_route" "public_gateway" {
+       route_table_id = "${aws_route_table.public.id}"
+       destination_cidr_block = "0.0.0.0/0"
+       gateway_id = "${aws_internet_gateway.default.id}"
+}
+
+resource "aws_route" "public_peer" {
+       count = "${length(var.peering_connection_ids)}"
+       route_table_id = "${aws_route_table.public.id}"
+       destination_cidr_block = "${element(data.aws_vpc_peering_connection.peer.*.cidr_block, count.index)}"
+       vpc_peering_connection_id = "${element(data.aws_vpc_peering_connection.peer.*.id, count.index)}"
+}
+
+resource "aws_subnet" "public" {
+       count = "${length(var.public_azs)}"
+       vpc_id = "${aws_vpc.default.id}"
+       cidr_block = "${cidrsubnet(var.cidr, 8, count.index + var.subnets_offset_public)}"
+       availability_zone = "${element(var.public_azs, count.index)}"
+       tags {
+               Name = "${var.project}-${var.environment}-public-${element(var.public_azs, count.index)}"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               service = "${var.project}-${var.environment}-subnet-public"
+               role = "subnet"
+               zone = "pub"
+       }
+       map_public_ip_on_launch = true
+}
+
+resource "aws_route_table_association" "public" {
+       count = "${length(var.public_azs)}"
+       subnet_id = "${element(aws_subnet.public.*.id, count.index)}"
+       route_table_id =  "${element(aws_route_table.public.*.id, count.index)}"
+}
+
+resource "aws_subnet" "private" {
+       count = "${length(var.private_azs)}"
+       vpc_id = "${aws_vpc.default.id}"
+       cidr_block = "${cidrsubnet(var.cidr, 8, count.index + var.subnets_offset_private)}"
+       availability_zone = "${element(var.private_azs, count.index)}"
+       tags {
+               Name = "${var.project}-${var.environment}-private-${element(var.private_azs, count.index)}"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               service = "${var.project}-${var.environment}-subnet-private"
+               role = "subnet"
+               zone = "priv"
+       }
+       map_public_ip_on_launch = false
+}
+
+resource "aws_route_table_association" "private" {
+       count = "${length(var.private_azs)}"
+       subnet_id = "${element(aws_subnet.private.*.id, count.index)}"
+       route_table_id = "${element(aws_route_table.private.*.id, count.index)}"
+}
+
+resource "aws_route_table" "private" {
+       count = "${length(var.private_azs)}"
+       vpc_id = "${aws_vpc.default.id}"
+       tags {
+               Name = "${var.project}-${var.environment}-private${format("%02d", count.index + 1)}"
+               project = "${var.project}"
+               environment = "${var.environment}"
+               service = "${var.project}-${var.environment}-route-table-private"
+               role = "route-table"
+       }
+}
+
+resource "aws_route" "private_gateway" {
+       count = "${length(var.private_azs)}"
+       route_table_id = "${element(aws_route_table.private.*.id, count.index)}"
+       destination_cidr_block = "0.0.0.0/0"
+       nat_gateway_id = "${element(aws_nat_gateway.default.*.id, count.index)}"
+}
+
+resource "aws_route" "private_peer" {
+       count = "${length(var.peering_connection_ids) * length(var.private_azs)}"
+       route_table_id = "${element(aws_route_table.private.*.id, count.index / length(var.private_azs))}"
+       destination_cidr_block = "${element(data.aws_vpc_peering_connection.peer.*.cidr_block, count.index % length(var.private_azs))}"
+       vpc_peering_connection_id = "${element(data.aws_vpc_peering_connection.peer.*.id, count.index % length(var.private_azs))}"
+}
+
+resource "aws_eip" "nat" {
+       count = "${length(var.private_azs)}"
+       vpc = true
+}
+
+resource "aws_nat_gateway" "default" {
+       count = "${length(var.private_azs)}"
+       allocation_id = "${element(aws_eip.nat.*.id, count.index)}"
+       subnet_id = "${element(aws_subnet.public.*.id, count.index)}"
+}
+
+data "aws_iam_policy_document" "base" {
+       statement {
+               sid = "aws-read"
+               resources = ["*"]
+               actions = [
+                       "autoscaling:Describe*",
+                       "cloudwatch:ListMetrics",
+                       "cloudwatch:GetMetricsStatistics",
+                       "cloudwatch:Describe*",
+                       "ec2:Describe*",
+                       "elasticloadbalancing:Describe*",
+                       "logs:CreateLogGroup",
+                       "logs:CreateLogStream",
+                       "logs:Describe*",
+                       "logs:PutLogEvents",
+                       "logs:PutMetricFilter"
+               ]
+       }
+}
+
+resource "aws_iam_policy" "base" {
+       name = "base-policy"
+       path = "/"
+       description = "base-policy"
+       policy = "${data.aws_iam_policy_document.base.json}"
+}
+
+resource "aws_security_group" "general-access" {
+       name = "general-access"
+       description = "Allow all ICMP and intra-vpc SSH traffic"
+       vpc_id = "${aws_vpc.default.id}"
+}
+
+resource "aws_security_group_rule" "ga_out_all" {
+       security_group_id = "${aws_security_group.general-access.id}"
+       type = "egress"
+       from_port = 0
+       to_port = 0
+       protocol = "all"
+       cidr_blocks = ["0.0.0.0/0"]
+       lifecycle {
+               create_before_destroy = true
+       }
+}
+
+resource "aws_security_group_rule" "ga_in_icmp" {
+       security_group_id = "${aws_security_group.general-access.id}"
+       type = "ingress"
+       from_port = -1
+       to_port = -1
+       protocol = "icmp"
+       cidr_blocks = ["0.0.0.0/0"]
+       lifecycle {
+               create_before_destroy = true
+       }
+}
+
+resource "aws_security_group_rule" "ga_in_ssh" {
+       security_group_id = "${aws_security_group.general-access.id}"
+       type = "ingress"
+       from_port = 22
+       to_port = 22
+       protocol = "tcp"
+       cidr_blocks = ["${concat(list(var.cidr), var.ssh_allowed_cidr)}"]
+       lifecycle {
+               create_before_destroy = true
+       }
+}