AWS CDK: Custom Construct

김기현·2026년 1월 31일

AWS

목록 보기
32/44

Custom construct는 여러 개의 기본 시소스(L1, L2)를 논리적으로 하나의 단위로 묶어 나만의 재사용 가능한 부품을 만드는 기술이다.


1. Custom Construct의 개념

추상화와 캡슐화의 결정체

기본적으로 CDK가 제공하는 Bucket이나 Function은 개별 리소스이다. 하지만 실제 배포에서는 “암호화가 적용된 S3 버킷과 이를 감시하는 CloudWatch 알람”처럼 여러 리소스가 쌍으로 움직이는 경우가 많다. 이를 하나의 클래스로 정의한 것이 Custom Construct이다.

구성 요소: Scope, Id, Props

모든 Construct는 생성자에서 세 가지 인자를 받는다.

  1. Scope: 이 리소스를 포함하는 부모 객체 (보통 this를 전달).
  2. Id: 같은 Scope 내에서 이 리소스를 식별하는 고유한 이름.
  3. Props: 리소스 설정에 필요한 매개변수 꾸러미.

2. Java로 Custom Construct 구현하기

하나의 S3 버킷과 그 버킷의 사용량을 모니터링하는 CloudWatch 알람을 묶은 MonitoringBucket이라는 Custom Construct를 만드는 예제이다.

Props 클래스 정의

먼저 Construct 생성 시 넘겨줄 설정값을 정의한다.

@Getter
@Builder
public class MonitoringBucketProps {
    private final String bucketName;
    private final int alarmThresholdMb;
}

Construct 클래스 구현

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;
    }
}

3. Custom Construct 사용하기

이렇게 만든 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);
    }
}

4. Custom Construct의 장점

  • 표준화: 사내 보안 가이드라인(예: 모든 버킷은 암호화 필수)이 적용된 컨스트럭트를 만들어 배포하면, 팀원들이 실수할 확률이 줄어든다.
  • 코드 재사용: 복잡한 인프라 패턴을 한 번만 작성하고 여러 프로젝트에서 라이브러리처럼 가져다 쓸 수 있다.
  • 복잡도 감소: Stack 코드가 수천 줄로 비대해지는 것을 방지하고, 논리적인 단위로 코드를 분리하여 관리할 수 있다.
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글