CDK AWS v2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS 합성 시 CDK 검증
합성 시 검증
AWS CDK 애플리케이션은 합성 시 CloudFormation 템플릿 형태로 인프라 설명을 생성합니다. 이러한 템플릿은 합성 직후 검증됩니다. AWS CDK에는 CDK Nag
참고
이전 Beta1 인터페이스(예: IPolicyValidationPluginBeta1, PolicyValidationPluginReportBeta1및의 policyValidationBeta1 속성Stage)는 안정적인 접미사가 없는 동일한 값(예: , IPolicyValidationPlugin)으로 전환되었습니다PolicyValidationPluginReport. Beta1 인터페이스는 더 이상 사용되지 않지만 계속 작동합니다. 검증 플러그인을 등록하는 권장 방법은 이제 policyValidationBeta1 속성이 아닌 Validations 클래스를 통하는 것입니다.
검증이란 무엇입니까?
합성 시 AWS CDK에서 수행하는 검증은 개발자 경험을 개선하기 위한 최선의 검증이며, 그 자체로는 완전한 표준 규정 준수 메커니즘이 아닙니다. CDK 앱에서 정상적으로 생성된 템플릿을 검증하지만 합성 외부에서 발생하는 작업에는 영향을 미칠 수 없습니다. 예를 들어 콘솔 또는 서비스 APIs. 또한 CDK 앱은 범용 프로그래밍 언어로 작성되므로 결정된 개발자는 원하는 경우 검증 메커니즘을 우회할 수 있습니다. 따라서 CDK 검증은 조기에 검증하기 위한 왼쪽 교대 근무 메커니즘이며 AWS CloudFormation 후크 또는 AWS Config와 같은 원하는 규칙 세트를 검증하기 위해 다른 메커니즘과 함께 사용해야 합니다.
애플리케이션 개발자용
검증 플러그인 추가
검증은 검증 플러그인을 통해 수행됩니다. AWS 리소스에 대한 포괄적인 규칙 세트를 사용하는 기본 플러그인은 @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 프레임워크와 플러그인이 셸아웃할 수 있는 외부 정책 검증 도구 간의 변환 계층 역할을 하는 것입니다. 플러그인은 AWS CDK에서 지원하는 모든 언어로 생성할 수 있습니다. 여러 언어에서 사용할 수 있는 플러그인을 생성하는 경우 JSII를 사용하여 각 AWS CDK 언어로 플러그인을 게시할 수 TypeScript 있도록 플러그인을 생성하는 것이 좋습니다.
플러그인 생성
AWS CDK 코어 모듈과 정책 도구 간의 통신 프로토콜은 IPolicyValidationPlugin 인터페이스에 의해 정의됩니다. 새 플러그인을 생성하려면 이 인터페이스를 구현하는 클래스를 작성해야 합니다. 구현해야 할 것은 두 가지입니다. 플러그인 이름(name 속성 재정의를 통해)과 validate() 메서드입니다.
프레임워크는 IPolicyValidationContext 객체를 전달하여 validate()를 직접적으로 호출합니다. 검증할 템플릿의 위치는 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 버킷을 생성하고 있습니다(예: 티켓 생성).
-
보안 도구가 예외를 등록하는 내부 시스템에서 읽는 방법을 알고 있습니다.
이 시나리오에서 개발자는 내부 시스템에서 예외를 요청한 다음 해당 예외를 ‘등록’하는 방법이 필요합니다. 가드 플러그인 예에 추가하여 내부 티켓팅 시스템에 일치하는 면제 사항이 있는 위반을 필터링하여 면제를 처리하는 플러그인을 생성할 수 있습니다.
구현 예는 기존 플러그인을 참조하세요.