OpenStack Swift 는 자체 REST API 를 쓴다. Amazon S3 API 와는 인증 방식도 요청 형태도 다르기 때문에, S3 클라이언트를 그대로 붙이려면 프록시 서버의 미들웨어 파이프라인에 s3api 미들웨어를 넣어야 한다. 이 미들웨어가 S3 요청을 Swift 요청으로 번역한다.
예전 문서에 나오는 swift3 는 별도 프로젝트였고, Swift 2.13(Ocata) 부터 Swift 본체에 s3api 로 흡수됐다. 지금 설정할 때는 egg:swift#s3api 를 쓴다. egg:swift3#swift3 가 적힌 문서는 오래된 것이다.
/etc/swift/proxy-server.conf 의 파이프라인에 s3api 와 s3token 을 넣는다. 순서가 중요하다. s3api 는 인증 미들웨어보다 앞에, s3token 은 s3api 와 keystoneauth 사이에 온다.
[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache listing_formats container_sync bulk ratelimit s3api s3token authtoken keystoneauth slo dlo versioned_writes proxy-logging proxy-server
[filter:s3api]
use = egg:swift#s3api
s3_acl = False
force_swift_request_proxy_log = True
[filter:s3token]
use = egg:swift#s3token
auth_uri = https://keystone.example.com:5000
delay_auth_decision = True
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_url = https://keystone.example.com:5000
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = swift
password = ${SWIFT_SERVICE_PASSWORD}
delay_auth_decision = True
authtoken 의 delay_auth_decision = True 가 빠지면 S3 서명이 붙은 요청이 Keystone 토큰 검사 단계에서 401 로 먼저 잘린다. s3token 이 서명을 검증하기 전에 거부되는 것이라 증상만 보면 키가 틀린 것처럼 보인다.
systemctl restart openstack-swift-proxy
swift-init proxy-server restart # 배포 방식에 따라
S3 클라이언트에 넣을 액세스 키와 시크릿 키는 Keystone 이 발급한다. OpenStack 계정의 비밀번호가 아니다.
openstack ec2 credentials create
openstack ec2 credentials list
openstack ec2 credentials show <ACCESS_KEY>
발급된 자격증명은 그 프로젝트(테넌트) 범위로 동작한다. 프로젝트가 여러 개면 프로젝트마다 따로 만든다. 지울 때는 openstack ec2 credentials delete <ACCESS_KEY> 다.
aws --endpoint-url http://swift-proxy.example.com:8080 s3 ls
aws --endpoint-url http://swift-proxy.example.com:8080 s3 mb s3://testbucket
aws --endpoint-url http://swift-proxy.example.com:8080 s3 cp ./file.txt s3://testbucket/
~/.aws/credentials 에는 EC2 자격증명을 넣고, 리전은 비워 두거나 us-east-1 로 둔다. 경로 방식 URL 을 쓴다.
aws configure set default.s3.addressing_style path
GUI 클라이언트에서의 설정은 S3 Browser 로 MinIO · OpenStack Swift 에 연결하기 에 있다.
s3_acl = True 로 켜야 부분적으로 지원된다. 켜면 Swift 쪽 ACL 과 의미가 달라지므로 두 API 를 같이 쓰는 환경에서는 신중하게 정한다.Host 헤더를 그대로 전달해야 서명 검증이 통과한다.