Custom construct는 여러 개의 기본 시소스(L1, L2)를 논리적으로 하나의 단위로 묶어 나만의 재사용 가능한 부품을 만드는 기술이다.
기본적으로 CDK가 제공하는 Bucket이나 Function은 개별 리소스이다. 하지만 실제 배포에서는 “암호화가 적용된 S3 버킷과 이를 감시하는 CloudWatch 알람”처럼 여러 리소스가 쌍으로 움직이는 경우가 많다. 이를 하나의 클래스로 정의한 것이 Custom Construct이다.
모든 Construct는 생성자에서 세 가지 인자를 받는다.
this를 전달).하나의 S3 버킷과 그 버킷의 사용량을 모니터링하는 CloudWatch 알람을 묶은 MonitoringBucket이라는 Custom Construct를 만드는 예제이다.
먼저 Construct 생성 시 넘겨줄 설정값을 정의한다.
@Getter
@Builder
public class MonitoringBucketProps {
private final String bucketName;
private final int alarmThresholdMb;
}
Construct를 상속받아 내부 로직을 구현한다.
public class MonitoringBucket extends Construct {
private final Bucket bucket;
public MonitoringBucket(final Construct scope, final String id, final MonitoringBucketProps props) {
super(scope, id);
// 1. S3 버킷 생성 (내부 리소스)
this.bucket = Bucket.Builder.create(this, "MySecureBucket")
.bucketName(props.getBucketName())
.build();
// 2. 버킷 크기에 대한 CloudWatch 알람 생성 (내부 리소스)
Alarm.Builder.create(this, "BucketSizeAlarm")
.metric(this.bucket.metricBucketSizeBytes())
.threshold(props.getAlarmThresholdMb() * 1024 * 1024)
.evaluationPeriods(1)
.comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD)
.build();
}
// 외부에서 버킷 객체에 접근할 수 있도록 Getter 제공
public Bucket getBucket() {
return this.bucket;
}
}
이렇게 만든 Construct는 일반적인 Stack 내부에서 마치 AWS가 제공하는 공식 라이브러리처럼 사용할 수 있다.
public class MyStack extends Stack {
public MyStack(final App scope, final String id) {
super(scope, id);
// 커스텀 컨스트럭트 사용
MonitoringBucket secureStorage = new MonitoringBucket(this, "ProjectStorage",
MonitoringBucketProps.builder()
.bucketName("my-org-project-files")
.alarmThresholdMb(500)
.build());
// 생성된 버킷에 대한 권한 부여 (Grant 활용)
// secureStorage.getBucket()을 통해 내부 리소스에 접근 가능
secureStorage.getBucket().grantRead(someLambda);
}
}