GCP Secret Manager - Retrieve Secrets

Octopus.GoogleCloudScripting exported 2023-05-01 by harrisonmeister belongs to ‘Google Cloud’ category.

This step retrieves one or more secrets from Secret Manager on Google Cloud Platform (GCP), and creates sensitive output variables for each value retrieved. These values can be used in other steps in your deployment or runbook process.

It’s recommended that you retrieve secrets with a specific version, and not the latest version. You can choose a custom output variable name for each secret, or one will be created dynamically.


Required:

  • Octopus Server 2021.2 or higher.
  • PowerShell 5.1 or higher.
  • The Google Cloud (gcloud) CLI, version 338.0.0 or higher installed on the target or worker. If the CLI can’t be found, the step will fail.
  • A Google account with permissions to retrieve secrets from Secret Manager on Google Cloud. Accessing a secret version requires the Secret Manager Secret Accessor role (roles/secretmanager.secretAccessor) on the secret, project, folder, or organization.

Notes:

  • Tested on Octopus 2021.2.
  • Tested on both Windows Server 2019 and Ubuntu 20.04.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Google Cloud Account

GCP.SecretManager.RetrieveSecrets.Account =

A Google Cloud account with permissions to access secrets from Secret Manager.

Google Cloud Project

GCP.SecretManager.RetrieveSecrets.Project =

Specify the default project. This sets the CLOUDSDK_CORE_PROJECT environment variable.

Google Cloud Region

GCP.SecretManager.RetrieveSecrets.Region =

Specify the default region. View the GCP Regions and Zones documentation for a current list of the available region and zone codes.

This sets the CLOUDSDK_COMPUTE_REGION environment variable.

Google Cloud Zone

GCP.SecretManager.RetrieveSecrets.Zone =

Specify the default zone. View the GCP Regions and Zones documentation for a current list of the available region and zone codes.

This sets the CLOUDSDK_COMPUTE_ZONE environment variable.

Secret names to retrieve

GCP.SecretManager.RetrieveSecrets.SecretNames =

Specify the names of the secrets to be returned from Secret Manager in Google Cloud, in the format:

SecretName SecretVersion | OutputVariableName where:

  • SecretName is the name of the secret to retrieve.
  • SecretVersion is the version of the secret to retrieve. If this value isn’t specified, the latest version will be retrieved.
  • OutputVariableName is the optional Octopus output variable name to store the secret’s value in. If this value isn’t specified, an output name will be generated dynamically.

Note: Multiple fields can be retrieved by entering each one on a new line.

GCP.SecretManager.RetrieveSecrets.PrintVariableNames = False

Write out the Octopus output variable names to the task log. Default: False.

Script body

Steps based on this template will execute the following PowerShell script.

$ErrorActionPreference = 'Stop'

# Variables
$SecretNames = $OctopusParameters["GCP.SecretManager.RetrieveSecrets.SecretNames"]
$PrintVariableNames = $OctopusParameters["GCP.SecretManager.RetrieveSecrets.PrintVariableNames"]

# GCP Project/Region/Zone
$Project = $OctopusParameters["GCP.SecretManager.RetrieveSecrets.Project"]
$Region = $OctopusParameters["GCP.SecretManager.RetrieveSecrets.Region"]
$Zone = $OctopusParameters["GCP.SecretManager.RetrieveSecrets.Zone"]

# Validation
if ([string]::IsNullOrWhiteSpace($SecretNames)) {
    throw "Required parameter GCP.SecretManager.RetrieveSecrets.SecretNames not specified"
}

$Secrets = @()
$VariablesCreated = 0
$StepName = $OctopusParameters["Octopus.Step.Name"]

