Я пытаюсь программно загрузить секрет в экземпляр AWS Secret Manager, используя
"@aws-sdk/client-secrets-manager": "^3.299.0", но я постоянно получаю сообщение об ошибке. Я следил за документацией здесь: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-secrets-manager/classes/getsecretvaluecommand.html
Я использую Typescript версии 5.0.2 и Node 18.x в качестве среды выполнения, и это мой tsconfig.json:
{
"compilerOptions": {
"module": "NodeNext",
"target": "ESNext",
"noImplicitAny": true,
"preserveConstEnums": true,
"outDir": "./dist",
"sourceMap": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "**/*.spec.ts"]
}
и это код, который терпит неудачу:
const client = new SecretsManagerClient({ region: 'my-region' });
async function getExistingSecret(connectionDetails: ConnectionDetails): Promise<string> {
console.info('checking if secret exists');
const command = getCommand(connectionDetails);
console.info(`GetSecretValueCommand: ${JSON.stringify(command)}`);
return client
.send(command) // <----- FAILS HERE
.catch(() => {
console.info(`secret does not exist`);
return null;
})
.then((response: GetSecretValueCommandOutput) => {
console.info(`secret exists arn: ${response.ARN}`);
return response.ARN;
});
}
const getCommand = (connectionDetails: ConnectionDetails): GetSecretValueCommand => {
const body = getCommandRequest(connectionDetails);
console.info(`GetSecretValueRequest: ${JSON.stringify(body)}`);
return { input: body } as GetSecretValueCommand;
};
const getCommandRequest = (connectionDetails: ConnectionDetails): GetSecretValueCommandInput => {
return { SecretId: secretName(connectionDetails) } as GetSecretValueCommandInput;
};
Ошибка, которую я получаю при запуске этого кода, такова:
TypeError: command.resolveMiddleware is not a function
at SecretsManagerClient.send (/var/task/node_modules/@aws-sdk/smithy-client/dist-cjs/client.js:13:33)
at getExistingSecret (/var/task/aws/secrets-client.js:35:10)
at addSecret (/var/task/aws/secrets-client.js:8:12)
at Runtime.handler (/var/task/index.js:9:29)
at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1085:29)
Я проверил эти места вместе с официальными документами, упомянутыми выше.
https://github.com/aws/aws-sdk-js-v3/issues/4456
Заранее благодарю за любую помощь!
Алекс
Я попробовал следующую документацию и ожидал, что код не вернет эту ошибку.
так ты имеешь в виду поставить await перед getExistingSecret(connectionDetails)?
Выложил решение, надеюсь поможет





Вот как я использую его с Typescript, но он также будет работать с Javascript
определение функции
import { SecretsManagerClient, GetSecretValueCommand, GetSecretValueCommandOutput } from "@aws-sdk/client-secrets-manager";
async function ImportSecrets(secretId?: string): Promise<GetSecretValueCommandOutput> {
const secretManagerClient = new SecretsManagerClient({ region: region });
const secretManagerCommand = new GetSecretValueCommand({ SecretId: secretId });
const secretManagerResponse = await secretManagerClient.send(secretManagerCommand);
return secretManagerResponse
}
вызов функции
let secrets = await ImportSecrets('my-secret-name')
Примечание. - Я передаю секретное имя идентификатора в функцию. Конечно, в моем случае у меня есть секрет создания вручную.
Большое спасибо за ваш вклад в это; Я рвала на себе волосы, пытаясь разобраться. Оказывается, GetSecretValueCommand не следует создавать как:
const command = { Input: someInput } as GetSecretValueCommand
Вместо этого следует использовать предоставленный конструктор:
const command = new GetSecretValueCommand(someInput)
Только тогда объект создается правильно.
Еще раз большое спасибо за ваш вклад в это!
Примечание для тех, кто найдет это: мне кажется, что один и тот же «шаблон» един для всех клиентов JavaScript V3, поэтому это должно помочь, даже если вы работаете с Kinesis, S3 и т. д.
Алекс
Рад, что помог. Если мой ответ помог вам, примите его, чтобы он помог другим в будущем.
Вы пробовали использовать с ожиданием? Нет проблем с ожиданием
import { SecretsManagerClient, GetSecretValueCommand } from "@aws-sdk/client-secrets-manager"; // ES Modules import // const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); // CommonJS import const client = new SecretsManagerClient(config); const input = { // GetSecretValueRequest SecretId: "STRING_VALUE", // required VersionId: "STRING_VALUE", VersionStage: "STRING_VALUE", }; const command = new GetSecretValueCommand(input); const response = await client.send(command);