Skip to content

Instantly share code, notes, and snippets.

@greyhoundforty
Created May 12, 2023 21:07
Show Gist options
  • Save greyhoundforty/0017e18175c97bda5006419f492559e6 to your computer and use it in GitHub Desktop.
Save greyhoundforty/0017e18175c97bda5006419f492559e6 to your computer and use it in GitHub Desktop.
Terraform Sensitive value testing

Versions:

$ terraform version
Terraform v1.4.5
on darwin_arm64
+ provider registry.terraform.io/hashicorp/random v3.5.1
+ provider registry.terraform.io/ibm-cloud/ibm v1.53.0-beta0
+ provider registry.terraform.io/logdna/logdna v1.14.2

provider.tf

terraform {
  required_providers {
    ibm = {
      source  = "IBM-Cloud/ibm"
      version = "1.53.0-beta0"
    }
    logdna = {
      source  = "logdna/logdna"
      version = "1.14.2"
    }
  }
}

provider "ibm" {
  region = var.region
}

Here is what I used to test.

  • module.observability_instances.logdna_ingestion_key is a sensitive value by default.
  • I also used the CRN of a VPC instance that was part of the same deploynent to pass in to the templatefile function.

Since logdna_ingestion_key is sensitive by default, I figured a good way to test was with some random attribute from another resource I knew wouldn't be marked as sensitive by default.

main.tf

resource "ibm_compute_vm_instance" "classic" {
  hostname                 = "${local.prefix}-classic"
  domain                   = var.domain
  os_reference_code        = var.os_reference_code
  datacenter               = "dal12"
  network_speed            = 1000
  hourly_billing           = true
  local_disk               = true
  private_network_only     = false
  flavor_key_name          = "BL2_2X8X100"
  tags                     = local.tags
  public_vlan_id           = data.ibm_network_vlan.public.id
  private_vlan_id          = data.ibm_network_vlan.private.id
  dedicated_acct_host_only = false
  ipv6_enabled             = true
  ssh_key_ids              = [data.ibm_compute_ssh_key.sshkey.id]
  user_metadata = templatefile("${path.module}/init.tftpl", {
    logdna_key = module.observability_instances.logdna_ingestion_key
    secret_key = ibm_is_instance.test.crn
  })
}

init.tftpl

#!/usr/bin/env bash
set -e 
echo "Grabbing ingestion and secret keys"
echo ${logdna_key} | tee -a /tmp/logdna.key
echo ${secret_key} | tee -a /tmp/secret.key

Plan

