При нажатии кнопки в браузере должно появиться предупреждение с секретной строкой (секретный ключ и секретное значение).
Это мое приложение для реагирования
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```
Вы не хотите использовать файл .env для установки AWS_ACCESS_KEY_ID или AWS_SECRET_ACCESS_KEY. SecretsManager хорош для хранения паролей базы данных, имен пользователей и т. д., но чтобы сначала выполнить вызовы API к SecretsManager или использовать любой SDK локально, вам необходимо настроить файл учетных данных в соответствии с документацией . Если вы работаете на экземпляре EC2, вместо этого вы можете использовать роли IAM.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я продолжаю получать
could not load credentials from any providers soluitionв консоли?
Почему этот код не работает на локальном компьютере?
Все просто: в aws лямбда есть некоторая предопределенная переменная среды См. здесь, которая не настроена в вашей локальной системе. Таким образом, эта функция будет выполняться там идеально без каких-либо настроек, таких как регион, accessKeyId.
Что вам нужно сделать, так это настроить переменные env или напрямую передать их в качестве аргумента функции инициатора клиента.
Я порекомендую использовать .env, потому что вы не хотите повторять одно и то же несколько раз при использовании другого сервиса.
Позвольте мне показать оба примера.
Это объект инициатора клиента aws, я расскажу только об основных свойствах, необходимых для инициализации клиента.
.envAWS_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
const client = new SecretsManager({
credentials: {
accessKeyId: yourAccess keyId,
secretAccessKey: your SecretAccess Key
},
region: your region
});
Понятно, а что, если я не хочу жестко запрограммировать идентификатор ключа доступа и секретный ключ доступа? каковы альтернативы или лучшая практика в этом случае?
вы можете использовать env, это будет лучший случай
ваш код работает, но теперь я в замешательстве, потому что здесь docs.aws.amazon.com/lambda/latest/dg/… там написано: «Чтобы повысить безопасность базы данных, мы рекомендуем вам использовать AWS Secrets Manager вместо переменных среды для хранить учетные данные базы данных. Дополнительную информацию см. в разделе «Использование AWS Lambda с Amazon RDS». так как же нам получить ключи от менеджера секретов, если нам нужны ключи для доступа к менеджеру и получения его секретных ключей в первую очередь?
По умолчанию Lambda использует управляемый ключ AWS для среды. Если вам нужно дополнительное шифрование, см. раздел «Шифрование среды». Вам не нужен RDS
вы не предоставили ключ доступа и секрет iam при инициализации клиента