# README

Palo Alto Networks Flexible Names Generator

A Terraform module for flexible names generation for resources created in AWS by VM-Series modules.

Usage

In order to invoke the module to generated flexible names for all resources created by Terraform for VM-Series, you need to defined map e.g. as below for combined design example:

module "generator" {
  source = "../../modules/names_generator"

  region               = var.region
  name_prefix          = var.name_prefix
  name_template        = var.name_templates.name_template
  template_assignments = var.template_assignments.assigned_template
  names = {
    vpc              = { for k, v in var.vpcs : k => v.name }
    internet_gateway = { for k, v in var.vpcs : k => v.name }
    vpn_gateway      = { for k, v in var.vpcs : k => v.name }
    subnet           = { for _, v in local.subnets : "${v.name}${v.az}" => "${v.name}${v.az}" }
    security_group   = { for _, v in local.security_groups : v.key => v.name }
    route_table = merge(
      { for k, v in var.vpcs : k => "igw_${v.name}" },
      { for _, v in local.subnets : "${v.name}${v.az}" => "${v.name}${v.az}" }
    )
    nat_gateway                           = { for _, v in local.nat_gateways : v.key => v.name }
    transit_gateway                       = { "tgw" : var.tgw.name }
    transit_gateway_route_table           = { for k, v in var.tgw.route_tables : k => v.name }
    transit_gateway_attachment            = { for k, v in var.tgw.attachments : k => v.name }
    gateway_loadbalancer                  = { for k, v in var.gwlbs : k => v.name }
    gateway_loadbalancer_target_group     = { for k, v in var.gwlbs : k => v.name }
    gateway_loadbalancer_endpoint         = { for k, v in var.gwlb_endpoints : k => v.name }
    application_loadbalancer              = { for k, v in var.spoke_albs : k => k }
    application_loadbalancer_target_group = { for _, v in local.alb_tg : v.key => v.value }
    network_loadbalancer                  = { for k, v in var.spoke_nlbs : k => k }
    network_loadbalancer_target_group     = { for _, v in local.nlb_tg : v.key => v.value }
    vm                                    = { for k, v in var.spoke_vms : k => k }
    vmseries                              = { for vmseries in local.vmseries_instances : "${vmseries.group}-${vmseries.instance}" => "${vmseries.group}-${vmseries.instance}" }
    vmseries_network_interface            = { for n in local.vmseries_network_interfaces : "${n.group}-${n.instance}-${n.nic}" => "${n.nic}-${n.instance}" }
    iam_role = {
      security : "vmseries"
      spoke : "spokevm"
    }
    iam_instance_profile = {
      security : "vmseries"
      spoke : "spokevm"
    }
  }
}

For each kind of resource output from module can be used e.g. as below for VPC:

module "vpc" {
  source = "../../modules/vpc"

  for_each = var.vpcs

  name = module.generator.names.vpc[each.key]
  ...
}

or GWLB and its endpoints:

module "gwlb" {
  source = "../../../modules/gwlb"

  for_each = var.gwlbs

  name    = module.generator.names.gateway_loadbalancer[each.key]
  ...
}

module "gwlbe_endpoint" {
  source = "../../../modules/gwlb_endpoint_set"

  for_each = var.gwlb_endpoints

  name              = module.generator.names.gateway_loadbalancer_endpoint[each.key]
  ...
}

Map of templates needs to be defined in terraform.tfvars:

name_templates = {
  name_at_the_end = {
    delimiter = "-"
    parts = [
      { prefix = null },
      { abbreviation = "__default__" },
      { bu = "cloud" },
      { env = "tst" },
      { suffix = "ec1" },
      { name = "%s" },
  ] }
  name_after_abbr = {
    delimiter = "-"
    parts = [
      { prefix = null },
      { abbreviation = "__default__" },
      { name = "%s" },
      { bu = "cloud" },
      { env = "tst" },
      { suffix = "ec1" },
  ] }
  name_with_az = {
    delimiter = "-"
    parts = [
      { prefix = null },
      { abbreviation = "__default__" },
      { name = "%s" },
      { bu = "cloud" },
      { env = "tst" },
      { suffix = "ec1" },
      { az = "__az_numeric__" }, # __az_literal__, __az_numeric__
  ] }
  name_max_32_characters = {
    delimiter = "-"
    parts = [
      { prefix = null },
      { abbreviation = "__default__" },
      { name = "%s" },
      { bu = "cloud" },
      { env = "tst" },
  ] }
}

Besides that for each kind template needs to be assigned (or default template needs to be used):

template_assignments = {
  default                               = "name_after_abbr"
  subnet                                = "name_with_az"
  route_table                           = "name_with_az"
  nat_gateway                           = "name_at_the_end"
  vm                                    = "name_at_the_end"
  vmseries                              = "name_at_the_end"
  vmseries_network_interface            = "name_at_the_end"
  application_loadbalancer              = "name_max_32_characters"
  application_loadbalancer_target_group = "name_max_32_characters"
  network_loadbalancer                  = "name_max_32_characters"
  network_loadbalancer_target_group     = "name_max_32_characters"
  gateway_loadbalancer                  = "name_max_32_characters"
  gateway_loadbalancer_target_group     = "name_max_32_characters"
}

Reference