$ terraform plan -out "$(terraform workspace show).tfplan"
data.ibm_is_ssh_key.ssh_key: Reading...
data.ibm_compute_ssh_key.sshkey: Reading...
data.ibm_is_image.base: Reading...
module.resource_group.data.ibm_resource_group.existing_resource_group[0]: Reading...
data.ibm_is_zones.regional: Reading...
data.ibm_network_vlan.public: Reading...
data.ibm_is_vpc.existing: Reading...
data.ibm_network_vlan.private: Reading...
data.ibm_compute_ssh_key.sshkey: Read complete after 0s [id=2175662]
data.ibm_is_zones.regional: Read complete after 0s [id=2023-05-12 20:40:19.359579 +0000 UTC]
data.ibm_network_vlan.public: Read complete after 0s [name=public-dal12-vlan]
data.ibm_network_vlan.private: Read complete after 0s [name=private-dal12-vlan]
module.resource_group.data.ibm_resource_group.existing_resource_group[0]: Read complete after 0s [id=ac83304b2fb6492e95995812da85b653]
data.ibm_is_image.base: Read complete after 1s [id=r038-b2ef5b38-7074-4119-9253-5fe81abe4842]
data.ibm_is_ssh_key.ssh_key: Read complete after 1s [id=r038-441f040d-e836-4d5f-ad3f-8ea475652ce2]
data.ibm_is_vpc.existing: Read complete after 2s [id=r038-a8827d69-a5ff-4571-8345-c7901e812a06]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # ibm_compute_vm_instance.classic will be created
  + resource "ibm_compute_vm_instance" "classic" {
      + block_storage_ids          = (known after apply)
      + cores                      = (known after apply)
      + datacenter                 = "dal12"
      + dedicated_acct_host_only   = false
      + disks                      = (known after apply)
      + domain                     = "ryantiffany.com"
      + file_storage_ids           = (known after apply)
      + flavor_key_name            = "BL2_2X8X100"
      + hostname                   = "scrt-test-classic"
      + hourly_billing             = true
      + id                         = (known after apply)
      + ip_address_id              = (known after apply)
      + ip_address_id_private      = (known after apply)
      + ipv4_address               = (known after apply)
      + ipv4_address_private       = (known after apply)
      + ipv6_address               = (known after apply)
      + ipv6_address_id            = (known after apply)
      + ipv6_enabled               = true
      + ipv6_static_enabled        = false
      + local_disk                 = true
      + memory                     = (known after apply)
      + network_speed              = 1000
      + os_reference_code          = "UBUNTU_20_64"
      + private_interface_id       = (known after apply)
      + private_network_only       = false
      + private_security_group_ids = (known after apply)
      + private_subnet             = (known after apply)
      + private_subnet_id          = (known after apply)
      + private_vlan_id            = 2603447
      + public_bandwidth_limited   = (known after apply)
      + public_bandwidth_unlimited = false
      + public_interface_id        = (known after apply)
      + public_ipv6_subnet         = (known after apply)
      + public_ipv6_subnet_id      = (known after apply)
      + public_security_group_ids  = (known after apply)
      + public_subnet              = (known after apply)
      + public_subnet_id           = (known after apply)
      + public_vlan_id             = 2603445
      + resource_controller_url    = (known after apply)
      + resource_name              = (known after apply)
      + resource_status            = (known after apply)
      + secondary_ip_addresses     = (known after apply)
      + ssh_key_ids                = [
          + 2175662,
        ]
      + tags                       = [
          + "owner:ryantiffany",
          + "provider:ibm",
          + "region:ca-tor",
          + "tfworkspace:default",
          + "vpc:scrt-test-vpc",
        ]
      + user_metadata              = (sensitive value)
      + wait_time_minutes          = 90
    }

  # ibm_is_instance.test will be created
  + resource "ibm_is_instance" "test" {
      + access_tags                       = (known after apply)
      + availability_policy_host_failure  = (known after apply)
      + bandwidth                         = (known after apply)
      + crn                               = (known after apply)
      + default_trusted_profile_auto_link = (known after apply)
      + disks                             = (known after apply)
      + force_action                      = false
      + gpu                               = (known after apply)
      + id                                = (known after apply)
      + image                             = "r038-b2ef5b38-7074-4119-9253-5fe81abe4842"
      + keys                              = [
          + "r038-441f040d-e836-4d5f-ad3f-8ea475652ce2",
        ]
      + lifecycle_reasons                 = (known after apply)
      + lifecycle_state                   = (known after apply)
      + memory                            = (known after apply)
      + metadata_service_enabled          = (known after apply)
      + name                              = "scrt-test-instance"
      + placement_target                  = (known after apply)
      + profile                           = "cx2-2x4"
      + resource_controller_url           = (known after apply)
      + resource_crn                      = (known after apply)
      + resource_group                    = "ac83304b2fb6492e95995812da85b653"
      + resource_group_name               = (known after apply)
      + resource_name                     = (known after apply)
      + resource_status                   = (known after apply)
      + status                            = (known after apply)
      + status_reasons                    = (known after apply)
      + tags                              = [
          + "owner:ryantiffany",
          + "provider:ibm",
          + "region:ca-tor",
          + "tfworkspace:default",
          + "vpc:scrt-test-vpc",
          + "zone:ca-tor-1",
        ]
      + total_network_bandwidth           = (known after apply)
      + total_volume_bandwidth            = (known after apply)
      + user_data                         = (sensitive value)
      + vcpu                              = (known after apply)
      + volume_attachments                = (known after apply)
      + vpc                               = "r038-a8827d69-a5ff-4571-8345-c7901e812a06"
      + wait_before_delete                = true
      + zone                              = "ca-tor-1"

      + boot_volume {
          + auto_delete_volume = true
          + encryption         = (known after apply)
          + iops               = (known after apply)
          + name               = "scrt-test-boot"
          + profile            = (known after apply)
          + size               = (known after apply)
          + snapshot           = (known after apply)
          + tags               = (known after apply)
          + volume_id          = (known after apply)
        }

      + metadata_service {
          + enabled            = true
          + protocol           = (known after apply)
          + response_hop_limit = (known after apply)
        }

      + network_interfaces {
          + allow_ip_spoofing    = (known after apply)
          + id                   = (known after apply)
          + name                 = (known after apply)
          + primary_ipv4_address = (known after apply)
          + security_groups      = (known after apply)
          + subnet               = (known after apply)

          + primary_ip {
              + address       = (known after apply)
              + auto_delete   = (known after apply)
              + href          = (known after apply)
              + name          = (known after apply)
              + reserved_ip   = (known after apply)
              + resource_type = (known after apply)
            }
        }

      + primary_network_interface {
          + allow_ip_spoofing    = false
          + id                   = (known after apply)
          + name                 = (known after apply)
          + port_speed           = (known after apply)
          + primary_ipv4_address = (known after apply)
          + security_groups      = [
              + "r038-c9953e03-b1ce-4860-9525-0167c0b207f6",
            ]
          + subnet               = "02q7-0f04b713-58ef-40ab-81c4-b43f5debf5c2"

          + primary_ip {
              + address       = (known after apply)
              + auto_delete   = (known after apply)
              + href          = (known after apply)
              + name          = (known after apply)
              + reserved_ip   = (known after apply)
              + resource_type = (known after apply)
            }
        }
    }

  # random_string.secret will be created
  + resource "random_string" "secret" {
      + id          = (known after apply)
      + length      = 12
      + lower       = true
      + min_lower   = 0
      + min_numeric = 0
      + min_special = 0
      + min_upper   = 0
      + number      = true
      + numeric     = true
      + result      = (known after apply)
      + special     = true
      + upper       = false
    }

  # module.observability_instances.module.logdna.ibm_resource_instance.logdna[0] will be created
  + resource "ibm_resource_instance" "logdna" {
      + account_id              = (known after apply)
      + allow_cleanup           = (known after apply)
      + created_at              = (known after apply)
      + created_by              = (known after apply)
      + crn                     = (known after apply)
      + dashboard_url           = (known after apply)
      + deleted_at              = (known after apply)
      + deleted_by              = (known after apply)
      + extensions              = (known after apply)
      + guid                    = (known after apply)
      + id                      = (known after apply)
      + last_operation          = (known after apply)
      + location                = "ca-tor"
      + locked                  = (known after apply)
      + name                    = "scrt-test-logging-instance"
      + parameters              = {
          + "default_receiver" = "true"
        }
      + plan                    = "7-day"
      + plan_history            = (known after apply)
      + resource_aliases_url    = (known after apply)
      + resource_bindings_url   = (known after apply)
      + resource_controller_url = (known after apply)
      + resource_crn            = (known after apply)
      + resource_group_crn      = (known after apply)
      + resource_group_id       = "ac83304b2fb6492e95995812da85b653"
      + resource_group_name     = (known after apply)
      + resource_id             = (known after apply)
      + resource_keys_url       = (known after apply)
      + resource_name           = (known after apply)
      + resource_plan_id        = (known after apply)
      + resource_status         = (known after apply)
      + restored_at             = (known after apply)
      + restored_by             = (known after apply)
      + scheduled_reclaim_at    = (known after apply)
      + scheduled_reclaim_by    = (known after apply)
      + service                 = "logdna"
      + service_endpoints       = "public-and-private"
      + state                   = (known after apply)
      + status                  = (known after apply)
      + sub_type                = (known after apply)
      + tags                    = [
          + "owner:ryantiffany",
          + "provider:ibm",
          + "region:ca-tor",
          + "tfworkspace:default",
          + "vpc:scrt-test-vpc",
        ]
      + target_crn              = (known after apply)
      + type                    = (known after apply)
      + update_at               = (known after apply)
      + update_by               = (known after apply)
    }

  # module.observability_instances.module.logdna.ibm_resource_key.resource_key[0] will be created
  + resource "ibm_resource_key" "resource_key" {
      + account_id            = (known after apply)
      + created_at            = (known after apply)
      + created_by            = (known after apply)
      + credentials           = (sensitive value)
      + credentials_json      = (sensitive value)
      + crn                   = (known after apply)
      + deleted_at            = (known after apply)
      + deleted_by            = (known after apply)
      + guid                  = (known after apply)
      + iam_compatible        = (known after apply)
      + id                    = (known after apply)
      + name                  = "LogDnaManagerKey"
      + resource_group_id     = (known after apply)
      + resource_instance_id  = (known after apply)
      + resource_instance_url = (known after apply)
      + role                  = "Manager"
      + source_crn            = (known after apply)
      + state                 = (known after apply)
      + status                = (known after apply)
      + updated_at            = (known after apply)
      + updated_by            = (known after apply)
      + url                   = (known after apply)
    }

