Skip to content

Examples

Basic Deployment

The simplest deployment with only required variables. Uses defaults for everything else: t3.small instances, elastic EFS throughput, daily backups.

module "pypiserver" {
  source  = "registry.infrahouse.com/infrahouse/pypiserver/aws"
  version = "2.3.0"

  providers = {
    aws     = aws
    aws.dns = aws
  }

  asg_subnets           = ["subnet-aaa", "subnet-bbb"]
  load_balancer_subnets = ["subnet-ccc", "subnet-ddd"]
  zone_id               = "Z1234567890ABC"
  alarm_emails          = ["ops@example.com"]
}

output "pypi_url" {
  value = module.pypiserver.pypi_server_urls[0]
}

output "pypi_username" {
  value     = module.pypiserver.pypi_username
  sensitive = true
}

output "pypi_password" {
  value     = module.pypiserver.pypi_password
  sensitive = true
}

Production Deployment

Production-ready configuration with larger instances, pinned image version, longer backup retention, and multiple DNS names.

module "pypiserver" {
  source  = "registry.infrahouse.com/infrahouse/pypiserver/aws"
  version = "2.3.0"

  providers = {
    aws     = aws
    aws.dns = aws.dns
  }

  # Required
  asg_subnets           = data.aws_subnets.private.ids
  load_balancer_subnets = data.aws_subnets.public.ids
  zone_id               = data.aws_route53_zone.main.zone_id
  alarm_emails          = ["ops@example.com", "oncall@example.com"]

  # Naming
  service_name = "pypi"
  dns_names    = ["pypi", "packages"]
  environment  = "production"

  # Scaling
  asg_instance_type = "c6a.xlarge"
  task_min_count    = 6
  task_max_count    = 12

  # Container
  docker_image_tag = "v2.3.0"

  # Backups
  enable_efs_backup     = true
  backup_retention_days = 30
  backup_schedule       = "cron(0 3 * * ? *)"

  # Cost optimization
  efs_lifecycle_policy = 30

  # Alerting
  alarm_topic_arns = [aws_sns_topic.pagerduty.arn]
}

Cost-Optimized (Dev/Test)

Minimal configuration for development or testing. Disables backups and uses small instances.

module "pypiserver" {
  source  = "registry.infrahouse.com/infrahouse/pypiserver/aws"
  version = "2.3.0"

  providers = {
    aws     = aws
    aws.dns = aws
  }

  asg_subnets           = [data.aws_subnets.private.ids[0]]
  load_balancer_subnets = data.aws_subnets.public.ids
  zone_id               = data.aws_route53_zone.dev.zone_id
  alarm_emails          = ["dev@example.com"]

  # Minimal resources
  asg_instance_type = "t3.micro"
  container_memory  = 256

  # Disable backups for dev
  enable_efs_backup = false

  # Allow clean teardown
  access_log_force_destroy = true
  backups_force_destroy    = true

  environment = "development"
}

Cross-Account DNS

When your Route53 zone is in a different AWS account (common with centralized DNS management).

provider "aws" {
  region = "us-west-2"
}

provider "aws" {
  alias  = "dns"
  region = "us-east-1"

  assume_role {
    role_arn = "arn:aws:iam::DNS_ACCOUNT_ID:role/dns-admin"
  }
}

module "pypiserver" {
  source  = "registry.infrahouse.com/infrahouse/pypiserver/aws"
  version = "2.3.0"

  providers = {
    aws     = aws
    aws.dns = aws.dns
  }

  asg_subnets           = data.aws_subnets.private.ids
  load_balancer_subnets = data.aws_subnets.public.ids
  zone_id               = "Z0987654321XYZ"
  alarm_emails          = ["ops@example.com"]
}

Working Example

A complete working example is available in the repository: examples/basic/