Skip to content

Instantly share code, notes, and snippets.

@rxgx
Last active June 20, 2022 02:52
Show Gist options
  • Save rxgx/7e1b24de5936ff1b2b815a3d9cc3897a to your computer and use it in GitHub Desktop.
Save rxgx/7e1b24de5936ff1b2b815a3d9cc3897a to your computer and use it in GitHub Desktop.
const AWS = require('aws-sdk');
const client = new AWS.SecretsManager({});
// Call the AWS API and return a Promise
function getAwsSecret(secretName) {
return client.getSecretValue({ SecretId: secretName }).promise();
}
// Create a async function to use the Promise
// Top level await is a proposal
async function getAwsSecretAsync (secretName) {
var error;
var response = await getAwsSecret(secretName).catch(err => (error = err));
return [error, response];
}
// Call the async function and return NodeJS callback style
module.exports = function asyncExample () {
var [error, secret] = getAwsSecretAsync('dev/MySecret/MyService');
if (error) {
// Trigger an error and halt
console.error(error);
return;
}
// Use the result
console.debug(secret);
}
@rxgx
Copy link
Author

rxgx commented Aug 4, 2021

@rudyhadoux That'll work! You'll have to watch out for SecretString not being found on s if the result of clientsecrets.getSecretValue isn't perfect (rejected).

@rudyhadoux
Copy link

rudyhadoux commented Aug 4, 2021

I don't understand your message. The only thing I can say is I tested this code today within a Typescript AWS Lamba and it works.
If it works once, it always works in the same type of environment.

@rxgx
Copy link
Author

rxgx commented Aug 5, 2021

s could be null or undefined if clientsecrets.getSecretValue takes too long or something happens on AWS servers.

@theepag
Copy link

theepag commented Jun 2, 2022

This code works :

const clientsecrets = new SecretsManager( { region: 'eu-west-3' } );

  const getMySecret = async ( SecretId ) =>
  {
    const s = await clientsecrets.getSecretValue( { SecretId } ).promise();
    return s.SecretString;
  };

  const secret = await getMySecret( 'STRIPE_PUBLISHABLE_TEST_KEY' );
  console.log( 'secret : ', secret );

I'm getting this error
SyntaxError: await is only valid in async functions and the top level bodies of modules

@Harrisonkamau
Copy link

This code works :

const clientsecrets = new SecretsManager( { region: 'eu-west-3' } );

  const getMySecret = async ( SecretId ) =>
  {
    const s = await clientsecrets.getSecretValue( { SecretId } ).promise();
    return s.SecretString;
  };

  const secret = await getMySecret( 'STRIPE_PUBLISHABLE_TEST_KEY' );
  console.log( 'secret : ', secret );

I'm getting this error SyntaxError: await is only valid in async functions and the top-level bodies of modules

const secret = await getMySecret( 'STRIPE_PUBLISHABLE_TEST_KEY' );
console.log( 'secret : ', secret );

This block of code needs to be wrapped in an async function. Node.js doesn't, yet, natively support calling await outside of an async unlike Deno.

To fix your issue, you can do this:

// Either
// using an IIFE (Immediately-invoke Function Expression)

(async () => {
  const secret = await getMySecret( 'STRIPE_PUBLISHABLE_TEST_KEY' );
  console.log( 'secret : ', secret );
})();

// or just use a Promise expression
getMySecret
  .then((secret) => console.log( 'secret : ', secret ))
  .catch((error) => console.error(error));

@rxgx
Copy link
Author

rxgx commented Jun 3, 2022

Top level async/await is now available in Node.js LTS (v16.15.0 as of now).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment