"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
AWS 의 S3에 파일을 업로드 및 다운로드 하도록 클라이언트를 구현하는데, 개인 도메인을 S3 저장소와 연결해서 사용할 수 있는지 간략히 알아보았습니다.
질문 >
AWS 의 S3에 파일을 업로드 및 다운로드 하도록 클라이언트를 구현하는데, 개인 도메인을 S3 저장소와 연결해서 사용할 수 있을까요?
답변 >
개인 도메인을 AWS S3에 연결하여 파일 업로드 및 다운로드에 사용할 수 있습니다. CloudFront + Route 53을 활용하면 S3 버킷을 개인 도메인과 연결하여 HTTPS 지원과 성능 최적화를 할 수 있습니다.
🔹 목표
- MFC 클라이언트에서 개인 도메인을 통해 S3에 파일 업로드 및 다운로드
- S3 버킷의 퍼블릭 접근을 차단하고, CloudFront를 통해 안전하게 접근
- 개인 도메인을 CloudFront에 연결하여 HTTPS 지원
🔹 설정 방법
1️⃣ S3 버킷 생성
- 버킷 이름: your-bucket-name
- 퍼블릭 액세스 차단 유지 (직접 접근 차단)
- 버전 관리 및 암호화 옵션 설정 가능
2️⃣ CloudFront 배포 생성 (S3 원본)
CloudFront를 사용하여 S3 버킷을 도메인과 연결하고 HTTPS를 지원합니다.
- AWS 콘솔 → CloudFront → 배포(Create Distribution) 클릭
- 원본(Origin) 설정:
- 원본 도메인: your-bucket-name.s3.amazonaws.com
- Origin Access Control (OAC) 활성화 (S3 퍼블릭 접근 차단 유지)
- 버킷 정책 자동 생성 (CloudFront만 접근 가능하도록 제한)
- HTTPS 적용:
- AWS Certificate Manager(ACM)에서 개인 도메인에 대한 SSL 인증서 생성
- CloudFront 배포에 SSL 인증서 적용
- 정적 콘텐츠 캐싱 설정 (선택 사항):
- 파일 다운로드 URL 캐싱을 방지하려면 "Cache-Control: no-cache" 헤더 설정
3️⃣ Route 53에서 개인 도메인 연결
- Route 53 콘솔 → 호스팅 영역(Hosted Zone) 생성
- A 레코드(Alias) 추가:
- 대상(Target): CloudFront 배포 도메인 (dxxxxxxxx.cloudfront.net)
🔹 파일 업로드 및 다운로드 방식
1️⃣ 업로드 방식
- Pre-Signed URL 사용 (보안 강화)
- MFC 클라이언트에서 Pre-Signed URL을 이용하여 개인 도메인 경로로 업로드
🚀 Pre-Signed URL 생성 (Python, Boto3)
import boto3
s3_client = boto3.client('s3')
def generate_presigned_url(bucket_name, object_key, expiration=3600):
url = s3_client.generate_presigned_url('put_object',
Params={'Bucket': bucket_name, 'Key': object_key},
ExpiresIn=expiration)
return url
# 사용 예시
upload_url = generate_presigned_url("your-bucket-name", "uploads/test-file.txt")
print(f"Upload URL: {upload_url}")
🚀 MFC 클라이언트에서 파일 업로드 (C++)
HRESULT UploadFileToS3(CString filePath, CString preSignedUrl)
{
CInternetSession session;
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
try {
pServer = session.GetHttpConnection(preSignedUrl);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_PUT, preSignedUrl);
CFile file;
if (!file.Open(filePath, CFile::modeRead)) {
return E_FAIL;
}
BYTE buffer[4096];
UINT bytesRead;
while ((bytesRead = file.Read(buffer, sizeof(buffer))) > 0) {
pFile->Write(buffer, bytesRead);
}
pFile->SendRequest();
return S_OK;
}
catch (...) {
return E_FAIL;
}
}
2️⃣ 다운로드 방식
- 클라이언트에서 개인 도메인을 통해 CloudFront를 통해 파일 다운로드
- CloudFront가 S3와 연결되어 있으므로, URL이 https://yourdomain.com/uploads/file.txt 형식으로 제공됨
🚀 MFC 클라이언트에서 다운로드 (C++)
HRESULT DownloadFileFromS3(CString fileUrl, CString savePath)
{
CInternetSession session;
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
try {
pServer = session.GetHttpConnection(fileUrl);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, fileUrl);
CFile file;
if (!file.Open(savePath, CFile::modeCreate | CFile::modeWrite)) {
return E_FAIL;
}
BYTE buffer[4096];
UINT bytesRead;
while ((bytesRead = pFile->Read(buffer, sizeof(buffer))) > 0) {
file.Write(buffer, bytesRead);
}
file.Close();
return S_OK;
}
catch (...) {
return E_FAIL;
}
}
🔹 정리
✅ CloudFront를 사용하여 개인 도메인을 S3에 연결
✅ HTTPS 적용 (SSL 인증서 발급 후 CloudFront 배포에 설정)
✅ MFC 클라이언트에서 Pre-Signed URL을 사용하여 안전하게 업로드 및 다운로드
✅ S3 퍼블릭 접근 차단, CloudFront를 통해서만 접근 가능
이 방식으로 구성하면 개인 도메인(https://yourdomain.com)을 통해 안전하고 빠르게 파일을 업로드/다운로드할 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com