2015-04-16 1 views
4

Я пытаюсь параметризировать разделитель, используемый Fn :: Join, например. Сначала я был:"Fn :: Join" с разделителем по параметру?

"Name" : { "Fn::Join" : [ ".", [ 
      { "Ref":"serviceName"}, { "Ref": "environment" } ] ] }, 

, который работает хорошо, но потом я изменил его:

"Name" : { "Fn::Join" : [ {"Ref":"HostNameSeparator"}, [ 
      { "Ref":"serviceName"}, { "Ref": "environment" } ] ] }, 

Я получаю следующее сообщение об ошибке от фазы проверки:

A client error (ValidationError) occurred when calling the 
ValidateTemplate operation: Template error: every Fn::Join object 
requires two parameters, (1) a string delimiter and (2) a list of 
strings to be joined or a function that returns a list of strings 
(such as Fn::GetAZs) to be joined. 

Можно делать то, что я хочу, т.е. передать разделитель Join в качестве параметра шаблона?

(я сократил выше, ради ясности, пожалуйста, игнорировать опечатки примеры)

+0

Не все утверждения/функции CFN принимают 'Ref'. Полученная вами ошибка довольно прямолинейна. – slayedbylucifer

+0

Да, я получил это и надеялся, что у меня что-то отсутствует, поскольку Ref вернет строку. На данный момент я закончил вычисление значения в оболочке и передачу его в качестве параметра, но не DRY. –

+0

Это должно сработать. Согласно документации Amazon, «Для разделителя Fn :: Join вы можете использовать функцию Ref». http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html Определен HostNameSeparator? –

ответ

2

Вы можете добиться этого с помощью CustomResource. Этот шаблон CloudFormation готов к запуску и иллюстрирует, как он может работать. Delimiter передается как параметр, и вы найдете объединенную строку в выводах стека.

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Description": "Example Join", 
    "Parameters": { 
     "Delimiter": { 
      "Type": "String" 
     } 
    }, 
    "Resources": { 
     "LambdaExecutionRole": { 
      "Type": "AWS::IAM::Role", 
      "Properties": { 
       "AssumeRolePolicyDocument": { 
        "Version": "2012-10-17", 
        "Statement": [ 
         { 
          "Effect": "Allow", 
          "Principal": { 
           "Service": ["lambda.amazonaws.com"] 
          }, 
          "Action": ["sts:AssumeRole"] 
         } 
        ] 
       }, 
       "Path": "/", 
       "Policies": [ 
        { 
         "PolicyName": "root", 
         "PolicyDocument": { 
          "Version": "2012-10-17", 
          "Statement": [ 
           { 
            "Effect": "Allow", 
            "Action": [ 
             "logs:CreateLogGroup", 
             "logs:CreateLogStream", 
             "logs:PutLogEvents" 
            ], 
            "Resource": "arn:aws:logs:*:*:*" 
           }, 
           { 
            "Effect": "Allow", 
            "Action": [ 
             "cloudformation:DescribeStacks" 
            ], 
            "Resource": "*" 
           } 
          ] 
         } 
        } 
       ] 
      } 
     }, 
     "LambdaJoin": { 
      "Type": "AWS::Lambda::Function", 
      "Properties": { 
       "Code": { 
        "ZipFile": { "Fn::Join": ["\n", [ 
         "var response = require('cfn-response');\n", 
         "exports.handler = function (event, context) {\n", 
         "if (event.RequestType === 'Delete') {\n", 
         "return response.send(event, context, response.SUCCESS, {}, event.PhysicalResourceId);\n", 
         "}\n", 
         "var delimiter = event.ResourceProperties.delimiter || '';\n", 
         "var strings = event.ResourceProperties.strings || [];\n", 
         "return response.send(event, context, response.SUCCESS, { string: strings.join(delimiter) }, event.PhysicalResourceId);\n", 
         "};\n" 
        ]]} 
       }, 
       "Handler": "index.handler", 
       "Runtime": "nodejs", 
       "Timeout": "10", 
       "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] } 
      } 
     }, 
     "CustomJoin": { 
      "Type": "Custom::Join", 
      "Version": "1.0", 
      "Properties": { 
       "ServiceToken": { "Fn::GetAtt": ["LambdaJoin", "Arn"] }, 
       "delimiter": { "Ref": "Delimiter" }, 
       "strings": ["first", "second", "third"] 
      }, 
      "DependsOn": ["LambdaJoin"] 
     } 
    }, 
    "Outputs": { 
     "JoinedString": { 
      "Value": { "Fn::GetAtt": ["CustomJoin", "string"] } 
     } 
    } 
} 
Смежные вопросы