if creating a couple of CloudFormation (cf) skripts and run them in a whole bash-script. How to get output from cf before as input for next cf?
One script runs like this:
aws cloudformation deploy --template-file myTemplate.yaml --stack-name myStackName
Or if need package before like this
aws cloudformation package --template-file template.yaml --s3-bucket my-S3-bucket --output-template-file output.yaml
aws cloudformation deploy --template-file output.yaml.yaml --stack-name myStackName
Override a parameter.
aws cloudformation deploy --template-file output.yaml.yaml --stack-name myStackName --parameter-overrides AppName='my First App' DevAccountId=23456 TestAccountId=98765
Creating bash/shell script for more than one cf is here
#!/usr/bin/env bash
AppName='my First App'
DevAccount=123456
TestAccount=98765
aws cloudformation deploy --template-file output1.yaml.yaml --stack-name myFirstStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount
aws cloudformation deploy --template-file output2.yaml.yaml --stack-name mySecondStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount
aws cloudformation deploy --template-file output3.yaml.yaml --stack-name myThirdStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount
And now!
How to combine them? How to use export (not export, only output) from one stack as input to another stack, only using bash?
Getting output, use describe-stacks like this
aws cloudformation describe-stacks --stack-name myStackName --output text
Or with –output json or table, but you got whole stackdescription.
Reduce to output-only with this: All outputs
aws cloudformation describe-stacks --stack-name thomas-is-doph --query "Stacks[0].Outputs[].OutputValue" --output text
or this: one specific output (Outputs[0] or Outputs[1] )
aws cloudformation describe-stacks --stack-name thomas-is-doph --query "Stacks[0].Outputs[0].OutputValue" --output text
You have to know the order of outputs!
But it gets better!
You can get a specific output with
aws cloudformation describe-stacks --stack-name myStackName --query "Stacks[0].Outputs[?OutputKey=='SearchTerm'].OutputValue" --output text
Now you get directly your searchTerm!
If you combine them in a script, a function would be nice
try this:
function getOutput { echo -n "function called to find $1" queryParameter="Stacks[0].Outputs[?OutputKey=='$1'].OutputValue" echo -n "Query Paramter= $queryParameter" outputVar='aws cloudformation describe-stacks --stack-name $2 --query $queryParameter - --output text'
result=$(eval "$outputVar")
echo "searching variable:> $result"}
In a whole script it looks like this:
#!/usr/bin/env bash
##################################################
## Getting output from CI! ##
## ##
## Needs 3 parameter ##
## $1 name of Output ##
## $2 name of Stack ##
## result name in mandatory ##
## contains result ##
## ##
## Example: ##
## getOutput KMSKey moe-cloud-stack result ##
##################################################
function getOutput {
echo -n "function called to find $1"
queryParameter="Stacks[0].Outputs[?OutputKey=='$1'].OutputValue"
echo -n "Query Paramter= $queryParameter"
outputVar='aws cloudformation describe-stacks --stack-name $2 --query $queryParameter --profile moe-ci --output text --region eu-central-1'
result=$(eval "$outputVar")
echo "searching variable:> $result"
}
AppName='my First App'
DevAccount=123456
TestAccount=98765
aws cloudformation deploy --template-file output1.yaml.yaml --stack-name myFirstStack --parameter-overrides AppName=$AppName DevAccountId=$DevAccount TestAccountId=$TestAccount
getOutput important myFirstStack result
first=$result
getOutput moreImportant myFirstStack result
second=$result
aws cloudformation deploy --template-file output2.yaml.yaml --stack-name mySecondStack --parameter-overrides AppName=$AppName moreImportant=$second important=$first
very nice, isnt it?