0

ich eine Abbildung in Cloudformation-Vorlage haben, lassen Sie uns sagen, es ist:Verwenden Cloudformation Mapping als Umgebungsvariable für benutzerdefinierte Ressource Lambda

"Mappings" : { 
    "RegionMap" : { 
     "us-east-1" : { "Name" : "Aaaa" }, 
     "ap-northeast-1" : { "Name" : "Bbbb" } 
    } 
} 

Jetzt habe ich in dieser diese Zuordnung als Umgebungsvariable auf das Lambda übergeben möge Vorlage:

"Environment": { 
    "Variables": { 
      "regions": { 
       "Ref": "RegionMap" 
      } 
    } 
    } 

Aber das gibt mir den Fehler:

Template contains errors.: Template format error: Unresolved resource dependencies [RegionMap] in the Resources block of the template

Ist es möglich, dass es funktioniert?

+0

Möchten Sie die vollständige Zuordnung der Lambda-Funktion oder nur einer der AMIs übergeben? –

+0

Komplette Zuordnung. Die Struktur dieses Mappings ist nur ein Beispiel, das keine Beziehung zu seinen realen Inhalten hat. – Andremoniy

Antwort

2

CloudFormation Die Daten des Zuordnungsabschnitts dürfen nur mit der systeminternen Funktion Fn::FindInMap extrahiert werden. Das bedeutet, dass Sie das gesamte Mapping-Objekt nicht als Umgebungsvariable senden können. Unabhängig vom Kontext sind Umgebungsvariable immer Strings. CloudFormation müsste dieses Objekt entweder in JSON oder YAML oder einem anderen Format serialisieren, und das ist wahrscheinlich der Grund, warum es Sie nicht zulassen wird.

Das können Sie selbst tun, Sie könnten das Mapping kopieren und es als JSON-String konvertieren (mit Escapezeichen usw.) und den Wert als Umgebungsvariable übergeben. Dann könnten Sie es in Ihrem Lambda-Code zurück in ein Objekt umwandeln.

Wenn Sie mit Ihrer Lambda-Funktion eine Custom Resource erstellen möchten, können Sie das gesamte JSON-Objekt als Parameter an die Ressource übergeben. Beispiel:

"AMIInfo": { 
    "Type": "Custom::AMIInfo", 
    "Properties": { 
    "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, 
    "RegionMap" : { 
     "us-east-1" : { "Name" : "Aaaa" }, 
     "ap-northeast-1" : { "Name" : "Bbbb" } 
    } 
    } 
} 
+0

Interessant. Aber wenn ich diese Karte in mehreren verschiedenen Lambdas innerhalb einer Vorlage verwenden möchte? – Andremoniy

+1

Wenn die Karte statisch ist, können Sie sie in Ihrem Lambdas programmieren. Eine andere Lösung (read hack) wäre, einen CloudFormation-Parameter (Benutzereingabe) zu verwenden und die Karte als String zu übergeben, dann könnte man sie in jeder Lambda-Funktionsdefinition "referenzieren". Sie könnten sogar den gewünschten Wert als "Standard" für diesen Parameter festlegen. Letzte Lösung, wenn Sie wirklich auf die Wiederverwendung von Code achten, können Sie ein Tool wie https://github.com/cloudtools/troposphere verwenden und Ihre Vorlage dynamisch generieren, während Sie dieselbe Map für jede Lambda-Definition verwenden. –

+0

Die Idee, Karte als Standardwert für den Parameter zu übergeben, ist sehr nett. Für diese spezielle Idee +1 und akzeptiert :) Danke! – Andremoniy

Verwandte Themen