Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将aws secret manager与nodejs lambda一起使用_Javascript_Node.js_Aws Lambda_Aws Secrets Manager - Fatal编程技术网

Javascript 如何将aws secret manager与nodejs lambda一起使用

Javascript 如何将aws secret manager与nodejs lambda一起使用,javascript,node.js,aws-lambda,aws-secrets-manager,Javascript,Node.js,Aws Lambda,Aws Secrets Manager,我试图包装示例代码片段以获取函数中的秘密,然后调用它,但它似乎不起作用。我怀疑我正在异步调用它,我需要同步调用它吗?我只需要一个函数,我可以调用它来获取一个秘密值,并将其放入一个var中 这就是功能: //outside exports.handler = (event, context, callback) => { function getSecret(secretName) { // Load the AWS SDK var AWS = require('aws-sdk'),

我试图包装示例代码片段以获取函数中的秘密,然后调用它,但它似乎不起作用。我怀疑我正在异步调用它,我需要同步调用它吗?我只需要一个函数,我可以调用它来获取一个秘密值,并将其放入一个var中

这就是功能:

//outside exports.handler = (event, context, callback) => {
function getSecret(secretName) {
  // Load the AWS SDK
  var AWS = require('aws-sdk'),
      region = process.env.AWS_REGION,
      secretName = secretName,
      secret,
      decodedBinarySecret;

  // Create a Secrets Manager client
  var client = new AWS.SecretsManager({
      region: region
  });

  // In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
  // See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
  // We rethrow the exception by default.

  client.getSecretValue({SecretId: secretName}, function(err, data) {
      if (err) {
          if (err.code === 'DecryptionFailureException')
              // Secrets Manager can't decrypt the protected secret text using the provided KMS key.
              // Deal with the exception here, and/or rethrow at your discretion.
              throw err;
          else if (err.code === 'InternalServiceErrorException')
              // An error occurred on the server side.
              // Deal with the exception here, and/or rethrow at your discretion.
              throw err;
          else if (err.code === 'InvalidParameterException')
              // You provided an invalid value for a parameter.
              // Deal with the exception here, and/or rethrow at your discretion.
              throw err;
          else if (err.code === 'InvalidRequestException')
              // You provided a parameter value that is not valid for the current state of the resource.
              // Deal with the exception here, and/or rethrow at your discretion.
              throw err;
          else if (err.code === 'ResourceNotFoundException')
              // We can't find the resource that you asked for.
              // Deal with the exception here, and/or rethrow at your discretion.
              throw err;
      }
      else {
          // Decrypts secret using the associated KMS CMK.
          // Depending on whether the secret is a string or binary, one of these fields will be populated.
          if ('SecretString' in data) {
              return data.SecretString;
          } else {
              let buff = new Buffer(data.SecretBinary, 'base64');
              return buff.toString('ascii');
          }
    }
  });
}
那我就叫它

// inside exports.handler = (event, context, callback) => {
var secret = getSecret('mySecret')
console.log('mysecret: ' + secret )
秘密变量总是
未定义

编辑:Async仅适用于承诺,因此我必须使我的函数异步并返回承诺:

async function mySecrets(secretName) {
    // Load the AWS SDK
    var AWS = require('aws-sdk'),
        region = process.env.AWS_REGION,
        secretName = secretName,
        secret,
        decodedBinarySecret;

    // Create a Secrets Manager client
    var client = new AWS.SecretsManager({
        region: region
    });

    return new Promise((resolve,reject)=>{
        client.getSecretValue({SecretId: secretName}, function(err, data) {

            // In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
            // See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
            // We rethrow the exception by default.
            if (err) {
                reject(err);
            }
            else {
                // Decrypts secret using the associated KMS CMK.
                // Depending on whether the secret is a string or binary, one of these fields will be populated.
                if ('SecretString' in data) {
                    resolve(data.SecretString);
                } else {
                    let buff = new Buffer(data.SecretBinary, 'base64');
                    resolve(buff.toString('ascii'));
                }
            }
        });
    });
}

.....
// inside handler
exports.handler = async (event) => {
....
var value = await mySecrets('mysecret')

您需要等待异步调用完成

在您的主处理器中,您将有如下内容:

// inside your main handler
exports.handler =  async function(event, context) {
    var secret = await getSecret('mySecret')
    console.log('mysecret: ' + secret )

    return ...
    }

我创建了一个同步解决方案,您可以在这里找到:

使用此软件包,您可以在特定命名空间中加载所有机密,如下所示:

const config=require('@jwere/secrets').configSync({
地区:'us-east-1',
环境:"生产",,
命名空间:“我的命名空间”,
});
这将找回你所有的秘密,这些秘密可能不是你想要的。如果你想要一个秘密,你可以这样做:

const config=require('@jwere/secrets')。secretSync({
地区:“美国西部2号”
id:“/my co/api/”
});

aws sdk提供了两种从API获取值的方法。您可以使用本机回调机制(如上所示),也可以在调用链的末尾使用
.promise()
将API调用转换为其promise等价物

例如

const data=await(secretManager.getSecret({SecretId}).promise();

如果您使用的是
wait
,那么您的函数需要与调用它的所有函数一样是
异步的,除非它们选择使用Promise的
,然后
/
catch
等等。

更好的方法是在异步lambda函数中这样做

示例
key:val=>password:rootPassword

const secret = await secretClient.getSecretValue({SecretId: 'SecretKeyName'}).promise().then((data) => {
        return JSON.parse(data.SecretString);
})
然后以
secret.password
的身份访问它


注意:环绕
尝试/catch
块自动处理错误。

如果有人需要解决此问题,这里有一个更简单的示例:

const result = await client
  .getSecretValue({
    SecretId: AWSConfig.secretName,
  })
  .promise();

const parsedResult = JSON.parse(result.SecretString);

我也可以用一个承诺来代替吗?是的,asyc或者承诺是一样的。经过两天无数次的尝试,我终于成功了!