Estoy tratando de analizar la respuesta de aws secretsmanager
La salida se parece a:
{ "ARN": "arn:aws:secretsmanager:us-west-2:0000:secret:token-0000", "Name": "token", "VersionId": "0000-0000-0000-0000-0000", "SecretString": "{\"TOKEN\":\"000000000000\"}", "VersionStages": ["AWSCURRENT"], "CreatedDate": "0000" } Al intentar analizar esta cadena con JSON.parse() , intenta analizar el valor de la cadena en SecretString que tiene comillas de escape.
Hubiera esperado necesitar JSON.parse la respuesta en dos pasos, sin embargo, esto no funciona.
#!/bin/bash TOKEN=$(node -e "\ const result = JSON.parse('$(aws secretsmanager get-secret-value --secret-id $ARN)'); \ const token = JSON.parse(result.SecretString); \ console.log(token); \ ") echo $TOKEN ¿Cómo puedo evitar que la función JSON.parse intente analizar el valor de cadena de SecretString ? Alternativamente, ¿hay una mejor manera de obtener el valor?
JSON.parse no intenta analizar las cadenas codificadas en JSON contenidas en el objeto analizado, por lo que no creo que esto sea lo que está causando su problema. Es más probable que tenga que ver con el manejo de las comillas por parte del shell.
Creo que una mejor manera de hacer esto sería hacer que su secuencia de comandos de Node llame a la CLI de aws usando child_process.execFile , en lugar de que el shell llame a aws y pase el resultado a Node.
Si necesita acceder a la variable ARN desde Node, puede hacerlo usando process.env.ARN .
Aquí hay un código que debería hacer el truco:
async function main() { const child_process = require('child_process'); const util = require('util'); const execFile = util.promisify(child_process.execFile); const json = (await execFile('aws', ['secretsmanager', 'get-secret-value', '--secret-id', process.env.ARN])).stdout; const result = JSON.parse(json); const token = result.SecretString; console.log(token); } main(); Si va a necesitar hacer más de este tipo de cosas, podría valer la pena mirar el SDK de AWS para NodeJS . Incluso con execFile , aún existen algunos inconvenientes con el uso de las herramientas de la CLI mediante programación de esta manera, especialmente si necesita pasar JSON a la herramienta de la CLI.
Tu puedes hacer:
const json = { "ARN": "arn:aws:secretsmanager:us-west-2:0000:secret:token-0000", "Name": "token", "VersionId": "0000-0000-0000-0000-0000", "SecretString": "{\"TOKEN\":\"000000000000\"}", "VersionStages": ["AWSCURRENT"], "CreatedDate": "0000" } json.SecretString = JSON.parse(json.SecretString) const { SecretString: { TOKEN: token } } = json console.log('Token:', token)intente con comillas simples en lugar de comillas dobles para el valor de cadena del JSON
{ "ARN": 'arn:aws:secretsmanager:us-west-2:0000:secret:token-0000', "Name": 'token', "VersionId": '0000-0000-0000-0000-0000', "SecretString": '{\"TOKEN\":\"000000000000\"}', "VersionStages": ['AWSCURRENT'], "CreatedDate": '0000' }