CloudFormation中的数学运算

时间:2016-01-09 12:35:21

标签: math amazon-cloudformation

是否可以在Cloudformation json模板中执行某种数学运算?

我遇到过两个有用的方面: 1.设置IOPS,该值必须是磁盘大小的比率。 2.为RDS免费存储空间设置Cloud Watch警报。将其设置为磁盘大小的百分比会很有用。

2 个答案:

答案 0 :(得分:8)

Intrinsic Functions不支持的CloudFormation模板中执行自定义逻辑有两种通用解决方案,例如数学运算:

1。自定义资源

编写Custom Resource来执行数学运算,将输入作为属性传递,输出作为值传递。这是一个自包含的工作示例,它将Result: 13作为堆栈输出返回:

Launch Stack

Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal: {Service: [lambda.amazonaws.com]}
          Action: ['sts:AssumeRole']
      Path: "/"
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  AddFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: !Sub |
          var response = require('cfn-response');
          exports.handler = function(event, context) {
            var result = parseInt(event.ResourceProperties.Op1) + parseInt(event.ResourceProperties.Op2);
            response.send(event, context, response.SUCCESS, {Value: result});
          };
      Runtime: nodejs
  AddTest:
    Type: Custom::Add
    Properties:
      ServiceToken: !GetAtt AddFunction.Arn
      Op1: 8
      Op2: 5
Outputs:
  Result:
    Description: Result
    Value: !GetAtt AddTest.Value

2。模板预处理器

使用您选择的全功能模板语言/平台来撰写“来源”#39;生成有效CloudFormation模板作为输出的模板。您可以使用功能齐全的CloudFormation特定库,如troposphere,但它也很容易编写一个简单的预处理器层,以满足您的用例和编程语言/库首选项。

我目前的选择是嵌入式Ruby(ERB),主要是因为我已经熟悉它。这是一个示例template.yml.erb文件,使用嵌入式Ruby语法执行数学运算,返回Result: 13作为堆栈输出:

Resources:
  # CloudFormation stacks require at least one resource
  Dummy:
    Type: AWS::SNS::Topic
Outputs:
  Result:
    Description: Result
    Value: <%= 8 + 5 %>

要处理模板,请运行cat template.yml.erb | ruby -rerb -e "puts ERB.new(ARGF.read, nil, '-').result" > template.yml,这会将以下支持CloudFormation的模板写入template.yml

Resources:
  # CloudFormation stacks require at least one resource
  Dummy:
    Type: AWS::SNS::Topic
Outputs:
  Result:
    Description: Result
    Value: 13

答案 1 :(得分:0)

我使用预处理系统取得了很大的成功。一般来说,我正在查看模板和可变数据,并根据这些数据做出决策。

以下是关于此问题的博文:

http://krogebry.blogspot.com/2014/12/cloudformation-discovery-and.html

在撰写本文时,我们遇到了许多VPC和一个非常复杂的帐户管理系统的问题。您所说的似乎可能是类似的思维方式,因为您有一些复杂(和整洁!)的要求可能需要类似的方法。此外,编译这样的堆栈还有一个额外的好处,即能够根据您的用例强制执行某些规则(例如,没有0.0.0.0:22或没有IOPS&gt; x阈值)。