Verwenden von Modulen zur Kapselung und Wiederverwendung von Ressourcenkonfigurationen - AWS CloudFormation

Verwenden von Modulen zur Kapselung und Wiederverwendung von Ressourcenkonfigurationen

Module sind eine Möglichkeit für Sie, Ressourcenkonfigurationen für die Aufnahme in Stack-Vorlagen auf transparente, verwaltbare und wiederholbare Weise zu erstellen. Module können gängige Servicekonfigurationen und Best Practices als modulare, anpassbare Bausteine zusammenfassen, die Sie in Ihre Stack-Vorlagen aufnehmen können. Module ermöglichen es Ihnen, Ressourcenkonfigurationen, die Best Practices, Fachwissen und akzeptierte Richtlinien (für Bereiche wie Sicherheit, Compliance, Governance und Branchenvorschriften) in Ihre Vorlagen einbeziehen, ohne fundierte Kenntnisse über die Feinheiten der Ressourcenimplementierung erwerben zu müssen.

Beispielsweise könnte eine Fachkraft für Netzwerke ein Modul erstellen, das integrierte Sicherheitsgruppen und Regeln für eingehenden/ausgehenden Datenverkehr enthält, die den Sicherheitsrichtlinien entsprechen. Sie könnten dieses Modul dann in Ihre Vorlage aufnehmen, um eine sichere Netzwerkinfrastruktur in Ihren Stack bereitzustellen – ohne Zeit damit verbringen zu müssen, herauszufinden, wie VPCs, Subnetze, Sicherheitsgruppen und Gateways funktionieren. Und da Module versioniert sind, kann der Modulautor eine neue Version des Moduls erstellen, wenn sich die Sicherheitsrichtlinien im Laufe der Zeit ändern, die diese Änderungen enthält.

Zu den Merkmalen der Verwendung von Modulen in Ihren Vorlagen gehören:

  • Vorhersagbarkeit: Ein Modul muss dem Schema entsprechen, das es in der CloudFormation-Registrierung registriert, damit Sie wissen, welche Ressourcen es auflösen kann, sobald Sie es in Ihre Vorlage aufgenommen haben.

  • Wiederverwendbarkeit: Sie können dasselbe Modul für mehrere Vorlagen und Konten verwenden.

  • Rückverfolgbarkeit: CloudFormation behält das Wissen darüber bei, welche Ressourcen in einem Stack aus einem Modul bereitgestellt wurden, sodass Sie die Quelle von Ressourcenänderungen leicht verstehen können.

  • Verwaltbarkeit: Sobald Sie ein Modul registriert haben, können Sie es über die CloudFormation-Registrierung verwalten, einschließlich Versionierung und Verfügbarkeit von Konten und Regionen.

Ein Modul kann enthalten:

  • Eine oder mehrere Ressourcen, die aus dem Modul bereitgestellt werden sollen, zusammen mit allen zugehörigen Daten wie Ausgaben oder Bedingungen.

  • Alle Modulparameter, mit denen Sie bei jeder Verwendung des Moduls benutzerdefinierte Werte angeben können.

Informationen zum Entwickeln von Modultypen finden Sie unter Entwickeln von Modelltypen im Benutzerhandbuch für die CloudFormation-Befehlszeilenschnittstelle.

Verwenden von Modulen in einer Vorlage

Um ein Modul zu verwenden, vergewissern Sie sich, dass es in dem Konto und in der Region registriert ist, in der Sie es verwenden möchten. Sie registrieren Module in der CloudFormation-Registrierung als private Erweiterungen. Behandeln Sie sie dann genauso, wie Sie es mit einzelnen Ressourcen tun würden:

  • Fügen Sie das entsprechende Modul in den Bereich Resources Ihrer Vorlage ein.

  • Geben Sie alle erforderlichen Eigenschaften für das Modul an.

Wenn Sie einen Stack-Vorgang initiieren, generiert CloudFormation eine verarbeitete Vorlage, die alle enthaltenen Module in die entsprechenden Ressourcen auflöst. Verwenden Sie Änderungssätze, um eine Vorschau der Ressourcen anzuzeigen, die hinzugefügt oder aktualisiert werden sollen, bevor der Stack-Vorgang tatsächlich ausgeführt wird.

Betrachten Sie das folgende Beispiel: Sie haben eine Vorlage, die sowohl Ressourcen als auch Module enthält. Die Vorlage enthält eine einzelne Ressource, ResourceA, sowie ein Modul, ModuleParent. Dieses Modul enthält zwei Ressourcen, ResourceB und ResourceC, sowie ein verschachteltes Modul, ModuleChild. ModuleChild enthält eine einzige Ressource, und zwar ResourceD. Wenn Sie aus dieser Vorlage einen Stack erstellen, verarbeitet CloudFormation die Vorlage und löst die Module in die entsprechenden Ressourcen auf. Der resultierende Stack enthält vier Ressourcen: ResourceA, ResourceB, ResourceCund ResourceD.


                Während eines Stack-Vorgangs löst CloudFormation die beiden in der Stack-Vorlage enthaltenen Module in die entsprechenden vier Ressourcen auf.

