我正在尝试使用范围过滤策略通过无服务器框架将SNS订阅部署到AWS。我的资源定义如下所示:
MySusbscription:
Type: AWS::SNS::Subscription
Properties:
TopicArn:
Ref: MyTopic
Endpoint: !GetAtt MyQueue.Arn
Protocol: sqs
RawMessageDelivery: true
FilterPolicy:
percentage:
- numeric:
- '>='
- ${ssm:/path/to/ssm/key}
RedrivePolicy:
deadLetterTargetArn: !GetAtt MyQueueDlq.Arn问题是Serverless将所有SSM值作为字符串提取,因此部署配置的编译版本将是:
- numeric:
- '>='
- '0.25'这将无法部署,因为SNS要求0.25为数字而不是字符串。Serverless有一个strToBool函数,但我还没有看到文档表明有一个等效的函数可以转换为数字/浮点数。
我确信我可以通过使用环境变量来解决这个问题,但是我们将所有的配置都存储在SSM中,我希望不会为了解决这个问题而做一次性的工作。
发布于 2021-02-05 05:36:30
第一个解决方案不是最干净的,但肯定会奏效。
在该目录中,使用以下脚本定义自定义JS文件ssmToNumber.js:
const AWS = require('aws-sdk');
module.exports = async (serverless) => {
# Setup AWS SDK with region and profile
const { region } = serverless.processedInput.options;
AWS.config.update({ region });
if (serverless.processedInput.options['aws-profile']) {
process.env.AWS_PROFILE = serverless.processedInput.options['aws-profile'];
}
const ssm = new AWS.SSM({ apiVersion: '2014-11-06' });
# Get SSM params details from serverless.yml
const ssmKey = serverless.service.custom.ssmKeys.percentageNumericThreshold.path;
const decryption = serverless.service.custom.ssmKeys.percentageNumericThreshold.decryption;
# Get SSM parameter value and convert it to int
const result = await ssm.getParameter({
Name: ssmKey,
WithDecryption: decryption,
}).promise();
if (result.Parameter) {
return parseInt(result.Parameter.Value, 10);
}
throw new Error(`Failed to read SSM parameter for key ${ssmKey}`);
};现在,在serverless.yml中定义以下值:
custom:
ssmKeys:
percentageNumericThreshold:
path: '/path/to/ssm/key'
decryption: false在您希望从SSM获得Numer值的位置,只需以这种方式调用它:
FilterPolicy:
percentage:
- numeric:
- '>='
- ${file(./ssmToNumber.js)}它是如何工作的?
Serverless Framework可以在构建期间启动任何JavaScript/TypeScript文件,并将其输出到serverless.yml文件中。
这正是我们在这里要做的。我们定义了我们的ssmToNumber.js脚本,它只是从SSM读取SSM参数,然后将其转换为整数并返回值。
它知道要使用哪个SSM路径,这要归功于serverless.yml文件中的custom.ssmKeys部分。
当然,如果您想要定制ssmToNumber.js文件,使其更加冗长和容错,那么您只需要编辑JavaScript文件。
另一种更优雅的方式
这需要更多的工作。查看Serverless with Typescript的官方示例。
正如您所看到的,可以使用serverless.ts或serverless.js代替YAML文件。
这需要你做一些重构现有YML文件的工作,但是编写助手函数,将它转换成数字,是实现你的用例的一种非常简单和优雅的方法。
它有一些缺点,比如直接包含其他CloudFormation模板的问题,但您仍然可以在单独的文件中定义YAML模板,然后简单地使用import调用从TS/JS代码导入这些模板。
https://stackoverflow.com/questions/65832576
复制相似问题