【问题标题】:How to export serverless cloudformation output variables to a file or a task runner?如何将无服务器 cloudformation 输出变量导出到文件或任务运行器?
【发布时间】:2019-08-01 13:36:05
【问题描述】:

我正在使用 serverless.yml 在 AWS cloudformation 中创建几个服务,特别是:cognitoUserPool 和 UserPoolClient。

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

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

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

【问题讨论】:

  • 是的。照你说的做。导出值,从 CloudFormation 读取它们并将它们写入文件。您可以使用占位符,也可以生成一个完整的 JavaScript 文件,其中仅包含这些作为全局变量。
  • 问题是:如何阅读它们?有没有办法让无服务器在某处输出这个?理想的解决方案是通过运行正常的无服务器部署命令自动完成这篇文章
  • 请参阅stackoverflow.com/a/54986275/1085343,了解无需使用插件即可实现此目的的无服务器方式

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


【解决方案1】:

要在不使用无服务器插件的情况下实现此目的,请将以下内容添加到您的 package.json 文件中:

  "scripts": {
    "sls:info": "sls info --verbose | tee ./.slsinfo",
  }

这将创建文件.slsinfo,其中包含您的无服务器输出(以及其他内容)。调用npm run sls:info运行

然后你可以更新 package.json:

  "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')

【讨论】:

    【解决方案2】:

    要从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 替换为您想要的值。

    在 Windows 上使用(引号的作用不同):

    aws cloudformation describe-stacks --stack-name SERVICE-STAGE --query Stacks[0].Outputs[?OutputKey==`OUTPUT_KEY`].OutputValue --output text
    

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

    【讨论】:

    • 非常有趣,任何想法如何抑制默认输出,如 FunctionQualifiedArn、ServiceEndpoint、ServerlessDeploymentBucketName ?
    • 我最终将所有内容导出到一个文件中,然后用 gulp 任务重写它以保留我只需要的属性。原因是因为我还需要一个声明以将其包含在我的 javascript 中,例如 var settings= {object here} ,否则我无法使用简单的 真正访问包含它的对象的内容>
    猜你喜欢
    • 2020-05-06
    • 2019-09-15
    • 2019-05-05
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多