name-scheme-latest.md

Naming Convention Proposal for the VPC Module

Pattern base: <org>-<env>-<tier>-<region_abbr>-<resource-type>[-<zone_id>][-<idx>]

Naming Table

Resource Naming Pattern Example
VPC <org>-<env>-<tier>-<region_abbr>-vpc hca-dev-dmz-usw2-vpc
CIDR Block Association <org>-<env>-<tier>-<region_abbr>-vpc-cidr hca-dev-dmz-usw2-vpc-cidr
Subnet (Public) <org>-<env>-<tier>-<region_abbr>-subnet-public-<zone_id>-<idx> hca-dev-dmz-usw2-subnet-public-az1-01
Subnet (Private) <org>-<env>-<tier>-<region_abbr>-subnet-private-<zone_id>-<idx> hca-dev-dmz-usw2-subnet-private-az1-01
Subnet (Isolated) <org>-<env>-<tier>-<region_abbr>-subnet-isolated-<zone_id>-<idx> hca-dev-dmz-usw2-subnet-isolated-az2-01
Internet Gateway <org>-<env>-<tier>-<region_abbr>-igw hca-dev-dmz-usw2-igw
NAT Gateway EIP <org>-<env>-<tier>-<region_abbr>-nat-eip-<zone_id>-<idx> hca-dev-dmz-usw2-nat-eip-az1-01
NAT Gateway <org>-<env>-<tier>-<region_abbr>-nat-<zone_id>-<idx> hca-dev-dmz-usw2-nat-az1-01
Route Table (Public) <org>-<env>-<tier>-<region_abbr>-rt-public hca-dev-dmz-usw2-rt-public
Route Table (Private) <org>-<env>-<tier>-<region_abbr>-rt-private-<zone_id>-<idx> hca-dev-dmz-usw2-rt-private-az1-01
Route Table (Isolated) <org>-<env>-<tier>-<region_abbr>-rt-isolated-<zone_id>-<idx> hca-dev-dmz-usw2-rt-isolated-az2-01
Transit Gateway VPC Attachment <org>-<env>-<tier>-<region_abbr>-tgw-attach hca-dev-dmz-usw2-tgw-attach
Flow Log IAM Role <org>-<env>-<tier>-<region_abbr>-flow-log-role hca-dev-dmz-usw2-flow-log-role
Flow Log IAM Role Policy <org>-<env>-<tier>-<region_abbr>-flow-log-policy hca-dev-dmz-usw2-flow-log-policy
VPC Flow Log <org>-<env>-<tier>-<region_abbr>-flow-log hca-dev-dmz-usw2-flow-log

Token Definitions

Token Source Notes
<org> Caller-supplied input No module-side assumption; explicit every time
<env> Caller-supplied input Validated against approved list (prod, staging, dev, sandbox, shared-services-prod, shared-services-nonprod, log, backup)
<tier> Caller-supplied input Optional — omitted cleanly (via compact()) when not applicable, e.g. hca-log-usw2-vpc
<region_abbr> Derived — parsed from aws_availability_zones.zone_ids[0] e.g. usw2-az1 -> usw2. No hardcoded region map; sourced directly from AWS-returned data
<zone_id> Derived per-subnet, from zone_ids (e.g. az1, az2) Not the AZ name letter (a, b) - the letter is randomized per AWS account and is not consistent across a multi-account estate. zone_id is the physically stable identifier
<idx> To be defined - TBD with HCA Disambiguates multiple subnets/resources within the same AZ. Semantics (sequential vs. caller-fixed) need confirmation

Scope Notes

  • Region-scoped resources (no <zone_id> in pattern): VPC, CIDR association, Internet Gateway, public Route Table, TGW Attachment, IAM role/policy, VPC Flow Log - these are not bound to a specific AZ.
  • AZ-scoped resources (<zone_id> required): Subnets, NAT Gateway, NAT EIP, private/isolated Route Tables - each instance lives in exactly one AZ.

Open Questions for HCA

  1. <idx> semantics - should this represent a sequential count of subnets created within an AZ, or a caller-fixed number tied to a specific CIDR block (stable even if other subnets are added/removed later)?
  2. CIDR Block Association naming - currently has no Name tag in the module. Confirming HCA wants one added, or if it should remain untagged.
  3. Case/separator convention - proposing all-lowercase, hyphen-separated, no underscores, to align with AWS-side naming restrictions (S3, IAM, etc.). Confirming this as a hard rule.
  4. Tag vs. resource-name argument - this pattern is proposed for both the Name tag (most resources) and the literal name argument (IAM role, IAM role policy) where applicable. Confirming HCA is fine applying one convention to both.

Length Constraint Analysis

AWS enforces hard character limits on certain resource name arguments (not tags):

Resource AWS Limit Type
IAM Role name 64 chars Hard API limit
IAM Role Policy name 128 chars Hard API limit
Tag values (Name and others) 256 chars Hard API limit

Worst-case stress test using the longest approved env value (shared-services-nonprod, 24 chars):

hca-shared-services-nonprod-dmz-usw2-flow-log-role ~= 52 chars - within the 64-char IAM role limit today, but leaves limited headroom if org or tier inputs grow longer.

Mitigation: the module will validate assembled name length against the tightest applicable limit (IAM role names, 64 chars) via a lifecycle.precondition on the affected resources, failing at plan/apply time with a clear error message rather than an opaque AWS API rejection. This validates the caller-supplied prefix combination, not just individual inputs in isolation, since it's the concatenated result that determines whether the limit is breached.