Фон
Приведенная ниже команда создает поток JSON.
aws cloudformation describe-stacks --stack-name ${stack} --region us-east-1 |\
jq --arg STACK ${stack} '.Stacks[] | select(.StackName=="mlai-metadata-development-backend") | .Outputs[] | select(.ExportName != null)
{
"OutputKey": "outputvpcid",
"OutputValue": "vpc-d4520cb1",
"Description": "VPC ID of the Stack mlai-metadata-development-backend",
"ExportName": "stack-vpc-id"
}
{
"OutputKey": "outputvpccidr",
"OutputValue": "172.31.0.0/16",
"Description": "VPC CIDR of the Stack mlai-metadata-development-backend",
"ExportName": "stack-vpc-cidr"
}
Мне нравится создавать JSON словарь, например {"stack-vpc-cidr": "172.31.0.0/16"}
.
Выполнение этого:
aws cloudformation describe-stacks --stack-name ${stack} --region us-east-1 |\
jq --arg STACK ${stack} '.Stacks[] | select(.StackName=="mlai-metadata-development-backend") | .Outputs[] | select(.ExportName != null) | "\(.ExportName):\(.OutputValue)"'
создает.
"stack-vpc-id:vpc-d4520cb1"
"stack-vpc-cidr:172.31.0.0/16"
Вопрос
Как я могу превратить их в строки словаря JSON с помощью jq?
Обновление
Благодаря ответам все поняли правильно.
aws cloudformation describe-stacks --stack-name ${stack} --region ${AWS_DEFAULT_REGION} |\
jq --arg stack ${stack} \
'[.Stacks[] | select(.StackName==$stack) | .Outputs[] |
select(.ExportName != null) | { (.ExportName) : (.OutputValue) }] |
add' |\
tee "${stack}".json
Результат:
{
"apigw-rest-api-conntent-metadata-url": "https://****.execute-api.us-east-1.amazonaws.com/development/",
"apigw-rest-api-conntent-metadata-stage-name": "development",
"stack-availability-zones": "us-east-1a,us-east-1b,us-east-1c,us-east-1d,us-east-1e,us-east-1f",
"apigw-rest-api-conntent-metadata-deployment-id": "***0tk",
"stack-vpc-id": "vpc-d4520cb1",
"stack-vpc-cidr": "172.31.0.0/16"
}