Kitaran hayat aplikasi CDK AWS termasuk langkah pengesahan, yang diterangkan dalam bab sintesis aplikasi CDK dalam dokumentasi rasmi:
Semua konstruk yang melaksanakan kaedah pengesahan boleh disahkan sendiri untuk memastikan ia berada dalam keadaan untuk penggunaan yang betul. Sebarang kegagalan pengesahan yang berlaku pada peringkat ini akan dimaklumkan kepada anda. Secara umum, kami mengesyorkan agar anda melakukan pengesahan secepat mungkin (biasanya sebaik sahaja beberapa input diperoleh) dan membuang pengecualian secepat mungkin. Melakukan pengesahan awal meningkatkan kebolehpercayaan kerana surih tindanan akan menjadi lebih tepat dan memastikan kod anda boleh meneruskan pelaksanaan dengan selamat.
Walaupun terdapat beberapa artikel hebat tentang cara mengendalikan pengesahan AWS CDK dalam TypeScript (dipautkan di bawah), saya tidak menemui contoh Python yang sepadan. Selepas mencipta beberapa pengesahan dalam Python, contoh berikut melengkapkan contoh dalam artikel ini.
Contoh berikut telah dibangunkan menggunakan AWS CDK v2.176.0 dan Python 3.13.1.
Pelaksanaan pengesahan dilakukan menggunakan kaedah pengesahan yang mengembalikan senarai mesej ralat. Jika senarai kosong, tiada ralat berbilang entri sepadan dengan semakan pengesahan berbeza yang mana pengesahan ini gagal. Logik pengesahan dirangkumkan dalam kelas beranotasi dengan @jsii.implements(IValidation), menunjukkan bahawa ia adalah jenis yang betul untuk pengesahan. Dalam contoh ini, terdapat semakan bahawa baldi Amazon S3 diluluskan untuk mengesahkan menggunakan kunci AWS KMS tersuai, yang memberikan lebih kawalan ke atas proses penyulitan berbanding dengan penyulitan lalai yang digunakan oleh 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>
Ini ialah contoh asas binaan AWS CDK yang menambahkan pengesahan tunggal menggunakan kaedah add_validation nod pembina dalam pokok skop. Terdapat pepijat semasa pelaksanaan di mana kunci AWS KMS tersuai telah dibuat tetapi tidak dihantar ke parameter encryption_key bagi binaan baldi 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>
Ralat jenis ini mudah diabaikan, di mana pengesahan berlaku. Menjalankan komposisi atau penggunaan CDK menggunakan contoh ini akan mengakibatkan ralat berikut:
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
Ada kemungkinan untuk mempunyai beberapa pengesah yang menguji aspek konfigurasi kami yang berbeza, dan mereka boleh digunakan semula untuk binaan yang berbeza jika kami menemui corak biasa seperti ini. Dalam contoh ini, semakan pengesahan ditambahkan untuk memastikan baldi Amazon S3 tidak dikonfigurasikan secara tidak sengaja untuk pengehosan tapak web statik, yang mana ini akan menjadi ralat.
<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>
Untuk menggunakan pengesah tambahan untuk menyemak sama ada pengehosan tapak web dikonfigurasikan untuk baldi Amazon S3, kemas kini contoh binaan CDK seperti yang ditunjukkan di bawah. Kali ini, ralat asal untuk tidak menghantar kunci AWS KMS tersuai dikekalkan. Kini, sebagai tambahan, website_index_document tersilap dihantar ke binaan baldi Amazon S3, menunjukkan bahawa ia akan digunakan untuk pengehosan tapak web statik.
<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>
Kali ini, kami mempunyai dua isu berbeza dengan baldi Amazon S3 kami, yang kedua-duanya dilaporkan oleh mekanisme pengesahan seperti yang ditunjukkan di bawah. Menjalankan komposisi atau penggunaan CDK menggunakan contoh ini akan mengakibatkan ralat berikut:
<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>
Ini sangat berkuasa kerana kami boleh mengumpul isu konfigurasi yang berbeza dalam infrastruktur awan dan menyelesaikannya tanpa perlu menjalankan semula dan membetulkannya berulang kali.
Perlu diingat bahawa pengesahan tidak terhad kepada binaan AWS CDK dan boleh ditambah pada tahap tindanan AWS CDK juga. Di sini kita boleh sebagai contoh menyemak sama ada timbunan yang diberikan tidak mengandungi sumber yang tidak diingini. Jika keperluan kami ialah tindanan tidak boleh mengandungi sebarang sumber AWS Lambda, maka kami boleh mensimulasikan keperluan tersebut menggunakan pengesahan yang diterangkan di bawah. Menggunakan anak binaan nod, anda boleh menggunakan fungsi isinstance terbina dalam Python untuk menyemak sama ada sebarang sumber ialah tika fungsi AWS CDK.
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
Untuk menambah pengesahan pada tindanan kami menggunakan kaedah add_validation yang sama seperti pembina. Memandangkan KodlotS3Stack dikenal pasti sebagai tindanan yang tidak boleh mengandungi sebarang fungsi AWS Lambda, ia adalah tempat yang baik untuk menguji pengesahan tindanan contoh. Jika ralat berlaku semasa pembangunan, seperti yang diterangkan di bawah, di mana pembangun mentakrifkan sumber fungsi AWS Lambda, pengesahan akan berkuat kuasa.
<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>
Menjalankan komposisi CDK atau penggunaan contoh ini akan mengakibatkan ralat berikut:
<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>
Anda juga patut menyemak sama ada AWS CDK sudah menyediakan semakan untuk aspek tertentu infrastruktur awan kami. Dalam konteks Amazon S3, ternyata jika kami mengkonfigurasi nama baldi kepada k1, menghasilkan panjang nama yang tidak sah, kami mendapat ralat terbina dalam berikut:
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密 [KodlotS3Stack/KodlotBucket1] 存储桶不能用于静态网站托管</code>
Begitu juga, jika kami mengkonfigurasi nama baldi sebagai k_1, menghasilkan aksara garis bawah yang tidak sah di dalamnya, ralat terbina dalam berikut akan berlaku:
<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>
Pengesahan CDK AWS ialah mekanisme berguna yang boleh digunakan oleh pembangun bersama-sama dengan ujian unit dan penyepaduan untuk memastikan kualiti keseluruhan infrastruktur pengkomputeran awan. Dapat menangkap salah konfigurasi biasa dan mentakrifkan piawaian akan membawa kepada pengesahan boleh guna semula yang boleh dikongsi antara komponen yang berbeza. Pengesahan boleh ditambah pada tahap berbeza yang ditakrifkan oleh AWS CDK, termasuk binaan AWS CDK dan tindanan AWS CDK. Adalah baik untuk melihat bahawa AWS CDK telah menangkap beberapa pengesahan biasa, kerana ia adalah asas kepada pelbagai perkhidmatan dan sumber awan dan harus sentiasa diperiksa, mengurangkan kemungkinan menghadapi ralat penggunaan dalam persekitaran pengeluaran.
Blok kod dikekalkan dan imej dirujuk dengan betul Struktur dan makna keseluruhan tetap sama, manakala perkataan diubah untuk aliran yang lebih semula jadi dan untuk mengelakkan pengulangan langsung.
Atas ialah kandungan terperinci Pengesahan CDK AWS dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!