Fetch AWS Secrets from Secrets Manager

fetch-secrets.jsJavaScript

fetch-secrets.js

const AWS = require("aws-sdk");
const fs = require("fs");
const path = require("path");
const dotenv = require("dotenv");

dotenv.config();

// Replace with your AWS access credentials
const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
const region = process.env.AWS_REGION;

// Initialize the AWS SDK Secrets Manager client
const secretsManager = new AWS.SecretsManager({
  accessKeyId,
  secretAccessKey,
  region,
});

// Function to convert secret object to KEY="VALUE" format
function formatSecretContent(secretObj) {
  return Object.entries(secretObj)
    .map(([key, value]) => `${key}="${value}"`)
    .join("\n");
}

// Function to fetch all secrets
async function fetchAndStoreSecrets() {
  let secrets = [];
  let nextToken = null;

  try {
    // Create the secrets folder if it doesn't exist
    const secretsFolderPath = path.join(__dirname, "secrets");
    if (!fs.existsSync(secretsFolderPath)) {
      fs.mkdirSync(secretsFolderPath, { recursive: true });
    }

    do {
      const params = nextToken ? { NextToken: nextToken } : {};
      const data = await secretsManager.listSecrets(params).promise();
      secrets = secrets.concat(data.SecretList);
      nextToken = data.NextToken;
    } while (nextToken);

    await Promise.all(
      secrets.map(async (secret) => {
        try {
          const secretValue = await secretsManager
            .getSecretValue({ SecretId: secret.ARN })
            .promise();
          const secretContent =
            secretValue.SecretString ||
            Buffer.from(secretValue.SecretBinary, "base64").toString("utf-8");

          // Parse the secret content and format it
          const parsedSecret = JSON.parse(secretContent);
          const formattedContent = formatSecretContent(parsedSecret);

          // Write the secret to a .env file inside the secrets folder
          const envFilePath = path.join(
            secretsFolderPath,
            `${secret.Name}.env`
          );
          fs.writeFileSync(envFilePath, formattedContent);

          console.log(`Stored secret: ${secret.Name} in: ${envFilePath}`);
        } catch (err) {
          console.error(`Failed to fetch or store secret: ${secret.Name}`, err);
        }
      })
    );

    console.log("All secrets fetched and stored successfully.");
  } catch (error) {
    console.error("Error fetching secrets:", error);
  }
}

// Invoke the function
fetchAndStoreSecrets();
Updated: 12/26/2024