Получение секретной строки из диспетчера секретов с помощью nodejs

При нажатии кнопки в браузере должно появиться предупреждение с секретной строкой (секретный ключ и секретное значение).

Это мое приложение для реагирования

const App = () => {

    const handleFileUpload = async () => {
        try{
            await fetch('/get')
            .then(res => res.json())
            .then(data => {alert(`AccessKeyId: ${data.message} \nSecretAccessKey:             ${data.secretValue}`)
            })
        } catch(e){
            alert(e)
 }};

    return (
        <div>
            <button onClick = {handleFileUpload}>Submit</button>
        </div>
    );
};

export default App;

и это мой nodejs, который должен отправлять секретную строку обратно при нажатии кнопки

import {SecretsManager, } from "@aws-sdk/client-secrets-manager";
import express from "express"
import AWS from "aws-sdk"

const app = express();
const PORT = 5000;

const handler = async () => {
    AWS.config.update({'region':'region'});
    const client  = new SecretsManager({'region':'region'})
    const SecretsManagerResult = await client.getSecretValue({
      SecretId: "secrets_manager_name",
    })

    let responseObj = JSON.parse(SecretsManagerResult.SecretString);
      
    const {clsa_key, clsa_secret} = responseObj;
    return {clsa_key, clsa_secret}
};

app.get('/get', async (req, res) => {
    try { 
        let secretData = await handler()
        res.json({
            message: 'Secret retrieved successfully',
            "secretValue": secretData,
        });
    } catch (error) {
        res.json({
            message: 'Error retrieving secret',
            "secretValue": error.message,
        });
}})

handler скопировано из источника кода из Lambda/Functions/FunctionName, функция выполняет работу, когда я нажимаю на источник кода (облако AWS 9), но я не уверен, почему она не запускается в моем коде (с использованием VScode). Я настроил менеджера секретов и роль с разрешением на получение секретного значения, но продолжаю получать could not load credentials from any providers soluition.

Я пробовал использовать

import { LambdaClient } from "@aws-sdk/client-lambda"

const invokeLambda = async () => {
    const lambda = new LambdaClient({ region: "us-west-1" });
    const functionName = mylambdafunction;  
    const input = { t
        FunctionName: "mylambdafunction", 
      }  
        command = new InvokeAsyncCommand(input);
      try{
        response = await lambda.send(command)
        }catch(e){
        console.info(e.message)
    return response;
};

Я ожидал, что invokeLambda сработает, но продолжаю получать ту же ошибку и теперь совсем запутался. Я просмотрел документацию по javascript sdk, но не смог понять, что не так в моем коде.

А вот мои конфигурации лямбда-функции

Allow: secretsmanager:GetResourcePolicy
Allow: secretsmanager:GetSecretValue
Allow: secretsmanager:DescribeSecret
Allow: secretsmanager:ListSecretVersionIds

а для Execution role у меня есть roleExample, у которого есть политика со следующими действиями

GetResourcePolicy
GetSecretValue
ListSecretVersionIds```

вы не предоставили ключ доступа и секрет iam при инициализации клиента

Yuvaraj M 17.05.2024 06:40

Вы не хотите использовать файл .env для установки AWS_ACCESS_KEY_ID или AWS_SECRET_ACCESS_KEY. SecretsManager хорош для хранения паролей базы данных, имен пользователей и т. д., но чтобы сначала выполнить вызовы API к SecretsManager или использовать любой SDK локально, вам необходимо настроить файл учетных данных в соответствии с документацией . Если вы работаете на экземпляре EC2, вместо этого вы можете использовать роли IAM.

jQueeny 17.05.2024 10:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
180
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я продолжаю получать could not load credentials from any providers soluition в консоли?

Почему этот код не работает на локальном компьютере?

Все просто: в aws лямбда есть некоторая предопределенная переменная среды См. здесь, которая не настроена в вашей локальной системе. Таким образом, эта функция будет выполняться там идеально без каких-либо настроек, таких как регион, accessKeyId.

Что вам нужно сделать, так это настроить переменные env или напрямую передать их в качестве аргумента функции инициатора клиента.

Я порекомендую использовать .env, потому что вы не хотите повторять одно и то же несколько раз при использовании другого сервиса.

Позвольте мне показать оба примера.

Это объект инициатора клиента aws, я расскажу только об основных свойствах, необходимых для инициализации клиента.

  1. Настройка .env
AWS_REGION = your region
AWS_ACCESS_KEY_ID = your iam access keyid
AWS_SECRET_ACCESS_KEY = your iam secret key

Затем инициализируйте клиент, например

const client  = new SecretsManager(); // it will take details from process.env
  1. Использование ручной настройки
const client  = new SecretsManager({
    credentials: {
        accessKeyId: yourAccess keyId,
        secretAccessKey: your SecretAccess Key
    },
    region: your region
});

Понятно, а что, если я не хочу жестко запрограммировать идентификатор ключа доступа и секретный ключ доступа? каковы альтернативы или лучшая практика в этом случае?

Mea12 17.05.2024 06:47

вы можете использовать env, это будет лучший случай

Yuvaraj M 17.05.2024 06:50

ваш код работает, но теперь я в замешательстве, потому что здесь docs.aws.amazon.com/lambda/latest/dg/… там написано: «Чтобы повысить безопасность базы данных, мы рекомендуем вам использовать AWS Secrets Manager вместо переменных среды для хранить учетные данные базы данных. Дополнительную информацию см. в разделе «Использование AWS Lambda с Amazon RDS». так как же нам получить ключи от менеджера секретов, если нам нужны ключи для доступа к менеджеру и получения его секретных ключей в первую очередь?

Mea12 17.05.2024 07:11

По умолчанию Lambda использует управляемый ключ AWS для среды. Если вам нужно дополнительное шифрование, см. раздел «Шифрование среды». Вам не нужен RDS

Yuvaraj M 17.05.2024 07:39

Другие вопросы по теме