Akeyless - Retrieve Dynamic Secret

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[].Output.AkeylessAuthToken}


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.

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.

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": "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"
  }
}

History

Page updated on Wednesday, June 17, 2026