S3 Browser 는 윈도우용 S3 클라이언트다. Amazon S3 뿐 아니라 S3 호환 API 를 제공하는 스토리지면 붙는다. 붙이는 데 걸리는 지점은 거의 두 가지로 정해져 있다 — 엔드포인트를 어떻게 쓰는가, 그리고 URL 스타일을 경로 방식으로 두었는가.
Accounts → Add New Account 에서 계정 유형을 S3 Compatible Storage 로 고른다.
| 항목 | 값 |
|---|---|
| Account Type | S3 Compatible Storage |
| REST Endpoint | <호스트>:<포트> — 예: minio.example.com:9000 |
| Access Key ID / Secret Access Key | 대상 스토리지에서 발급한 값 |
| Use secure transfer (SSL/TLS) | 엔드포인트가 HTTPS 면 켠다 |
| Signature version | 대부분 Signature V4 |
Advanced S3-compatible storage settings 에서 다음을 확인한다.
bucket.minio.example.com 같은 가상 호스트 이름을 조회하다 실패한다.us-east-1 로 둔다.엔드포인트 칸에는 http:// 를 붙이지 않고 호스트와 포트만 넣는다. 프로토콜은 SSL 체크박스가 정한다.
| 방식 | 형태 |
|---|---|
| 경로(path-style) | http://minio.example.com:9000/mybucket/myobject |
| 가상 호스트(virtual-hosted-style) | http://mybucket.s3.amazonaws.com/myobject |
자체 호스팅 스토리지는 버킷 이름마다 DNS 레코드와 와일드카드 인증서를 준비해야 가상 호스트 방식을 쓸 수 있다. 그래서 대부분 경로 방식으로 운영한다. 클라이언트가 가상 호스트 방식을 고집하면 NoSuchBucket 이나 이름 풀이 실패가 뜬다.
MinIO 의 S3 엔드포인트는 기본 9000 이고 콘솔은 --console-address 로 지정한 다른 포트다. 클라이언트에 넣을 것은 콘솔이 아니라 S3 엔드포인트 포트다.
mc alias set myminio http://minio.example.com:9000 ${ACCESS_KEY} ${SECRET_KEY}
mc ls myminio
mc admin info myminio
mc 로 붙지 않으면 클라이언트 설정이 아니라 서버나 방화벽 문제다. 클라이언트를 만지기 전에 이쪽부터 확인한다.
Swift 는 원래 자체 API 를 쓰고 S3 API 는 s3api 미들웨어를 프록시 파이프라인에 넣어야 열린다. 이 미들웨어가 없으면 어떤 S3 클라이언트도 붙지 않는다. 설정은 Swift 의 S3 호환 API 에 있다.
S3 클라이언트에 넣을 액세스 키와 시크릿 키는 Keystone 의 EC2 자격증명이다.
openstack ec2 credentials create
openstack ec2 credentials list
엔드포인트는 Swift 프록시 주소(보통 :8080) 를 그대로 쓴다. 버킷은 Swift 의 컨테이너에, 오브젝트는 오브젝트에 대응한다.
s3a:// 는 스토리지 프로토콜이 아니라 Hadoop 의 파일시스템 커넥터 이름이다. 하둡 · 스파크가 S3 호환 스토리지를 파일시스템처럼 다루기 위한 구현이고, 실제로 오가는 것은 똑같은 HTTP 기반 S3 API 다. 그래서 S3 Browser 같은 일반 클라이언트에는 s3a 라는 선택지가 없고 있을 필요도 없다.
하둡 쪽에서는 core-site.xml 에 엔드포인트를 적는다.
<configuration>
<property>
<name>fs.s3a.endpoint</name>
<value>http://minio.example.com:9000</value>
</property>
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>
<property>
<name>fs.s3a.connection.ssl.enabled</name>
<value>false</value>
</property>
<property>
<name>fs.s3a.aws.credentials.provider</name>
<value>org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider</value>
</property>
</configuration>
hadoop fs -ls s3a://mybucket/path/
액세스 키와 시크릿 키는 core-site.xml 에 평문으로 적지 말고 Hadoop 자격증명 공급자 파일에 넣는다.
hadoop credential create fs.s3a.access.key -provider jceks://file/etc/hadoop/s3.jceks
hadoop credential create fs.s3a.secret.key -provider jceks://file/etc/hadoop/s3.jceks
그리고 fs.s3a.security.credential.provider.path 에 그 경로를 지정한다.
| 증상 | 원인 |
|---|---|
이름을 풀지 못함, NoSuchBucket |
path-style 이 꺼져 있다 |
SignatureDoesNotMatch |
시그니처 버전 불일치, 키 오타, 서버와 클라이언트의 시각 차이 |
| 연결 자체가 안 됨 | 콘솔 포트를 엔드포인트로 넣었거나 방화벽 |
| 인증서 오류 | 자체 서명 인증서. 신뢰 저장소에 넣거나 HTTP 로 시험한다 |
| Swift 에서 403 | s3api 미들웨어 미적용, 또는 EC2 자격증명이 아닌 Keystone 비밀번호를 넣었다 |