我正在使用serverless.yml在AWS云形成中创建一些服务,特别是:cognitoUserPool和UserPoolClient。
这两个创建都将返回我将在我的平面html文件上使用的ID,其中cognito库连接到amazon cognito,因此,因为我从S3提供平面文件,所以我需要在文件内编码这些值
现在我正在寻找一种自动化方法,可能在文件中留下占位符,然后通过预处理器运行它们,在将它们上传到S3之前用输出值更改占位符。
有关如何实现这一目标的任何想法?我的第一个猜测是从无服务器部署中导出输出变量,然后在任务运行器上使用这些值。
答案 0 :(得分:3)
要在不使用无服务器插件的情况下实现此目的,请将以下内容添加到package.json文件中:
"scripts": {
"sls:info": "sls info --verbose | tee ./.slsinfo",
}
这将创建文件.slsinfo
,其中包含无服务器输出(以及其他内容)。通过调用npm run sls:info
然后您可以像这样嵌套脚本:
"scripts": {
"sls:deploy": "sls deploy && npm run sls:info",
"sls:info": "sls info --verbose | tee .slsinfo",
}
现在您可以调用npm run sls:deploy
,它将部署您的服务并将您的输出添加到.slsinfo文件。
要在.slsinfo
中使用信息,最简单的方法是使用正则表达式。下面的示例:
const slsinfo = require('fs').readFileSync('./.slsinfo', 'utf8');
function getOutput(output) {
return slsinfo.match(new RegExp('('+output+': )((.?)+)(\\n)'))[2];
}
使用上述方法,您可以得到如下输出:
const var = getOutput('MyOutputName')
答案 1 :(得分:1)
要从serverless
获取输出,您可以使用serverless-stack-output插件,也可以推断出堆栈名称并使用aws
命令。
aws cloudformation describe-stacks --stack-name SERVICE-STAGE --query Stacks[0].Outputs
将SERVICE
替换为您的服务名称,将STAGE
替换为您的阶段。您应该使用此命令的输出获取JSON对象。
如果您想获得具体的输出,请尝试:
aws cloudformation describe-stacks --stack-name SERVICE-STAGE --query Stacks[0].Outputs[?OutputKey==`OUTPUT_KEY`].OutputValue --output text
将SERVICE
,STAGE
和OUTPUT_KEY
替换为您想要的值。
有关--query
的更多详情,请参阅https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html