如何将无服务器的cloudformation输出变量导出到文件或任务运行器?

时间:2018-03-16 22:05:57

标签: amazon-web-services amazon-cloudformation serverless-framework

我正在使用serverless.yml在AWS云形成中创建一些服务,特别是:cognitoUserPool和UserPoolClient。

这两个创建都将返回我将在我的平面html文件上使用的ID,其中cognito库连接到amazon cognito,因此,因为我从S3提供平面文件,所以我需要在文件内编码这些值

现在我正在寻找一种自动化方法,可能在文件中留下占位符,然后通过预处理器运行它们,在将它们上传到S3之前用输出值更改占位符。

有关如何实现这一目标的任何想法?我的第一个猜测是从无服务器部署中导出输出变量,然后在任务运行器上使用这些值。

2 个答案:

答案 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

SERVICESTAGEOUTPUT_KEY替换为您想要的值。

有关--query的更多详情,请参阅https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html