CloudFormation verfolgt, welche Ressourcen in einem Stack aus Modulen erstellt wurden. Sie können diese Informationen auf den Registerkarten Ereignisse, Ressourcen und Abweichungen für einen bestimmten Stack anzeigen und sie sind auch in der Änderungssatzvorschau enthalten.

Module sind von Ressourcen in einer Vorlage unterscheidbar, da sie der folgenden vierteiligen Namenskonvention entsprechen, im Gegensatz zu der typischen dreiteiligen Konvention, die von Ressourcen verwendet wird:

organization::service::usecase::MODULE

Verwenden von Parametern zur Angabe von Modulwerten

Module können Modulparameter enthalten. Ähnlich wie bei Vorlagenparametern können Sie mit Modulparametern benutzerdefinierte Werte aus der Vorlage (oder dem Modul) eingeben, in der/dem sie enthalten sind. Das Modul kann diese Werte dann verwenden, um Eigenschaften der enthaltenen Ressourcen festzulegen.

Sie können auch Vorlagenparameter definieren, die wiederum Moduleigenschaften festlegen, damit Benutzer Werte eingeben können, die zum Zeitpunkt des Stack-Vorgangs an das Modul übergeben werden. Weitere Informationen zum Definieren von Vorlagenparametern finden Sie unter Parameter.

Wenn ein Modul ein verschachteltes Modul enthält, das Modulparameter enthält, können Sie ebenfalls:

  • Werte für die Parameter des verschachtelten Moduls direkt im übergeordneten Modul angeben.

  • Entsprechende Modulparameter im übergeordneten Modul definieren, die es ermöglichen, die Parameter des verschachtelten Moduls durch die Vorlage (oder das Modul) festzulegen, in der das übergeordnete Modul enthalten ist.

Verwenden von Vorlagenparametern zur Angabe von Modulparameterwerten

Das folgende Beispiel zeigt, wie Vorlagenparameter definiert werden, die Werte an ein Modul übergeben.

In diesem Fall definiert die Vorlage mit My::S3::SampleBucket::MODULE einen Vorlagenparameter, BucketName, der es dem Benutzer ermöglicht, während des Stack-Vorgangs einen S3-Bucket-Namen anzugeben.

// Template containing My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } } } }

Festlegen von Eigenschaften für Ressourcen in einem untergeordneten Modul aus dem übergeordneten Modul

Das folgende Beispiel veranschaulicht, wie Parameterwerte in einem Modul angegeben werden, das in einem anderen Modul verschachtelt ist.

Dieses erste Modul, My::S3::SampleBucketPrivate::MODULE, ist das untergeordnete Modul. Es definiert zwei Parameter: BucketName und AccessControl. Die für diese Parameter angegebenen Werte werden verwendet, um die Eigenschaften BucketName und AccessControl der Ressource AWS::S3::Bucket, die das Modul enthält, anzugeben. Unten sehen Sie das Vorlagenfragment für My::S3::SampleBucketPrivate::MODULE.

// My::S3::SampleBucketPrivate::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket with Versioning and DeletionPolicy.", "Parameters": { "BucketName": { "Description": "Name for the bucket", "Type": "String" }, "AccessControl": { "Description": "AccessControl for the bucket", "Type": "String" } }, "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl": { "Ref": "AccessControl" }, "DeletionPolicy": "Retain", "VersioningConfiguration": { "Status": "Enabled" } } } } }

Als Nächstes ist das vorherige Modul in ein übergeordnetes Modul, My::S3::SampleBucket::MODULE, verschachtelt. Das übergeordnete Modul, My::S3::SampleBucket::MODULE, legt die Parameter des untergeordneten Moduls auf folgende Weise fest:

  • Es setzt den AccessControl-Parameter von My::S3::SampleBucketPrivate::MODULE auf Private.

  • Für BucketName definiert es einen Modulparameter, der es ermöglicht, den Bucket-Namen in der Vorlage (oder dem Modul) anzugeben, die/das My::S3::SampleBucket::MODULE enthält.

// My::S3::SampleBucket::MODULE { "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample S3 Bucket. With Private AccessControl.", "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucketPrivate::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" }, "AccessControl" : "Private" } } } }

Angeben von Beschränkungen für Modulparameter

Die Modulparameter unterstützen keine Erzwingung von Typ oder Einschränkung . Um eine Typ- oder Einschränkungsüberprüfung für einen Modulparameter durchzuführen, erstellen Sie einen Vorlagenparameter mit den gewünschten Einschränkungen und referenzieren Sie dann in Ihrem Modulparameter auf diesen Vorlagenparameter.

