Object Storage (1)

임채민·2025년 8월 29일

NHN Cloud SE Study 

목록 보기
6/6
  • NHN Cloud Object Storage는 OpenStack Swift 기반으로 구축된 분산 객체 스토리지 시스템이다.
  • 컨테이너는 파일시스템의 디렉토리와 유사하지만, 실제로는 오브젝트들의 논리적 그룹핑을 위한 네임스페이스 역할을 한다.

NHN Cloud Object Storage의 기반이 되는 swift 아키텍처

  • Account : 테넌트 레벨의 최상위 네임스페이스
  • Container : 오브젝트들을 그룹핑하는 논리적 컨테이너
  • Object : 실제 데이터와 메타데이터를 포함하는 개체

1) 오브젝트 스토리지 컨테이너 생성 및 관리

1-1. 컨테이너 생성

NHNCloud 웹 콘솔에서 Object Storage 컨테이너 생성

  • 컨테이너 설정
    • 접근 정책 - private (컨테이너 오브젝트에 대한 접근 제한)
    • 스토리지 클래스 - standard (자주 접근하는 데이터에 적합)

1-2. 접근 정책 변경 테스트

접근 정책을 private에서 public으로 변경하면 직접 접근 가능한 컨테이너 URL이 만들어진다.

  • Public 접근: HTTP GET 요청으로 인증 없이 직접 접근 가능한 URL 생성
  • Public 컨테이너는 CDN과 연동하여 전 세계적으로 빠른 콘텐츠 전송이 가능하다.

다만 Public 설정 시 모든 오브젝트가 인터넷에 노출되기 때문에 IP ACL, Referrer 제한 등으로 추가 보안 설정을 권장한다. (민감한 데이터는 절대 Public 컨테이너에 저장 금지)

현재는 컨테이너 생성만 하고 아무것도 저장되어 있지 않아서 아래와 같이 표시된다.

테스트 목적으로 컨테이너 내부에 PDF 파일을 하나 업로드하였더니 웹에서 직접 접근 가능한 주소가 만들어졌다.


2) API를 이용한 오브젝트 업로드/다운로드

NHN Cloud Object Storage 인증 프로세스

  1. 테넌트 ID, 사용자명, 패스워드로 인증을 요청
  2. 서버에서 인증 토큰 발급
  3. 토큰에 포함된 정보: 만료 시간, 권한, 서비스 엔드포인트

2-1. API 설정

NHNCloud Object Storage API 사용법은 여기서 볼수 있다.

1) 인증 토큰 발급

curl -X POST ${IDENTITY_URL}/tokens \
  -H "Content-Type: application/json" \
  -d '{
    "auth": {
      "tenantId": "'${TENANT_ID}'",
      "passwordCredentials": {
        "username": "'${USERNAME}'",
        "password": "'${API_PASSWORD}'"
      }
    }
  }' | python -m json.tool

환경변수 설정 후 curl 을 통해 인증 토큰 ID와 만료 시간, 사용 가능한 리전 등을 확인

2) 스토리지 계정 조회

발급받은 토큰으로 스토리지 계정 정보를 조회하는 API를 테스트 (성공)

  • X-Account-Container-Count : 컨테이너 개수
  • X-Account-Object-Count : 오브젝트 개수
  • X-Account-Bytes-Used : 사용 용량

2-2. 컨테이너 관리 API 실습

1) 모든 컨테이너의 목록 조회

  • 응답 형식
    • 기본 옵션은 plain text
    • ?format=json : JSON 형식으로 상세 정보 포함
    • ?format=xml : XML 형식

2) 새 컨테이너 생성

curl -X PUT ${STORAGE_URL}/api-test-container \
>   -H "X-Auth-Token: ${TOKEN}"

3) 오브젝트 목록 조회

curl -X GET ${STORAGE_URL}/api-test-container \
>   -H "X-Auth-Token: ${TOKEN}"

2-3. 오브젝트 업로드 실습

1) 테스트 파일 생성 후 단일 파일 업로드

echo "Hello NHN Cloud Object Storage API!!" > test-api.txt
echo "Configuration data for API test" > config-api.json
echo "Log entry $(date)" > api-test.log