Plan: 5 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + logdna_ingestion_key = (sensitive value)

Apply

$ terraform apply "default.tfplan"
random_string.secret: Creating...
random_string.secret: Creation complete after 0s [id=w:}%f50&9z3:]
module.observability_instances.module.logdna.ibm_resource_instance.logdna[0]: Creating...
module.observability_instances.module.logdna.ibm_resource_instance.logdna[0]: Still creating... [10s elapsed]
module.observability_instances.module.logdna.ibm_resource_instance.logdna[0]: Creation complete after 14s [id=crn:v1:bluemix:public:logdna:ca-tor:a/6c27214690345bfb75bb1f2b28a20504:a546db72-8e4f-462b-8762-2eaca8a9b2bc::]
module.observability_instances.module.logdna.ibm_resource_key.resource_key[0]: Creating...
module.observability_instances.module.logdna.ibm_resource_key.resource_key[0]: Creation complete after 2s [id=crn:v1:bluemix:public:logdna:ca-tor:a/6c27214690345bfb75bb1f2b28a20504:a546db72-8e4f-462b-8762-2eaca8a9b2bc:resource-key:ac9d9b73-c397-4a99-ae8d-6d32640537d8]
ibm_is_instance.test: Creating...
ibm_is_instance.test: Still creating... [10s elapsed]
ibm_is_instance.test: Creation complete after 17s [id=02q7_36fa07c0-c9eb-4b0c-8fe7-832d87c034b9]
ibm_compute_vm_instance.classic: Creating...
ibm_compute_vm_instance.classic: Still creating... [10s elapsed]
ibm_compute_vm_instance.classic: Still creating... [20s elapsed]
ibm_compute_vm_instance.classic: Still creating... [30s elapsed]
ibm_compute_vm_instance.classic: Still creating... [40s elapsed]
ibm_compute_vm_instance.classic: Still creating... [50s elapsed]
ibm_compute_vm_instance.classic: Still creating... [1m0s elapsed]
ibm_compute_vm_instance.classic: Still creating... [1m10s elapsed]
ibm_compute_vm_instance.classic: Still creating... [1m20s elapsed]
ibm_compute_vm_instance.classic: Still creating... [1m30s elapsed]
ibm_compute_vm_instance.classic: Creation complete after 1m39s [id=137403360]

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

Outputs:

logdna_ingestion_key = <sensitive>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment