Reputation: 1
I'm trying to use every Key,Value of an output and pipe it to another command. Here is what I'm trying to use:
INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID"
With the above command, I have the following output:
{
"Tags": [
{
"ResourceType": "instance",
"ResourceId": "i-0342a609edf80001a",
"Value": "A-VALUE",
"Key": "A-KEY"
},
{
"ResourceType": "instance",
"ResourceId": "i-0342a609edf80001a",
"Value": "B-VALUE",
"Key": "B-KEY"
},
{
"ResourceType": "instance",
"ResourceId": "i-0342a609edf80001a",
"Value": "C-VALUE",
"Key": "C-KEY"
},
{
"ResourceType": "instance",
"ResourceId": "i-0342a609edf80001a",
"Value": "D-VALUE",
"Key": "D-KEY"
},
{
"ResourceType": "instance",
"ResourceId": "i-0342a609edf80001a",
"Value": "E-VALUE",
"Key": "E-KEY"
},
{
"ResourceType": "instance",
"ResourceId": "i-0342a609edf80001a",
"Value": "F-VALUE",
"Key": "G-KEY"
},
{
Now I want to pipe each Key,Value to the following command:
aws ec2 create-tags --resources XXXXX --tags Key=H-KEY,Value=H-VALUE
Where the quantity and values of Key,Value are variable. So I believe I need a "for each".
May you help me?
It's like: For each Key,Value, do:
aws ec2 create-tags --resources XXXXX --tags Key=A-KEY,Value=A-VALUE
aws ec2 create-tags --resources XXXXX --tags Key=B-KEY,Value=B-VALUE
aws ec2 create-tags --resources XXXXX --tags Key=C-KEY,Value=C-VALUE
aws ec2 create-tags --resources XXXXX --tags Key=N...-KEY,Value=N...-VALUE
Upvotes: 0
Views: 307
Reputation: 247012
jq has a @sh
directive to output values properly quoted for the shell:
aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" \
| jq -r '.Tags[] | @sh "aws ec2 create-tags --resources XXXXX --tags Key=\(.Key),Value=\(.Value)"'
Given your input, this outputs
aws ec2 create-tags --resources XXXXX --tags Key='A-KEY',Value='A-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='B-KEY',Value='B-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='C-KEY',Value='C-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='D-KEY',Value='D-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='E-KEY',Value='E-VALUE'
aws ec2 create-tags --resources XXXXX --tags Key='G-KEY',Value='F-VALUE'
To execute those as commands pipe into sh
:
aws ec2 describe-tags ... | jq -r ... | sh
jq is quite an adventure. You need to add a "select" filter to remove keys that start with "aws:"
jq -r '
.Tags[] |
select(.Key | test("^aws:") | not) |
@sh "aws ... --tags Key=\(.Key),Value=\(.Value)"
'
Upvotes: 5