AWS CDK를 이용한 퍼블릭 S3 버킷 생성하기
작성 일자 : 2024년 8월 11일
AWS CDK란?
AWS CDK(AWS Cloud Development Kit)는 코드를 사용하여 클라우드 인프라를 정의하고 AWS CloudFormation을 통해 프로비저닝하도록 설계된 오픈 소스 소프트웨어 개발 프레임워크입니다.
이를 통해 개발자는 TypeScript, JavaScript, Python, Java, C#, .NET과 같은 친숙한 프로그래밍 언어를 사용하여 AWS 클라우드 리소스를 모델링하고 프로비저닝할 수 있습니다.
AWS CDK를 이용한 퍼블릭 S3 버킷 생성하기
1. AWS User 생성
- AWS > IAM > Users로 이동합니다.
Create user
버튼을 클릭합니다.User name
을aws-cli-user
로 입력한 후,Next
버튼을 클릭합니다.Add user to group
을 클릭한 후,Create group
버튼을 클릭합니다.User group name
을Admins
로 입력한 후,Permissions policies
에서AdministratorAccess
를 체크하여 그룹을 생성합니다.Users groups
에서Admins
를 체크한 후,Next
버튼을 클릭합니다.Create user
버튼을 클릭하여 사용자를 생성합니다.
2. Access Key 생성
- 생성된 사용자
aws-cli-user
를 클릭합니다. Security credentials
탭으로 이동한 후,Access keys
섹션에서Create access key
버튼을 클릭합니다.Use case
를Command Line Interface(CLI)
로 선택한 후,Next
버튼을 클릭합니다.Create access key
버튼을 클릭하여 Access key ID와 Secret access key를 생성하고, 이를 안전한 곳에 기록합니다.
3. AWS CLI 설정
AWS CDK는 주로 보안 자격 증명을 구성하고 배포 작업을 위한 AWS Region을 지정하기 위해 AWS CLI를 사용합니다. 먼저 AWS CLI를 설치하고, aws configure
명령어를 통해 AWS CLI를 설정합니다.
- Homebrew를 이용하여 AWS CLI를 설치합니다.
$ brew install awscli
aws configure
명령어를 통해 AWS CLI를 설정합니다.
$ aws configure
AWS Access Key ID [None]: <위에서 발급한 Access key ID>
AWS Secret Access Key [None]: <위에서 발급한 Secret access key>
Default region name [None]: ap-northeast-2 또는 원하는 Region
Default output format [None]: json
4. AWS CDK 프로젝트 생성
- npm을 이용하여 AWS CDK를 설치합니다.
$ npm install -g aws-cdk
- 프로젝트 디렉토리를 생성하고, 프로젝트 디렉토리로 이동합니다.
$ mkdir aws-cdk-s3
$ cd aws-cdk-s3
- AWS CDK CLI를 이용하여 프로젝트를 생성합니다.
$ cdk init app --language typescript
- 해당 디렉토리에 기본 구조의 AWS CDK 프로젝트가 생성된 것을 확인할 수 있으며,
lib/aws-cdk-s3-stack.ts
파일에 아래와 같은 코드가 기본으로 작성되어 있습니다. 해당 코드는 그대로 두고, S3 버킷을 생성하는 코드를 먼저 작성하겠습니다.
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
export class AwsCdkS3Stack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
// example resource
// const queue = new sqs.Queue(this, 'AwsCdkS3Queue', {
// visibilityTimeout: cdk.Duration.seconds(300)
// });
}
}
5. S3 버킷 Construct 코드 작성
Construct
는 클라우드 인프라를 정의하는 데 사용되는 기본 구성 요소입니다. lib/s3.ts
파일을 생성하고, 아래와 같은 코드를 작성합니다. 이번 포스트에서는 퍼블릭 S3 버킷을 생성하겠습니다. 실제 프로덕션 환경에서는 CloudlFront와 같은 CDN을 통해 S3 버킷을 보호하거나 pre-signed URL을 사용하여 버킷에 접근하도록 제한하는 것이 좋습니다.
import { RemovalPolicy } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class S3 extends Construct{
public readonly bucket: s3.Bucket;
constructor(scope: Construct, id: string) {
super(scope, id);
this.bucket = new s3.Bucket(this, 'CdkS3Bucket', {
bucketName: 'cdk-s3-bucket',
publicReadAccess: true,
blockPublicAccess: new s3.BlockPublicAccess({
blockPublicAcls: false,
ignorePublicAcls: false,
blockPublicPolicy: false,
restrictPublicBuckets: false,
}),
objectOwnership: s3.ObjectOwnership.BUCKET_OWNER_PREFERRED,
removalPolicy: RemovalPolicy.DESTROY, // Not for production
autoDeleteObjects: true, // Not for production
versioned: false,
});
}
}
bucketName
: S3 버킷의 이름을 지정합니다.publicReadAccess
: S3 버킷에 대한 퍼블릭 읽기 권한을 부여합니다. (Bucket policy에서s3:GetObject
Statement가 추가됨)blockPublicAccess
: 버킷의Permissions
탭에서Block all public access
를 비활성화합니다.objectOwnership
: Object Ownership을ACLs enabled
+Bucket owner preferred
로 설정합니다.removalPolicy
: 스택이 삭제될 때 S3 버킷을 삭제합니다.autoDeleteObjects
: 버킷이 삭제될 때 버킷 내의 객체를 삭제합니다.
6. S3 버킷 Construct를 AWS CDK 스택에 추가
다시 lib/aws-cdk-s3-stack.ts
파일로 돌아가서 주석 부분은 제거하고, S3 버킷 Construct를 추가합니다.
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { S3 } from './s3';
export class AwsCdkS3Stack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new S3(this, 'S3');
}
}
7. AWS CDK 프로젝트 배포
- AWS CDK 프로젝트를 배포합니다.
$ cdk deploy
- 배포가 완료되면, AWS Management Console에서 S3 서비스로 이동하여 S3 버킷이 생성되었는지 확인합니다.
8. AWS CDK 프로젝트 삭제
배포된 AWS CDK 스택도 CLI를 통해 삭제할 수 있습니다.
$ cdk destroy