vainkop / terraform-aws-wireguard

Terraform Module for Wireguard VPN
GNU General Public License v3.0
25 stars 23 forks source link

When use_ssm is off there is a template issue in user-data.txt #4

Open MarcMeszaros opened 3 years ago

MarcMeszaros commented 3 years ago

By default use_ssm = false. This causes template rendering to fail (in terraform v0.15.0+ at least).

│ Error: Error in function call
│ 
│   on .terraform/modules/wireguard/main.tf line 58, in resource "aws_launch_configuration" "wireguard_launch_config":
│   58:   user_data = templatefile("${path.module}/templates/user-data.txt", {
│   59:     wg_server_private_key              = var.use_ssm ? "AWS_SSM_PARAMETER" : var.wg_server_private_key,
│   60:     wg_server_private_key_aws_ssm_name = var.use_ssm ? aws_ssm_parameter.wireguard_server_private_key[0].name : null,
│   61:     wg_server_net                      = var.wg_server_net,
│   62:     wg_server_port                     = var.wg_server_port,
│   63:     peers                              = join("\n", data.template_file.wg_client_data_json.*.rendered),
│   64:     use_eip                            = var.use_eip ? "enabled" : "disabled",
│   65:     eip_id                             = aws_eip.wireguard.id,
│   66:     use_ssm                            = var.use_ssm ? "true" : "false",
│   67:     wg_server_interface                = var.wg_server_interface
│   68:   })
│     ├────────────────
│     │ aws_eip.wireguard.id is "eipalloc-2fb2cd18"
│     │ aws_ssm_parameter.wireguard_server_private_key is empty tuple
│     │ data.template_file.wg_client_data_json is tuple with 1 element
│     │ path.module is ".terraform/modules/wireguard"
│     │ var.use_eip is false
│     │ var.use_ssm is false
│     │ var.wg_server_interface is "eth0"
│     │ var.wg_server_net is "172.25.5.0/24"
│     │ var.wg_server_port is 51820
│     │ var.wg_server_private_key is "<redacted>"
│ 
│ Call to function "templatefile" failed:
│ .terraform/modules/wireguard/templates/user-data.txt:60,47-81: Invalid
│ template interpolation value; The expression result is null. Cannot include
│ a null value in a string template., and 1 other diagnostic(s).

Solution

Use empty string instead of null when passing in template variables even if the variable isn't actually used in the user-data script.

  user_data = templatefile("${path.module}/templates/user-data.txt", {
    wg_server_private_key              = var.use_ssm ? "AWS_SSM_PARAMETER" : var.wg_server_private_key,
    wg_server_private_key_aws_ssm_name = var.use_ssm ? aws_ssm_parameter.wireguard_server_private_key[0].name : "",
    wg_server_net                      = var.wg_server_net,
    wg_server_port                     = var.wg_server_port,
    peers                              = join("\n", data.template_file.wg_client_data_json.*.rendered),
    use_eip                            = var.use_eip ? "enabled" : "disabled",
    eip_id                             = aws_eip.wireguard.id,
    use_ssm                            = var.use_ssm ? "true" : "false",
    wg_server_interface                = var.wg_server_interface
  })