- NHN Cloud Object Storage는 OpenStack Swift 기반으로 구축된 분산 객체 스토리지 시스템이다.
- 컨테이너는 파일시스템의 디렉토리와 유사하지만, 실제로는 오브젝트들의 논리적 그룹핑을 위한 네임스페이스 역할을 한다.
NHN Cloud Object Storage의 기반이 되는 swift 아키텍처
Account: 테넌트 레벨의 최상위 네임스페이스Container: 오브젝트들을 그룹핑하는 논리적 컨테이너Object: 실제 데이터와 메타데이터를 포함하는 개체
NHNCloud 웹 콘솔에서 Object Storage 컨테이너 생성

private (컨테이너 오브젝트에 대한 접근 제한) standard (자주 접근하는 데이터에 적합) 
접근 정책을 private에서 public으로 변경하면 직접 접근 가능한 컨테이너 URL이 만들어진다.

다만 Public 설정 시 모든 오브젝트가 인터넷에 노출되기 때문에 IP ACL, Referrer 제한 등으로 추가 보안 설정을 권장한다. (민감한 데이터는 절대 Public 컨테이너에 저장 금지)
현재는 컨테이너 생성만 하고 아무것도 저장되어 있지 않아서 아래와 같이 표시된다.

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

NHN Cloud Object Storage 인증 프로세스
- 테넌트 ID, 사용자명, 패스워드로 인증을 요청
- 서버에서 인증 토큰 발급
- 토큰에 포함된 정보: 만료 시간, 권한, 서비스 엔드포인트
NHNCloud Object Storage API 사용법은 여기서 볼수 있다.
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와 만료 시간, 사용 가능한 리전 등을 확인

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

X-Account-Container-Count : 컨테이너 개수X-Account-Object-Count : 오브젝트 개수X-Account-Bytes-Used : 사용 용량
?format=json : JSON 형식으로 상세 정보 포함?format=xml : XML 형식curl -X PUT ${STORAGE_URL}/api-test-container \
> -H "X-Auth-Token: ${TOKEN}"

curl -X GET ${STORAGE_URL}/api-test-container \
> -H "X-Auth-Token: ${TOKEN}"
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 체크섬 반환하여 무결성 확인

$ 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 는 하나의 오브젝트명

api-test-container 컨테이너에 있는 test-api.txt 파일이 정상적으로 존재함을 확인 
downloaded-test-api.txt 로 저장

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


COPY 메서드는 같은 컨테이너 내 복사에 주로 사용PUT + X-Copy-From 는 다른 컨테이너로 복사할 때 유용$ 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" (누구나 읽기 가능)

PUBLIC 으로 정확히 반영됨이제 api-test-container 의 파일들은 지정된 IP 대역에서 인증 없이도 직접 URL로 접근 가능하다.
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를 삭제한다.