Requirements

NameVersion
terraform>= 1.0.0, < 2.0.0
aws~> 5.17

Providers

No providers.

Modules

No modules.

Resources

No resources.

Inputs

NameDescriptionTypeDefaultRequired
abbreviationsMap of abbreviations used for resources (placed in place of "__default__").map(string)
{
"application_loadbalancer": "alb",
"application_loadbalancer_target_group": "atg",
"gateway_loadbalancer": "gwlb",
"gateway_loadbalancer_endpoint": "gwep",
"gateway_loadbalancer_target_group": "gwtg",
"iam_instance_profile": "profile",
"iam_role": "role",
"internet_gateway": "igw",
"nat_gateway": "ngw",
"network_loadbalancer": "nlb",
"network_loadbalancer_target_group": "ntg",
"route_table": "rt",
"route_table_internet_gateway": "rt",
"security_group": "sg",
"subnet": "snet",
"transit_gateway": "tgw",
"transit_gateway_attachment": "att",
"transit_gateway_route_table": "trt",
"vm": "vm",
"vmseries": "vm",
"vmseries_network_interface": "nic",
"vpc": "vpc",
"vpn_gateway": "vgw"
}
no
az_map_literal_to_numericMap of number used instead of letters for AZs (placed in place of "__az_numeric__").map(string)
{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5,
"f": 6,
"g": 7,
"h": 8,
"i": 9
}
no
name_prefixPrefix used in names for the resourcesstringn/ayes
name_templatesMap of templates used to generate names. Each template is defined by list of objects. Each object contains 1 element defined by key and string value.

Important:
0. Delimiter specifies the delimiter used between all components of the new name.
1. Elements with key prefix (value is not important) will be replaced with value of the name_prefix variable (e.g. { prefix = null })
2. %s will be eventually replaced by resource name
3. __default__ is a marker that we will be replaced with a default resource abbreviation, anything else will be used literally.
4. __az_numeric__ is a marker that will be used to replace the availability zone letter indicator with a number (e.g. a->1, b->2, ...)
5. __az_literal__ is a marker that will be used to replace the full availability zone name with a letter (e.g. eu-central-1a will become a)
6. Order matters

Example:

name_template = {
name_at_the_end = {
delimiter = "-"
parts = [
{ prefix = null },
{ abbreviation = "__default__" },
{ bu = "cloud" },
{ env = "tst" },
{ suffix = "ec1" },
{ name = "%s" },
] }
name_after_abbr = {
delimiter = "-"
parts = [
{ prefix = null },
{ abbreviation = "__default__" },
{ name = "%s" },
{ bu = "cloud" },
{ env = "tst" },
{ suffix = "ec1" },
] }
name_with_az = {
delimiter = "-"
parts = [
{ prefix = null },
{ abbreviation = "__default__" },
{ name = "%s" },
{ bu = "cloud" },
{ env = "tst" },
{ suffix = "ec1" },
{ az = "__az_numeric__" }, # __az_literal__, __az_numeric__
] }
name_max_32_characters = {
delimiter = "-"
parts = [
{ prefix = null },
{ abbreviation = "__default__" },
{ name = "%s" },
{ bu = "cloud" },
{ env = "tst" },
] }
}
map(object({
delimiter = string
parts = list(map(string))
}))
{}no
namesMap of objects defining names used for resources.

Example:

names = {
vpc = { for k, v in var.vpcs : k => v.name }
gateway_loadbalancer = { for k, v in var.gwlbs : k => v.name }
gateway_loadbalancer_endpoint = { for k, v in var.gwlb_endpoints : k => v.name }
}

Please take a look combined_design example, which contains full map for names.
map(map(string)){}no
regionAWS region used to deploy whole infrastructurestringn/ayes
template_assignmentsMap of templates (used to generate names) assigned to each kind of resource.

Example:

template_assignments = {
default = "name_after_abbr"
subnet = "name_with_az"
route_table = "name_with_az"
nat_gateway = "name_at_the_end"
vm = "name_at_the_end"
vmseries = "name_at_the_end"
vmseries_network_interface = "name_at_the_end"
application_loadbalancer = "name_max_32_characters"
application_loadbalancer_target_group = "name_max_32_characters"
network_loadbalancer = "name_max_32_characters"
network_loadbalancer_target_group = "name_max_32_characters"
gateway_loadbalancer = "name_max_32_characters"
gateway_loadbalancer_target_group = "name_max_32_characters"
}
map(string){}no

Outputs

NameDescription
namesMap of generated names for each kind of resources.

Example:

names = {
vpc = {
app1_vpc = "example-vpc-app1-cloud-tst-ec1"
app2_vpc = "example-vpc-app2-cloud-tst-ec1"
security_vpc = "example-vpc-security-cloud-tst-ec1"
}
gateway_loadbalancer = {
security_gwlb = "example-gwlb-security-cloud-tst"
}
gateway_loadbalancer_endpoint = {
app1_inbound = "example-gwep-app1-cloud-tst-ec1"
app2_inbound = "example-gwep-app2-cloud-tst-ec1"
security_gwlb_eastwest = "example-gwep-eastwest-cloud-tst-ec1"
security_gwlb_outbound = "example-gwep-outbound-cloud-tst-ec1"
}
}