我正在使用无服务器框架(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/