2443909362
---ci--- project: nova-platform milestone: v1.0 status: complete requirements: covered: [REQ-01,REQ-02,REQ-03,REQ-04,REQ-05,REQ-06,REQ-07,REQ-08,REQ-09,REQ-10,REQ-11,REQ-12,REQ-13,REQ-14,REQ-15,REQ-16,REQ-17,REQ-18,REQ-19,REQ-20,REQ-21,REQ-22,REQ-23,REQ-24,REQ-25,REQ-26,REQ-27,REQ-28,REQ-29,REQ-30,REQ-31,REQ-32,REQ-33,REQ-34,REQ-35,REQ-36,REQ-37,REQ-38] partial: [] ---/ci--- v1.0 milestone complete: simplified infrastructure-delivery platform derived from Nova (acdl). 6 phases (P0-P5 + P6 final). 38 REQ-IDs. 38 decisions (D-001..D-038). 76 tests pass. Engine boundary holds. Happy paths green (check-only + CI). 13 L1 + 2 L2 modules. 5 terraform roots. Shell reproducibility. Zero OOS files. Tags: v0.1.0 (P0) → v0.1.1..v0.1.5 (P1..P5) → v0.1.6 (P6 = milestone release on v0.1 patch line).
115 lines
2.6 KiB
Terraform
115 lines
2.6 KiB
Terraform
# Nova CI VPC — short-lived VPC for L1 module lifecycle testing (D-024).
|
|
#
|
|
# Created by the modules-lifecycle pipeline before testing VPC-dependent
|
|
# modules (alb, ecs-service, rds, uptime). Destroyed after all tests
|
|
# complete. Separate from the long-lived platform VPC (terraform/platform).
|
|
#
|
|
# State: spike/ci-vpc/terraform.tfstate (separate from platform/ and module states)
|
|
|
|
terraform {
|
|
required_version = ">= 1.9, < 1.10"
|
|
required_providers {
|
|
aws = {
|
|
source = "hashicorp/aws"
|
|
version = "~> 5.0"
|
|
}
|
|
}
|
|
# Partial backend config — the bucket name is supplied at `terraform init`
|
|
# time via `-backend-config=bucket=...` (the bucket is created by
|
|
# terraform/bootstrap/create_state_backend.py as nova-tfstate-<account>-<region>).
|
|
# This keeps the HCL free of a hardcoded account ID (D-026 spirit).
|
|
backend "s3" {
|
|
key = "spike/ci-vpc/terraform.tfstate"
|
|
region = "us-east-1"
|
|
}
|
|
}
|
|
|
|
provider "aws" {
|
|
region = "us-east-1"
|
|
}
|
|
|
|
data "aws_availability_zones" "available" {
|
|
state = "available"
|
|
}
|
|
|
|
resource "aws_vpc" "ci" {
|
|
cidr_block = "10.1.0.0/16"
|
|
tags = {
|
|
Name = "nova-ci-vpc"
|
|
"nova:owner" = "nova"
|
|
"nova:environment" = "ci"
|
|
}
|
|
}
|
|
|
|
resource "aws_subnet" "ci" {
|
|
count = 2
|
|
vpc_id = aws_vpc.ci.id
|
|
cidr_block = cidrsubnet(aws_vpc.ci.cidr_block, 8, count.index + 1)
|
|
availability_zone = data.aws_availability_zones.available.names[count.index]
|
|
tags = {
|
|
Name = "nova-ci-subnet-${count.index}"
|
|
"nova:owner" = "nova"
|
|
"nova:environment" = "ci"
|
|
}
|
|
}
|
|
|
|
resource "aws_internet_gateway" "ci" {
|
|
vpc_id = aws_vpc.ci.id
|
|
tags = {
|
|
Name = "nova-ci-igw"
|
|
}
|
|
}
|
|
|
|
resource "aws_route_table" "ci" {
|
|
vpc_id = aws_vpc.ci.id
|
|
route {
|
|
cidr_block = "0.0.0.0/0"
|
|
gateway_id = aws_internet_gateway.ci.id
|
|
}
|
|
}
|
|
|
|
resource "aws_route_table_association" "ci" {
|
|
count = 2
|
|
subnet_id = aws_subnet.ci[count.index].id
|
|
route_table_id = aws_route_table.ci.id
|
|
}
|
|
|
|
resource "aws_security_group" "ecs" {
|
|
name = "nova-ci-ecs-sg"
|
|
description = "Security group for CI ECS services"
|
|
vpc_id = aws_vpc.ci.id
|
|
|
|
ingress {
|
|
from_port = 80
|
|
to_port = 80
|
|
protocol = "tcp"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
|
|
egress {
|
|
from_port = 0
|
|
to_port = 0
|
|
protocol = "-1"
|
|
cidr_blocks = ["0.0.0.0/0"]
|
|
}
|
|
}
|
|
|
|
resource "aws_ecs_cluster" "ci" {
|
|
name = "nova-ci-cluster"
|
|
}
|
|
|
|
output "vpc_id" {
|
|
value = aws_vpc.ci.id
|
|
}
|
|
|
|
output "subnet_ids" {
|
|
value = join(",", aws_subnet.ci[*].id)
|
|
}
|
|
|
|
output "ecs_security_group_id" {
|
|
value = aws_security_group.ecs.id
|
|
}
|
|
|
|
output "cluster_arn" {
|
|
value = aws_ecs_cluster.ci.arn
|
|
} |