Python での AWS CDK 検証

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-20 16:25:10824ブラウズ

AWS CDK Validation in Python

AWS CDK アプリケーションのライフサイクルには検証手順が含まれており、これについては公式ドキュメントの CDK アプリケーション合成の章で説明されています。

validate メソッドを実装するすべてのコンストラクトは自己検証され、正しいデプロイメントの状態にあることを確認できます。この段階で検証エラーが発生した場合は、通知されます。一般に、検証をできるだけ早く (通常は入力が取得されたらすぐに) 実行し、できるだけ早く例外をスローすることをお勧めします。検証を早期に実行すると、スタック トレースがより正確になり、コードが安全に実行を継続できるようになるため、信頼性が向上します。

TypeScript で AWS CDK 検証を処理する方法に関する優れた記事がいくつかありますが (下記リンク)、対応する Python の例は見つかりませんでした。 Python でいくつかの検証を作成した後、次の例はこれらの記事の例を補完します。

  • AWS CDK コンストラクトの検証チェック
  • 検証に AWS CDK を使用する (addValidation)

次の例は、AWS CDK v2.176.0 と Python 3.13.1 を使用して開発されました。

検証例

検証の実装は、エラー メッセージのリストを返す validate メソッドを使用して行われます。リストが空の場合、エラーはありません。複数のエントリは、この検証が失敗したさまざまな検証チェックに対応します。検証ロジックは @jsii.implements(IValidation) アノテーションが付けられたクラスにカプセル化されており、検証に正しい型であることを示します。この例では、検証に渡された Amazon S3 バケットがカスタム AWS KMS キーを使用しているかどうかのチェックがあり、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>

AWS CDK 構築例

これは、スコープ ツリー内のコンストラクター ノードの add_validation メソッドを使用して単一の検証を追加する AWS CDK コンストラクトの基本的な例です。実装中に、カスタム AWS KMS キーが作成されたものの、Amazon S3 バケット構造のencryption_key パラメータに渡されなかったというバグがありました。

<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>

このタイプのエラーは見落とされやすいため、検証が重要になります。この例を使用して CDK の構成またはデプロイメントを実行すると、次のエラーが発生します:

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

複数の検証

構成のさまざまな側面をテストする複数のバリデーターを使用することが可能であり、このような共通のパターンが見つかった場合は、それらをさまざまな構成に再利用できます。この例では、Amazon S3 バケットが静的 Web サイトホスティング用に誤って設定されていないことを確認するための検証チェックが追加されています。この場合、これはエラーになります。

<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>

AWS CDK 構築例を更新しました

追加のバリデーターを使用して、Web サイトのホスティングが Amazon S3 バケット用に設定されているかどうかを確認するには、以下に示すようにサンプル CDK 構造を更新します。今回は、カスタム AWS KMS キーを渡さなかったという元のエラーが保持されます。さらに、website_index_document が誤って 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>

今回、Amazon S3 バケットには 2 つの異なる問題があり、どちらも以下に示すように検証メカニズムによって報告されています。この例を使用して CDK の構成またはデプロイメントを実行すると、次のエラーが発生します:

<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>

これは、クラウド インフラストラクチャ内のさまざまな構成の問題を収集し、何度も再実行して修正することなく、それらをすべて解決できるため、非常に強力です。

AWS CDK スタックの検証

検証は AWS CDK 構造に限定されず、AWS CDK スタック レベルにも追加できることを覚えておく価値があります。ここでは、たとえば、特定のスタックに不要なリソースが含まれていないかどうかを確認できます。スタックに AWS Lambda リソースを含めないという要件がある場合は、以下で説明する検証を使用してその要件をシミュレートできます。ノード構造の子を使用すると、Python の組み込み isinstance 関数を使用して、リソースが AWS CDK 関数のインスタンスであるかどうかを確認できます。

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

AWS CDK スタックの例

スタックに検証を追加するには、コンストラクターと同じ add_validation メソッドを使用します。 KodlotS3Stack は、AWS Lambda 関数を含めてはいけないスタックとして識別されるため、サンプル スタックの検証をテストするのに適した場所です。以下で説明するような、開発者が AWS Lambda 関数リソースを定義する開発中にエラーが発生した場合、検証が有効になります。

<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>

この例の CDK 構成またはデプロイメントを実行すると、次のエラーが発生します:

<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>

組み込み検証

AWS CDK がクラウド インフラストラクチャの特定の側面に対するチェックをすでに提供しているかどうかを確認することも重要です。 Amazon S3 のコンテキストでは、バケット名を k1 に設定すると、名前の長さが不正になり、次の組み込みエラーが発生することがわかります:

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

同様に、バケット名を k_1 として設定し、その中に不正なアンダースコア文字が含まれる場合、次の組み込みエラーが発生します:

<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>

結論

AWS CDK 検証は、開発者が単体テストや統合テストと組み合わせて使用​​して、クラウド コンピューティング インフラストラクチャの全体的な品質を確認できる便利なメカニズムです。よくある構成ミスを見つけて標準を定義できると、異なるコンポーネント間で共有できる再利用可能な検証が可能になります。検証は、AWS CDK コンストラクトや AWS CDK スタックなど、AWS CDK によって定義されたさまざまなレベルで追加できます。 AWS CDK がいくつかの一般的な検証をキャプチャしていることは良いことです。これらはさまざまなクラウド サービスやリソースの基礎であり、常にチェックする必要があり、本番環境でデプロイメント エラーが発生する可能性が低くなります。

コード ブロックは保持され、画像は正しく参照されます。全体的な構造と意味は変わりませんが、より自然な流れになるよう、また直接の繰り返しを避けるために表現が変更されています。

以上がPython での AWS CDK 検証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。