Octopus.Script exported 2026-06-17 by akeyless-community belongs to ‘Akeyless’ category.
This step retrieves a dynamic secret from Akeyless and creates sensitive output variables for use in later deployment or runbook steps.
This step template uses the Akeyless REST API, so no other dependencies are needed.
Authentication token
Use the Akeyless - Access Key Login step template first, then bind the Auth Token parameter to:
#{Octopus.Action[
Dynamic secret arguments
Optional provisioning arguments can be supplied one per line.
Required:
- Authentication token
- Dynamic secret path
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Gateway URL
Akeyless.Retrieve.Dynamic.GatewayUrl = https://api.akeyless.io
The Akeyless API or Gateway URL. For SaaS, use https://api.akeyless.io.
Auth Token
Akeyless.Retrieve.Dynamic.AuthToken =
Authentication token from a previous Akeyless login step.
Secret path
Akeyless.Retrieve.Dynamic.SecretPath =
Full path to the dynamic secret, e.g. /production/database/dynamic
Output variable name
Akeyless.Retrieve.Dynamic.OutputVariableName =
Optional output variable name when the dynamic secret returns a single value.
Timeout (seconds)
Akeyless.Retrieve.Dynamic.Timeout =
Optional timeout for dynamic secret provisioning.
Dynamic secret args
Akeyless.Retrieve.Dynamic.DynamicSecretArgs =
Optional provisioning arguments, one per line.
Field names
Akeyless.Retrieve.Dynamic.FieldValues =
Choose specific response fields in the format FieldName | OutputVariableName.
Print output variable names
Akeyless.Retrieve.Dynamic.PrintVariableNames = False
Write created output variable names to the task log.
Script body
Steps based on this template will execute the following PowerShell script.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
function Get-AkeylessApiErrorBody {
param ($RequestError)
if ($PSVersionTable.PSVersion.Major -lt 6) {
if ($RequestError.Exception.Response) {
$reader = New-Object System.IO.StreamReader($RequestError.Exception.Response.GetResponseStream())
$reader.BaseStream.Position = 0
$reader.DiscardBufferedData()
$rawResponse = $reader.ReadToEnd()
try { return ($rawResponse | ConvertFrom-Json) } catch { return $rawResponse }
}
return $null
}
return $RequestError.ErrorDetails.Message
}
function Format-AkeylessApiError {
param (
[string]$Action,
[System.Management.Automation.ErrorRecord]$ErrorRecord
)
$message = "An error occurred during $Action`: $($ErrorRecord.Exception.Message)"
$body = Get-AkeylessApiErrorBody -RequestError $ErrorRecord
if ($null -ne $body) {
if ($body.error) {
$message += "`n`tDetail: $($body.error)"
}
elseif ($body.PSObject.Properties.Name -contains 'errors') {
$message += "`n`tDetail: $($body.errors -Join ',')"
}
elseif ($body -is [string] -and -not [string]::IsNullOrWhiteSpace($body)) {
$message += "`n`tDetail: $body"
}
}
return $message
}
function Invoke-AkeylessApi {
param (
[Parameter(Mandatory = $true)][string]$GatewayUrl,
[Parameter(Mandatory = $true)][string]$Path,
[Parameter(Mandatory = $true)][hashtable]$Body
)
$base = $GatewayUrl.TrimEnd('/')
$apiPath = $Path.TrimStart('/')
$uri = "$base/$apiPath"
$json = $Body | ConvertTo-Json -Depth 20 -Compress:$false
try {
return Invoke-RestMethod -Method Post -Uri $uri -Body $json -ContentType 'application/json'
}
catch {
$detail = Format-AkeylessApiError -Action "POST $Path" -ErrorRecord $_
Write-Error $detail -Category ConnectionError
}
}
function Normalize-AkeylessPath {
param ([string]$Path)
if ([string]::IsNullOrWhiteSpace($Path)) {
return $Path
}
$normalized = $Path.Trim()
if (-not $normalized.StartsWith('/')) {
$normalized = "/$normalized"
}
return $normalized
}
function ConvertTo-AkeylessOutputVariableName {
param (
[string]$SecretPath,
[string]$FieldName = '',
[string]$OverrideName = ''
)
if (-not [string]::IsNullOrWhiteSpace($OverrideName)) {
return $OverrideName.Trim()
}
$base = (Normalize-AkeylessPath $SecretPath).Trim('/').Replace('/', '.')
if ([string]::IsNullOrWhiteSpace($FieldName)) {
return $base
}
return "$base.$($FieldName.Trim())"
}
function Get-AkeylessSecretValue {
param (
[string]$GatewayUrl,
[string]$Token,
[string]$SecretPath,
[int]$Version = 0
)
$path = Normalize-AkeylessPath $SecretPath
$body = @{
token = $Token
names = @($path)
}
if ($Version -gt 0) {
$body.version = $Version
}
$response = Invoke-AkeylessApi -GatewayUrl $GatewayUrl -Path 'get-secret-value' -Body $body
if ($null -eq $response) {
throw "Empty response retrieving secret '$path'"
}
if ($response.PSObject.Properties.Name -contains $path) {
return $response.$path
}
foreach ($property in $response.PSObject.Properties) {
if (-not [string]::IsNullOrWhiteSpace([string]$property.Value)) {
return $property.Value
}
}
throw "Secret '$path' was not found in the API response"
}
function Set-AkeylessSensitiveOutput {
param (
[string]$Name,
[string]$Value,
[string]$StepName,
[bool]$PrintVariableNames
)
if ([string]::IsNullOrWhiteSpace($Name)) {
throw 'Output variable name cannot be empty'
}
Set-OctopusVariable -Name $Name -Value $Value -Sensitive
if ($PrintVariableNames) {
Write-Host "Created output variable: ##{Octopus.Action[$StepName].Output.$Name}"
}
}
function Publish-AkeylessSecretValue {
param (
[string]$GatewayUrl,
[string]$Token,
[string]$SecretPath,
[string]$StepName,
[bool]$PrintVariableNames,
[string]$OutputVariableName = '',
[array]$Fields = @(),
[int]$Version = 0
)
$raw = Get-AkeylessSecretValue -GatewayUrl $GatewayUrl -Token $Token -SecretPath $SecretPath -Version $Version
$created = 0
$fieldsSpecified = ($Fields.Count -gt 0)
if ($raw -is [string]) {
$trimmed = $raw.Trim()
if ($fieldsSpecified) {
$parsed = $null
try { $parsed = $trimmed | ConvertFrom-Json } catch {}
if ($null -eq $parsed) {
throw "Secret '$SecretPath' is not JSON but field names were specified"
}
$raw = $parsed
}
}
if ($raw -is [pscustomobject] -or $raw -is [hashtable]) {
$properties = if ($raw -is [hashtable]) { $raw.Keys } else { $raw.PSObject.Properties.Name }
if ($fieldsSpecified) {
foreach ($field in $Fields) {
$fieldName = $field.Name
$fieldValue = if ($raw -is [hashtable]) { $raw[$fieldName] } else { $raw.$fieldName }
if ($null -ne $fieldValue) {
$variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $fieldName -OverrideName $field.VariableName
Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames
$created++
}
}
}
else {
foreach ($fieldName in $properties) {
$fieldValue = if ($raw -is [hashtable]) { $raw[$fieldName] } else { $raw.$fieldName }
if ($null -ne $fieldValue) {
$variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $fieldName
Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames
$created++
}
}
}
return $created
}
$variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -OverrideName $OutputVariableName
Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$raw) -StepName $StepName -PrintVariableNames $PrintVariableNames
return 1
}
function Invoke-AkeylessListItems {
param (
[string]$GatewayUrl,
[string]$Token,
[string]$FolderPath,
[string[]]$Types = @()
)
$path = Normalize-AkeylessPath $FolderPath
$items = @()
$folders = @()
$paginationToken = ''
do {
$body = @{
token = $Token
path = $path
'current-folder' = $true
}
if ($Types.Count -gt 0) {
$body.type = $Types
}
if (-not [string]::IsNullOrWhiteSpace($paginationToken)) {
$body.'pagination-token' = $paginationToken
}
$response = Invoke-AkeylessApi -GatewayUrl $GatewayUrl -Path 'list-items' -Body $body
if ($null -eq $response) {
break
}
if ($null -ne $response.items) {
$items += @($response.items | ForEach-Object { $_.item_name })
}
if ($null -ne $response.folders) {
$folders += @($response.folders)
}
$paginationToken = ''
if ($response.PSObject.Properties.Name -contains 'next_page') {
$paginationToken = [string]$response.next_page
}
} while (-not [string]::IsNullOrWhiteSpace($paginationToken))
return [pscustomobject]@{
Items = $items
Folders = $folders
}
}
function Get-AkeylessFolderItems {
param (
[string]$GatewayUrl,
[string]$Token,
[string]$FolderPath,
[string[]]$Types = @('static-secret')
)
$listing = Invoke-AkeylessListItems -GatewayUrl $GatewayUrl -Token $Token -FolderPath $FolderPath -Types $Types
return @($listing.Items)
}
function Get-AkeylessFolderChildren {
param (
[string]$GatewayUrl,
[string]$Token,
[string]$FolderPath
)
$listing = Invoke-AkeylessListItems -GatewayUrl $GatewayUrl -Token $Token -FolderPath $FolderPath
return @($listing.Folders)
}
function Parse-AkeylessFieldDefinitions {
param ([string]$RawValue)
$fields = @()
if ([string]::IsNullOrWhiteSpace($RawValue)) {
return $fields
}
@(($RawValue -Split "`n").Trim()) | ForEach-Object {
if ([string]::IsNullOrWhiteSpace($_)) { return }
$parts = ($_ -Split '\|', 2)
$name = $parts[0].Trim()
if ([string]::IsNullOrWhiteSpace($name)) {
throw "Unable to establish field name from: '$_'"
}
$fields += [pscustomobject]@{
Name = $name
VariableName = if ($parts.Count -gt 1) { $parts[1].Trim() } else { '' }
}
}
return $fields
}
function Parse-AkeylessSecretDefinitions {
param ([string]$RawValue)
$secrets = @()
if ([string]::IsNullOrWhiteSpace($RawValue)) {
return $secrets
}
@(($RawValue -Split "`n").Trim()) | ForEach-Object {
if ([string]::IsNullOrWhiteSpace($_)) { return }
$parts = ($_ -Split '\|', 2)
$path = Normalize-AkeylessPath $parts[0].Trim()
if ([string]::IsNullOrWhiteSpace($path)) {
throw "Unable to establish secret path from: '$_'"
}
$secrets += [pscustomobject]@{
Path = $path
OutputVariableName = if ($parts.Count -gt 1) { $parts[1].Trim() } else { '' }
}
}
return $secrets
}
function Get-AkeylessSecretsRecursively {
param (
[string]$GatewayUrl,
[string]$Token,
[string]$FolderPath,
[bool]$Recursive
)
$results = @()
$folder = Normalize-AkeylessPath $FolderPath
$items = Get-AkeylessFolderItems -GatewayUrl $GatewayUrl -Token $Token -FolderPath $folder
foreach ($item in $items) {
$results += $item
}
if ($Recursive) {
$children = Get-AkeylessFolderChildren -GatewayUrl $GatewayUrl -Token $Token -FolderPath $folder
foreach ($child in $children) {
$results += Get-AkeylessSecretsRecursively -GatewayUrl $GatewayUrl -Token $Token -FolderPath $child -Recursive $true
}
}
return $results
}
function Complete-AkeylessLogin {
param (
[string]$GatewayUrl,
[hashtable]$AuthBody,
[string]$StepName
)
$response = Invoke-AkeylessApi -GatewayUrl $GatewayUrl -Path 'auth' -Body $AuthBody
if ($null -eq $response -or [string]::IsNullOrWhiteSpace($response.token)) {
throw 'Authentication succeeded but no token was returned'
}
Set-AkeylessSensitiveOutput -Name 'AkeylessAuthToken' -Value $response.token -StepName $StepName -PrintVariableNames $true
Write-Host 'Authenticated to Akeyless successfully'
}
function Publish-AkeylessStructuredSecretResponse {
param (
[object]$Response,
[string]$SecretPath,
[string]$StepName,
[bool]$PrintVariableNames,
[string]$OutputVariableName = '',
[array]$Fields = @()
)
$created = 0
if ($Response -is [pscustomobject] -or $Response -is [hashtable]) {
$properties = if ($Response -is [hashtable]) { @($Response.Keys) } else { @($Response.PSObject.Properties.Name) }
if ($Fields.Count -gt 0) {
foreach ($field in $Fields) {
$fieldValue = if ($Response -is [hashtable]) { $Response[$field.Name] } else { $Response.$($field.Name) }
if ($null -ne $fieldValue) {
$variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $field.Name -OverrideName $field.VariableName
Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames
$created++
}
}
}
else {
$useSingleOutputName = (-not [string]::IsNullOrWhiteSpace($OutputVariableName)) -and ($properties.Count -eq 1)
foreach ($fieldName in $properties) {
$fieldValue = if ($Response -is [hashtable]) { $Response[$fieldName] } else { $Response.$fieldName }
if ($null -ne $fieldValue) {
$overrideName = if ($useSingleOutputName) { $OutputVariableName } else { '' }
$variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $fieldName -OverrideName $overrideName
Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames
$created++
}
}
}
}
else {
$variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -OverrideName $OutputVariableName
Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$Response) -StepName $StepName -PrintVariableNames $PrintVariableNames
$created = 1
}
return $created
}
function Get-AwsHmacSha256Bytes {
param (
[byte[]]$Key,
[string]$Message
)
$hmac = New-Object System.Security.Cryptography.HMACSHA256 (, $Key)
return $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($Message))
}
function Get-AwsHmacSha256Hex {
param (
[byte[]]$Key,
[string]$Message
)
return ([BitConverter]::ToString((Get-AwsHmacSha256Bytes -Key $Key -Message $Message))).Replace('-', '').ToLowerInvariant()
}
function Get-AwsSigningKey {
param (
[string]$SecretKey,
[string]$DateStamp,
[string]$Region,
[string]$Service
)
$kSecret = [Text.Encoding]::UTF8.GetBytes("AWS4$SecretKey")
$kDate = Get-AwsHmacSha256Bytes -Key $kSecret -Message $DateStamp
$kRegion = Get-AwsHmacSha256Bytes -Key $kDate -Message $Region
$kService = Get-AwsHmacSha256Bytes -Key $kRegion -Message $Service
return Get-AwsHmacSha256Bytes -Key $kService -Message 'aws4_request'
}
function Get-AwsSha256Hex {
param ([string]$Text)
$sha = [System.Security.Cryptography.SHA256]::Create()
return ([BitConverter]::ToString($sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($Text)))).Replace('-', '').ToLowerInvariant()
}
function Get-AwsCredentialChain {
$accessKeyId = $env:AWS_ACCESS_KEY_ID
$secretAccessKey = $env:AWS_SECRET_ACCESS_KEY
$sessionToken = $env:AWS_SESSION_TOKEN
if (-not [string]::IsNullOrWhiteSpace($accessKeyId) -and -not [string]::IsNullOrWhiteSpace($secretAccessKey)) {
return [pscustomobject]@{
AccessKeyId = $accessKeyId.Trim()
SecretAccessKey = $secretAccessKey.Trim()
SessionToken = if ([string]::IsNullOrWhiteSpace($sessionToken)) { '' } else { $sessionToken.Trim() }
}
}
try {
$imdsToken = Invoke-RestMethod -Method Put -Uri 'http://169.254.169.254/latest/api/token' -Headers @{ 'X-aws-ec2-metadata-token-ttl-seconds' = '21600' } -TimeoutSec 2
$roleName = Invoke-RestMethod -Uri 'http://169.254.169.254/latest/meta-data/iam/security-credentials/' -Headers @{ 'X-aws-ec2-metadata-token' = $imdsToken } -TimeoutSec 2
$roleCreds = Invoke-RestMethod -Uri "http://169.254.169.254/latest/meta-data/iam/security-credentials/$roleName" -Headers @{ 'X-aws-ec2-metadata-token' = $imdsToken } -TimeoutSec 2
if ($null -eq $roleCreds -or [string]::IsNullOrWhiteSpace($roleCreds.AccessKeyId)) {
throw 'EC2 instance metadata returned no IAM credentials'
}
return [pscustomobject]@{
AccessKeyId = [string]$roleCreds.AccessKeyId
SecretAccessKey = [string]$roleCreds.SecretAccessKey
SessionToken = [string]$roleCreds.Token
}
}
catch {
throw "AWS credentials were not found in environment variables or EC2 instance metadata: $($_.Exception.Message)"
}
}
function New-AwsIamCloudId {
param (
[string]$AccessKeyId,
[string]$SecretAccessKey,
[string]$SessionToken = '',
[string]$Region = 'us-east-1',
[string]$StsUrl = 'https://sts.amazonaws.com/'
)
$service = 'sts'
$method = 'POST'
$hostName = ([Uri]$StsUrl).Host
$body = 'Action=GetCallerIdentity&Version=2011-06-15'
$amzDate = (Get-Date).ToUniversalTime().ToString('yyyyMMddTHHmmssZ')
$dateStamp = $amzDate.Substring(0, 8)
$payloadHash = Get-AwsSha256Hex -Text $body
$headers = [ordered]@{
Host = $hostName
'Content-Type' = 'application/x-www-form-urlencoded; charset=utf-8'
'Content-Length' = [string]$body.Length
'X-Amz-Date' = $amzDate
}
if (-not [string]::IsNullOrWhiteSpace($SessionToken)) {
$headers['X-Amz-Security-Token'] = $SessionToken
}
$canonicalHeaders = ($headers.GetEnumerator() | ForEach-Object { "$($_.Key.ToLowerInvariant()):$($_.Value)" }) -join "`n"
$signedHeaders = (($headers.Keys | ForEach-Object { $_.ToLowerInvariant() }) | Sort-Object) -join ';'
$canonicalRequest = @(
$method
'/'
''
"$canonicalHeaders`n"
$signedHeaders
$payloadHash
) -join "`n"
$credentialScope = "$dateStamp/$Region/$service/aws4_request"
$stringToSign = @(
'AWS4-HMAC-SHA256'
$amzDate
$credentialScope
(Get-AwsSha256Hex -Text $canonicalRequest)
) -join "`n"
$signingKey = Get-AwsSigningKey -SecretKey $SecretAccessKey -DateStamp $dateStamp -Region $Region -Service $service
$signature = Get-AwsHmacSha256Hex -Key $signingKey -Message $stringToSign
$authorization = "AWS4-HMAC-SHA256 Credential=$AccessKeyId/$credentialScope, SignedHeaders=$signedHeaders, Signature=$signature"
$requestHeaders = @{
Authorization = @($authorization)
'Content-Length' = @([string]$body.Length)
Host = @($hostName)
'Content-Type' = @('application/x-www-form-urlencoded; charset=utf-8')
'X-Amz-Date' = @($amzDate)
}
if (-not [string]::IsNullOrWhiteSpace($SessionToken)) {
$requestHeaders['X-Amz-Security-Token'] = @($SessionToken)
}
$payload = [ordered]@{
sts_request_method = $method
sts_request_url = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($StsUrl))
sts_request_body = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($body))
sts_request_headers = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(($requestHeaders | ConvertTo-Json -Compress)))
}
return [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(($payload | ConvertTo-Json -Compress)))
}
function Resolve-AwsIamCloudId {
param (
[string]$CloudId,
[string]$Region,
[string]$StsUrl
)
if (-not [string]::IsNullOrWhiteSpace($CloudId)) {
return $CloudId.Trim()
}
$credentials = Get-AwsCredentialChain
return New-AwsIamCloudId -AccessKeyId $credentials.AccessKeyId -SecretAccessKey $credentials.SecretAccessKey -SessionToken $credentials.SessionToken -Region $Region -StsUrl $StsUrl
}
$GATEWAY_URL = $OctopusParameters['Akeyless.Retrieve.Dynamic.GatewayUrl']
$AUTH_TOKEN = $OctopusParameters['Akeyless.Retrieve.Dynamic.AuthToken']
$SECRET_PATH = $OctopusParameters['Akeyless.Retrieve.Dynamic.SecretPath']
$OUTPUT_VARIABLE_NAME = $OctopusParameters['Akeyless.Retrieve.Dynamic.OutputVariableName']
$TIMEOUT_TEXT = $OctopusParameters['Akeyless.Retrieve.Dynamic.Timeout']
$DYNAMIC_ARGS = $OctopusParameters['Akeyless.Retrieve.Dynamic.DynamicSecretArgs']
$FIELD_VALUES = $OctopusParameters['Akeyless.Retrieve.Dynamic.FieldValues']
$PRINT_VARIABLE_NAMES = $OctopusParameters['Akeyless.Retrieve.Dynamic.PrintVariableNames']
$StepName = $OctopusParameters['Octopus.Step.Name']
if ([string]::IsNullOrWhiteSpace($GATEWAY_URL)) {
$GATEWAY_URL = 'https://api.akeyless.io'
}
if ([string]::IsNullOrWhiteSpace($AUTH_TOKEN)) {
throw 'Required parameter Auth Token not specified'
}
if ([string]::IsNullOrWhiteSpace($SECRET_PATH)) {
throw 'Required parameter Secret Path not specified'
}
if ([string]::IsNullOrWhiteSpace($PRINT_VARIABLE_NAMES)) {
$PRINT_VARIABLE_NAMES = 'False'
}
$printNames = ($PRINT_VARIABLE_NAMES -eq 'True')
$path = Normalize-AkeylessPath $SECRET_PATH
$body = @{
token = $AUTH_TOKEN
name = $path
}
if (-not [string]::IsNullOrWhiteSpace($TIMEOUT_TEXT)) {
$timeout = 0
if (-not [int]::TryParse($TIMEOUT_TEXT, [ref]$timeout)) {
throw "Timeout must be an integer, got '$TIMEOUT_TEXT'"
}
if ($timeout -gt 0) {
$body.timeout = $timeout
}
}
$argsList = @()
if (-not [string]::IsNullOrWhiteSpace($DYNAMIC_ARGS)) {
$argsList = @(($DYNAMIC_ARGS -Split "`n").Trim() | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
if ($argsList.Count -gt 0) {
$body.args = $argsList
}
}
$response = Invoke-AkeylessApi -GatewayUrl $GATEWAY_URL -Path 'get-dynamic-secret-value' -Body $body
if ($null -eq $response) {
throw "Empty response retrieving dynamic secret '$path'"
}
$fields = Parse-AkeylessFieldDefinitions -RawValue $FIELD_VALUES
$created = Publish-AkeylessStructuredSecretResponse -Response $response -SecretPath $path -StepName $StepName -PrintVariableNames $printNames -OutputVariableName $OUTPUT_VARIABLE_NAME -Fields $fields
Write-Host "Created $created output variables"
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "f8e3a1b2-4c5d-6e7f-8a9b-0c1d2e3f4a03",
"Name": "Akeyless - Retrieve Dynamic Secret",
"Description": "This step retrieves a **dynamic secret** from Akeyless and creates sensitive [output variables](https://octopus.com/docs/projects/variables/output-variables#sensitive-output-variables) for use in later deployment or runbook steps.\n\nThis step template uses the [Akeyless REST API](https://docs.akeyless.io/reference/getdynamicsecretvalue), so no other dependencies are needed.\n\n---\n\n**Authentication token**\n\nUse the **Akeyless - Access Key Login** step template first, then bind the Auth Token parameter to:\n\n#{Octopus.Action[<Login step name>].Output.AkeylessAuthToken}\n\n---\n\n**Dynamic secret arguments**\n\nOptional provisioning arguments can be supplied one per line.\n\n---\n\n**Required:**\n- Authentication token\n- Dynamic secret path",
"Version": 1,
"ExportedAt": "2026-06-17T04:32:01.621Z",
"ActionType": "Octopus.Script",
"Author": "akeyless-community",
"Packages": [],
"Parameters": [
{
"HelpText": "The Akeyless API or Gateway URL. For SaaS, use https://api.akeyless.io.",
"Id": "10003000-0000-0000-0000-100030001001",
"Label": "Gateway URL",
"DefaultValue": "https://api.akeyless.io",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Name": "Akeyless.Retrieve.Dynamic.GatewayUrl"
},
{
"HelpText": "Authentication token from a previous Akeyless login step.",
"Id": "10003000-0000-0000-0000-100030001002",
"Label": "Auth Token",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
},
"Name": "Akeyless.Retrieve.Dynamic.AuthToken"
},
{
"HelpText": "Full path to the dynamic secret, e.g. `/production/database/dynamic`",
"Id": "10003000-0000-0000-0000-100030001003",
"Label": "Secret path",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Name": "Akeyless.Retrieve.Dynamic.SecretPath"
},
{
"HelpText": "Optional output variable name when the dynamic secret returns a single value.",
"Id": "10003000-0000-0000-0000-100030001004",
"Label": "Output variable name",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Name": "Akeyless.Retrieve.Dynamic.OutputVariableName"
},
{
"HelpText": "Optional timeout for dynamic secret provisioning.",
"Id": "10003000-0000-0000-0000-100030001005",
"Label": "Timeout (seconds)",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Name": "Akeyless.Retrieve.Dynamic.Timeout"
},
{
"HelpText": "Optional provisioning arguments, one per line.",
"Id": "10003000-0000-0000-0000-100030001006",
"Label": "Dynamic secret args",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
},
"Name": "Akeyless.Retrieve.Dynamic.DynamicSecretArgs"
},
{
"HelpText": "Choose specific response fields in the format FieldName | OutputVariableName.",
"Id": "10003000-0000-0000-0000-100030001007",
"Label": "Field names",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
},
"Name": "Akeyless.Retrieve.Dynamic.FieldValues"
},
{
"HelpText": "Write created output variable names to the task log.",
"Id": "10003000-0000-0000-0000-100030001008",
"Label": "Print output variable names",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Name": "Akeyless.Retrieve.Dynamic.PrintVariableNames"
}
],
"Properties": {
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n\nfunction Get-AkeylessApiErrorBody {\n param ($RequestError)\n\n if ($PSVersionTable.PSVersion.Major -lt 6) {\n if ($RequestError.Exception.Response) {\n $reader = New-Object System.IO.StreamReader($RequestError.Exception.Response.GetResponseStream())\n $reader.BaseStream.Position = 0\n $reader.DiscardBufferedData()\n $rawResponse = $reader.ReadToEnd()\n try { return ($rawResponse | ConvertFrom-Json) } catch { return $rawResponse }\n }\n return $null\n }\n\n return $RequestError.ErrorDetails.Message\n}\n\nfunction Format-AkeylessApiError {\n param (\n [string]$Action,\n [System.Management.Automation.ErrorRecord]$ErrorRecord\n )\n\n $message = \"An error occurred during $Action`: $($ErrorRecord.Exception.Message)\"\n $body = Get-AkeylessApiErrorBody -RequestError $ErrorRecord\n if ($null -ne $body) {\n if ($body.error) {\n $message += \"`n`tDetail: $($body.error)\"\n }\n elseif ($body.PSObject.Properties.Name -contains 'errors') {\n $message += \"`n`tDetail: $($body.errors -Join ',')\"\n }\n elseif ($body -is [string] -and -not [string]::IsNullOrWhiteSpace($body)) {\n $message += \"`n`tDetail: $body\"\n }\n }\n\n return $message\n}\n\nfunction Invoke-AkeylessApi {\n param (\n [Parameter(Mandatory = $true)][string]$GatewayUrl,\n [Parameter(Mandatory = $true)][string]$Path,\n [Parameter(Mandatory = $true)][hashtable]$Body\n )\n\n $base = $GatewayUrl.TrimEnd('/')\n $apiPath = $Path.TrimStart('/')\n $uri = \"$base/$apiPath\"\n $json = $Body | ConvertTo-Json -Depth 20 -Compress:$false\n\n try {\n return Invoke-RestMethod -Method Post -Uri $uri -Body $json -ContentType 'application/json'\n }\n catch {\n $detail = Format-AkeylessApiError -Action \"POST $Path\" -ErrorRecord $_\n Write-Error $detail -Category ConnectionError\n }\n}\n\nfunction Normalize-AkeylessPath {\n param ([string]$Path)\n\n if ([string]::IsNullOrWhiteSpace($Path)) {\n return $Path\n }\n\n $normalized = $Path.Trim()\n if (-not $normalized.StartsWith('/')) {\n $normalized = \"/$normalized\"\n }\n\n return $normalized\n}\n\nfunction ConvertTo-AkeylessOutputVariableName {\n param (\n [string]$SecretPath,\n [string]$FieldName = '',\n [string]$OverrideName = ''\n )\n\n if (-not [string]::IsNullOrWhiteSpace($OverrideName)) {\n return $OverrideName.Trim()\n }\n\n $base = (Normalize-AkeylessPath $SecretPath).Trim('/').Replace('/', '.')\n if ([string]::IsNullOrWhiteSpace($FieldName)) {\n return $base\n }\n\n return \"$base.$($FieldName.Trim())\"\n}\n\nfunction Get-AkeylessSecretValue {\n param (\n [string]$GatewayUrl,\n [string]$Token,\n [string]$SecretPath,\n [int]$Version = 0\n )\n\n $path = Normalize-AkeylessPath $SecretPath\n $body = @{\n token = $Token\n names = @($path)\n }\n\n if ($Version -gt 0) {\n $body.version = $Version\n }\n\n $response = Invoke-AkeylessApi -GatewayUrl $GatewayUrl -Path 'get-secret-value' -Body $body\n if ($null -eq $response) {\n throw \"Empty response retrieving secret '$path'\"\n }\n\n if ($response.PSObject.Properties.Name -contains $path) {\n return $response.$path\n }\n\n foreach ($property in $response.PSObject.Properties) {\n if (-not [string]::IsNullOrWhiteSpace([string]$property.Value)) {\n return $property.Value\n }\n }\n\n throw \"Secret '$path' was not found in the API response\"\n}\n\nfunction Set-AkeylessSensitiveOutput {\n param (\n [string]$Name,\n [string]$Value,\n [string]$StepName,\n [bool]$PrintVariableNames\n )\n\n if ([string]::IsNullOrWhiteSpace($Name)) {\n throw 'Output variable name cannot be empty'\n }\n\n Set-OctopusVariable -Name $Name -Value $Value -Sensitive\n if ($PrintVariableNames) {\n Write-Host \"Created output variable: ##{Octopus.Action[$StepName].Output.$Name}\"\n }\n}\n\nfunction Publish-AkeylessSecretValue {\n param (\n [string]$GatewayUrl,\n [string]$Token,\n [string]$SecretPath,\n [string]$StepName,\n [bool]$PrintVariableNames,\n [string]$OutputVariableName = '',\n [array]$Fields = @(),\n [int]$Version = 0\n )\n\n $raw = Get-AkeylessSecretValue -GatewayUrl $GatewayUrl -Token $Token -SecretPath $SecretPath -Version $Version\n $created = 0\n $fieldsSpecified = ($Fields.Count -gt 0)\n\n if ($raw -is [string]) {\n $trimmed = $raw.Trim()\n if ($fieldsSpecified) {\n $parsed = $null\n try { $parsed = $trimmed | ConvertFrom-Json } catch {}\n if ($null -eq $parsed) {\n throw \"Secret '$SecretPath' is not JSON but field names were specified\"\n }\n $raw = $parsed\n }\n }\n\n if ($raw -is [pscustomobject] -or $raw -is [hashtable]) {\n $properties = if ($raw -is [hashtable]) { $raw.Keys } else { $raw.PSObject.Properties.Name }\n\n if ($fieldsSpecified) {\n foreach ($field in $Fields) {\n $fieldName = $field.Name\n $fieldValue = if ($raw -is [hashtable]) { $raw[$fieldName] } else { $raw.$fieldName }\n if ($null -ne $fieldValue) {\n $variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $fieldName -OverrideName $field.VariableName\n Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames\n $created++\n }\n }\n }\n else {\n foreach ($fieldName in $properties) {\n $fieldValue = if ($raw -is [hashtable]) { $raw[$fieldName] } else { $raw.$fieldName }\n if ($null -ne $fieldValue) {\n $variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $fieldName\n Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames\n $created++\n }\n }\n }\n\n return $created\n }\n\n $variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -OverrideName $OutputVariableName\n Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$raw) -StepName $StepName -PrintVariableNames $PrintVariableNames\n return 1\n}\n\nfunction Invoke-AkeylessListItems {\n param (\n [string]$GatewayUrl,\n [string]$Token,\n [string]$FolderPath,\n [string[]]$Types = @()\n )\n\n $path = Normalize-AkeylessPath $FolderPath\n $items = @()\n $folders = @()\n $paginationToken = ''\n\n do {\n $body = @{\n token = $Token\n path = $path\n 'current-folder' = $true\n }\n\n if ($Types.Count -gt 0) {\n $body.type = $Types\n }\n if (-not [string]::IsNullOrWhiteSpace($paginationToken)) {\n $body.'pagination-token' = $paginationToken\n }\n\n $response = Invoke-AkeylessApi -GatewayUrl $GatewayUrl -Path 'list-items' -Body $body\n if ($null -eq $response) {\n break\n }\n\n if ($null -ne $response.items) {\n $items += @($response.items | ForEach-Object { $_.item_name })\n }\n if ($null -ne $response.folders) {\n $folders += @($response.folders)\n }\n\n $paginationToken = ''\n if ($response.PSObject.Properties.Name -contains 'next_page') {\n $paginationToken = [string]$response.next_page\n }\n } while (-not [string]::IsNullOrWhiteSpace($paginationToken))\n\n return [pscustomobject]@{\n Items = $items\n Folders = $folders\n }\n}\n\nfunction Get-AkeylessFolderItems {\n param (\n [string]$GatewayUrl,\n [string]$Token,\n [string]$FolderPath,\n [string[]]$Types = @('static-secret')\n )\n\n $listing = Invoke-AkeylessListItems -GatewayUrl $GatewayUrl -Token $Token -FolderPath $FolderPath -Types $Types\n return @($listing.Items)\n}\n\nfunction Get-AkeylessFolderChildren {\n param (\n [string]$GatewayUrl,\n [string]$Token,\n [string]$FolderPath\n )\n\n $listing = Invoke-AkeylessListItems -GatewayUrl $GatewayUrl -Token $Token -FolderPath $FolderPath\n return @($listing.Folders)\n}\n\nfunction Parse-AkeylessFieldDefinitions {\n param ([string]$RawValue)\n\n $fields = @()\n if ([string]::IsNullOrWhiteSpace($RawValue)) {\n return $fields\n }\n\n @(($RawValue -Split \"`n\").Trim()) | ForEach-Object {\n if ([string]::IsNullOrWhiteSpace($_)) { return }\n $parts = ($_ -Split '\\|', 2)\n $name = $parts[0].Trim()\n if ([string]::IsNullOrWhiteSpace($name)) {\n throw \"Unable to establish field name from: '$_'\"\n }\n $fields += [pscustomobject]@{\n Name = $name\n VariableName = if ($parts.Count -gt 1) { $parts[1].Trim() } else { '' }\n }\n }\n\n return $fields\n}\n\nfunction Parse-AkeylessSecretDefinitions {\n param ([string]$RawValue)\n\n $secrets = @()\n if ([string]::IsNullOrWhiteSpace($RawValue)) {\n return $secrets\n }\n\n @(($RawValue -Split \"`n\").Trim()) | ForEach-Object {\n if ([string]::IsNullOrWhiteSpace($_)) { return }\n $parts = ($_ -Split '\\|', 2)\n $path = Normalize-AkeylessPath $parts[0].Trim()\n if ([string]::IsNullOrWhiteSpace($path)) {\n throw \"Unable to establish secret path from: '$_'\"\n }\n $secrets += [pscustomobject]@{\n Path = $path\n OutputVariableName = if ($parts.Count -gt 1) { $parts[1].Trim() } else { '' }\n }\n }\n\n return $secrets\n}\n\nfunction Get-AkeylessSecretsRecursively {\n param (\n [string]$GatewayUrl,\n [string]$Token,\n [string]$FolderPath,\n [bool]$Recursive\n )\n\n $results = @()\n $folder = Normalize-AkeylessPath $FolderPath\n\n $items = Get-AkeylessFolderItems -GatewayUrl $GatewayUrl -Token $Token -FolderPath $folder\n foreach ($item in $items) {\n $results += $item\n }\n\n if ($Recursive) {\n $children = Get-AkeylessFolderChildren -GatewayUrl $GatewayUrl -Token $Token -FolderPath $folder\n foreach ($child in $children) {\n $results += Get-AkeylessSecretsRecursively -GatewayUrl $GatewayUrl -Token $Token -FolderPath $child -Recursive $true\n }\n }\n\n return $results\n}\n\nfunction Complete-AkeylessLogin {\n param (\n [string]$GatewayUrl,\n [hashtable]$AuthBody,\n [string]$StepName\n )\n\n $response = Invoke-AkeylessApi -GatewayUrl $GatewayUrl -Path 'auth' -Body $AuthBody\n if ($null -eq $response -or [string]::IsNullOrWhiteSpace($response.token)) {\n throw 'Authentication succeeded but no token was returned'\n }\n\n Set-AkeylessSensitiveOutput -Name 'AkeylessAuthToken' -Value $response.token -StepName $StepName -PrintVariableNames $true\n Write-Host 'Authenticated to Akeyless successfully'\n}\n\nfunction Publish-AkeylessStructuredSecretResponse {\n param (\n [object]$Response,\n [string]$SecretPath,\n [string]$StepName,\n [bool]$PrintVariableNames,\n [string]$OutputVariableName = '',\n [array]$Fields = @()\n )\n\n $created = 0\n if ($Response -is [pscustomobject] -or $Response -is [hashtable]) {\n $properties = if ($Response -is [hashtable]) { @($Response.Keys) } else { @($Response.PSObject.Properties.Name) }\n if ($Fields.Count -gt 0) {\n foreach ($field in $Fields) {\n $fieldValue = if ($Response -is [hashtable]) { $Response[$field.Name] } else { $Response.$($field.Name) }\n if ($null -ne $fieldValue) {\n $variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $field.Name -OverrideName $field.VariableName\n Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames\n $created++\n }\n }\n }\n else {\n $useSingleOutputName = (-not [string]::IsNullOrWhiteSpace($OutputVariableName)) -and ($properties.Count -eq 1)\n foreach ($fieldName in $properties) {\n $fieldValue = if ($Response -is [hashtable]) { $Response[$fieldName] } else { $Response.$fieldName }\n if ($null -ne $fieldValue) {\n $overrideName = if ($useSingleOutputName) { $OutputVariableName } else { '' }\n $variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -FieldName $fieldName -OverrideName $overrideName\n Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$fieldValue) -StepName $StepName -PrintVariableNames $PrintVariableNames\n $created++\n }\n }\n }\n }\n else {\n $variableName = ConvertTo-AkeylessOutputVariableName -SecretPath $SecretPath -OverrideName $OutputVariableName\n Set-AkeylessSensitiveOutput -Name $variableName -Value ([string]$Response) -StepName $StepName -PrintVariableNames $PrintVariableNames\n $created = 1\n }\n\n return $created\n}\n\nfunction Get-AwsHmacSha256Bytes {\n param (\n [byte[]]$Key,\n [string]$Message\n )\n\n $hmac = New-Object System.Security.Cryptography.HMACSHA256 (, $Key)\n return $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($Message))\n}\n\nfunction Get-AwsHmacSha256Hex {\n param (\n [byte[]]$Key,\n [string]$Message\n )\n\n return ([BitConverter]::ToString((Get-AwsHmacSha256Bytes -Key $Key -Message $Message))).Replace('-', '').ToLowerInvariant()\n}\n\nfunction Get-AwsSigningKey {\n param (\n [string]$SecretKey,\n [string]$DateStamp,\n [string]$Region,\n [string]$Service\n )\n\n $kSecret = [Text.Encoding]::UTF8.GetBytes(\"AWS4$SecretKey\")\n $kDate = Get-AwsHmacSha256Bytes -Key $kSecret -Message $DateStamp\n $kRegion = Get-AwsHmacSha256Bytes -Key $kDate -Message $Region\n $kService = Get-AwsHmacSha256Bytes -Key $kRegion -Message $Service\n return Get-AwsHmacSha256Bytes -Key $kService -Message 'aws4_request'\n}\n\nfunction Get-AwsSha256Hex {\n param ([string]$Text)\n\n $sha = [System.Security.Cryptography.SHA256]::Create()\n return ([BitConverter]::ToString($sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($Text)))).Replace('-', '').ToLowerInvariant()\n}\n\nfunction Get-AwsCredentialChain {\n $accessKeyId = $env:AWS_ACCESS_KEY_ID\n $secretAccessKey = $env:AWS_SECRET_ACCESS_KEY\n $sessionToken = $env:AWS_SESSION_TOKEN\n\n if (-not [string]::IsNullOrWhiteSpace($accessKeyId) -and -not [string]::IsNullOrWhiteSpace($secretAccessKey)) {\n return [pscustomobject]@{\n AccessKeyId = $accessKeyId.Trim()\n SecretAccessKey = $secretAccessKey.Trim()\n SessionToken = if ([string]::IsNullOrWhiteSpace($sessionToken)) { '' } else { $sessionToken.Trim() }\n }\n }\n\n try {\n $imdsToken = Invoke-RestMethod -Method Put -Uri 'http://169.254.169.254/latest/api/token' -Headers @{ 'X-aws-ec2-metadata-token-ttl-seconds' = '21600' } -TimeoutSec 2\n $roleName = Invoke-RestMethod -Uri 'http://169.254.169.254/latest/meta-data/iam/security-credentials/' -Headers @{ 'X-aws-ec2-metadata-token' = $imdsToken } -TimeoutSec 2\n $roleCreds = Invoke-RestMethod -Uri \"http://169.254.169.254/latest/meta-data/iam/security-credentials/$roleName\" -Headers @{ 'X-aws-ec2-metadata-token' = $imdsToken } -TimeoutSec 2\n if ($null -eq $roleCreds -or [string]::IsNullOrWhiteSpace($roleCreds.AccessKeyId)) {\n throw 'EC2 instance metadata returned no IAM credentials'\n }\n\n return [pscustomobject]@{\n AccessKeyId = [string]$roleCreds.AccessKeyId\n SecretAccessKey = [string]$roleCreds.SecretAccessKey\n SessionToken = [string]$roleCreds.Token\n }\n }\n catch {\n throw \"AWS credentials were not found in environment variables or EC2 instance metadata: $($_.Exception.Message)\"\n }\n}\n\nfunction New-AwsIamCloudId {\n param (\n [string]$AccessKeyId,\n [string]$SecretAccessKey,\n [string]$SessionToken = '',\n [string]$Region = 'us-east-1',\n [string]$StsUrl = 'https://sts.amazonaws.com/'\n )\n\n $service = 'sts'\n $method = 'POST'\n $hostName = ([Uri]$StsUrl).Host\n $body = 'Action=GetCallerIdentity&Version=2011-06-15'\n $amzDate = (Get-Date).ToUniversalTime().ToString('yyyyMMddTHHmmssZ')\n $dateStamp = $amzDate.Substring(0, 8)\n $payloadHash = Get-AwsSha256Hex -Text $body\n\n $headers = [ordered]@{\n Host = $hostName\n 'Content-Type' = 'application/x-www-form-urlencoded; charset=utf-8'\n 'Content-Length' = [string]$body.Length\n 'X-Amz-Date' = $amzDate\n }\n\n if (-not [string]::IsNullOrWhiteSpace($SessionToken)) {\n $headers['X-Amz-Security-Token'] = $SessionToken\n }\n\n $canonicalHeaders = ($headers.GetEnumerator() | ForEach-Object { \"$($_.Key.ToLowerInvariant()):$($_.Value)\" }) -join \"`n\"\n $signedHeaders = (($headers.Keys | ForEach-Object { $_.ToLowerInvariant() }) | Sort-Object) -join ';'\n $canonicalRequest = @(\n $method\n '/'\n ''\n \"$canonicalHeaders`n\"\n $signedHeaders\n $payloadHash\n ) -join \"`n\"\n\n $credentialScope = \"$dateStamp/$Region/$service/aws4_request\"\n $stringToSign = @(\n 'AWS4-HMAC-SHA256'\n $amzDate\n $credentialScope\n (Get-AwsSha256Hex -Text $canonicalRequest)\n ) -join \"`n\"\n\n $signingKey = Get-AwsSigningKey -SecretKey $SecretAccessKey -DateStamp $dateStamp -Region $Region -Service $service\n $signature = Get-AwsHmacSha256Hex -Key $signingKey -Message $stringToSign\n $authorization = \"AWS4-HMAC-SHA256 Credential=$AccessKeyId/$credentialScope, SignedHeaders=$signedHeaders, Signature=$signature\"\n\n $requestHeaders = @{\n Authorization = @($authorization)\n 'Content-Length' = @([string]$body.Length)\n Host = @($hostName)\n 'Content-Type' = @('application/x-www-form-urlencoded; charset=utf-8')\n 'X-Amz-Date' = @($amzDate)\n }\n\n if (-not [string]::IsNullOrWhiteSpace($SessionToken)) {\n $requestHeaders['X-Amz-Security-Token'] = @($SessionToken)\n }\n\n $payload = [ordered]@{\n sts_request_method = $method\n sts_request_url = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($StsUrl))\n sts_request_body = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($body))\n sts_request_headers = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(($requestHeaders | ConvertTo-Json -Compress)))\n }\n\n return [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(($payload | ConvertTo-Json -Compress)))\n}\n\nfunction Resolve-AwsIamCloudId {\n param (\n [string]$CloudId,\n [string]$Region,\n [string]$StsUrl\n )\n\n if (-not [string]::IsNullOrWhiteSpace($CloudId)) {\n return $CloudId.Trim()\n }\n\n $credentials = Get-AwsCredentialChain\n return New-AwsIamCloudId -AccessKeyId $credentials.AccessKeyId -SecretAccessKey $credentials.SecretAccessKey -SessionToken $credentials.SessionToken -Region $Region -StsUrl $StsUrl\n}\n\n$GATEWAY_URL = $OctopusParameters['Akeyless.Retrieve.Dynamic.GatewayUrl']\n$AUTH_TOKEN = $OctopusParameters['Akeyless.Retrieve.Dynamic.AuthToken']\n$SECRET_PATH = $OctopusParameters['Akeyless.Retrieve.Dynamic.SecretPath']\n$OUTPUT_VARIABLE_NAME = $OctopusParameters['Akeyless.Retrieve.Dynamic.OutputVariableName']\n$TIMEOUT_TEXT = $OctopusParameters['Akeyless.Retrieve.Dynamic.Timeout']\n$DYNAMIC_ARGS = $OctopusParameters['Akeyless.Retrieve.Dynamic.DynamicSecretArgs']\n$FIELD_VALUES = $OctopusParameters['Akeyless.Retrieve.Dynamic.FieldValues']\n$PRINT_VARIABLE_NAMES = $OctopusParameters['Akeyless.Retrieve.Dynamic.PrintVariableNames']\n$StepName = $OctopusParameters['Octopus.Step.Name']\n\nif ([string]::IsNullOrWhiteSpace($GATEWAY_URL)) {\n $GATEWAY_URL = 'https://api.akeyless.io'\n}\nif ([string]::IsNullOrWhiteSpace($AUTH_TOKEN)) {\n throw 'Required parameter Auth Token not specified'\n}\nif ([string]::IsNullOrWhiteSpace($SECRET_PATH)) {\n throw 'Required parameter Secret Path not specified'\n}\nif ([string]::IsNullOrWhiteSpace($PRINT_VARIABLE_NAMES)) {\n $PRINT_VARIABLE_NAMES = 'False'\n}\n\n$printNames = ($PRINT_VARIABLE_NAMES -eq 'True')\n$path = Normalize-AkeylessPath $SECRET_PATH\n$body = @{\n token = $AUTH_TOKEN\n name = $path\n}\n\nif (-not [string]::IsNullOrWhiteSpace($TIMEOUT_TEXT)) {\n $timeout = 0\n if (-not [int]::TryParse($TIMEOUT_TEXT, [ref]$timeout)) {\n throw \"Timeout must be an integer, got '$TIMEOUT_TEXT'\"\n }\n if ($timeout -gt 0) {\n $body.timeout = $timeout\n }\n}\n\n$argsList = @()\nif (-not [string]::IsNullOrWhiteSpace($DYNAMIC_ARGS)) {\n $argsList = @(($DYNAMIC_ARGS -Split \"`n\").Trim() | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })\n if ($argsList.Count -gt 0) {\n $body.args = $argsList\n }\n}\n\n$response = Invoke-AkeylessApi -GatewayUrl $GATEWAY_URL -Path 'get-dynamic-secret-value' -Body $body\nif ($null -eq $response) {\n throw \"Empty response retrieving dynamic secret '$path'\"\n}\n\n$fields = Parse-AkeylessFieldDefinitions -RawValue $FIELD_VALUES\n$created = Publish-AkeylessStructuredSecretResponse -Response $response -SecretPath $path -StepName $StepName -PrintVariableNames $printNames -OutputVariableName $OUTPUT_VARIABLE_NAME -Fields $fields\nWrite-Host \"Created $created output variables\""
},
"Category": "Akeyless",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/akeyless-retrieve-dynamic-secret.json",
"Website": "/step-templates/f8e3a1b2-4c5d-6e7f-8a9b-0c1d2e3f4a03",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Wednesday, June 17, 2026