2016-10-19 2 views
1

J'ai un modèle de cloud qui utilise des ressources personnalisées adossées à la fonction lambda. L'un des paramètres de la fonction lambda est une liste de chaînes. Je n'ai qu'un seul élément à transmettre dans la liste et je voudrais utiliser Fn: Join pour concaténer créer la chaîne. Cependant, l'utilisation de Fn :: Join donne une erreur car elle conduit à un json invalide. Toutes les entrées sont appréciées.aws cloudformation utiliser Fn :: Rejoindre une liste

"Abonnements": [ "Fn :: Rejoindre": [ ":" [ "a", "b", "c"]]]

A client error (ValidationError) occurred when calling the CreateStack operation : Template format error: JSON not well-formed.

CloudFormation Snippet: -

"Resources": { 
"MyCustomRes": { 
     "Type": "Custom::CustomResource", 
     "Properties": { 
     "ServiceToken": { "Fn::Join": [ "", [ 
             "arn:aws:lambda:", 
             { "Ref": "AWS::Region" }, 
             ":", 
             { "Ref": "AWS::AccountId" }, 
             ":function:LambdaFn" 
             ] ] }, 
     "Version": 1, 
     "ResourceName": { "Ref": "ResourceName" }, 
     "Subscriptions"  : [ "Fn::Join": [ "", [ 
             "arn:aws:sns:", 
             { "Ref": "AWS::Region" }, 
             ":", 
             { "Ref": "AWS::AccountId" }, 
             ":Topic1" 
             ] ] ] 
    } 
}  }, 

Répondre

3

le Fn::JoinIntrinsic Function utilisé pour construire les valeurs de la propriété Subscriptions doit être un objet plutôt qu'un tableau.

sa syntaxe JSON invalide d'utiliser un tableau comme ['Fn::Join' : [...]] à la place, il doit être de la forme {"Fn::Join" : [...]}

Les documents décrivent la syntaxe comme

{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] } 

Par conséquent, votre modèle de formation cloud doit utiliser le

suivant
"Subscriptions": { 
     "Fn::Join": [":", [ 
      "arn:aws:sns", 
      { "Ref": "AWS::Region"}, 
      { "Ref": "AWS::AccountId"}, 
      "Topic1"] 
     ] 
    }