Maison > développement back-end > Tutoriel Python > Validation AWS CDK en Python

Validation AWS CDK en Python

Mary-Kate Olsen
Libérer: 2025-01-20 16:25:10
original
869 Les gens l'ont consulté

AWS CDK Validation in Python

Le cycle de vie de l'application AWS CDK comprend des étapes de vérification, qui sont expliquées dans le chapitre de synthèse de l'application CDK de la documentation officielle :

Toutes les constructions qui implémentent la méthode validate peuvent être auto-validées pour garantir qu'elles sont dans un état permettant un déploiement correct. Tout échec de validation survenant à ce stade vous sera notifié. En général, nous recommandons d'effectuer la validation le plus rapidement possible (généralement dès qu'une entrée est obtenue) et de lever des exceptions le plus rapidement possible. Effectuer une vérification précoce améliore la fiabilité, car les traces de pile seront plus précises et garantiront que votre code pourra poursuivre son exécution en toute sécurité.

Bien qu'il existe d'excellents articles sur la façon de gérer la validation AWS CDK dans TypeScript (lien ci-dessous), je n'ai pas trouvé d'exemple Python correspondant. Après avoir créé quelques validations en Python, l'exemple suivant complète les exemples de ces articles.

  • Contrôles de validation dans les constructions AWS CDK
  • Utiliser AWS CDK pour la validation (addValidation)

Les exemples suivants ont été développés à l'aide d'AWS CDK v2.176.0 et Python 3.13.1.

Exemple de vérification

La mise en œuvre de la validation se fait à l'aide de la méthode validate qui renvoie une liste de messages d'erreur. Si la liste est vide, il n'y a pas d'erreurs ; plusieurs entrées correspondent à différents contrôles de validation pour lesquels cette validation a échoué. La logique de validation est encapsulée dans une classe annotée avec @jsii.implements(IValidation), indiquant qu'il s'agit du type correct pour la validation. Dans cet exemple, il existe une vérification selon laquelle le compartiment Amazon S3 a réussi à vérifier qu'il utilise une clé AWS KMS personnalisée, qui offre plus de contrôle sur le processus de chiffrement par rapport au chiffrement par défaut utilisé par Amazon S3.

<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>
Copier après la connexion
Copier après la connexion

Exemple de construction AWS CDK

Il s'agit d'un exemple de base d'une construction AWS CDK qui ajoute une seule validation à l'aide de la méthode add_validation du nœud constructeur dans l'arborescence de portée. Il y a eu un bug lors de l'implémentation où une clé AWS KMS personnalisée a été créée mais n'a pas été transmise au paramètre chiffrement_key de la construction du compartiment Amazon S3.

<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>
Copier après la connexion
Copier après la connexion

Ce type d'erreur est facilement négligé, c'est là que la validation entre en jeu. L’exécution d’une composition ou d’un déploiement CDK à l’aide de cet exemple entraînera l’erreur suivante :

<code>RuntimeError: Error: 验证失败,错误如下:
  [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
Copier après la connexion
Copier après la connexion

Vérifications multiples

Il est possible d'avoir plusieurs validateurs testant différents aspects de notre configuration, et ils peuvent être réutilisés pour différentes constructions si nous trouvons des modèles communs comme celui-ci. Dans cet exemple, un contrôle de validation est ajouté pour garantir que le compartiment Amazon S3 n'est pas accidentellement configuré pour l'hébergement de sites Web statiques, auquel cas il s'agirait d'une erreur.

<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>
Copier après la connexion
Copier après la connexion

Exemple de construction AWS CDK mis à jour

Pour utiliser un validateur supplémentaire afin de vérifier si l'hébergement de site Web est configuré pour un compartiment Amazon S3, mettez à jour l'exemple de construction CDK comme indiqué ci-dessous. Cette fois, l'erreur d'origine consistant à ne pas transmettre une clé AWS KMS personnalisée est conservée. Désormais, en outre, website_index_document est transmis de manière incorrecte à la construction du compartiment Amazon S3, indiquant qu'il sera utilisé pour l'hébergement de sites Web statiques.

<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>
Copier après la connexion
Copier après la connexion

Cette fois, nous rencontrons deux problèmes différents avec notre compartiment Amazon S3, tous deux signalés par le mécanisme de vérification comme indiqué ci-dessous. L’exécution d’une composition ou d’un déploiement CDK à l’aide de cet exemple entraînera l’erreur suivante :

<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>
Copier après la connexion
Copier après la connexion

C'est très puissant car nous pouvons collecter différents problèmes de configuration dans l'infrastructure cloud et tous les résoudre sans avoir à les réexécuter et à les corriger encore et encore.

Vérification de la pile AWS CDK

Il convient de rappeler que la validation ne se limite pas aux constructions AWS CDK et peut également être ajoutée au niveau de la pile AWS CDK. Ici on peut par exemple vérifier si une pile donnée ne contient pas de ressources indésirables. Si notre exigence est que la pile ne contienne aucune ressource AWS Lambda, nous pouvons alors simuler cette exigence à l'aide de la validation décrite ci-dessous. À l'aide de l'enfant d'une construction de nœud, vous pouvez utiliser la fonction isinstance intégrée de Python pour vérifier si une ressource est une instance d'une fonction AWS CDK.

<code>RuntimeError: Error: 验证失败,错误如下:
  [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
Copier après la connexion
Copier après la connexion

Exemple de pile AWS CDK

Pour ajouter une validation à la pile, nous utilisons la même méthode add_validation que le constructeur. Étant donné que KodlotS3Stack est identifié comme une pile qui ne doit contenir aucune fonction AWS Lambda, c'est un bon endroit pour tester la validation de l'exemple de pile. Si une erreur se produit pendant le développement, telle que celle décrite ci-dessous, lorsqu'un développeur définit une ressource de fonction AWS Lambda, la vérification prendra effet.

<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>
Copier après la connexion
Copier après la connexion

L'exécution de la composition ou du déploiement du CDK de cet exemple entraînera l'erreur suivante :

<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>
Copier après la connexion

Vérification intégrée

Il convient également de vérifier si le CDK AWS fournit déjà des contrôles pour certains aspects de notre infrastructure cloud. Dans le contexte d'Amazon S3, il s'avère que si nous configurons le nom du bucket sur k1, ce qui entraîne une longueur de nom illégale, nous obtenons l'erreur intégrée suivante :

<code>RuntimeError: Error: 验证失败,错误如下:
  [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密
  [KodlotS3Stack/KodlotBucket1] 存储桶不能用于静态网站托管</code>
Copier après la connexion

De même, si nous configurons le nom du bucket sur k_1, ce qui entraîne un caractère de soulignement illégal, l'erreur intégrée suivante se produira :

<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>
Copier après la connexion

Conclusion

La validation AWS CDK est un mécanisme utile que les développeurs peuvent utiliser conjointement avec des tests unitaires et d'intégration pour garantir la qualité globale de l'infrastructure de cloud computing. Être capable de détecter les erreurs de configuration courantes et de définir des normes conduira à des validations réutilisables qui pourront être partagées entre différents composants. La validation peut être ajoutée à différents niveaux définis par AWS CDK, y compris les constructions AWS CDK et les piles AWS CDK. Il est bon de voir que le CDK AWS a capturé certaines validations courantes, car elles sont fondamentales pour divers services et ressources cloud et doivent toujours être vérifiées, réduisant ainsi le risque de rencontrer des erreurs de déploiement dans un environnement de production.

Les blocs de code sont conservés et l'image est référencée correctement. La structure globale et la signification restent les mêmes, tandis que la formulation est modifiée pour un flux plus naturel et pour éviter la répétition directe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal