계층 1 구문 - AWS 권장 가이드

계층 1 구문

L1 구문은 AWS CDK의 구성 요소이며 Cfn 접두사를 사용해 다른 구문과 쉽게 구별됩니다. 예를 들어 AWS CDK의 Amazon DynamoDB 패키지에는 L2 구문인 Table 구문이 포함되어 있습니다. 해당되는 L1 구문은 CfnTable이라고 하며 CloudFormation DynamoDB Table을 직접 나타냅니다. AWS CDK 애플리케이션은 일반적으로 L1 구문을 직접 사용하지 않지만 이 첫 번째 계층에 액세스하지 않고는 AWS CDK를 사용할 수 없습니다. 그러나 대부분의 경우 개발자가 사용하는 데 익숙한 L2 및 L3 구문은 L1 구문에 크게 의존합니다. 따라서 L1 구문을 CloudFormation과 AWS CDK 사이의 브리지로 간주할 수 있습니다.

AWS CDK의 유일한 목적은 표준 코딩 언어를 사용하여 CloudFormation 템플릿을 생성하는 것입니다. cdk synth CLI 명령을 실행하고 결과 CloudFormation 템플릿이 생성되면 AWS CDK의 작업이 완료됩니다. cdk deploy 명령은 편의를 위해 존재하지만 해당 명령을 실행할 때 수행하는 작업은 전적으로 CloudFormation 내에서 수행됩니다. AWS CDK 코드를 CloudFormation에서 이해하는 형식으로 변환하는 퍼즐 조각은 L1 구문입니다.

L1 구문에 대한 AWS CDK CloudFormation 수명 주기

L1 구문을 생성하고 사용하는 프로세스는 다음 단계로 구성됩니다.

  1. AWS CDK 빌드 프로세스는 CloudFormation 사양을 L1 구문 형태의 프로그래밍 코드로 변환합니다.

  2. 개발자는 AWS CDK 애플리케이션의 일부로 L1 구문을 직접 또는 간접적으로 참조하는 코드를 작성합니다.

  3. 개발자는 cdk synth 명령을 실행하여 프로그래밍 코드를 CloudFormation 사양(템플릿)에 지정된 형식으로 다시 변환합니다.

  4. 개발자는 cdk deploy 명령을 실행하여 이러한 템플릿 내 CloudFormation 스택을 AWS 계정 환경에 배포합니다.

연습을 좀 해 보겠습니다. GitHub의 AWS CDK 오픈 소스 리포지토리로 이동하여 무작위 AWS 서비스를 선택한 다음 해당 서비스의 AWS CDK 패키지(packages, aws-cdk-lib, aws-<servicename>, lib 폴더에 있음)로 이동합니다. 이 예제에서는 Amazon S3를 선택하지만 이 방식은 모든 서비스에서 작동합니다. 해당 패키지의 기본 index.ts 파일을 보면 다음과 같은 줄이 있습니다.

export * from './s3.generated';

그러나 해당 디렉터리의 어디에도 s3.generated 파일이 표시되지 않습니다. AWS CDK 빌드 프로세스 중에 CloudFormation 리소스 사양에서 L1 구문이 자동으로 생성되기 때문입니다. 따라서 패키지에 대한 AWS CDK 빌드 명령을 실행한 후에만 패키지에 s3.generated가 표시됩니다.

AWS CloudFormation 리소스 사양

AWS CloudFormation 리소스 사양은 AWS에 대한 코드형 인프라(IAC)를 정의하고 CloudFormation 템플릿 내 코드가 AWS 계정의 리소스로 변환되는 방법을 결정합니다. 이 사양은 리전별 수준에서 AWS 리소스를 JSON 형식으로 정의합니다. 각 리소스에는 provider::service::resource 형식을 따르는 고유한 리소스 유형 이름이 부여됩니다. 예를 들어 Amazon S3 버킷의 리소스 유형 이름은 AWS::S3::Bucket이고 Amazon S3 Access Points의 리소스 유형 이름은 AWS::S3::AccessPoint입니다. 이러한 리소스 유형은 AWS CloudFormation 리소스 사양에 정의된 구문을 사용하여 CloudFormation 템플릿에서 렌더링할 수 있습니다. 또한 AWS CDK 빌드 프로세스가 실행되면 각 리소스 유형이 L1 구문이 됩니다.

따라서 각 L1 구문은 해당 CloudFormation 리소스의 프로그래밍 방식 미러 이미지입니다. CloudFormation 템플릿에 적용하는 모든 속성은 L1 구문을 인스턴스화할 때 사용할 수 있으며, 해당 L1 구문을 인스턴스화할 때 필요한 모든 CloudFormation 속성도 인수로 필요합니다. 다음 표에서는 CloudFormation 템플릿에 표시된 S3 버킷을 AWS CDK L1 구문으로 정의된 것과 동일한 S3 버킷과 비교합니다.

CloudFormation 템플릿

L1 구문

"amzns3demobucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", "BucketEncryption": { "ServerSideEncryptionConfiguration": [ { "ServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }, "MetricsConfigurations": [ { "Id": "myConfig" } ], "OwnershipControls": { "Rules": [ { "ObjectOwnership": "BucketOwnerPreferred" } ] }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, "IgnorePublicAcls": true, "RestrictPublicBuckets": true }, "VersioningConfiguration": { "Status": "Enabled" } } }
new CfnBucket(this, "amzns3demobucket", { bucketName: "amzn-s3-demo-bucket", bucketEncryption: { serverSideEncryptionConfiguration: [ { serverSideEncryptionByDefault: { sseAlgorithm: "AES256" } } ] }, metricsConfigurations: [ { id: "myConfig" } ], ownershipControls: { rules: [ { objectOwnership: "BucketOwnerPreferred" } ] }, publicAccessBlockConfiguration: { blockPublicAcls: true, blockPublicPolicy: true, ignorePublicAcls: true, restrictPublicBuckets: true }, versioningConfiguration: { status: "Enabled" } });

보시다시피 L1 구문은 CloudFormation 리소스 코드에서 정확한 매니페스트화되었습니다. 바로 가기나 단순화가 없으므로 작성해야 하는 표준 문안 텍스트의 양은 대략적으로 동일합니다. 그러나 AWS CDK를 사용할 때 큰 이점 중 하나는 표준 문안 CloudFormation 구문을 많이 제거하는 데 도움이 된다는 점입니다. 그러면 어떻게 되나요? 여기에서 L2 구문이 사용됩니다.