node.js - 如何获取环境变量并保存到参数存储?

标签 node.js amazon-web-services serverless-framework

我正在使用无服务器框架(aws)。

创建数据库时从 cloudFormation 写入环境。数据库的可变端点。

我的 serverless.yml 文件的一部分

  environment:    
      DATABASE_HOST:
          "Fn::GetAtt": [ServerlessRDS, Endpoint.Address]

此变量可从 lambda 级别获取,因为它已部署在 aws 上。但我想从本地访问这个变量。我想到了要将此变量写入参数存储(aws系统管理器)

因此,我将脚本附加到我的 serverless.yml 文件中(使用 serverless-scriptable-plugin)

scriptHooks,我的 serverless.yml 文件的一部分 :

after:aws:deploy:finalize:cleanup:
  - scripts/update-dbEndopint.js

这是脚本。没什么特别的,将环境变量 process.env.DATABASE_HOST 写入参数 stora。

const aws = require('aws-sdk');
const ssm = new aws.SSM();
(async () => {
  try {
    const params = {
      Name: `${process.env.AWS_SERVICE_NAME}-DATABASE_HOST-${
        process.env.AWS_STAGE
      }`,
      Value: `${process.env.DATABASE_HOST}`,
      Type: 'String',
      Overwrite: true,
    };
    await ssm.putParameter(params).promise();
    log(`[DATABASE_HOST]: ${process.env.DATABASE_HOST} `);
    log('Task done.');
  } catch (e) {
    throw e;
  }
})();

但是部署后变量未定义。 这是因为变量值只能在稍后使用。

你知道如何让我将基本端点获取到参数存储吗?

最佳答案

您的 servreless.yml 将为该函数设置 environment 变量,但不会为 serverless-scriptable-plugin 运行的脚本的 process.env 设置变量。

您需要使用类似以下内容将其保存为堆栈的输出:

Resources:
  ServerlessRDS:
    ....

Outputs:
  ServerlessRDSEndpointAddress:
    Value:
      "Fn::GetAtt": [ServerlessRDS, Endpoint.Address]

然后在您的脚本中从堆栈中提取该值,如下所示:

const fs = require('fs');
const yaml = require('js-yaml');
const aws = require('aws-sdk');
const ssm = new aws.SSM();

const getStackName = (stage) => {
  const content = fs.readFileSync('serverless.yml');
  return `${yaml.safeLoad(content).service}-${stage}`;
};

const getStackOutputs = async (provider, stackName, stage, region) => {
  const result = await provider.request(
    'CloudFormation',
    'describeStacks',
    { StackName: stackName },
    stage,
    region,
  );

  const outputsArray = result.Stacks[0].Outputs;

  let outputs = {};
  for (let i = 0; i < outputsArray.length; i++) {
    outputs[outputsArray[i].OutputKey] = outputsArray[i].OutputValue;
  }

  return outputs;
};

(async () => {
  try {
    const provider = serverless.getProvider('aws');
    const { stage, region } = options;

    const { ServerlessRDSEndpointAddress } = await getStackOutputs(provider, getStackName(stage), stage, region)

    const params = {
      Name: `${process.env.AWS_SERVICE_NAME}-DATABASE_HOST-${
        process.env.AWS_STAGE
      }`,
      Value: `${ServerlessRDSEndpointAddress}`,
      Type: 'String',
      Overwrite: true,
    };
    await ssm.putParameter(params).promise();
    log(`[DATABASE_HOST]: ${ServerlessRDSEndpointAddress} `);
    log('Task done.');
  } catch (e) {
    throw e;
  }
})();

我不确定将值保存在参数存储中将如何​​允许您在本地访问它。

如果您想在本地调用该函数,您可以使用:

serverless invoke local -f functionName -e DATABASE_HOST=<DATABASE_HOST>

或者使用dotenv对于任何其他 JavaScript 代码

关于node.js - 如何获取环境变量并保存到参数存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57575458/

相关文章:

node.js - Lerna 构建在远程失败 - 内部包的符号链接(symbolic link)很糟糕

node.js - MongooseJS 使用 find 通过引用查找

node.js - 创建 react 应用程序无法在构建后读取环境变量

java - 从 AWS Lambda 获取超时 AmazonDynamoDBClient dbClient = new AmazonDynamoDBClient();

mysql - 连接亚马逊mysql数据库

amazon-web-services - AWS CloudFormation 自定义权限边界

node.js - 从 node.js 报告上传进度

azure - 如何在 Azure 函数中创建子文件夹

amazon-web-services - 如何正确连接 AWS Lambda 到 VPC 中的 RDS?

amazon-s3 - 如何正确设置 IAM 执行角色和存储桶策略以将 lambda 写入公共(public)读取 S3 存储桶?