블로그 본문
[S3 연동 실무] Amazon S3 버킷 권한 제어(Public Read) 설정 및 MySQL 상품 테이블 S3 URL 업데이트
니꼴라 클라우드 테크 8월 31, 2026📌 목차 바로가기
지난 포스팅에서는 대용량 미디어 데이터(이미지 등)를 데이터베이스(RDBMS) 내부에 BLOB 등의 포맷으로 무단 누적했을 때 발생하는 3대 시스템적 대재앙(비용 낭비, 디스크 I/O 버퍼 병목, 정기 무중단 백업 마비)의 실체를 분석했습니다. 그리고 이에 대응하여 물리 파일 본체는 S3 Standard 가상 창고에 분산 격리하고, DB 테이블에는 오직 가벼운 링크 경로 주소(URL)만 기록하여 컴퓨팅 자원과 수송 자원을 완벽하게 분업하는 클라우드 탈동조화(Decoupling) 설계 철학을 이해했습니다.
이번 포스팅에서는 지난 포스팅에서 다룬 아키텍처 설계 사상을 직접 내 손으로 실체화하는 실전 프로시저를 수행하겠습니다. AWS S3 대시보드에 진입해 버킷을 생성하고, 전 세계 웹 사용자가 이미지를 조회할 수 있게 돕는 글로벌 공용 조회 정책(GetObject Policy) JSON 구문을 적용하며, 완성된 객체 고유 HTTPS URL을 MySQL Workbench를 사용해 Products 테이블의 prod_img 컬럼에 실시간 업데이트 적재하는 3단계 통합 셋업 과정을 설명하겠습니다.
1. [1단계] Amazon S3 버킷(Bucket) 생성 및 퍼블릭 액세스 차단 전면 해제
클라우드 가상 영토에 우리의 의류 쇼핑몰 전용 미디어 저장 버킷(Bucket) 공간을 개설하겠습니다. S3 버킷은 쉽게 말해 '클라우드 상에 생성되는 파일 최상위 폴더'와 같습니다.
- 리전 재확인: AWS 콘솔 로그인 후, 화면 우측 상단의 지리적 리전 정보가 반드시 '아시아 태평양(서울) ap-northeast-2'로 정밀 매핑되어 있는지 엄격하게 확인합니다. 리전이 다르면 추후 업로드된 미디어의 통신 레이턴시 지연이 발생할 수 있습니다.
- S3 서비스 진입: 콘솔 검색창에 'S3'를 타이핑하여 S3 대시보드로 순간 이동한 뒤, 우측 상단의 주황색 [버킷 만들기 (Create bucket)] 버튼을 클릭합니다.
- 일반 구성 및 이름 정의:
- 버킷 유형:
범용 (General purpose)을 선택합니다. - 버킷 이름: 전 세계의 모든 AWS 사용자 중에서 유일무이한 명칭을 지녀야 합니다. 예시로는
ysu-shop-media-00과 같이 본인의 소문자 이니셜이나 고유 식별 숫자를 조합해 명명합니다. (대문자 및 공백 사용 불가) - 객체 소유권: 기본값인
ACL 비활성화됨 (ACLs disabled, 권장)상태를 유지합니다.
- 버킷 유형:
- ★퍼블릭 액세스 제약 장벽 해제 (핵심):
- 화면을 스크롤 해 내려가면 '이 버킷의 퍼블릭 액세스 차단 설정 (Block Public Access settings for this bucket)' 영역이 나타납니다.
- 기본값으로 체크되어 있는
모든 퍼블릭 액세스 차단 (Block all public access)체크박스를 마우스로 클릭하여 체크 해제(비활성화) 처리합니다. - 이유: 이 기본 방어 장막이 쳐져 있으면 S3에 아무리 상품 이미지를 정상 업로드하고 개별 URL을 취득하더라도 외부 웹 브라우저 사용자가 접속했을 때 Access Denied 보안 오류가 뿜어져 나와 이미지가 깨져 보이기 때문입니다.
- 하단에 등장하는 "현재 설정으로 인해 버킷과 그 안의 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다" 경고 문구 확인용 체크박스를 클릭해 승인해 줍니다.
- 기본 옵션 고정 및 생성: 기본 암호화 유형(
SSE-S3) 등 나머지 상세 속성은 default 상태 그대로 스킵하고 맨 아래 [버킷 만들기] 버튼을 눌러 바구니 조립을 완료합니다.
2. [2단계] JSON 버킷 정책(Bucket Policy) 이식: s3:GetObject 전면 승인
버킷 생성을 완료했지만, S3는 기본적으로 보수적인 격리 통제를 기반으로 작동하므로 여전히 외부 공공 인터넷에서의 자유로운 조회는 철저하게 차단되어 있습니다.
이번에는 버킷 내부에 담길 모든 상품 이미지 객체에 대해, 전 세계 웹사이트 방문자 누구나 비밀 키(Credentials) 인증 없이 웹브라우저 상에서 이미지를 즉각 읽고 렌더링할 수 있도록 퍼블릭 조회 전용 JSON 정책(Bucket Policy)을 직접 수동 이식해 성문을 열어 주겠습니다.
- 권한 탭 순간이동: 생성 완료된 버킷 리스트에서 방금 만든
ysu-shop-media-00링크 이름을 누르고, 상단 가로 메뉴바에서 [권한 (Permissions)] 탭을 정밀 클릭합니다. - 정책 편집기 기상: 하단으로 화면을 내려 '버킷 정책 (Bucket policy)' 항목 영역 우측의 [편집 (Edit)] 버튼을 클릭합니다.
- 보안 GetObject JSON 구문 적용: 텍스트 에디터 창에 적혀 있는 기존 내용을 깨끗이 제거하고, 교재 [코드 5-3]에 수록된 아래의 글로벌 표준 보안 조회 정책 스크립트를 누락 없이 정교하게 기입합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Principal": "*",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::ysu-shop-media-00/*"
]
}
]
}
- Sid (Statement ID): 이 정책 구문의 고유 ID로, 자유로운 영문 이름 지정이 가능합니다.
- Principal (주체): 전체 개방을 의미하는 와일드카드 문자 기호인
"*"을 대입합니다. 이는 전 세계 인터넷상의 그 누구라도 이 버킷에 등록된 이미지 데이터에 접근할 수 있게 성문을 열겠다는 절대적인 정책입니다. - Effect (효과): 원격 접속 패킷을 수용하겠다는 의미로
"Allow"를 선언합니다. - Action (허용 연산): 오직 파일의 원격 읽기 및 다운로드 연산만 부분 수용하도록
"s3:GetObject"규칙 한 줄만을 안전하게 맵핑합니다. (쓰기 연산인PutObject나 삭제인DeleteObject는 절대 포함해서는 안 됩니다.) - Resource (적용 대상): ★여기가 가장 결정적입니다. 내 버킷 고유의 Amazon 리소스 이름(ARN) 뒤에 접미사로 반드시
"/*"를 덧붙여 주어야 합니다. (예:arn:aws:s3:::ysu-shop-media-00/*형태) 이 슬래시 별표(/*) 기호는 해당 버킷 내부에 업로드되어 저장될 모든 하위 이미지 개별 파일에 대해 이 public 조회 정책을 예외 없이 일괄 상속 강제하겠다는 의미입니다. - 설정을 마친 후 하단의 [변경 사항 저장 (Save changes)] 버튼을 클릭합니다. 버킷 대시보드 타이틀 옆에 주황색 라벨로 '퍼블릭(Public)' 표시가 활성화되는 것을 통해 권한 셋업 성공을 시각적으로 즉시 입증할 수 있습니다.
3. [3단계] 미디어 자산 폴더 일괄 업로드 및 고유 HTTPS URL 취득
성문과 방화벽 정책이 완벽히 세팅되었습니다. 이제 준비된 우리의 쇼핑몰 6대 마스터 의류 이미지 자산 파일들을 S3 버킷 내부로 선적할 시간입니다.
- 폴더 선적 개시: S3 버킷 메인 화면에서 파란색 [업로드 (Upload)] 버튼을 클릭한 뒤, [폴더 추가 (Add folder)] 버튼을 선택합니다.
- img 폴더 일괄 수송: 내 로컬 컴퓨터 혹은 EC2 내 가상 디렉토리의 public 하위 폴더에 보관 중이던
img폴더(내부에 P0001.png부터 P0006.png까지 6가지 의류 사진이 수납되어 있음)를 통째로 지정하여 업로드합니다. - 전송 완료 확인: 업로드가 시작되면 하단 전송 상태 진행 바가 표시되며, 잠시 대기한 뒤 녹색의 '업로드 성공' 상태 카드가 노출되면 클라우드 분산 스토리지 내로 미디어 자산 수송이 종료됩니다.
- 객체 고유 HTTPS URL 확인: S3 대역에 업로드 완료된
img/폴더 안으로 진입하여 첫 번째 상품 이미지 파일인P0001.png를 마우스로 가볍게 탭해 상세 페이지를 열어봅니다.- 화면 우측 하단 영역의 객체 개요(Object overview) 박스 속에, 전 세계 인터넷 도로망 어디서나 즉각 호출하여 실시간 다운로드할 수 있는 아래 규격의 고정밀 고유 HTTPS 도메인 주소가 발급되어 있는 것을 선명하게 목격할 수 있습니다.
- 예시 S3 URL 주소:
https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0001.png - 웹 브라우저의 새 탭 주소창에 이 URL 링크를 그대로 복사해 붙여넣고 엔터를 치면, 어떠한 로그인 절차 없이도 우리가 업로드한 의류 이미지가 화면 가득 무손실 상태로 즉각 렌더링되어 나타나는 것을 통해 무결성을 최종 실증할 수 있습니다!
4. [최종 도킹] MySQL Workbench를 사용한 상품 테이블 S3 URL 업데이트
S3를 통해 전 세계로 퍼져 나갈 수 있는 상품 이미지들의 절대 HTTPS 좌표 주소 6가지를 마침내 모두 획득했습니다!
이제 데이터베이스 설계 단원(5.2절)의 피날레 조치이자 클라우드 분산 아키텍처의 최종 결합 수칙인 "고용량 바이너리 파일을 직접 DB에 싣지 않고, S3 URL 텍스트 주소 정보만 Products 테이블의 prod_img 컬럼에 덮어쓰기(UPDATE) 매핑하는 단계"를 MySQL Workbench를 가동해 집행해 보겠습니다.
- DB 개발 사령탑 기상: 로컬 컴퓨터에서 MySQL Workbench 툴을 띄우고, 등록해 둔
AWS RDS MySQL커넥션을 연결해 로그인 패스워드(mysql1234)를 기입하여 쿼리창을 기상시킵니다. - S3 URL 일괄 이식 쿼리 실행: 쿼리 에디터 창을 열고, 각 6가지 상품 코드(
prod_cd)에 매칭되는 S3 고유 도메인 이미지 주소값을 칼같이 반영하는 아래의UPDATEDML 스크립트를 정렬해 실행합니다:
-- 1. 사용할 쇼핑몰 스키마 명확히 바인딩
USE shopping_db;
-- 2. 각 6대 패션 의류 상품별 S3 이미지 HTTPS 주소 일대일 영사 반영 UPDATE 구문 집행
-- (주의: 아래 도메인 내의 'ysu-shop-media-00' 영역은 실제 본인이 생성한 S3 버킷 명칭으로 정밀 교체해야 합니다)
UPDATE Products
SET prod_img = 'https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0001.png'
WHERE prod_cd = 'P0001' ;
UPDATE Products
SET prod_img = 'https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0002.png'
WHERE prod_cd = 'P0002' ;
UPDATE Products
SET prod_img = 'https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0003.png'
WHERE prod_cd = 'P0003' ;
UPDATE Products
SET prod_img = 'https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0004.png'
WHERE prod_cd = 'P0004' ;
UPDATE Products
SET prod_img = 'https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0005.png'
WHERE prod_cd = 'P0005' ;
UPDATE Products
SET prod_img = 'https://ysu-shop-media-00.s3.ap-northeast-2.amazonaws.com/img/P0006.png'
WHERE prod_cd = 'P0006' ;
-- 3. 이식이 오차 없이 이루어졌는지 영구 검증용 SELECT 쿼리 수행
SELECT prod_cd, prod_name, price, prod_img FROM Products;
SQL 컴파일을 완료하고 SELECT 결과를 출력해 보면, prod_img 컬럼 내부에 과거의 투박한 로컬 임시 파일 이름(P0001.png) 대신, 클라우드상에서 보증하는 고성능 S3 HTTPS URL 주소 라인을 최종 확인할 수 있습니다!
이로써 향후 프론트엔드 브라우저 화면이 우리 백엔드 서버에 상품 조회를 수신하면, 가벼워진 RDBMS는 이 텍스트 링크만을 쿼리해 뱉어내고 실제 무거운 고해상도 이미지는 S3 스토리지가 병렬로 내려받게 만드는 완벽한 분업화 데이터 라이프사이클 수송망이 개통된 것입니다!
5. S3 버킷 생성 및 URL DB 업데이트 아키텍처 다이어그램
우리가 개설한 S3 버킷의 퍼블릭 액세스 장막을 해제하고 JSON s3:GetObject 정책을 관통시켜 획득한 HTTPS URL 링크들을 RDS MySQL 데이터 테이블 본진의 prod_img 컬럼에 DML UPDATE 구문으로 일대일 매핑 결속하는 가상 맵 흐름도입니다.
마치며: 무제한의 미디어 분산 수송망이 최종 개통되었습니다!
오늘 우리는 데이터를 설계하고 인프라의 가치를 극대화하는 최고의 클라우드 아키텍트로서, AWS S3 버킷 개설법과 s3:GetObject JSON 정책의 정교한 의미 분석, 그리고 취득한 HTTPS 주소를 RDBMS Products 마스터 테이블에 칼같이 이식해 결속해 내는 S3-RDS 연동 실무 대단원을 완수했습니다!
"무거운 이미지 자산들을 고성능의 RDBMS 엔진 내부에서 영구적으로 격리 은퇴시켜, S3라는 광활하고 저렴한 화물 열차 칸에 안전하게 입고해 두고 DB 테이블에는 오직 S3 화물 컨테이너의 절대 GPS 좌표(S3 URL)만을 이정표로 꽂아둔 현대적인 클라우드 분산 아키텍처 연동에 최종 성공한 것입니다."
든든하게 데이터를 담을 요새의 내외부 준비 작동을 모두 마쳤으니, 이제 진짜 웹 서비스를 기동하기 위해 우리 애플리케이션의 뼈대를 이루는 설계 패턴의 표준 사상인 MVC(Model-View-Controller) 아키텍처를 완벽하게 머릿속에 이식하고, 데이터가 원격지 가상 서버 내부에서 흘러 다니는 맥락인 '시스템 메시지 시퀀스 흐름'을 시각적으로 해부해 나갈 시간이 왔습니다.
다음 포스팅인 [백엔드 아키텍처] MVC(Model-View-Controller) 패턴으로 해부하는 의류 쇼핑몰 웹 애플리케이션 구조 편에서는, db.js가 이끄는 Model의 깊은 바다와, template.js 및 인라인 CSS가 담당하는 View의 화사한 껍데기, 그리고 Main.js와 각 기능 라우터들이 전담하는 Controller의 냉철한 신경망 조직 구조가 어떻게 유기적으로 톱니바퀴처럼 굴러가며 상용 엔터프라이즈 구조를 확립하는지, 그 실무의 설계도를 시원하게 가이드해 드리겠습니다.
오늘 S3 버킷 생성 중 버킷 이름 고유성 에러로 명명 장벽에 부딪히셨거나, JSON 버킷 정책 컴파일 중 Resource ARN 문법 쉼표 오타로 권한 저장이 실패해 고생하고 계신다면 절대 주저하지 마시고 운영자 메일로 문의해주세요. 오늘도 안전하고 똑똑한 클라우딩 라이프 하세요. 감사합니다! 😉
출처
- 이현호. 실무 프로젝트로 완성하는 클라우드 환경에서 DB 구축과 웹 개발. 길벗캠퍼스. 2026.04. (5.3장 'Amazon S3를 활용한 이미지 저장' 141-144페이지 참조)
- 이현호. "05장. 데이터베이스 구축_설명오디오.m4a" 설명 오디오 가이드 스크립트 기반 S3 버킷 생성 절차, s3:GetObject JSON 정책 요소(Sid, Principal, Effect, Action, Resource) 분해 해석 및 MySQL Workbench DML UPDATE 매핑 비하인드 아키텍처 대화록 완벽 반영.
- Amazon S3 Bucket Policy Examples Guide (https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html) 및 AWS Policy Generator Documentations.
자주 묻는 질문 (FAQ)
Q. Amazon S3 버킷을 생성할 때 외부 조회를 허용하기 위해 반드시 해제해야 하는 핵심 보안 옵션은 무엇인가요?
A. '모든 퍼블릭 액세스 차단' 옵션입니다. 이 기본 보안 장벽을 해제하여 비활성화해주어야만, 이후 버킷 정책을 통해 외부 웹 브라우저가 상품 이미지 파일에 퍼블릭 비동기 조회(GET) 방식으로 자유롭게 다가갈 수 있는 경로가 개방됩니다.
Q. S3 버킷 정책(Bucket Policy) JSON 작성 시 'Principal'과 'Action' 항목에 무엇을 정의해야 하나요?
A. Principal에는 전체 개방을 상징하는 별표 문자('*')를, Action에는 's3:GetObject'를 매핑해야 합니다. 이렇게 지정해야만 전 세계의 불특정 다수 클라이언트 브라우저가 인증용 비밀 키(Credentials) 없이도 상품 상세 페이지 이미지 데이터를 원격 조회할 수 있습니다.
Q. S3 버킷에 업로드된 상품 이미지를 RDS MySQL 데이터베이스 제품 테이블에 최종 바인딩할 때 실행하는 SQL 구문의 특징은 무엇인가요?
A. 'UPDATE' 쿼리문을 실행해 S3의 고유 객체 HTTPS URL 주소값만 'prod_img' 문자열 컬럼에 덮어쓰는 것입니다. 이진 이미지 원본 대신 텍스트 주소 형태만 데이터베이스에 기록함으로써 RDBMS의 I/O 및 백업 오버헤드를 극적으로 최소화합니다.
