The foreach state in Direktiv is a powerful state that will execute an action for an array of items passed to it, in parallel. However, it is sometimes difficult to understand how Direktiv interprets these arrays.
Let's use the following example JSON input:
{
"detail":{
"requestParameters":{
"instancesSet":{
"items":[
{
"instanceId":"i-0772f323027e52c97"
},
{
"instanceId":"i-e272f3sdj447sac82"
},
{
"instanceId":"i-a872f323024e32c44"
}
]
}
}
}
}We would like to run the foreach state for each of the instanceIds in the JSON object. Let's look at how this is implemented:
description: A simple foreach state
functions:
- id: aws-cli
service: aws-cli
type: knative-namespace
states:
#
# For AWS: confirmed that the machine is in going into a terminated state, now we need to get volumes associated with the instance
#
- id: get-instance-details-aws
log: jq(.)
# log: Retrieve all the volumes not marked for deletion
type: foreach
array: 'jq([.detail.requestParameters.instancesSet.items[] | { "instance-id": .instanceId }])'
action:
function: aws-cli
input:
access-key: "key"
secret-key: "secret"
region: "region"
commands:
- command: 'aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=jq(."instance-id")'The jq statement creates the following object which is passed into the foreach loop:
[
{
"instance-id": "i-0772f323027e52c97"
},
{
"instance-id": "i-e272f3sdj447sac82"
},
{
"instance-id": "i-a872f323024e32c44"
}
]Let's break the jq statement down into it's parts:
- .detail.requestParameters.instancesSet.items[] selects all of the sub-items in the items array
- | pipes this select into the next part of the jq query
- { "instance-id": .instanceId } creates a new object called instance-id with the value of the instanceId key.
- [ ... ] around the statement instructs jq to create an array of the newly created objects
The object passed to the foreach state is now a simple array, which in turn will be broken into its seperate parts and passed to the function as a top-level JSON object that looks like this:
{
"instance-id": "i-a872f323024e32c44"
}The function can therefore address the instance-id directly using jq(.instance-id).
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article