Der AWS CDK-Anwendungslebenszyklus umfasst Überprüfungsschritte, die im Kapitel zur CDK-Anwendungssynthese der offiziellen Dokumentation erläutert werden:
Alle Konstrukte, die die Validierungsmethode implementieren, können selbst validiert werden, um sicherzustellen, dass sie sich in einem Zustand für die korrekte Bereitstellung befinden. Alle zu diesem Zeitpunkt auftretenden Validierungsfehler werden Ihnen mitgeteilt. Im Allgemeinen empfehlen wir, die Validierung so schnell wie möglich durchzuführen (normalerweise, sobald eine Eingabe vorliegt) und Ausnahmen so schnell wie möglich auszulösen. Eine frühzeitige Durchführung der Verifizierung verbessert die Zuverlässigkeit, da Stack-Traces genauer sind und gewährleistet, dass Ihr Code sicher mit der Ausführung fortfahren kann.
Obwohl es einige hervorragende Artikel zum Umgang mit der AWS CDK-Validierung in TypeScript gibt (unten verlinkt), konnte ich kein entsprechendes Python-Beispiel finden. Nachdem einige Validierungen in Python erstellt wurden, ergänzt das folgende Beispiel die Beispiele in diesen Artikeln.
Die folgenden Beispiele wurden mit AWS CDK v2.176.0 und Python 3.13.1 entwickelt.
Die Implementierung der Validierung erfolgt mithilfe der Validate-Methode, die eine Liste von Fehlermeldungen zurückgibt. Wenn die Liste leer ist, gibt es keine Fehler; mehrere Einträge entsprechen verschiedenen Validierungsprüfungen, bei denen diese Validierung fehlgeschlagen ist. Die Validierungslogik ist in einer mit @jsii.implements(IValidation) annotierten Klasse gekapselt, was angibt, dass es sich um den richtigen Typ für die Validierung handelt. In diesem Beispiel wird überprüft, ob der zur Überprüfung übergebene Amazon S3-Bucket einen benutzerdefinierten AWS KMS-Schlüssel verwendet, der im Vergleich zur von Amazon S3 verwendeten Standardverschlüsselung mehr Kontrolle über den Verschlüsselungsprozess bietet.
<code class="language-python">@jsii.implements(IValidation) class KodlotS3KmsValidator: """检查S3存储桶是否使用自定义KMS密钥加密。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.encryption_key is None: error_messages.append(f"存储桶必须使用自定义KMS密钥加密") return error_messages</code>
Dies ist ein einfaches Beispiel für ein AWS CDK-Konstrukt, das eine einzelne Validierung mithilfe der add_validation-Methode des Konstruktorknotens im Bereichsbaum hinzufügt. Während der Implementierung ist ein Fehler aufgetreten, bei dem ein benutzerdefinierter AWS KMS-Schlüssel erstellt, aber nicht an den Parameter „encryption_key“ des Amazon S3-Bucket-Konstrukts übergeben wurde.
<code class="language-python">class KodlotS3Bucket(Construct): """带有验证的S3存储桶。""" def __init__(self, scope: Construct, construct_id: str, bucket_name: str) -> None: super().__init__(scope, construct_id) s3_kms_key = kms.Key(self, f"KodlotS3KmsKey{bucket_name.title()}") self.s3_bucket = s3.Bucket( self, f"KodlotS3{bucket_name.title()}", bucket_name=bucket_name, encryption_key=None, ) self.node.add_validation(KodlotS3KmsValidator(self.s3_bucket))</code>
Diese Art von Fehler wird leicht übersehen, und hier kommt die Validierung ins Spiel. Das Ausführen einer CDK-Komposition oder -Bereitstellung anhand dieses Beispiels führt zu folgendem Fehler:
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
Es ist möglich, dass mehrere Validatoren verschiedene Aspekte unserer Konfiguration testen, und sie können für verschiedene Konstrukte wiederverwendet werden, wenn wir gemeinsame Muster wie dieses finden. In diesem Beispiel wird eine Validierungsprüfung hinzugefügt, um sicherzustellen, dass der Amazon S3-Bucket nicht versehentlich für das Hosten statischer Websites konfiguriert wird. In diesem Fall wäre dies ein Fehler.
<code class="language-python">@jsii.implements(IValidation) class KodlotS3NotWebsiteValidator: """检查S3存储桶未配置为静态网站托管。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.is_website: error_messages.append(f"存储桶不能用于静态网站托管") return error_messages</code>
Um einen zusätzlichen Validator zu verwenden, um zu überprüfen, ob Website-Hosting für einen Amazon S3-Bucket konfiguriert ist, aktualisieren Sie das Beispiel-CDK-Konstrukt wie unten gezeigt. Diesmal bleibt der ursprüngliche Fehler, dass kein benutzerdefinierter AWS KMS-Schlüssel übergeben wurde, erhalten. Jetzt wird außerdem website_index_document fälschlicherweise an das Amazon S3-Bucket-Konstrukt übergeben, was darauf hinweist, dass es für das Hosting statischer Websites verwendet wird.
<code class="language-python">@jsii.implements(IValidation) class KodlotS3KmsValidator: """检查S3存储桶是否使用自定义KMS密钥加密。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.encryption_key is None: error_messages.append(f"存储桶必须使用自定义KMS密钥加密") return error_messages</code>
Dieses Mal haben wir zwei verschiedene Probleme mit unserem Amazon S3-Bucket, die beide vom Verifizierungsmechanismus gemeldet werden, wie unten gezeigt. Das Ausführen einer CDK-Komposition oder -Bereitstellung anhand dieses Beispiels führt zu folgendem Fehler:
<code class="language-python">class KodlotS3Bucket(Construct): """带有验证的S3存储桶。""" def __init__(self, scope: Construct, construct_id: str, bucket_name: str) -> None: super().__init__(scope, construct_id) s3_kms_key = kms.Key(self, f"KodlotS3KmsKey{bucket_name.title()}") self.s3_bucket = s3.Bucket( self, f"KodlotS3{bucket_name.title()}", bucket_name=bucket_name, encryption_key=None, ) self.node.add_validation(KodlotS3KmsValidator(self.s3_bucket))</code>
Das ist sehr leistungsstark, da wir verschiedene Konfigurationsprobleme in der Cloud-Infrastruktur erfassen und alle lösen können, ohne sie immer wieder ausführen und beheben zu müssen.
Es sei daran erinnert, dass die Validierung nicht auf AWS CDK-Konstrukte beschränkt ist und auch zur AWS CDK-Stack-Ebene hinzugefügt werden kann. Hier können wir beispielsweise prüfen, ob ein bestimmter Stack keine unerwünschten Ressourcen enthält. Wenn unsere Anforderung darin besteht, dass der Stack keine AWS Lambda-Ressourcen enthalten darf, können wir diese Anforderung mithilfe der unten beschriebenen Validierung simulieren. Mithilfe des untergeordneten Elements eines Knotenkonstrukts können Sie mit der in Python integrierten Funktion isinstance prüfen, ob eine Ressource eine Instanz einer AWS CDK-Funktion ist.
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
Um dem Stapel eine Validierung hinzuzufügen, verwenden wir dieselbe add_validation-Methode wie der Konstruktor. Da KodlotS3Stack als Stack identifiziert wird, der keine AWS Lambda-Funktionen enthalten darf, ist es ein guter Ort, um die Validierung des Beispiel-Stacks zu testen. Wenn während der Entwicklung ein Fehler auftritt, wie der unten beschriebene, bei dem ein Entwickler eine AWS Lambda-Funktionsressource definiert, wird die Überprüfung wirksam.
<code class="language-python">@jsii.implements(IValidation) class KodlotS3NotWebsiteValidator: """检查S3存储桶未配置为静态网站托管。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.is_website: error_messages.append(f"存储桶不能用于静态网站托管") return error_messages</code>
Das Ausführen der CDK-Zusammensetzung oder Bereitstellung dieses Beispiels führt zu folgendem Fehler:
<code class="language-python">class KodlotS3Bucket(Construct): """带有验证的S3存储桶。""" def __init__(self, scope: Construct, construct_id: str, bucket_name: str) -> None: super().__init__(scope, construct_id) s3_kms_key = kms.Key(self, f"KodlotS3KmsKey{bucket_name.title()}") self.s3_bucket = s3.Bucket( self, f"KodlotS3{bucket_name.title()}", bucket_name=bucket_name, encryption_key=None, website_index_document="index.html", ) self.node.add_validation(KodlotS3KmsValidator(self.s3_bucket)) self.node.add_validation(KodlotS3NotWebsiteValidator(self.s3_bucket))</code>
Es lohnt sich auch zu prüfen, ob das AWS CDK bereits Prüfungen für bestimmte Aspekte unserer Cloud-Infrastruktur bereitstellt. Im Kontext von Amazon S3 stellt sich heraus, dass wir den folgenden integrierten Fehler erhalten, wenn wir den Bucket-Namen auf k1 konfigurieren, was zu einer unzulässigen Namenslänge führt:
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密 [KodlotS3Stack/KodlotBucket1] 存储桶不能用于静态网站托管</code>
Wenn wir den Bucket-Namen als k_1 konfigurieren, was zu einem unzulässigen Unterstrich führt, tritt in ähnlicher Weise der folgende integrierte Fehler auf:
<code class="language-python">@jsii.implements(IValidation) class KodlotNoLambdaInStackValidator: """检查给定堆栈中未定义任何Lambda函数。""" def __init__(self, stack: cdk.Stack): self.stack = stack def validate(self) -> List[str]: error_messages: List[str] = [] for construct in self.stack.node.children: if isinstance(construct, _lambda.Function): error_messages.append(f"堆栈不能包含任何Lambda函数") return error_messages</code>
Die AWS CDK-Validierung ist ein nützlicher Mechanismus, den Entwickler in Verbindung mit Unit- und Integrationstests verwenden können, um die Gesamtqualität der Cloud-Computing-Infrastruktur sicherzustellen. Die Fähigkeit, häufige Fehlkonfigurationen zu erkennen und Standards zu definieren, führt zu wiederverwendbaren Validierungen, die von verschiedenen Komponenten gemeinsam genutzt werden können. Die Validierung kann auf verschiedenen durch AWS CDK definierten Ebenen hinzugefügt werden, einschließlich AWS CDK-Konstrukten und AWS CDK-Stacks. Es ist gut zu sehen, dass das AWS CDK einige gängige Validierungen erfasst hat, da diese für verschiedene Cloud-Dienste und -Ressourcen von grundlegender Bedeutung sind und immer überprüft werden sollten, wodurch die Wahrscheinlichkeit von Bereitstellungsfehlern in einer Produktionsumgebung verringert wird.
Die Codeblöcke bleiben erhalten und das Bild wird korrekt referenziert. Die Gesamtstruktur und Bedeutung bleiben gleich, während der Wortlaut geändert wird, um einen natürlicheren Ablauf zu gewährleisten und direkte Wiederholungen zu vermeiden.
Das obige ist der detaillierte Inhalt vonAWS CDK-Validierung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!