$ curl -X PUT ${STORAGE_URL}/api-test-container/test-api.txt \
>   -H "X-Auth-Token: ${TOKEN}" \
>   -H "Content-Type: text/plain" \
>   -T test-api.txt

$ curl -X PUT ${STORAGE_URL}/api-test-container/config-api.json \
>   -H "X-Auth-Token: ${TOKEN}" \
>   -H "Content-Type: application/json" \
>   -T config-api.json

업로드 프로세스
1. 클라이언트가 파일을 HTTP PUT 요청으로 전송
2. Swift가 파일을 여러 노드에 복제
3. 모든 복사본이 성공적으로 저장되면 201 Created 응답
4. ETag 헤더로 MD5 체크섬 반환하여 무결성 확인

2) 폴더 구조로 업로드 (가상 폴더)

$ curl -X PUT ${STORAGE_URL}/api-test-container/logs/api-test.log \
>   -H "X-Auth-Token: ${TOKEN}" \
>   -H "Content-Type: text/plain" \
>   -T api-test.log

Swift의 가상 폴더 개념

  • 실제 폴더는 존재하지 않음
  • 오브젝트명에 슬래시(/)를 포함하여 계층 구조 시뮬레이션
  • logs/api-test.log 는 하나의 오브젝트명

3) 업로드 결과 확인


2-4. 오브젝트 다운로드 실습

1) 오브젝트 정보 조회

  • api-test-container 컨테이너에 있는 test-api.txt 파일이 정상적으로 존재함을 확인
  • OpenStack Swift 스토리지에서 정상적으로 서비스되고 있음

2) 오브젝트 다운로드

  • 40바이트 파일을 다운로드하여 downloaded-test-api.txt 로 저장

2-5. 오브젝트 복사 및 이동

1) 같은 컨테이너 내 복사

기존의 test-api.txt 파일을 같은 컨테이너 내에서 test-api-backup.txt 라는 이름으로 복사

2) 다른 컨테이너로 복사

  • COPY 메서드는 같은 컨테이너 내 복사에 주로 사용
  • PUT + X-Copy-From 는 다른 컨테이너로 복사할 때 유용
  • 둘 다 서버 사이드 복사로 네트워크 전송 없이 빠르게 처리된다.

2-6. 컨테이너 접근 정책 설정

컨테이너를 Public Read로 설정

$ curl -X POST ${STORAGE_URL}/api-test-container \
>   -H "X-Auth-Token: ${TOKEN}" \
>   -H "X-Container-Read: .r:*"
$ curl -X POST ${STORAGE_URL}/api-test-container \
>   -H "X-Auth-Token: ${TOKEN}" \
>   -H "X-Container-Ip-Acl-Allowed-List: 192.168.1.0/24,10.0.0.1"

X-Container-Read: .r:* : 모든 사용자에게 읽기 권한 부여
.r:* = "referrer any" (누구나 읽기 가능)

  • CLI 명령어로 설정한 공개 읽기 권한이 웹 콘솔에서 PUBLIC 으로 정확히 반영됨
  • IP 제한도 함께 적용되어 제한된 공개 접근 상태

이제 api-test-container 의 파일들은 지정된 IP 대역에서 인증 없이도 직접 URL로 접근 가능하다.


2-7. 오브젝트 정리 및 삭제

1) HTTP DELETE 메서드로 특정 파일들을 하나씩 삭제한다.

curl -X DELETE ${STORAGE_URL}/api-test-container/test-api.txt \
  -H "X-Auth-Token: ${TOKEN}"

curl -X DELETE ${STORAGE_URL}/api-test-container/config-api.json \
  -H "X-Auth-Token: ${TOKEN}"

2) 완전히 비워야만 컨테이너를 삭제할 수 있기 때문에 아직 남아있는 파일들의 목록을 확인한다.
API로 확인한 남은 파일들도 마찬가지로 삭제한다.

curl -X GET ${STORAGE_URL}/api-test-container \
  -H "X-Auth-Token: ${TOKEN}"

3) 빈 컨테이너 api-test-container를 삭제한다.

  • 오브젝트 → 컨테이너 순으로 삭제된다.
  • 모든 DELETE 작업에 인증 토큰이 필요하다.

profile
NHN Cloud IaaS System Engineer / Infra Devops Engineer

0개의 댓글