Referenzieren von Ressourcen in einem Modul

Ressourcen in einem Modul können mit logischem Namen referenziert werden. Der vollständig qualifizierte logische Name einer in einem Modul enthaltenen Ressource kann erstellt werden, indem Folgendes kombiniert wird:

  • Der logische Name, der für das Modul in der enthaltenden Vorlage (oder dem enthaltenden Modul) angegeben wurde.

  • Der logische Name für die Ressource, der im Modul angegeben ist.

Der voll qualifizierte logische Name für die Ressource kann mit oder ohne Verwendung eines Zeitraums als Trennzeichen angegeben werden. Zum Beispiel sind beide nachstehenden logischen Namen gültig und funktionell gleichwertig:

  • ModuleLogicalName.ResourceLogicalName

  • ModuleLogicalNameResourceLogicalName

Auf diese Weise können Sie die intrinsischen Funktionen GetAtt und Ref verwenden, um auf Eigenschaftswerte für Modulressourcen zuzugreifen.

Im folgenden Beispiel verweist die Vorlage auf eine Eigenschaft in einem Modul, um eine entsprechende Eigenschaft für eine Ressource in der Vorlage selbst festzulegen.

Angenommen, das Modul My::S3::SampleBucket::MODULE enthält eine Ressource AWS::S3::Bucket mit dem logischen Namen S3Bucket. Um mithilfe der intrinsischen Funktion Ref auf den Bucket-Namen dieser Ressource zu verweisen, kombinieren Sie den logischen Namen, den das Modul in der Vorlage hat, MyBucket, mit dem logischen Namen der Ressource im Modul, S3Bucket, um den vollständig qualifizierten logischen Namen der Ressource zu erhalten: entweder MyBucket.S3Bucket oder MyBucketS3Bucket.

Die logischen Namen der in einem Modul enthaltenen Ressourcen werden im Schema des Moduls angegeben. Sie können auf folgende Arten auf dieses Schema zugreifen:

  • Finden Sie das Modul in der CloudFormation-Registrierung. Auf der Registerkarte Schema wird das Modulschema angezeigt.

  • Verwenden der DescribeType-API, um die Moduldetails zurückzugeben, die das Schema enthält.

// Template that uses My::S3::SampleBucket::MODULE { "Parameters": { "BucketName": { "Description": "Name for your sample bucket", "Type": "String" } }, "Resources": { "MyBucket": { "Type": "My::S3::SampleBucket::MODULE", "Properties": { "BucketName": { "Ref": "BucketName" } } }, "exampleQueue": { "Type": "AWS::SQS::Queue", "Properties": { "QueueName": { "Ref": "MyBucket.S3Bucket" } } } }, "Outputs": { "BucketArn": { "Value": { "Fn::GetAtt": [ "MyBucket", "S3Bucket.Arn" ] } } } }
Parameters: BucketName: Description: Name for your sample bucket Type: String Resources: MyBucket: Type: My::S3::SampleBucket::MODULE Properties: BucketName: !Ref BucketName exampleQueue: Type: AWS::SQS::Queue Properties: QueueName: !Ref MyBucket.S3Bucket Outputs: BucketArn: Value: !GetAtt MyBucket.S3Bucket.Arn

Überlegungen zur Verwendung von Modulen

  • Für die Nutzung von Modulen fallen keine zusätzlichen Kosten an. Sie zahlen nur für die Ressourcen, die diese Module in Ihren Stacks auflösen.

  • CloudFormation-Kontingente, wie die maximal zulässige Anzahl von Ressourcen in einem Stapel oder die maximale Größe des Vorlagenstexts, gelten für die verarbeitete Vorlage, unabhängig davon, ob die in dieser Vorlage enthaltenen Ressourcen aus Modulen stammen oder nicht. Weitere Informationen finden Sie unter AWS CloudFormation-Kontingente.

  • Tags, die Sie auf Stack-Ebene angeben, werden den einzelnen Ressourcen zugewiesen, die vom Modul abgeleitet werden.

  • Auf der Modulebene angegebene Hilfsskripts werden nicht auf die einzelnen im Modul enthaltenen Ressourcen übertragen, wenn CloudFormation die Vorlage verarbeitet.

  • Die im Modul angegebenen Ausgaben werden an Ausgaben auf Vorlagenebene weitergegeben.

    Jeder Ausgabe wird eine logische ID zugewiesen, die eine Verkettung des logischen Namens des Moduls und des Ausgabenamens ist, wie im Modul definiert. Weitere Informationen zu Ausgaben finden Sie unter Ausgaben.

  • Die im Modul angegebenen Parameter werden nicht an Parameter auf Vorlagenebene weitergegeben.

    Sie können jedoch Parameter auf Vorlagenebene erstellen, die auf Parameter auf Modulebene verweisen. Weitere Informationen finden Sie unter Verwenden von Parametern zur Angabe von Modulwerten.