# Extract secret names
@(($SecretNames -Split "`n").Trim()) | ForEach-Object {
    if (![string]::IsNullOrWhiteSpace($_)) {
        Write-Verbose "Working on: '$_'"
        $secretDefinition = ($_ -Split "\|")
        $secretName = $secretDefinition[0].Trim()
        $secretNameAndVersion = ($secretName -Split " ")
        $secretVersion = "latest"
        if ($secretNameAndVersion.Count -gt 1) {
            $secretName = $secretNameAndVersion[0].Trim()
            $secretVersion = $secretNameAndVersion[1].Trim()
        }
        if ([string]::IsNullOrWhiteSpace($secretName)) {
            throw "Unable to establish secret name from: '$($_)'"
        }
        $secret = [PsCustomObject]@{
            Name          = $secretName
            SecretVersion = $secretVersion
            VariableName  = if (![string]::IsNullOrWhiteSpace($secretDefinition[1])) { $secretDefinition[1].Trim() } else { "" }
        }
        $Secrets += $secret
    }
}

Write-Verbose "GCP Default Project: $Project"
Write-Verbose "GCP Default Region: $Region"
Write-Verbose "GCP Default Zone: $Zone"
Write-Verbose "Secrets to retrieve: $($Secrets.Count)"
Write-Verbose "Print variables: $PrintVariableNames"

# Retrieve Secrets
foreach ($secret in $secrets) {
    $name = $secret.Name
    $secretVersion = $secret.SecretVersion
    $variableName = $secret.VariableName
    if ([string]::IsNullOrWhiteSpace($variableName)) {
        $variableName = "$($name.Trim())-$secretVersion"
    }
    Write-Host "Retrieving Secret '$name' (version: $secretVersion)"
    if ($secretVersion -ieq "latest") {
        Write-Host "Note: Retrieving the 'latest' version for secret '$name' isn't recommended. Consider choosing a specific version to retrieve."
    }
    
    $secretValue = (gcloud secrets versions access $secretVersion --secret="$name") -Join "`n"
    
    if ([string]::IsNullOrWhiteSpace($secretValue)) {
        throw "Error: Secret '$name' (version: $secretVersion) not found or has no versions."
    }

    Set-OctopusVariable -Name $variableName -Value $secretValue -Sensitive

    if ($PrintVariableNames -eq $True) {
        Write-Host "Created output variable: ##{Octopus.Action[$StepName].Output.$variableName}"
    }
    $VariablesCreated += 1
}

