Amazon web services 如何将无服务器cloudformation输出变量导出到文件或任务运行程序?

Amazon web services 如何将无服务器cloudformation输出变量导出到文件或任务运行程序?,amazon-web-services,amazon-cloudformation,serverless-framework,Amazon Web Services,Amazon Cloudformation,Serverless Framework,我正在使用serverless.yml在AWS cloudformation中创建两个服务,特别是:cognitoUserPool和UserPoolClient 这两个创建都将返回ID,我将在cognito库的平面html文件上使用这些ID连接到amazon cognito,因此,由于我提供的是来自S3的平面文件,我需要在文件中对这些值进行编码 现在我正在寻找一种自动化的方法,也许在文件中留下一个占位符,然后通过预处理器运行它们,在将占位符上传到S3之前用输出值更改占位符 有什么办法可以做到这一

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

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

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

有什么办法可以做到这一点吗?我的第一个猜测是从serverless deploy导出输出变量,然后在任务运行程序上使用这些值。

要从serverless获取输出,可以使用插件,也可以推断堆栈名称并使用aws命令

将服务替换为服务名称,将阶段替换为阶段。您应该获得一个JSON对象,其中包含此命令的输出

如果您只想获得特定的输出,请尝试:

aws cloudformation describe-stacks --stack-name SERVICE-STAGE --query 'Stacks[0].Outputs[?OutputKey==`OUTPUT_KEY`].OutputValue' --output text
用所需的值替换SERVICE、STAGE和OUTPUT_键

在Windows上使用引号的工作方式不同:

aws cloudformation describe-stacks --stack-name SERVICE-STAGE --query Stacks[0].Outputs[?OutputKey==`OUTPUT_KEY`].OutputValue --output text
有关-query的更多详细信息,请参见

要从serverless获取输出,您可以使用插件,也可以推断堆栈名称并使用aws命令

将服务替换为服务名称,将阶段替换为阶段。您应该获得一个JSON对象,其中包含此命令的输出

如果您只想获得特定的输出,请尝试:

aws cloudformation describe-stacks --stack-name SERVICE-STAGE --query 'Stacks[0].Outputs[?OutputKey==`OUTPUT_KEY`].OutputValue' --output text
用所需的值替换SERVICE、STAGE和OUTPUT_键

在Windows上使用引号的工作方式不同:

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

有关-query的更多详细信息,请参见

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

  "scripts": {
    "sls:info": "sls info --verbose | tee ./.slsinfo",
  }
这将创建文件.slsinfo,其中包含无服务器输出和其他内容。通过调用npm运行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中的信息,我发现最简单的方法是使用regex。示例如下:

const slsinfo = require('fs').readFileSync('./.slsinfo', 'utf8');

function getOutput(output) {
  return slsinfo.match(new RegExp('('+output+': )((.?)+)(\\n)'))[2];
}
使用上述方法,您可以获得如下输出:

const var = getOutput('MyOutputName')

要在不使用无服务器插件的情况下实现这一点,请在package.json文件中添加以下内容:

  "scripts": {
    "sls:info": "sls info --verbose | tee ./.slsinfo",
  }
这将创建文件.slsinfo,其中包含无服务器输出和其他内容。通过调用npm运行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中的信息,我发现最简单的方法是使用regex。示例如下:

const slsinfo = require('fs').readFileSync('./.slsinfo', 'utf8');

function getOutput(output) {
  return slsinfo.match(new RegExp('('+output+': )((.?)+)(\\n)'))[2];
}
使用上述方法,您可以获得如下输出:

const var = getOutput('MyOutputName')

对照你说的做。导出这些值,从CloudFormation读取它们并将它们写入文件。您可以使用占位符,也可以生成一个完整的JavaScript文件,其中只包含这些全局变量。问题是:如何读取它们?有没有一种方法可以让serverless在某个地方输出这些信息?理想的解决方案是,只需运行普通的无服务器部署命令,就可以自动完成编写。请参阅无服务器方式,无需使用pluginYes即可实现这一点。照你说的做。导出这些值,从CloudFormation读取它们并将它们写入文件。您可以使用占位符,也可以生成一个完整的JavaScript文件,其中只包含这些全局变量。问题是:如何读取它们?有没有一种方法可以让serverless在某个地方输出这些信息?理想的解决方案是,只需运行普通的无服务器部署命令,即可自动完成此编写。请参阅无服务器方式,无需使用pluginVery,了解如何抑制默认输出,如FunctionQualifiedArn、ServiceEndpoint、,ServerlessDeploymentBucketName?我最终将所有内容导出到一个文件中,然后用一个gulp任务重写它,以保留我只需要的属性。原因是我还需要一个声明来将其包含在我的javascript中,比如var settings={object here},否则我无法用一个简单的标记访问包含它的对象的内容非常有趣,有没有关于如何抑制默认输出(如FunctionQualifiedArn、ServiceEndpoint、,ServerlessDeploymentBucketName?我最终将所有内容导出到一个文件中,然后用一个gulp任务重写它,以保留我只需要的属性。原因是,我还需要一个声明来将其包含在我的javascript中,比如var settings={object here},否则我无法使用简单的标记访问包含它的对象的内容