如何在Cloudformation中指定JSON格式的字符串?

时间:2016-08-19 14:12:30

标签: json amazon-cloudformation

我在CloudFormation模板上有以下资源,可以从AWS文档中创建运行Lambda函数的规则:

  "ScheduledRule": {
    "Type": "AWS::Events::Rule",
    "Properties": {
    "Description": "ScheduledRule",
    "ScheduleExpression": "rate(5 minutes)",
    "State": "ENABLED",
    "Targets": [{
      "Arn": { "Fn::GetAtt": ["myLambda", "Arn"] },
      "Id": "TargetFunctionV1"
    }]
    }
  }

我想指定输入:

{
  "Arn" : String,
  "Id" : String,
  "Input" : String,
  "InputPath" : String
}

和Input是传递给目标的JSON格式的文本字符串。该值将覆盖匹配的事件。

我希望我的JSON格式文本为:

{
  "mykey1": "Some Value"
}

当我把:

时,我不知道如何在输入中指定它
  "ScheduledRule": {
    "Type": "AWS::Events::Rule",
    "Properties": {
    "Description": "ScheduledRule",
    "ScheduleExpression": "rate(5 minutes)",
    "State": "ENABLED",
    "Targets": [{
      "Arn": { "Fn::GetAtt": ["myLambda", "Arn"] },
      "Id": "TargetFunctionV1",
      "Input": { "mykey1": "Some Value" }
    }]
    }
  }

我会收到错误:

Value of property Input must be of type String

我该如何正确指定?

6 个答案:

答案 0 :(得分:5)

自己找到答案:

“输入”:“{\”test \“:\”value11 \“,\”test2 \“:\”value22 \“}”

希望它可以帮助别人。

答案 1 :(得分:4)

我会使用YAML,因为它更容易阅读且更具可读性:

Input:
  !Sub |
    {
        mykey1: "${myKey}"
    }

答案 2 :(得分:4)

我想扩展@Pau 的回答。基本上,如果您使用 | 表示下面的整个块将被视为原始字符串。

如果您需要替换 JSON 中的任何变量,那么您可以使用 Sub,但如果您没有任何变量,那么您就不需要 Sub。一个例子是:

Input:|
  {
    "jsonVar":"jsonVal",
    "jsonVar2" : "jsonVal2"
  }

您可以稍后执行 JSON.parse(<input-variable>) 来获取 JSON 对象。

注意:如果没有下一个变量,请不要在 JSON 中的变量末尾放置逗号。示例:

Input:|
  {
    "jsonVar":"jsonVal",
    "jsonVar2" : "jsonVal2",
  }

这会导致 JSON 解析错误。

答案 3 :(得分:0)

这应该有效:

"Input": JSON.stringify({ mykey1: "Some Value" })

答案 4 :(得分:0)

如果您使用yaml编写CloudFormation脚本,发现难以使用JSON字符串(例如策略文档),最简单的方法是使用online converter

将JSON转换为yaml
ApiGatewayRestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Description: API Gateway for some API
      EndpointConfiguration:
        Types:
          - PRIVATE
      Name: MyAPIGateway 
      Policy: <Policy Doc >

让我们说说政策文件如下。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:ap-southeast-2:something/*",
        "Condition": {
            "ForAnyValue:StringEquals": {
                "aws:sourceVpce": "vpce-abcd"
            }
        }
    }
]
}

使用转换器,您可以将JSON转换为相同的Yaml并按以下方式使用。

ApiGatewayRestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Description: API Gateway for some API
      EndpointConfiguration:
        Types:
          - PRIVATE
      Name: MyAPIGateway 
      Policy: 
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal: "*"
          Action: execute-api:Invoke
          Resource: arn:aws:execute-api:ap-southeast-2:something/*
          Condition:
            ForAnyValue:StringEquals:
              aws:sourceVpce: vpce-abcd

答案 5 :(得分:0)

这是我用于“输入”行的类似 YAML 代码。我花了一整天的时间才弄明白语法,所以我希望这可以在将来对某人有所帮助。

Input: "{\"action\":[\"configure\"],\"mode\":[\"ec2\"],\"optionalConfigurationSource\":[\"ssm\"],\"optionalConfigurationLocation\":[\"AmazonCloudWatch-Baseline-Windows\"],\"optionalRestart\":[\"yes\"]}"