4.5. Swift 컨테이너 작업
개발자는 Ceph Object Gateway를 통해 Swift API(애플리케이션 프로그래밍 인터페이스)를 사용하여 컨테이너 작업을 수행할 수 있습니다. 컨테이너를 나열, 생성, 업데이트 및 삭제할 수 있습니다. 컨테이너의 메타데이터를 추가하거나 업데이트할 수도 있습니다.
4.5.1. 사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터.
- RESTful 클라이언트.
4.5.2. Swift 컨테이너 작업
컨테이너는 데이터 오브젝트를 저장하는 메커니즘입니다. 계정에는 여러 컨테이너가 있을 수 있지만 컨테이너 이름은 고유해야 합니다. 이 API를 사용하면 클라이언트는 컨테이너를 생성하고, 액세스 제어 및 메타데이터를 설정하고, 컨테이너의 콘텐츠를 검색하고, 컨테이너를 삭제할 수 있습니다. 이 API는 특정 사용자 계정의 정보와 관련된 요청을 하므로 컨테이너의 액세스 제어가 의도적으로 공개적으로 액세스할 수 있는 경우를 제외하고 이 API의 모든 요청을 인증해야 합니다. 즉 익명의 요청을 허용합니다.
Amazon S3 API는 'bucket'이라는 용어를 사용하여 데이터 컨테이너를 설명합니다. 다른 사람이 Swift API에서 'bucket'을 참조하는 것을 들으면 'bucket'이라는 용어는 'container.' 용어와 동등한 것으로 해석될 수 있습니다.
오브젝트 스토리지의 한 가지 기능은 계층적 경로 또는 디렉터리를 지원하지 않는다는 것입니다. 대신 각 컨테이너에 오브젝트가 포함될 수 있는 하나 이상의 컨테이너로 구성된 하나의 수준을 지원합니다. RADOS 게이트웨이의 Swift 호환 API는 'pseudo-hierarchical containers'의 개념을 지원합니다. 이는 오브젝트 이름 지정을 사용하여 컨테이너 또는 디렉터리 계층 구조를 실제로 스토리지 시스템에서 구현하지 않고 구현하는 수단입니다. pseudo-hierarchical 이름으로 오브젝트의 이름을 지정할 수 있습니다(예: photo/buildings/empire-state.jpg)이지만 컨테이너 이름에는 슬래시(/
) 문자를 포함할 수 없습니다.
대용량 오브젝트를 버전 Swift 컨테이너에 업로드할 때 python-swiftclient
유틸리티와 함께 --leave-segments
옵션을 사용합니다. --leave-segments
를 사용하지 않는 경우 매니페스트 파일을 덮어씁니다. 따라서 기존 개체를 덮어쓰면 데이터 손실로 이어집니다.Consequently, an existing object is overwritten, which leads to data loss.
4.5.3. Swift에서 컨테이너의 ACL(액세스 제어 목록)을 업데이트합니다.
사용자가 컨테이너를 생성할 때 기본적으로 사용자는 컨테이너에 대한 읽기 및 쓰기 액세스 권한을 갖습니다. 다른 사용자가 컨테이너의 콘텐츠를 읽거나 컨테이너에 쓸 수 있도록 하려면 사용자를 특별히 활성화해야 합니다. 모든 사용자가 컨테이너에서 읽거나 쓸 수 있도록 X-Container-Read
또는 X-Container-Write
설정에서 *
를 지정할 수도 있습니다. 설정 *
는 컨테이너를 공개합니다. 즉, 익명 사용자가 컨테이너에서 읽거나 쓸 수 있습니다.
구문
POST /API_VERSION/ACCOUNT/TENANT:CONTAINER HTTP/1.1 Host: FULLY_QUALIFIED_DOMAIN_NAME X-Auth-Token: AUTH_TOKEN X-Container-Read: * X-Container-Write: UID1, UID2, UID3
요청 헤더
X-Container-Read
- 설명
- 컨테이너에 대한 읽기 권한이 있는 사용자 ID입니다.
- 유형
- 사용자 ID의 쉼표로 구분된 문자열 값.
- 필수 항목
- 없음
X-Container-Write
- 설명
- 컨테이너에 대한 쓰기 권한이 있는 사용자 ID입니다.
- 유형
- 사용자 ID의 쉼표로 구분된 문자열 값.
- 필수 항목
- 없음
4.5.4. Swift 목록 컨테이너
API 버전을 지정하는 GET
요청이며 계정은 특정 사용자 계정에 대한 컨테이너 목록을 반환합니다. 요청이 특정 사용자의 컨테이너를 반환하므로 요청에는 인증 토큰이 필요합니다. 이 요청은 익명으로 만들 수 없습니다.
구문
GET /API_VERSION/ACCOUNT HTTP/1.1 Host: FULLY_QUALIFIED_DOMAIN_NAME X-Auth-Token: AUTH_TOKEN
요청 매개변수
limit
- 설명
- 결과 수를 지정된 값으로 제한합니다.
- 유형
- 정수
- 유효한 값
- 해당 없음
- 필수 항목
- 있음
형식
- 설명
- 결과 수를 지정된 값으로 제한합니다.
- 유형
- 정수
- 유효한 값
-
JSON
또는xml
- 필수 항목
- 없음
marker
- 설명
- 마커 값보다 큰 결과 목록을 반환합니다.
- 유형
- 문자열
- 유효한 값
- 해당 없음
- 필수 항목
- 없음
응답에는 컨테이너 목록이 포함되어 있거나 HTTP 204
응답 코드를 사용하여 반환합니다.
응답 엔티티
계정
- 설명
- 계정 정보 목록입니다.
- 유형
- 컨테이너
컨테이너
- 설명
- 컨테이너 목록.
- 유형
- 컨테이너
name
- 설명
- 컨테이너의 이름입니다.
- 유형
- 문자열
bytes
- 설명
- 컨테이너의 크기입니다.
- 유형
- 정수
4.5.5. Swift에서 컨테이너의 오브젝트 나열
컨테이너 내의 오브젝트를 나열하려면 API 버전, 계정 및 컨테이너 이름을 사용하여 GET
요청을 만듭니다. 쿼리 매개변수를 지정하여 전체 목록을 필터링하거나 매개 변수를 종료하여 컨테이너에 저장된 처음 10,000개 오브젝트 이름 목록을 반환할 수 있습니다.
구문
GET /API_VERSION/TENANT:CONTAINER HTTP/1.1 Host: FULLY_QUALIFIED_DOMAIN_NAME X-Auth-Token: AUTH_TOKEN
요청 매개변수
형식
- 설명
- 결과 수를 지정된 값으로 제한합니다.
- 유형
- 정수
- 유효한 값
-
JSON
또는xml
- 필수 항목
- 없음
접두사
- 설명
- 결과 집합을 지정된 접두사로 시작하는 오브젝트로 제한합니다.
- 유형
- 문자열
- 유효한 값
- 해당 없음
- 필수 항목
- 없음
marker
- 설명
- 마커 값보다 큰 결과 목록을 반환합니다.
- 유형
- 문자열
- 유효한 값
- 해당 없음
- 필수 항목
- 없음
limit
- 설명
- 결과 수를 지정된 값으로 제한합니다.
- 유형
- 정수
- 유효한 값
- 0 - 10,000
- 필수 항목
- 없음
delimiter
- 설명
- 접두사와 나머지 오브젝트 이름 간의 구분 기호입니다.
- 유형
- 문자열
- 유효한 값
- 해당 없음
- 필수 항목
- 없음
경로
- 설명
- 오브젝트의 pseudo-hierarchical 경로입니다.
- 유형
- 문자열
- 유효한 값
- 해당 없음
- 필수 항목
- 없음
응답 엔티티
컨테이너
- 설명
- 컨테이너입니다.
- 유형
- 컨테이너
object
- 설명
- 컨테이너 내의 오브젝트입니다.
- 유형
- 컨테이너
name
- 설명
- 컨테이너 내 오브젝트의 이름입니다.
- 유형
- 문자열
hash
- 설명
- 오브젝트 콘텐츠의 해시 코드입니다.
- 유형
- 문자열
last_modified
- 설명
- 오브젝트의 콘텐츠가 마지막으로 수정된 시간입니다.
- 유형
- 날짜
content_type
- 설명
- 오브젝트의 콘텐츠 유형입니다.
- 유형
- 문자열
4.5.6. Swift에서 컨테이너 만들기
새 컨테이너를 생성하려면 API 버전, 계정 및 새 컨테이너의 이름을 사용하여 PUT
요청을 만듭니다. 컨테이너 이름은 고유해야 하며 forward-slash(/) 문자를 포함하지 않아야 하며 256바이트 미만이어야 합니다. 요청에 액세스 제어 헤더 및 메타데이터 헤더를 포함할 수 있습니다. 배치 풀 세트의 키를 식별하는 스토리지 정책을 포함할 수도 있습니다. 예를 들어, execute radosgw-admin zone get
to see a list of available keys under placement_pools
. 스토리지 정책을 사용하면 컨테이너에 대한 특수 풀 세트(예: SSD 기반 스토리지)를 지정할 수 있습니다. 이 작업은 멱등입니다. 이미 존재하는 컨테이너 생성을 요청하는 경우 HTTP 202 반환 코드와 함께 반환되지만 다른 컨테이너를 생성하지 않습니다.
구문
PUT /API_VERSION/ACCOUNT/TENANT:CONTAINER HTTP/1.1 Host: FULLY_QUALIFIED_DOMAIN_NAME X-Auth-Token: AUTH_TOKEN X-Container-Read: COMMA_SEPARATED_UIDS X-Container-Write: COMMA_SEPARATED_UIDS X-Container-Meta-KEY:VALUE X-Storage-Policy: PLACEMENT_POOLS_KEY
headers
X-Container-Read
- 설명
- 컨테이너에 대한 읽기 권한이 있는 사용자 ID입니다.
- 유형
- 사용자 ID의 쉼표로 구분된 문자열 값.
- 필수 항목
- 없음
X-Container-Write
- 설명
- 컨테이너에 대한 쓰기 권한이 있는 사용자 ID입니다.
- 유형
- 사용자 ID의 쉼표로 구분된 문자열 값.
- 필수 항목
- 없음
X-Container-Meta-KEY
- 설명
- 임의의 문자열 값을 사용하는 사용자 정의 메타데이터 키입니다.
- 유형
- 문자열
- 필수 항목
- 없음
X-Storage-Policy
- 설명
-
Ceph Object Gateway의
placement_pools
에서 스토리지 정책을 식별하는 키입니다. 사용 가능한 키에 대해radosgw-admin 영역을 가져옵니다
. - 유형
- 문자열
- 필수 항목
- 없음
동일한 이름의 컨테이너가 이미 있고 사용자가 컨테이너 소유자인 경우 작업이 성공합니다. 그렇지 않으면 작업이 실패합니다.
HTTP 응답
409
- 상태 코드
-
BucketAlreadyExists
- 설명
- 컨테이너는 이미 다른 사용자의 소유권에 있습니다.
4.5.7. Swift에서 컨테이너 삭제
컨테이너를 삭제하려면 API 버전, 계정 및 컨테이너 이름을 사용하여 DELETE
요청을 만듭니다. 컨테이너가 비어 있어야 합니다. 컨테이너가 비어 있는지 확인하려면 컨테이너에 대해 HEAD
요청을 실행합니다. 컨테이너를 성공적으로 제거하면 컨테이너 이름을 재사용할 수 있습니다.
구문
DELETE /API_VERSION/ACCOUNT/TENANT:CONTAINER HTTP/1.1 Host: FULLY_QUALIFIED_DOMAIN_NAME X-Auth-Token: AUTH_TOKEN
HTTP 응답
204
- 상태 코드
-
NoContent
- 설명
- 컨테이너가 제거되었습니다.
4.5.8. Swift 추가 또는 컨테이너 메타데이터 업데이트
컨테이너에 메타데이터를 추가하려면 API 버전, 계정 및 컨테이너 이름을 사용하여 POST
요청을 만듭니다. 메타데이터를 추가하거나 업데이트하려면 컨테이너에 쓰기 권한이 있어야 합니다.
구문
POST /API_VERSION/ACCOUNT/TENANT:CONTAINER HTTP/1.1 Host: FULLY_QUALIFIED_DOMAIN_NAME X-Auth-Token: AUTH_TOKEN X-Container-Meta-Color: red X-Container-Meta-Taste: salty
요청 헤더
X-Container-Meta-KEY
- 설명
- 임의의 문자열 값을 사용하는 사용자 정의 메타데이터 키입니다.
- 유형
- 문자열
- 필수 항목
- 없음