Registrierung und Versionierung von Modulen

Sie registrieren und verwalten die Module in Ihrem Konto und Ihrer Region mit der CloudFormation-Registrierung. Weitere Informationen finden Sie unter Verwendung der AWS CloudFormation-Registrierung.

Sie können mehrere Versionen desselben Moduls in einem bestimmten Konto und einer Region registrieren. Beachten Sie folgende Überlegungen:

  • Ein Modul muss in dem Konto und der Region registriert sein, in der Sie es verwenden möchten.

  • Während des Stack-Vorgangs verwendet CloudFormation eine beliebige Version des Moduls, die derzeit als Standardversion in dem Konto und in der Region registriert ist, in der der Stack-Vorgang ausgeführt wird. Dies schließt Module ein, die in anderen Modulen verschachtelt sind.

    Beachten Sie daher, dass die Verwendung derselben Vorlage zu unterschiedlichen Ergebnissen führen kann, wenn Sie verschiedene Versionen desselben Moduls als Standardversion in verschiedenen Konten oder Regionen registriert haben.

    Weitere Informationen finden Sie unter Angeben, welche Version einer Erweiterung verwendet werden soll.

  • Während des Stack-Vorgangs verwendet CloudFormation eine beliebige Version der Ressource, die derzeit als Standardversion in dem Konto und in der Region registriert ist, in der der Stack-Vorgang ausgeführt wird. Dies schließt die Ressourcen ein, die durch das Einschließen von Modulen generiert wurden.

  • Durch das Ändern der Standardversion eines Moduls wird kein Stack-Aktualisierungsvorgang ausgelöst. Wenn Sie jedoch das nächste Mal einen Stack-Vorgang mit einer Vorlage ausführen, die dieses Modul enthält, z. B. ein Stack-Update, verwendet CloudFormation die neue Standardversion im Vorgang.

    Die einzige Ausnahme besteht darin, ein Stack-Update mit der Option Vorherige Vorlagenoption verwenden durchzuführen, wie unten beschrieben.

  • Wenn Sie für Stack-Aktualisierungsvorgänge die Option Vorherige Vorlage verwenden angeben, verwendet CloudFormation die zuvor verarbeitete Vorlage für das Stack-Update und verarbeitet das Modul nicht für Änderungen, die Sie möglicherweise daran vorgenommen haben, erneut.

  • Um einheitliche Ergebnisse zu gewährleisten, sollten Sie, wenn Sie Module in eine Stack-Vorlage für die Verwendung mit Stack-Sets aufnehmen, sicherstellen, dass in allen Konten und Regionen, in denen Sie die Bereitstellung Ihrer Stack-Instances planen, dieselbe Version des Moduls als Standardversion angegeben ist. Dies gilt auch für Module, die in anderen Modulen verschachtelt sind. Weitere Informationen zu Stack-Sets finden Sie unter Arbeiten mit Stack-Sets.

Weitere Informationen zum Registrieren neuer Versionen eines Moduls oder zum Ändern der Standardversion eines Moduls finden Sie unter Verwenden der AWS CloudFormation-Registrierung.

Aktivieren öffentlicher Module zur Verwendung in Ihrem Konto

Um ein öffentliches Modul in Ihrem Konto und Ihrer Region erfolgreich zu aktivieren, muss für jede im Modul enthaltene öffentliche Erweiterung (Ressource oder Modul) eines Drittanbieters Folgendes zutreffen:

  • Die Erweiterung muss bereits in Ihrem Konto und Ihrer Region aktiviert sein.

    Wenn die Erweiterung im Modul einen Typnamen-Alias verwendet, muss die Erweiterung in Ihrem Konto und in Ihrer Region unter Verwendung des gleichen Typnamen-Alias registriert werden. Weitere Informationen finden Sie unter Angeben von Aliassen, die auf Erweiterungen verweisen.

  • Die derzeit aktivierte Erweiterungsversion muss eine der unterstützten Hauptversionen dieser Erweiterung sein, die im Modul angegeben sind. Weitere Informationen finden Sie unter Modellanforderungen für die Veröffentlichung eines öffentlichen Moduls im CloudFormation CLI-Benutzerhandbuch.

Wenn Sie nicht die richtigen öffentlichen Erweiterungen und Erweiterungsversionen von Drittanbietern aktiviert haben, schlägt CloudFormation den Vorgang mit einem Fehler fehl, der die Erweiterungen und/oder Versionen auflistet, die aktiviert werden müssen, bevor das Modul erfolgreich aktiviert werden kann.