kevinhakanson.com

CloudFormation Output Values using the AWS CLI

March 13, 2023 #aws #cli #cloudformation

I was updating the Hello Go CDK sample project and looking for an easy way to get a CloudFormation stack output value for use in a CLI command.

The AWS CLI describe-stacks command will get that value, but there is an entire page of JSON to parse through. Most AWS CLI command support the --query global option, which is a “JMESPath query to use in filtering the response data.” See the JMESPath Specification¶ for full details.

I ran the command below using Stacks[].Outputs[] as the JMESPath query to see all the Outputs.

$ aws cloudformation describe-stacks --stack-name HelloGoAppStage-HelloGoAppStack --query Stacks[].Outputs[]

[
    {
        "OutputKey": "FargateServiceLoadBalancerDNSXXXXXXXX",
        "OutputValue": "hello-alb-0000000000.us-east-1.elb.amazonaws.com"
    },
    {
        "OutputKey": "FargateServiceServiceURLXXXXXXXX",
        "OutputValue": "http://hello-alb-0000000000.us-east-1.elb.amazonaws.com"
    }
]

The above JSON had unique values I redacted using XXXXXXXX and 0000000000. This makes finding the correct output harder than just matching an exact key value. Narrowing the describe-stacks command down to just FargateServiceServiceURLXXXXXXXX required a more complicated JMESPath query - one that would select the “OutputKey” that starts_with a “FargateServiceServiceURL” value.

$ aws cloudformation describe-stacks --stack-name HelloGoAppStage-HelloGoAppStack --query  "Stacks[0].Outputs[?starts_with(OutputKey, 'FargateServiceServiceURL')].OutputValue" 
[
    "http://hello-alb-0000000000.us-east-1.elb.amazonaws.com"
]

This output is better, but still a JSON string array with a quoted value. Another AWS CLI global option is --output which indicates the “formatting style for command output” and takes “json”, “text”, or “table” as values.

I changed my command to use --output text and now the value is in the format I need.

$ aws cloudformation describe-stacks --stack-name HelloGoAppStage-HelloGoAppStack --query  "Stacks[0].Outputs[?starts_with(OutputKey, 'FargateServiceServiceURL')].OutputValue" --output text
http://hello-alb-0000000000.us-east-1.elb.amazonaws.com

The last step was to use the backtick operator to interpolate the value and assign it to the HELLO_GO_URL environment variable so I can use it in the subsequent curl command.

export HELLO_GO_URL=`aws cloudformation describe-stacks --stack-name HelloGoAppStage-HelloGoAppStack --query "Stacks[0].Outputs[?starts_with(OutputKey, 'FargateServiceServiceURL')].OutputValue" --output text`
curl -w "\n" $HELLO_GO_URL/servicetest

Kevin Hakanson

Multi-Cloud Certified Architect | DevSecOps | AppSec | Web Platform | Speaker | Learner | Builder
Twitter | LinkedIn | GitHub | Stack Overflow | Credly

© 2024 Kevin Hakanson (built with Gatsby)