首頁 >後端開發 >Python教學 >Python 中的 AWS CDK 驗證

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構造範例

這是一個AWS CDK建構的基本範例,它使用建構節點在作用域樹中的add_validation方法來新增單一驗證。在實作過程中出現了一個錯誤,其中建立了自訂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儲存桶未意外配置為靜態網站託管,在這種情況下,這將是一個錯誤。

<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構造範例

要使用附加驗證器檢查是否為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儲存桶有兩個不同的問題,如下所示,驗證機制報告了這兩個問題。使用此範例執行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已經捕獲了一些常見的驗證,因為它們是各種雲端服務和資源的基礎,應該始終進行檢查,從而減少在生產環境中遇到部署錯誤的可能性。

The code blocks are preserved and the image is referenced correctly. The overall structure and meaning remain the same, while the wording is altered for a more natural flow and to avoid direct repetition.

以上是Python 中的 AWS CDK 驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn