Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
AWS Validasi kebijakan CDK pada waktu sintesis
Validasi kebijakan pada waktu sintesis
Jika Anda atau organisasi Anda menggunakan alat validasi kebijakan apa pun, seperti AWS CloudFormation Guard atau OPA, untuk menentukan batasan pada AWS CloudFormation template Anda, Anda dapat mengintegrasikannya dengan CDK pada waktu
Validasi yang dilakukan oleh AWS CDK pada waktu sintesis memvalidasi kontrol pada satu titik dalam siklus hidup penerapan, tetapi tidak dapat memengaruhi tindakan yang terjadi di luar sintesis. Contohnya termasuk tindakan yang diambil langsung di konsol atau melalui API layanan. Mereka tidak tahan terhadap perubahan AWS CloudFormation template setelah sintesis. Beberapa mekanisme lain untuk memvalidasi aturan yang sama yang ditetapkan secara lebih otoritatif harus disiapkan secara independen, seperti AWS CloudFormation hook atau Config.AWS Namun demikian, kemampuan AWS CDK untuk mengevaluasi aturan yang ditetapkan selama pengembangan masih berguna karena akan meningkatkan kecepatan deteksi dan produktivitas pengembang.
Tujuan dari validasi kebijakan AWS CDK adalah untuk meminimalkan jumlah pengaturan yang diperlukan selama pengembangan, dan membuatnya semudah mungkin.
catatan
Beta1Antarmuka sebelumnya (sepertiIPolicyValidationPluginBeta1,PolicyValidationPluginReportBeta1, dan policyValidationBeta1 properti aktifStage) telah dinaikkan ke ekuivalen stabil tanpa akhiran (misalnya,,). IPolicyValidationPlugin PolicyValidationPluginReport Beta1Antarmuka tidak digunakan lagi tetapi terus berfungsi. Cara yang disarankan untuk mendaftarkan plugin validasi sekarang melalui Validations kelas daripada properti. policyValidationBeta1
Untuk pengembang aplikasi
Menambahkan plugin validasi
Untuk menggunakan satu atau beberapa plugin validasi dalam aplikasi Anda, gunakan kelas: Validations
import { Validations } from 'aws-cdk-lib'; import { CfnGuardValidator } from '@cdklabs/cdk-validator-cfnguard'; const app = new App(); // Add a validation plugin to the entire app Validations.of(app).addPlugins(new CfnGuardValidator()); // Or add to a particular stage const prodStage = new Stage(app, 'ProdStage'); Validations.of(prodStage).addPlugins(new CfnGuardValidator());
Segera setelah sintesis, semua plugin yang terdaftar dengan cara ini akan dipanggil untuk memvalidasi semua template yang dihasilkan dalam lingkup yang Anda tentukan. Secara khusus, jika Anda mendaftarkan templat di App objek, semua templat akan dikenakan validasi.
Awas
Selain memodifikasi perakitan cloud, plugin dapat melakukan apa saja yang dapat dilakukan oleh aplikasi AWS CDK Anda. Mereka dapat membaca data dari sistem file, mengakses jaringan dll. Ini adalah tanggung jawab Anda sebagai konsumen plugin untuk memverifikasi bahwa itu aman untuk digunakan.
Menambahkan peringatan dan kesalahan
ValidationsKelas ini juga menyediakan metode untuk menambahkan peringatan dan kesalahan khusus ke konstruksi Anda:
import { Validations } from 'aws-cdk-lib'; const bucket = new s3.Bucket(this, 'MyBucket'); // Add a warning Validations.of(bucket).addWarning('MyWarningId', 'This bucket does not have versioning enabled'); // Add an error (will cause synthesis to fail) Validations.of(bucket).addError('MyErrorId', 'This bucket must have encryption enabled');
Mengakui peringatan
Jika Anda ingin menekan peringatan tertentu, gunakan acknowledge metode ini:
import { Validations } from 'aws-cdk-lib'; Validations.of(myConstruct).acknowledge({ id: 'MyWarningId', reason: 'This is acceptable for our use case' });
acknowledgeMetode ini menerima Acknowledgment objek dengan id dan areason. idMenggunakan :: pembatas untuk memisahkan awalan sumber validasi dari nama aturan (misalnya, atau). annotation::MyWarning cdknag::AwsSolutions-S1 Jika Anda memberikan ID kosong tanpa::, annotation:: awalan ditambahkan secara otomatis.
AWS CloudFormation Plugin penjaga
Menggunakan CfnGuardValidatorCfnGuardValidatorPlugin ini dilengkapi dengan satu set kontrol proaktif AWS Control Tower yang terpasang di dalamnya. Seperangkat aturan saat ini dapat ditemukan dalam dokumentasi proyek
Untuk pelanggan AWS Control Tower, kontrol proaktif yang sama ini dapat diterapkan di seluruh organisasi Anda. Saat Anda mengaktifkan AWS kontrol proaktif Control Tower di lingkungan AWS Control Tower Anda, kontrol dapat menghentikan penyebaran sumber daya yang tidak sesuai yang digunakan melalui. AWS CloudFormation Untuk informasi selengkapnya tentang kontrol proaktif terkelola dan cara kerjanya, lihat dokumentasi AWS Control Tower.
Kontrol yang dibundel AWS CDK dan kontrol proaktif AWS Control Tower terkelola ini paling baik digunakan bersama. Dalam skenario ini Anda dapat mengonfigurasi plugin validasi ini dengan kontrol proaktif yang sama yang aktif di lingkungan cloud AWS Control Tower Anda. Anda kemudian dapat dengan cepat mendapatkan keyakinan bahwa aplikasi AWS CDK Anda akan melewati AWS kontrol Control Tower dengan menjalankan secara cdk synth lokal.
Laporan Validasi
Saat Anda mensintesis aplikasi AWS CDK, plugin validator akan dipanggil dan hasilnya akan dicetak. Contoh laporan ditampilkan di bawah ini.
Validation Report (CfnGuardValidator) ------------------------------------- (Summary) ╔═══════════╤════════════════════════╗ ║ Status │ failure ║ ╟───────────┼────────────────────────╢ ║ Plugin │ CfnGuardValidator ║ ╚═══════════╧════════════════════════╝ (Violations) Ensure S3 Buckets are encrypted with a KMS CMK (1 occurrences) Severity: medium Occurrences: - Construct Path: MyStack/MyCustomL3Construct/Bucket - Stack Template Path: ./cdk.out/MyStack.template.json - Creation Stack: └── MyStack (MyStack) │ Library: aws-cdk-lib.Stack │ Library Version: 2.50.0 │ Location: Object.<anonymous> (/home/johndoe/tmp/cdk-tmp-app/src/main.ts:25:20) └── MyCustomL3Construct (MyStack/MyCustomL3Construct) │ Library: N/A - (Local Construct) │ Library Version: N/A │ Location: new MyStack (/home/johndoe/tmp/cdk-tmp-app/src/main.ts:15:20) └── Bucket (MyStack/MyCustomL3Construct/Bucket) │ Library: aws-cdk-lib/aws-s3.Bucket │ Library Version: 2.50.0 │ Location: new MyCustomL3Construct (/home/johndoe/tmp/cdk-tmp-app/src/main.ts:9:20) - Resource Name: amzn-s3-demo-bucket - Locations: > BucketEncryption/ServerSideEncryptionConfiguration/0/ServerSideEncryptionByDefault/SSEAlgorithm Recommendation: Missing value for key `SSEAlgorithm` - must specify `aws:kms` How to fix: > Add to construct properties for `cdk-app/MyStack/Bucket` `encryption: BucketEncryption.KMS` Validation failed. See above reports for details
Secara default, laporan akan dicetak dalam format yang dapat dibaca manusia. Jika Anda ingin laporan dalam format JSON, aktifkan menggunakan @aws-cdk/core:validationReportJson via CLI atau meneruskannya langsung ke aplikasi:
const app = new App({ context: { '@aws-cdk/core:validationReportJson': true }, });
Atau, Anda dapat mengatur pasangan nilai kunci konteks ini menggunakan cdk.context.json file cdk.json atau di direktori proyek Anda (lihat Nilai konteks dan AWS CDK).
Jika Anda memilih format JSON, AWS CDK akan mencetak laporan validasi kebijakan ke file yang dipanggil policy-validation-report.json di direktori perakitan cloud. Untuk format default yang dapat dibaca manusia, laporan akan dicetak ke output standar.
Untuk penulis plugin
Plugin
Kerangka inti AWS CDK bertanggung jawab untuk mendaftarkan dan memanggil plugin dan kemudian menampilkan laporan validasi yang diformat. Tanggung jawab plugin adalah bertindak sebagai lapisan terjemahan antara kerangka kerja AWS CDK dan alat validasi kebijakan. Plugin dapat dibuat dalam bahasa apa pun yang didukung oleh AWS CDK. Jika Anda membuat plugin yang mungkin dikonsumsi oleh beberapa bahasa maka disarankan agar Anda membuat plugin TypeScript sehingga Anda dapat menggunakan JSII untuk mempublikasikan plugin di setiap bahasa AWS CDK.
Membuat plugin
Protokol komunikasi antara modul inti AWS CDK dan alat kebijakan Anda ditentukan oleh IPolicyValidationPlugin antarmuka. Untuk membuat plugin baru Anda harus menulis kelas yang mengimplementasikan antarmuka ini. Ada dua hal yang perlu Anda terapkan: nama plugin (dengan mengganti name properti), dan validate() metode.
Kerangka kerja akan memanggilvalidate(), melewati IPolicyValidationContext objek. Lokasi template yang akan divalidasi diberikan olehtemplatePaths. Plugin harus mengembalikan instance dariPolicyValidationPluginReport. Objek ini mewakili laporan yang akan diterima pengguna pada akhir sintesis.
validate(context: IPolicyValidationContext): PolicyValidationPluginReport { // First read the templates using context.templatePaths... // ...then perform the validation, and then compose and return the report. // Using hard-coded values here for better clarity: return { success: false, violations: [{ ruleName: 'CKV_AWS_117', description: 'Ensure that AWS Lambda function is configured inside a VPC', fix: 'https://docs.bridgecrew.io/docs/ensure-that-aws-lambda-function-is-configured-inside-a-vpc-1', violatingResources: [{ resourceName: 'MyFunction3BAA72D1', templatePath: '/home/johndoe/myapp/cdk.out/MyService.template.json', locations: 'Properties/VpcConfig', }], }], }; }
Perhatikan bahwa plugin tidak diizinkan untuk memodifikasi apa pun di perakitan cloud. Setiap upaya untuk melakukannya akan mengakibatkan kegagalan sintesis.
Jika plugin Anda bergantung pada alat eksternal, perlu diingat bahwa beberapa pengembang mungkin belum menginstal alat itu di workstation mereka. Untuk meminimalkan gesekan, kami sangat menyarankan Anda menyediakan beberapa skrip instalasi bersama dengan paket plugin Anda, untuk mengotomatiskan seluruh proses. Lebih baik lagi, jalankan skrip itu sebagai bagian dari instalasi paket Anda. Dengannpm, misalnya, Anda dapat menambahkannya ke postinstall skrippackage.json file.
Penanganan Pengecualian
Jika organisasi Anda memiliki mekanisme untuk menangani pengecualian, itu dapat diimplementasikan sebagai bagian dari plugin validator.
Contoh skenario untuk mengilustrasikan mekanisme pengecualian yang mungkin:
-
Organisasi memiliki aturan bahwa bucket Amazon S3 publik tidak diizinkan, kecuali untuk skenario tertentu.
-
Pengembang membuat bucket Amazon S3 yang termasuk dalam salah satu skenario tersebut dan meminta pengecualian (buat tiket misalnya).
-
Alat keamanan tahu cara membaca dari sistem internal yang mendaftarkan pengecualian
Dalam skenario ini pengembang akan meminta pengecualian dalam sistem internal dan kemudian akan memerlukan beberapa cara untuk “mendaftarkan” pengecualian itu. Menambahkan ke contoh plugin penjaga, Anda dapat membuat plugin yang menangani pengecualian dengan memfilter pelanggaran yang memiliki pengecualian yang cocok dalam sistem tiket internal.
Lihat plugin yang ada misalnya implementasi.