Write-Host "Created $variablesCreated output variables"

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "9f5a9e3c-76b1-462f-972a-ae91d5deaa05",
  "Name": "GCP Secret Manager - Retrieve Secrets",
  "Description": "This step retrieves one or more secrets from [Secret Manager](https://cloud.google.com/secret-manager) on Google Cloud Platform (GCP), and creates [sensitive output variables](https://octopus.com/docs/projects/variables/output-variables#sensitive-output-variables) for each value retrieved. These values can be used in other steps in your deployment or runbook process.\n\nIt's recommended that you retrieve secrets with a specific version, and not the *latest* version. You can choose a custom output variable name for each secret, or one will be created dynamically.\n\n---\n\n**Required:** \n- Octopus Server **2021.2** or higher.\n- PowerShell **5.1** or higher.\n- The Google Cloud (`gcloud`) CLI, version **338.0.0** or higher installed on the target or worker. If the CLI can't be found, the step will fail.\n- A Google account with permissions to retrieve secrets from Secret Manager on Google Cloud. Accessing a secret version requires the **Secret Manager Secret Accessor** role (`roles/secretmanager.secretAccessor`) on the secret, project, folder, or organization. \n\nNotes:\n\n- Tested on Octopus **2021.2**.\n- Tested on both Windows Server 2019 and Ubuntu 20.04.\n\n",
  "Version": 3,
  "ExportedAt": "2023-05-01T16:37:53.788Z",
  "ActionType": "Octopus.GoogleCloudScripting",
  "Author": "harrisonmeister",
  "Packages": [],
  "Parameters": [
    {
      "Id": "29f8f138-c6a2-4906-a059-b220c6fd9dd2",
      "Name": "GCP.SecretManager.RetrieveSecrets.Account",
      "Label": "Google Cloud Account",
      "HelpText": "A Google Cloud account with permissions to access secrets from Secret Manager.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "GoogleCloudAccount"
      }
    },
    {
      "Id": "7ab1295b-52dc-432e-ac8f-14c8db41e7dd",
      "Name": "GCP.SecretManager.RetrieveSecrets.Project",
      "Label": "Google Cloud Project",
      "HelpText": "Specify the default project. This sets the `CLOUDSDK_CORE_PROJECT` [environment variable](https://g.octopushq.com/GCPDefaultProject).",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "c75430a0-7cdd-462a-a302-1c05097b4570",
      "Name": "GCP.SecretManager.RetrieveSecrets.Region",
      "Label": "Google Cloud Region",
      "HelpText": "Specify the default region. View the [GCP Regions and Zones](https://g.octopushq.com/GCPRegionsZones) documentation for a current list of the available region and zone codes.\n\nThis sets the `CLOUDSDK_COMPUTE_REGION` [environment variable](https://g.octopushq.com/GCPDefaultRegionAndZone).",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "18a683b7-8bc1-4005-bbef-2a88ab52b659",
      "Name": "GCP.SecretManager.RetrieveSecrets.Zone",
      "Label": "Google Cloud Zone",
      "HelpText": "Specify the default zone. View the [GCP Regions and Zones](https://g.octopushq.com/GCPRegionsZones) documentation for a current list of the available region and zone codes.\n\nThis sets the `CLOUDSDK_COMPUTE_ZONE` [environment variable](https://g.octopushq.com/GCPDefaultRegionAndZone).",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "08056d0f-d0a3-42c3-ac4c-612c56b93d21",
      "Name": "GCP.SecretManager.RetrieveSecrets.SecretNames",
      "Label": "Secret names to retrieve",
      "HelpText": "Specify the names of the secrets to be returned from Secret Manager in Google Cloud, in the format:\n\n`SecretName SecretVersion | OutputVariableName` where:\n\n- `SecretName` is the name of the secret to retrieve.\n- `SecretVersion` is the version of the secret to retrieve. *If this value isn't specified, the latest version will be retrieved*.\n- `OutputVariableName` is the _optional_ Octopus [output variable](https://octopus.com/docs/projects/variables/output-variables) name to store the secret's value in. *If this value isn't specified, an output name will be generated dynamically*.\n\n**Note:** Multiple fields can be retrieved by entering each one on a new line.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "MultiLineText"
      }
    },
    {
      "Id": "517e1f61-418e-4e97-9d07-54cac58f03a2",
      "Name": "GCP.SecretManager.RetrieveSecrets.PrintVariableNames",
      "Label": "Print output variable names",
      "HelpText": "Write out the Octopus [output variable](https://octopus.com/docs/projects/variables/output-variables) names to the task log. Default: `False`.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.GoogleCloud.ImpersonateServiceAccount": "False",
    "Octopus.Action.GoogleCloud.UseVMServiceAccount": "False",
    "Octopus.Action.GoogleCloudAccount.Variable": "#{GCP.SecretManager.RetrieveSecrets.Account}",
    "Octopus.Action.GoogleCloud.Project": "#{GCP.SecretManager.RetrieveSecrets.Project}",
    "Octopus.Action.GoogleCloud.Region": "#{GCP.SecretManager.RetrieveSecrets.Region}",
    "Octopus.Action.GoogleCloud.Zone": "#{GCP.SecretManager.RetrieveSecrets.Zone}",
    "Octopus.Action.Script.ScriptBody": "$ErrorActionPreference = 'Stop'\n\n# Variables\n$SecretNames = $OctopusParameters[\"GCP.SecretManager.RetrieveSecrets.SecretNames\"]\n$PrintVariableNames = $OctopusParameters[\"GCP.SecretManager.RetrieveSecrets.PrintVariableNames\"]\n\n# GCP Project/Region/Zone\n$Project = $OctopusParameters[\"GCP.SecretManager.RetrieveSecrets.Project\"]\n$Region = $OctopusParameters[\"GCP.SecretManager.RetrieveSecrets.Region\"]\n$Zone = $OctopusParameters[\"GCP.SecretManager.RetrieveSecrets.Zone\"]\n\n# Validation\nif ([string]::IsNullOrWhiteSpace($SecretNames)) {\n    throw \"Required parameter GCP.SecretManager.RetrieveSecrets.SecretNames not specified\"\n}\n\n$Secrets = @()\n$VariablesCreated = 0\n$StepName = $OctopusParameters[\"Octopus.Step.Name\"]\n\n# Extract secret names\n@(($SecretNames -Split \"`n\").Trim()) | ForEach-Object {\n    if (![string]::IsNullOrWhiteSpace($_)) {\n        Write-Verbose \"Working on: '$_'\"\n        $secretDefinition = ($_ -Split \"\\|\")\n        $secretName = $secretDefinition[0].Trim()\n        $secretNameAndVersion = ($secretName -Split \" \")\n        $secretVersion = \"latest\"\n        if ($secretNameAndVersion.Count -gt 1) {\n            $secretName = $secretNameAndVersion[0].Trim()\n            $secretVersion = $secretNameAndVersion[1].Trim()\n        }\n        if ([string]::IsNullOrWhiteSpace($secretName)) {\n            throw \"Unable to establish secret name from: '$($_)'\"\n        }\n        $secret = [PsCustomObject]@{\n            Name          = $secretName\n            SecretVersion = $secretVersion\n            VariableName  = if (![string]::IsNullOrWhiteSpace($secretDefinition[1])) { $secretDefinition[1].Trim() } else { \"\" }\n        }\n        $Secrets += $secret\n    }\n}\n\nWrite-Verbose \"GCP Default Project: $Project\"\nWrite-Verbose \"GCP Default Region: $Region\"\nWrite-Verbose \"GCP Default Zone: $Zone\"\nWrite-Verbose \"Secrets to retrieve: $($Secrets.Count)\"\nWrite-Verbose \"Print variables: $PrintVariableNames\"\n\n# Retrieve Secrets\nforeach ($secret in $secrets) {\n    $name = $secret.Name\n    $secretVersion = $secret.SecretVersion\n    $variableName = $secret.VariableName\n    if ([string]::IsNullOrWhiteSpace($variableName)) {\n        $variableName = \"$($name.Trim())-$secretVersion\"\n    }\n    Write-Host \"Retrieving Secret '$name' (version: $secretVersion)\"\n    if ($secretVersion -ieq \"latest\") {\n        Write-Host \"Note: Retrieving the 'latest' version for secret '$name' isn't recommended. Consider choosing a specific version to retrieve.\"\n    }\n    \n    $secretValue = (gcloud secrets versions access $secretVersion --secret=\"$name\") -Join \"`n\"\n    \n    if ([string]::IsNullOrWhiteSpace($secretValue)) {\n        throw \"Error: Secret '$name' (version: $secretVersion) not found or has no versions.\"\n    }\n\n    Set-OctopusVariable -Name $variableName -Value $secretValue -Sensitive\n\n    if ($PrintVariableNames -eq $True) {\n        Write-Host \"Created output variable: ##{Octopus.Action[$StepName].Output.$variableName}\"\n    }\n    $VariablesCreated += 1\n}\n\nWrite-Host \"Created $variablesCreated output variables\"\n"
  },
  "Category": "Google Cloud",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/gcp-secret-manager-retrieve-secrets.json",
  "Website": "/step-templates/9f5a9e3c-76b1-462f-972a-ae91d5deaa05",
  "Logo": "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",
  "MinimumServerVersion": "2021.2.0",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Monday, May 1, 2023