這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS 合成時的 CDK 驗證
合成時的驗證
您的 AWS CDK 應用程式會在合成時間以 CloudFormation 範本的形式產生基礎設施描述。這些範本會在合成後立即驗證。 AWS CDK 隨附一組內建的驗證規則,您可以延伸其他 CDK 特定的驗證工具,例如 CDK Nag
注意
先前的Beta1界面 (例如 IPolicyValidationPluginBeta1、 PolicyValidationPluginReportBeta1和 上的 policyValidationBeta1 屬性Stage) 已漸進到穩定的無尾碼對等項目 (例如 IPolicyValidationPlugin、 PolicyValidationPluginReport)。Beta1 界面已棄用,但會繼續運作。註冊驗證外掛程式的建議方式現在是透過 Validations類別,而不是 policyValidationBeta1 屬性。
什麼是驗證,什麼不是驗證
AWS CDK 在合成時間執行的驗證是改善開發人員體驗的最佳努力驗證;本身並非完整的標準合規機制。它驗證 CDK 應用程式正常產生的範本,但不會影響在合成之外發生的動作。例如,直接在主控台或透過服務 APIs採取的動作。此外,由於 CDK 應用程式是以一般用途的程式設計語言撰寫,因此確定的開發人員可以繞過驗證機制。這就是為什麼 CDK 驗證是早期驗證的左移機制,應該與另一個機制結合使用,以驗證所需的規則集,例如 AWS CloudFormation hook 或 AWS Config。
適用於應用程式開發人員
新增驗證外掛程式
驗證是由驗證外掛程式執行。根據 @aws/cloudformation-validateValidations類別:
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());
合成之後,會以這種方式註冊的所有外掛程式都會立即被叫用,以驗證在您定義的範圍內產生的所有範本。特別是,如果您在 App 物件中註冊範本,則所有範本都必須經過驗證。
警告
外掛程式在執行時可以完整存取您的機器。身為外掛程式的消費者,您有責任確認它來自信任的來源。
驗證報告
當您合成 AWS CDK 應用程式時,系統會呼叫驗證器外掛程式,並列印結果。範例報告顯示如下。
lib/my-custom-l3-construct.ts:10:5 ERROR [CT.S3.PR.1]: Require an Amazon S3 bucket to have block public access settings configured (cdk-validator-cfnguard) MyStack/MyCustomL3Construct/Bucket/Resource (MyCustomL3ConstructBucket8C61BCA7) constructs.Construct Suggested fix: [FIX]: The parameters 'BlockPublicAcls', 'BlockPublicPolicy', 'IgnorePublicAcls', 'RestrictPublicBuckets' must be set to true under the bucket-level 'PublicAccessBlockConfiguration'. Acknowledge with 'cdk-validator-cfnguard::s3_bucket_level_public_access_prohibited_check' lib/my-custom-l3-construct.ts:10:5 ERROR [CT.S3.PR.10]: Require an Amazon S3 bucket to have server-side encryption configured using an AWS KMS key (cdk-validator-cfnguard) MyStack/MyCustomL3Construct/Bucket/Resource (MyCustomL3ConstructBucket8C61BCA7) constructs.Construct Suggested fix: [FIX]: Set an encryption rule in 'BucketEncryption.ServerSideEncryptionConfiguration' with a 'ServerSideEncryptionByDefault.SSEAlgorithm' configuration of 'aws:kms' or 'aws:kms:dsse' Acknowledge with 'cdk-validator-cfnguard::s3_bucket_default_encryption_kms_check' ...
根據預設,報告會以人類可讀格式列印。如果您想要 JSON 格式的報告,請透過 CLI @aws-cdk/core:validationReportJson 使用 啟用報告,或直接將其傳遞給應用程式:
const app = new App({ context: { '@aws-cdk/core:validationReportJson': true }, });
或者,您可以使用專案目錄中的 cdk.json或 cdk.context.json 檔案來設定此內容索引鍵/值對 (請參閱內容值和 AWS CDK)。
如果您選擇 JSON 格式, AWS CDK 會將政策驗證報告列印到雲端組件目錄中名為 policy-validation-report.json 的檔案。對於預設的人類可讀格式,報告將列印到標準輸出。
確認警告
如果您已評估警告或錯誤,並認為它不適用於您,您可以使用 acknowledge方法加以隱藏。抑制是以範圍為基礎,並適用於指定範圍內的所有建構。
import { Validations } from 'aws-cdk-lib'; Validations.of(myConstruct).acknowledge({ id: 'PluginName::MyWarningId', reason: 'This is acceptable for our use case', });
id 使用::分隔符號來分隔驗證來源字首與規則名稱 (例如 Construct-Annotations::或 AwsSolutions-S1::)。
AWS CloudFormation Guard 外掛程式
使用 CfnGuardValidatorCfnGuardValidator 外掛程式隨附一組內建的 AWS Control Tower 主動控制。您可以在專案文件中
對於 AWS Control Tower 客戶,這些相同的主動控制可以部署到整個組織。當您在 AWS Control Tower 環境中啟用 AWS Control Tower 主動控制時,這些控制可以停止部署透過 AWS CloudFormation 部署的不合規資源。如需受管主動控制及其運作方式的詳細資訊,請參閱 AWS Control Tower 文件。
這些 AWS CDK 綁定控制項和受管 AWS Control Tower 主動控制最好一起使用。在此案例中,您可以使用與 AWS Control Tower 雲端環境中作用中的相同主動控制來設定此驗證外掛程式。然後,您可以透過cdk synth在本機執行 ,快速獲得對 AWS CDK 應用程式通過 AWS Control Tower 控制項的信心。
AWS CDK Nag 外掛程式
您可以使用 CDK Nag
對於建構作者:直接新增警告和錯誤
Validations 類別也提供直接將自訂警告和錯誤新增至建構的方法。您可以使用此機制直接在建構模組上報告組態錯誤,而不必實作驗證外掛程式。您以這種方式新增的驗證和錯誤將與驗證外掛程式發現的違規一起報告。
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');
對於外掛程式作者
AWS CDK 核心架構負責註冊和叫用外掛程式,然後顯示格式化的驗證報告。外掛程式的責任是做為 AWS CDK 架構和外部政策驗證工具之間的轉譯層,例如您的外掛程式可能傳出 shell。外掛程式可以使用 AWS CDK 支援的任何語言建立。如果您要建立可能由多種語言使用的外掛程式,建議您在 中建立外掛程式,TypeScript以便使用 JSII 在每個 AWS CDK 語言中發佈外掛程式。
建立外掛程式
AWS CDK 核心模組與政策工具之間的通訊協定是由 IPolicyValidationPlugin 介面定義。若要建立新的外掛程式,您必須撰寫實作此界面的類別。您需要實作兩件事:外掛程式名稱 (透過覆寫 name 屬性) 和 validate()方法。
框架將呼叫 validate(),傳遞 IPolicyValidationContext 物件。要驗證的範本位置由 提供templatePaths。外掛程式應該會傳回 的執行個體PolicyValidationPluginReport。此物件代表使用者在合成結束時收到的報告。
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', }], }], }; }
請注意,外掛程式不允許修改雲端組件中的任何內容。任何嘗試這樣做都會導致合成失敗。
如果您的外掛程式依賴於您封裝的外部工具,請記住,有些開發人員可能尚未在工作站中安裝該工具。若要將摩擦降至最低,請提供一些安裝指令碼與您的外掛程式套件,以自動化安裝程序。
處理豁免
如果您的組織有處理豁免的機制,則可以將其實作為驗證器外掛程式的一部分。
說明可能豁免機制的範例案例:
-
組織具有不允許公有 Amazon S3 儲存貯體的規則,但在某些情況下除外。
-
開發人員正在建立屬於這些案例之一的 Amazon S3 儲存貯體,並請求豁免 (例如建立票證)。
-
安全工具知道如何從註冊豁免的內部系統讀取
在此案例中,開發人員會在內部系統中請求例外狀況,然後需要某種方法來「註冊」該例外狀況。將 新增至防護外掛程式範例,您可以透過篩選掉內部票證系統中具有相符豁免的違規,來建立處理豁免的外掛程式。
如需範例實作,請參閱現有的外掛程式。