W przypadku, gdy tworzenie zasobów przy pomocy szablonów Cloudformation musimy uzależnić od pewnych warunków (na przykład wartości paramtrów) na ratunek przychodzą wbudowane mechanizmu serwisu AWS. W tym artykule opiszę techniki posługiwania się Sekcją warunkową (ang. Conditions) oraz funkcjami warunkowymi.
Funkcje warunkowe
Podstawową funkcją warunkową Cloudformation jest funkcja Fn::If
, która w szablonach JSON ma następujący schemat "Fn::If": [nazwa_warunku, wartosc_prawda, wartosc_falsz]
, którym przypomina standardowy operator ternarny obecny między innymi w językach z rodziny C warunek ? wartosc_prawda : wartosc_falsz
. Działanie funkcji polega na tym, że jeżeli wartość logiczna zdefiniowana w sekcji warunkowej jako nazwa_warunek
równa się true
to wynikiem działania funkcji jest wartosc_prawda
. W przeciwnym wypadku funkcja zwróci wartosc_falsz
. Wartość, która powinna być zwrócona może być podana jawnie, lub być wynikiem obliczenia innej funkcji. Na przykład "Fn:If": ["MojeDokumentyIstnieje", "Fn:GetAtt": ["MojeDokumenty", "WebsiteUrl"], "https://s3.amazonaws.com/moje_dokumenty"]
zwróci wynik działania funkcji Fn:GetAtt
jeżeli warunek MojeDokumentyIstnieje
jest prawdziwy.
Sekcja warunkowa
Postawą działania funkcji warunkowej są warunki, które definiuje się w sekcji Conditions
szablonu CloudFormation. Każy z warunków zdefinowanych w tej grupie ma unikatową nazwę, a jego wartość wynika z zastosowania funkcji, które odpowiadają operatorom logicznym: Fn::And
, Fn::Or
, Fn::Not
oraz funkcji porównania Fn::Equals
. Do utworzony warunków można odwołać się w wywołaniach funkcji Fn::If
albo przez atrybut Condition
, który można utworzyć dla każdego zasobu.
Przykład
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters" {
"System": {
"Description": "Okresla, czy system jest produkcyjny czy testowy",
"AllowedValues": ["prod", "test", "beta"],
"Type": "String"
}
},
"Conditions": {
"TestSystem": {
"Fn::Or": [
Fn::Equals[{"Ref": "System"}, "test"],
Fn::Equals[{"Ref": "System"}, "beta"]
]
}
}
},
"Resources": {
"Dane": {
"Type": "AWS::S3::Bucket",
"Resources": {
"BucketName": {"Fn::If": [
"TestSystem",
"dane-testowe",
"dane-produkcyjne"
]}
}
},
"UsunDane": {
"Type": "AWS::Lambda::Function",
"Condition": "TestSystem",
"Resources": {
"FunctionName": "usun-dane-fn"
}
}
}
}
Nazwa kubełka zostanie określona przy pomocy funkcji Fn::If
. Jeżeli warunek TestSystem
jest fałszywy, to funkcja UsunDane
nie zostanie wogóle utworzona (bo jej istnienie nie jest uzasadnione na systemie produkcyjnym.