Die neue Fn::ForEach Funktion kannst du durch eine Spracherweiterung nutzen. Ich persönlich bevorzuge das YAML-Format für CloudFormation Templates, daher sind die nachfolgenden Beispiele entsprechend formatiert.
Die ForEach-Funktion kannst du in der Resources, Condition und Outputs Sektion verwenden.
Wenn du also beispielsweise für dein Monitoring System SNS-Topics für deine Alarme aus verschiedenen Umgebungen erstellen, kannst du das in Zukunft wie folgt machen.
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
'Fn::ForEach::CWAlarmSNSTopics':
- Environment
- - Development
- Test
- Production
- 'SnsTopicAlarm${Environment}':
Type: 'AWS::SNS::Topic'
Properties:
TopicName: !Ref Environment
Zeile 2 führt eine Transformation durch. Diese liest das Template ein, wandelt gewisse Sprachkonstrukte um und resultiert in einem Template, welches nativen CloudFormation Code enthält. In diesem Fall wird hierdurch das Tempalte eingelesen und das Sprachkonstrukt für Fn::ForEach in Einzelressourcen umgewandelt.
Zeile 4 enthält das ForEach-Konstrukt und einen Identifikationsschlüssel. Dieser muss eindeutig sein. In diesem Fall ist es CWAlarmSNSTopics.
In Zeile 5 ist der Name der Variablen, welche in der ForEach Schleife genutzt wird, definiert.
Zeile 6-8 ist eine Liste von Werten, die der Variablen zugeordnet werden.
Zeile 9 ist ein Ressourcenidentifikator, wie du ihn bestimmt schon in normalen CloudFormation Templates gesehen hast. Die Besonderheit hieran ist, dass die Variable aus Zeile 5 verwendet wird.
Die weiteren Zeilen definieren ein SNS-Topic. Dies ist nun wieder altbekannter CloudFormation Code.
Das Resultat beim Ausführen dieses Templates sind drei Ressourcen:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"SnsTopicAlarmDevelopment": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Development"
}
},
"SnsTopicAlarmTest": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Test"
}
},
"SnsTopicAlarmProduction": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Production"
}
}
}
}
Wie du sehen kannst, lässt sich hierdurch Code Duplizierung vermeiden.
Mehr Informationen findest du in der offiziellen Dokumentation.