【问题标题】:How to get env variable and save to parameter Store?如何获取环境变量并保存到参数存储?
【发布时间】:2019-12-25 18:40:44
【问题描述】:

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

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

我的 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到参数sora。

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;
  }
})();

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

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

【问题讨论】:

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


    【解决方案1】:

    您的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 代码

    【讨论】:

      猜你喜欢
      • 2017-06-17
      • 2019-06-25
      • 2018-04-01
      • 2019-11-05
      • 2021-02-12
      • 1970-01-01
      • 2017-07-31
      • 2021-11-17
      • 2013-12-29
      相关资源
      最近更新 更多