W pracy z bardziej złożonymi stackami CloudFormation niekiedy celowe jest podzielenie ich na mniejsze jednostki, grupujące zasoby określonych typów. Podobnie sprawa ma się, gdy pewne zasoby zamierzamy współdzielić między różnymi stackami. W tym celu w stacku źródłowym eksportujemy zasób, który ma być współdzielony. Z kolei w stackach, które mają wykorzystywać współdzielony zasób, importują go wskazując jednoznaczną nazwę, z którą został wyeksportowany.
Eksportowanie zasobów
Jako przykład współdzielonego zasobu użyję topicu SNS o nazwie export-test-topic
zdefionowanym w osobnym stacku CloudFormation z następującym szablonem.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Szablon, ktory definiuje topic SNS i eksportuje go dla innych stackow",
"Resources": {
"ExportTestTopic": {
"Type": "AWS::SNS::Topic",
"Description": "Publikuje wartosci do podłączonych konsumentów",
"Properties": {
"TopicName": "export-test-topic"
}
}
},
"Outputs" : {
"EventTopic" : {
"Value" : { "Ref" : "ExportTestTopic" },
"Export" : {
"Name" : "OutputExportTestTopic"
}
}
}
}
W tym szablonie kluczowa jest sekcja Outputs
, w której wartością wyjściową jest utworzony topic SNS. W innych stackach CloudFormation utworzonych ramach jednego konta AWS będzie on dostępny pod nazwą OutpuExportTestTopic
.
Importowanie zasobów
Nazwa, pod którą został wyeksportowany topic ExportTestTopic
zostanie wykorzystana w drugim szablonie, gdzie definiujemy kolejkę SQS test-event-queue
, która będzie gromadziła wiadmości, które przychodzą do topicu.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Szablon, ktory definiuje kolejke SQS, ktora zbiera powiadomienia SNS z zaimportowanego topicu",
"Resources": {
"EventsQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "test-event-queue"
}
},
"SnsToSqs": {
"Type": "AWS::SNS::Subscription",
"Description": "Połącznie SNS - SQS",
"Properties": {
"Protocol": "sqs",
"TopicArn": {
"Fn:ImportValue": "OutputExportTestTopic"
},
"Endpoint": {
"Fn::GetAtt": ["EventsQueue", "Arn"]
}
}
}
}
}
Połączenie SNS-SQS definiujemy zasobem AWS::SNS::Subscription. Ten typ zasobu pozwala na zdefiniowanie różnego typu integracji, gdzie źródłem wiadmości jest topic SNS. W zależności od wymagań celem, do którego trafiają wiadomości SNS może być endpoint HTTP, adres e-mail, kolejka SQS, itd. W naszym przypadku jako Protocol
określamy sqs
, a jako Endpoint
- kolejkę SQS zdefiowaną w zasobie EventsQueue
. Topic, który jest źródłem wskazujemy przy pomocy funkcji Fn:ImportValue, używając do tego nazwę, z którą został on wyeksportowany, czyli OutputExportTestTopic
.
Podsumowanie
Współdzielenie zasobów między stackami CloudFromation jest podawane jako dobra praktyka. Podział na stacki w zależności od typu zasobów i ich charakterystykę może mieć niebagatelne znaczenie i wpływać na działanie naszego systemu. Dlatego umiejętność współdzielenia ich jest istotnym elementem pracy z AWS CloudFormation