#개발 #기술블로그 #동아리 #ACC #AWS #S3 #CloudFront #인프라 #infra #백엔드 ![[ACC_Storage.pdf]] ![](https://www.zdnet.com/a/img/2018/04/24/c79e9dfb-b4a9-46bb-b831-f2c57fdf8a1d/cloud-storage.jpg) # Cloud Storage란? - `정의` 데이터와 파일을 인터넷에 저장할 수 있는 클라우드 컴퓨팅 모델 - `사용 방법` 퍼블릭 인터넷 / 전용 프라이빗 네트워크 연결을 통해 액세스 - `장점` - 비용 효율성 - 민첩성 향상 - 더 빠른 배포 - 효율적 데이터 관리 - 확장성 - `종류` - File Storage - `정의` 데이터를 파일 단위의 계층 구조로 저장하는 데이터 스토리지 - `특징` - 애플리케이션에 가장 널리 사용 - 직접 데이터 관리 (서버 기능도 수행) $\to$ NFS, NAS 기술 사용 가능 - 로컬 하드 드라이브와 유사한 접근 방식 - **[[Amazon EFS]]** - `사용 사례` - 여러 서버, 사용자가 동일한 파일 시스템에 동시 접근하는 경우 - 파일, 디렉토리릍 통해 데이터를 관리하고 싶은 경우 - 네트워크를 통한 파일 공유가 필요한 경우 - Block Storage - `정의` 물리적 하드웨어 (HDD, SSD) 와 비슷한 역할 - `특징` - 데이터를 Block 형태로 Read & Write - 이때 빠른 Read & Write를 위해 Block에 고유한 식별자 `ID#` 를 부여해서 사용 - 백업 기능을 제공하기도 함 $\to$ SAN 역할 - **[[Amazon EBS]]** - Object Storage - `정의` 대용량 미디어 파일, 이미지, 백업 등의 비정형 데이터를 저장하기 위한 스토리지 - `특징` - **전송된 형식 그대로를 객체 데이터로** 저장 - 사용자가 직접 메타데이터 지정 가능 - 객체는 **보안 버킷**이라는 저장 공간에 저장 - HTTP 프로토콜 기반 REST API 호출을 통해 접근 - **Amazon S3** - `사용 사례` - 정적 웹 컨텐츠(이미지, 비디오, HTML)를 호스팅할 경우 - 전 세계 여러 데이터센터에 데이터를 분산시키는 경우 - 저렴한 비용으로 데이터를 오래 보관하는 경우 # Amazon S3 ![](https://velog.velcdn.com/images/simhani1/post/4c34323a-2f4a-4c99-95a6-886253adb234/image.png) - `정의` 데이터를 버킷 내 객체로 저장하는 객체 스토리지 서비스 - `특징` - 파일을 하나의 객체로 저장 $\to$ Key를 통해 관리 - `확장성` 저장 용량 신경 X - `데이터 보호` 버전 관리, 암호화, 복제 기능 - `비용 효율성` 사용한 만큼만 비용 지불 - 즉, **다량의 데이터를 안전하게 저장할 수 있다** - 비즈니스 요구에 맞게 데이터에 대한 접근 제어 *(e.g., ACL, IAM 정책)* - `구성` 버킷 & 객체 - `버킷` 최상위 디렉토리 - `객체` 디렉토리 내에 저장되는 파일 ## Bucket - `정의` S3에 저장된 객체에 대한 컨테이너 = 폴더? - `특징` - 객체를 무제한으로 저장 가능 - 한 계정당 최대 100개의 버킷 생성 가능 - AWS 전역에서 **단 하나만 존재**, 리전과 관계 없이 **전역적으로 유일한** 이름 사용 ## Object - `정의` S3에 저장되는 기본 개체 = 파일? - `특징` - 객체는 하나 이상의 버킷에 저장, 각 객체의 크기는 최대 5TB - 객체 데이터 + 메타 데이터로 구성 - `Key`와 `버전 ID`로 버킷 내에서 고유하게 식별 - `구성 요소` - Key - 객체에 할당한 이름. 객체 키를 사용하여 객체를 검색. - Value - 저장하는 콘텐츠. 객체 값은 임의의 바이트 시퀀스. - Version ID - 버킷 내에서 키와 버전 ID를 사용하여 각 객체를 고유하게 식별 가능함. 버전 ID는 버킷에 객체를 추가할 때 Amazon S3가 생성하는 문자열. - Metadata - 객체 관련 정보를 저장하기 위한 이름-값 페어의 세트. Amazon S3의 객체에 사용자 정의 메타데이터라고 하는 메타데이터를 지정 가능. Amazon S3는 이러한 객체의 관리에 사용되는 시스템 메타데이터를 객체에 지정. - Tag - 태그를 사용하여 액세스 제어 또는 비용 할당을 위해 저장된 객체를 분류 가능. - 액세스 제어 정보 - Amazon S3는 ACL(액세스 제어 목록), 버킷 정책 등의 리소스 기반 액세스 제어와 사용자 기반 액세스 제어를 모두 지원. - Amazon S3 리소스(예: 버킷, 객체)는 기본적으로 비공개. 명시적으로 권한을 부여해야 다른 사용자가 이러한 리소스에 액세스 가능. - `URL 형식` - `https://awsinaction.s3.ap-southeast-2..amazonaws.com/img/cat.png` - `awsinaction` Bucket Name - `s3.ap-southeast-2..amazonaws.com` Region - `/img/cat.png` Key name - `보안` - `데이터 암호화` - `서버 측 암호화` - `정의` 서버가 데이터를 자동으로 보호해주는 기능 - `방식` - `"x-amz-server-side-encryption": "AES256"` 설정해서 요청 - 업로드 시 AWS가 데이터를 대신 암호화해서 저장 - 다운로드 시 자동으로 복호화해 원래 상태로 반환 - **[[SSE-S3]]** - [[SSE-KMS]] / [[DSSE-KMS]] / [[SSE-C]] - **현재는 서버 측 암호화(SSE-S3)를 S3 내 모든 버킷 암호화의 기본 수준으로 적용** - `클라이언트 측 암호화` - `정의` 전송 및 저장 시, 보안을 보장하기 위해 로컬에서 데이터 암호화 - AWS를 포함한 제3자에게 객체 노출 방지 가능 - `방식` - S3 암호화 클라이언트를 사용해 객체 암호화 - 버킷에 업로드 - 즉, S3 암호화 클라이언트가 사용자-S3 간 중개자 역할 - `특징` - 높은 보안 보장 - 관리, 구현 복잡성 증가 - `액세스 제어` - `IAM` - `정의` 사용자를 생성하고 **사용자의 버킷 권한** 액세스 관리 - `사용자/역할 기준` 누가 무엇을 할 수 있나? - 자신의 계정 내의 IAM 사용자를 단위로 해 액세스 제어 - IAM Policy 적용 범위는, 자신의 AWS 계정 내의 - IAM User - IAM Group - IAM Role - 접근하려는 출발지 IP 주소나 도메인명에 의한 액세스 제어도 가능 - `ACL` - `정의` 권한이 있는 사용자에 대해 **간단한 개별 오브젝트를 액세스 가능하게** 만듦 - `계정 기준` 어떤 계정이 접근할 수 있나? - AWS 계정 단위로 액세스 권한 설정 - 다른 AWS 계정에 대해 객체, 버킷에 대한 읽기/쓰기 허용 - `버킷 정책` - `정의` 단일 S3 버킷 내 모든 객체에 대한 권한을 세부적으로 구성 - `버킷/객체 기준` 이 버킷에 누가 접근할 수 있나? - Bucket 단위로 액세스 권한 설정 - 자신의 AWS 계정의 IAM 사용자 / 또 다른 AWS 계정의 IAM 사용자에 대해 S3 리소스 액세스 권한 설정 - 접근하려는 출발지 IP 주소나 도메인명에 의한 액세스 제어도 가능 - `CORS(Cross-Origin Resource Sharing)` [[CORS]] - `정의` 교차 출처 리소스 공유 - 일종의 협약 - 출처가 교차한다 = 리소스를 주고받으려는 '두 출처가 서로 다르다' - CORS를 설정한다 = '출처가 다른 서버 간의 리소스 공유'를 허용한다 - `Access-Control-Allow-Origin` 헤더 사용 - `Pre-signed URL` - `정의` 임시 URL을 사용하여 다른 사용자에게 기간 제한 (임시 권한) 액세스 부여 - 임시 URL 지정 $\to$ TIMEOUT! - S3 접근 권한이 없는 이용자 대상 - Pre-signed 임시 URL 지정, 일정 시간 후 public 접근 불가 - 단, URL 생성자가 **유효한 보안 자격 증명 + 허용하려는 작업 권한** 보유하고 있어야 함 - `스토리지 관리` - `버전 관리` - 한 버킷에 여러 버전의 객체 보관 $\to$ 실수로 삭제되거나 덮어써진 객체 복원 가능 - 버전 관리 활성화 시, 저장되는 객체에 대해 고유한 Version ID 자동 생성 - 단, 한 번 활성화하면 비활성화 불가 - 각 버전은 독립적으로 존재 - `객체 복제` - 하나 이상의 대상 버킷에 대한 객체를 **동일한 리전 or 다른 리전**에 비동기적으로 자동 복제 - `종류` - `SRR` S3 동일 리전 복제 - `효과` 같은 리전에 있으므로 *로그 집계, 계정 간 라이브 복제, 액세스 제어* - 로그 집계: S3 access log / CloudFront log / ALB log 같은 건 보통 **여러 버킷에 분산 저장되는데**, SRR 걸어두면 `[서비스별 로그 버킷들] → (SRR) → [중앙 로그 버킷]` 이런 식의 동작 가능해짐. 즉, 로그가 생성되는 순간 중앙 버킷으로 모임 - 계정 간 라이브 복제: SRR은 같은 리전이지만 **계정은 달라도 됨** - 액세스 제어: 복제 시점에 ownership / ACL / KMS를 바꿀 수 있음 - `CRR` S3 리전 간 복제 - 서로 다른 리전 버킷에서 새 객체 복제 - `효과` 대기시간 최소화, 운영 효율적 - `S3 배치 복제` 기존 객체를 *온디맨드*로 다른 버킷에 복제 - `효과` 데이터 안정성과 운영 효율성 향상! - `클래스` - S3 버킷의 각 객체에는 그와 연결된 **스토리지 클래스** 존재 - 사용자는 **사용 사례 & 요구사항에 맞게** 스토리지 클래스 선택 - `종류` Access Frequency 기준 Frequent $\to$ Infrequent [[S3 Storage Class]] - `S3 Standard` 자주 접근 - `S3 Intelligent-Tiering` 접근 패턴이 불확실 - `S3 Standard-IA` 가끔 접근하지만, 빠른 조회 필요 - `S3 One Zone-IA` 복구 가능. 비용 줄이고 싶을 때. - `S3 Glacier Instant Retrieval` 거의 안 쓰지만, 즉시 조회 필요. - `S3 Glacier Flexible Retrieval` 몇 분 ~ 몇 시간 기다려도 될 때 - `S3 Glacier Deep Archive` 거의 접근 안 할 때. 최저 비용 저장 가능. - `수명 주기` - `정의` 객체를 효율적으로 저장 & 관리하기 위해 S3 객체 그룹에 적용할 작업을 정의하는 수명 주기 구성 - `종류` - `전환 작업` - 객체가 다른 스토리지 클래스로 전환되는 시기 정의 - *e.g.,* - 30일 지나면 S3 Standard-IA, - 60일 지나면 S3 Glacier Instance Retrieval로 옮기기 - `만료 작업` - 객체가 만료되는 시기 정의 - 만료되면? S3가 해당 객체 자동 삭제 # Amazon CloudFront ![](https://media.licdn.com/dms/image/v2/D5612AQGJVymfD1z-PQ/article-cover_image-shrink_600_2000/article-cover_image-shrink_600_2000/0/1726407324455?e=2147483647&v=beta&t=ZBahLW57x_6a1txuy0kgfYMQUeFZTzce1I6J57XfUQk) ## 개념 ### CloudFront란? - `정의` CDN (글로벌 콘텐츠 전송 네트워크) 서비스 - 짧은 지연 시간 + 빠른 전송 속도로 데이터, 동영상, 애플리케이션, API를 전세계 고객에게 안전하게 전송 - 기본 보안 기능 제공 ### [[CDN]]이란? - `정의` 콘텐츠 전송 네트워크 - 콘텐츠를 효율적으로 전달하기 위해 여러 서버에 데이터를 분산시켜 캐싱 - **원본 서버 위치와 상관없이, 사용자에게 더 가까이 있는 서버로부터 캐싱된 컨텐츠 배포 $\to$ 빠름!** - *e.g., 영국 웹사이트를 미국에서 접근하려면? 미국 근처 ISA에서 배포!* ### Edge Location: CloudFront의 콘텐츠 제공 방식 - `정의` 사용자에게 더 가까운 지리적 위치에 콘텐츠를 저장하는 Origin Server의 **Caching Server** - `방식` - 사용자 요청 발생 시, - 지연 시간이 가장 적은 Edge Location으로 Routing ### REC (Regional Edge Caches) - `정의` Origin Server - Edge Location 사이에 존재하는 **캐시 계층** - Edge Location에서 캐시하지 않는 콘텐츠 저장 - Edge Location에서 캐시 Miss $\to$ - Origin Server X - REC O $\to$ 빠름 ### Origin Server - `정의` 데이터의 원본이 위치한 곳 - `역할` static contents & dynamic contents 모두 처리 - `static contents` - `정의` EC2 서버가 필요로 하지 않는 콘텐츠 - e.g., 이미지 - S3 Bucket (기본) - `dynamic contents` - `정의` 서버가 필요로 하는 콘텐츠 - e.g., 로그인 자료, 실시간 추가 자료 - dynamic contents를 정적 캐싱한다면 TTL 시간 동안 사용자는 새로 추가 or 수정된 데이터를 볼 수 없음 - EC2 Instance, ELB (Elastic Load Balancing) ## CloudFront 동작 방식 1. 클라이언트 $\to$ Edge Server 요청 2. Edge Server: 해당 데이터 캐싱 여부 확인 3. 동작 1. 캐시 사본이 있다면 1. 사용자에게 응답 2. 캐시 사본이 없다면 1. Origin Server로 포워딩 2. Edge Server에 캐싱 데이터 생성 3. 사용자에게 응답 ## CloudFront 기능 1. HTTPS 지원 1. origin에서 HTTPS 지원하지 않아도 알아서 HTTPS 통신을 해줌 2. 인증키 설치 등의 작업이 불필요 $\to$ 간편함! 2. 특정 지역 콘텐츠 접근 제한 1. 지리적 제한이 가능함 1. e.g., 회사 사정으로 특정 지역을 제한하고 싶을 때 사용 3. Signed URL 1. S3 pre-signed URL과 비슷한 기능 2. 허용된 사용자에게만 접근할 수 있는 signed url 제공 1. e.g., 유료결제를 한 사용자에게만 동영상 URL 제공 3. 하나의 콘텐츠에만 사용 가능 4. 접근 허용 사용자를 정해둠 $\to$ signed url 생성 $\to$ 사용자 검증 $\to$ URL 제공 4. Signed Cookie 1. 다수의 파일에 대한 access 제공 (다수의 파일 - 하나의 signed cookie) 2. 만료 시간, IP 주소 범위 등 지정 1. e.g., ID/PW를 입력해 로그인한 유료 회원에게 유료 콘텐츠를 모두 제공 3. 로그인 $\to$ 인증정보 기반 cookie 발급 $\to$ 이 cookie를 포함해 보내면 인증 완료! ![[ACC_Storage_핸즈온.pdf]]