Eksport i import zasobów w stackach CloudFormation


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

Zobacz też