Categorie > Tips & trucs

Workaround voor bug in 'AWS Secrets Manager Get Secret' taak

geschreven door Wilco van Dijk

AWS Toolkit issue 504 omschrijving in Github
Bron: Github


Amazon heeft de AWS Toolkit beschikbaar gesteld waarin een set aan Azure Devops taken zit die je kunt gebruiken om vanuit een Azure Devops pipeline te communiceren met AWS resources, waaronder de AWS Secrets Manager. Een handige taak is 'AWS Secrets Manager Get Secret' taak om een specifieke secret op te halen. Wanneer je echter gebruik maakt van de functionaliteit om meerdere instellingen als key-value pairs op te slaan binnen een secret geeft deze taak een verkeerd resultaat terug. Deze bug is reeds aangemeld in 2023, maar tot op heden niet opgelost.

Het probleem

In mijn vorige artikel beschrijf ik hoe je een .Net configuratie kunt opslaan in AWS Secrets Manager. Hierin beschrijf ik de mogelijkheid om meerdere instellingen op te slaan als key-value pairs in een secret. Op de achtergrond wordt dit opgeslagen als JSON string.

Een voorbeeld van wat je zou verwachten als je de waarde opvraagt.

{"foo":"bar"} 

Als je de Azure Devops taak 'AWS Secrets Manager Get Secret' gebruikt om de waarde van de secret op te halen krijg je ongeldige JSON als resultaat, waarbij de dubbele quotes ontbreken.

{foo:bar}

Oplossing

Als mogelijke oplossing heb ik als eerste getest wat voor resultaat dezelfde aanroep via de AWS CLI zou opleveren. Dit is wel het JSON formaat wat je zou verwachten. De CLI aanroepen kun je via de Azure Devops taak 'AWS CLI' doen, maar deze heeft niet de mogelijkheid om de output af te vangen. Daarom heb ik gekozen voor de Azure Devops taak 'AWS Shell Script', waarbij je in bash (inline) script de AWS CLI kunt aanroepen en de mogelijkheid hebt om het resultaat te bewerken en op te slaan als pipeline variabele.

In het eerste voorbeeld is 'secret-id' een pipeline variabele. De waarde wordt onbewerkt opgeslagen in een pipeline variabele 'SECRETVALUE'.

# Haal de secret op met AWS CLI en sla het resultaat op in een variabele
SECRETVALUE=$(aws secretsmanager get-secret-value \ 
    --secret-id "$(secret-id)" \ 
    --query SecretString \ 
    --output text)

# Controleer of de secret succesvol is opgehaald
if [ $? -eq 0 ]; then
    echo "Secret succesvol opgehaald: $SECRETVALUE"
    echo "##vso[task.setvariable variable=SECRETVALUE;issecret=true]$SECRETVALUE"
else
    echo "Fout bij het ophalen van de secret"
fi

Het tweede voorbeeld gaat een stapje verder en geeft de waarde van een specifieke instelling terug uit de lijst van key-value pairs.

# Haal de secret op met AWS CLI en sla het resultaat op in een variabele
SETTINGVALUE=$(aws secretsmanager get-secret-value \
    --secret-id "$(secret-id)" \
    --query SecretString \
    --output text  | jq -r '."$(setting-id)"')

# Controleer of de secret succesvol is opgehaald
if [ $? -eq 0 ]; then
    echo "Secret succesvol opgehaald: $SETTINGVALUE"
    echo "##vso[task.setvariable variable=SETTINGVALUE;issecret=true]$SETTINGVALUE"
else
    echo "Fout bij het ophalen van de secret"
fi

Het derde voorbeeld gaat nog een stapje verder en haalt alle instellingen op.

# Haal de secret op met AWS CLI en sla het resultaat op in een variabele
JSON_STRING=$(aws secretsmanager get-secret-value --secret-id "$(secret-id)" --query SecretString --output text)

# Controleer of de secret succesvol is opgehaald
if [ $? -eq 0 ]; then
    
    # Doorloop alle instellingen uit het resultaat
    echo $JSON_STRING | jq -r 'to_entries[] | "\(.key|ascii_upcase)|\(.value|tostring)"' | while read i; 
    do
        # Plaats de instelling en de waarde in een array
        my_array=($(echo $i | tr "|" "\n"))

        # Stel naamen waarde van variabele samen
        variable="SECRET-${my_array[0]//:/-}"
        value=${my_array[1]}

        echo "$variable"
        echo "##vso[task.setvariable variable=${variable};issecret=true]${value}"
    done

else
    echo "Fout bij het ophalen van de secret"
fi

Voorwaarde voor een goede werking is dat de pipeline, via de service connectie, rechten heeft om de AWS Secrets Manager te benaderen.

Deze oplossing is bruikbaar voor alle acties die je via de AWS CLI wilt uitvoeren, waarbij je de output wilt afvangen. Beschikbare diensten via de AWS CLI kun je hier terugvinden.

Heeft dit artikel jou op weg geholpen?  Buy Me A Coffee

.Net configuratie opslaan in AWS Secrets Manager

Wilco van Dijk
Lees meer

Hoe werkt het laden van AWS credentials in .Net?

Wilco van Dijk
Lees meer

Startscherm Azure Function uitzetten

Wilco van Dijk
Lees meer