首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SSM值转换为数字

将SSM值转换为数字
EN

Stack Overflow用户
提问于 2021-01-22 01:21:48
回答 1查看 205关注 0票数 1

我正在尝试使用范围过滤策略通过无服务器框架将SNS订阅部署到AWS。我的资源定义如下所示:

代码语言:javascript
复制
      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值作为字符串提取,因此部署配置的编译版本将是:

代码语言:javascript
复制
              - numeric:
                - '>='
                - '0.25'

这将无法部署,因为SNS要求0.25为数字而不是字符串。Serverless有一个strToBool函数,但我还没有看到文档表明有一个等效的函数可以转换为数字/浮点数。

我确信我可以通过使用环境变量来解决这个问题,但是我们将所有的配置都存储在SSM中,我希望不会为了解决这个问题而做一次性的工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-05 05:36:30

第一个解决方案不是最干净的,但肯定会奏效。

在该目录中,使用以下脚本定义自定义JS文件ssmToNumber.js

代码语言:javascript
复制
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中定义以下值:

代码语言:javascript
复制
custom:
  ssmKeys:
    percentageNumericThreshold:
      path: '/path/to/ssm/key'
      decryption: false

在您希望从SSM获得Numer值的位置,只需以这种方式调用它:

代码语言:javascript
复制
      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.tsserverless.js代替YAML文件。

这需要你做一些重构现有YML文件的工作,但是编写助手函数,将它转换成数字,是实现你的用例的一种非常简单和优雅的方法。

它有一些缺点,比如直接包含其他CloudFormation模板的问题,但您仍然可以在单独的文件中定义YAML模板,然后简单地使用import调用从TS/JS代码导入这些模板。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65832576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档