AWS CDK應用生命週期中包含驗證步驟,官方文件的CDK應用合成章節對此進行了說明:
所有已實作validate方法的建構都可以進行自驗證,以確保其處於可正確部署的狀態。此階段發生的任何驗證失敗都會通知您。通常,我們建議盡快執行驗證(通常是在獲得某些輸入後立即執行),並儘快拋出異常。儘早執行驗證可以提高可靠性,因為堆疊追蹤將更準確,並確保您的程式碼可以安全地繼續執行。
雖然有一些優秀的文章介紹瞭如何在TypeScript中處理AWS CDK驗證(連結如下),但我找不到對應的Python範例。在Python中創建了一些驗證之後,以下範例是這些文章中範例的補充。
以下範例使用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 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>
要使用附加驗證器檢查是否為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 Lambda資源,那麼我們可以使用下面介紹的驗證來模擬該要求。使用節點建構的子項,可以使用Python的內建isinstance函數檢查任何資源是否為AWS CDK函數的實例。
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
要為堆疊新增驗證,我們使用與建構相同的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中文網其他相關文章!