Amazon web services 如何将无服务器cloudformation输出变量导出到文件或任务运行程序?
我正在使用serverless.yml在AWS cloudformation中创建两个服务,特别是:cognitoUserPool和UserPoolClient 这两个创建都将返回ID,我将在cognito库的平面html文件上使用这些ID连接到amazon cognito,因此,由于我提供的是来自S3的平面文件,我需要在文件中对这些值进行编码 现在我正在寻找一种自动化的方法,也许在文件中留下一个占位符,然后通过预处理器运行它们,在将占位符上传到S3之前用输出值更改占位符 有什么办法可以做到这一点吗?我的第一个猜测是从serverless deploy导出输出变量,然后在任务运行程序上使用这些值。要从serverless获取输出,可以使用插件,也可以推断堆栈名称并使用aws命令 将服务替换为服务名称,将阶段替换为阶段。您应该获得一个JSON对象,其中包含此命令的输出 如果您只想获得特定的输出,请尝试: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之前用输出值更改占位符 有什么办法可以做到这一
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},否则我无法使用简单的标记访问包含它的对象的内容