SAIO에서 기본 작업 수행해 보기

1. 파일을 업로드 하고 싶은데...

이젠 뭘 해야하지. 친절하게 “이렇게 하시면 됩니다...” 라고 소개해주는 자료도 못찾았고. 어쩔수 없이 내가 찾아야지 뭐.

2. 로그인을 해야한다던데

Swift는 로그인을 해야한다고 했다. SAIO는 기본적으로 tempauth를 사용하도록 설정이 되어있다고 했다. tempauth는 테스트용으로 만들어진 간단한 인증 시스템이라고 한다.
Tempauth 계정정보는 /etc/swift/proxy-server.conf 에 들어있다고 했다. 찾아보니 몇 개가 들어가 있긴 하다.

[filter:tempauth]
use = egg:swift#tempauth
user_admin_admin = admin .admin .reseller_admin
user_test_tester = testing .admin
user_test2_tester2 = testing2 .admin
user_test_tester3 = testing3

4개의 계정이 기본적으로 생성이 되어있는것 같고, 저게 무슨뜻인지 이해하려면 아래 정보를 살펴보면 된다.
user_<account>_<user> = <key> [group] [group] [...] [storage_url]

예를들어, user_test_tester = testing .admin 이라는 설정은

  • account 는 test
  • 사용자는 tester
  • 비밀번호는 testing
  • 권한은 .admin

이라는 뜻이라고 한다.

기본적으로 tempauth를 통해 test 라는 Account를 생성하게 되면, URL로 접근할때는 “AUTH_” 라는 접두어가 자동으로 붙도록 설정 되어있다고 한다.

그러니, tester라는 사용자의 경우는 “test”라는 account에 속해 있고, 이것을 URL로 접속을 할때에는 AUTH_test가 되는것이라고 한다. 이 정보 찾는게 왜 그렇게 어렵더냐.

3. 로그인 해보기

tester라는 계정으로 로그인을 해 보자. X-Storage-User에 있는 “test:tester”는 ’test라는 account에 속한 tester 계정’ 이라는 뜻이라고 한다.
curl -v -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing' http://127.0.0.1:8080/auth/v1.0

오웅. 뭔가 잘 된듯 하다.

* About to connect() to 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /auth/v1.0 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8080
> Accept: */*
> X-Storage-User: test:tester
> X-Storage-Pass: testing
>
< HTTP/1.1 200 OK
< X-Storage-Url: http://127.0.0.1:8080/v1/AUTH_test
< X-Auth-Token-Expires: 86399
< X-Auth-Token: AUTH_tk09f6c4ae127745e2a514013717279519
< Content-Type: text/html; charset=UTF-8
< X-Storage-Token: AUTH_tk09f6c4ae127745e2a514013717279519
< Content-Length: 0
< X-Trans-Id: tx202e8cba730645c7ab321-005aaa3b4b
< X-Openstack-Request-Id: tx202e8cba730645c7ab321-005aaa3b4b
< Date: Thu, 15 Mar 2018 09:22:19 GMT
<
* Connection #0 to host 127.0.0.1 left intact

음 잘 된것 같다. 이제는 X-Auth-Token을 사용하여 curl 명령어를 사용하면 된다.

4. Account에 첫 접속 해보기

이제는 우리의 account인 test에 접속해 볼수 있다. 아까 말했듯이, test Account를 URL로 할때에는 자동으로 AUTH_가 붙어야 한다.

curl -v -H 'X-Auth-Token:AUTH_tk09f6c4ae127745e2a514013717279519' http://127.0.0.1:8080/v1/AUTH_test

성공적으로 실행이 되었다.

HTTP/1.1 200 OK
X-Account-Storage-Policy-Gold-Bytes-Used: 0
Content-Length: 5
X-Account-Storage-Policy-Gold-Object-Count: 0
X-Account-Object-Count: 0
X-Timestamp: 1521110431.89676
X-Account-Storage-Policy-Gold-Container-Count: 1
X-Account-Bytes-Used: 0
X-Account-Container-Count: 1
Content-Type: text/plain; charset=utf-8
Accept-Ranges: bytes
X-Trans-Id: txe8b662cbad0e46bcac800-005aaa63eb
X-Openstack-Request-Id: txe8b662cbad0e46bcac800-005aaa63eb
Date: Thu, 15 Mar 2018 12:15:39 GMT

5. Container 생성하기

-X 에 PUT을 사용해서 container를 생성할 수 있다. saio 라는 이름의 container를 생성해 보았다.

curl -i -X PUT -H "X-Auth-Token:AUTH_tk09f6c4ae127745e2a514013717279519" http://127.0.0.1:8080/v1/AUTH_test/saio

우옹 생성이 되었다.

HTTP/1.1 201 Created
Content-Length: 0
Content-Type: text/html; charset=UTF-8
X-Trans-Id: tx1f064fda218740f18e24d-005aaa4d9f
X-Openstack-Request-Id: tx1f064fda218740f18e24d-005aaa4d9f
Date: Thu, 15 Mar 2018 10:40:32 GMT

6. Object 올려보기

테스트 삼아서 파일을 올려보자. SAIO 설치를 위해서 git clone으로 다운 받았던 파일중에 requirement.txt를 올려보기로 했다.

curl -i -X PUT -H "X-Auth-Token: $TOKEN" http://127.0.0.1:8080/v1/AUTH_test/saio/requirements.txt -T requirements.txt

우왓, 성공했다.

HTTP/1.1 201 Created
Last-Modified: Thu, 15 Mar 2018 12:38:29 GMT
Content-Length: 0
Etag: 488109b7dee914c0eafa4ebfc9776b62
Content-Type: text/html; charset=UTF-8
X-Trans-Id: tx714e49f825f84cc48f169-005aaa6944
X-Openstack-Request-Id: tx714e49f825f84cc48f169-005aaa6944
Date: Thu, 15 Mar 2018 12:38:28 GMT

실제로 잘 저장이 되었는지 container에게 물어보았다.
curl -i -X GET -H "X-Auth-Token: $TOKEN" http://127.0.0.1:8080/v1/AUTH_test/saio/

HTTP/1.1 200 OK
X-Container-Object-Count: 1
Accept-Ranges: bytes
X-Storage-Policy: gold
Last-Modified: Thu, 15 Mar 2018 10:40:33 GMT
X-Container-Bytes-Used: 482
X-Timestamp: 1521110432.02145
Content-Type: text/plain; charset=utf-8
Content-Length: 17
X-Trans-Id: txff408794fdbb41e5a8fe8-005aaa69d4
X-Openstack-Request-Id: txff408794fdbb41e5a8fe8-005aaa69d4
Date: Thu, 15 Mar 2018 12:40:52 GMT

requirements.txt

파일을 몇 개 더 업로드 해 보기로 했다.
bandit.yaml, setup.cfg, setup.py ,README.rst

For loop을 사용해서 한꺼번에 올려버렸다.
for FILE in bandit.yaml setup.cfg setup.py README.rst; do curl -i -X PUT -H "X-Auth-Token: $TOKEN" http://127.0.0.1:8080/v1/AUTH_test/saio/$FILE -T $FILE; done

모든 파일이 다 잘 올라간듯 하다. Container를 다시 한번 확인해 보았다. 다 잘 올라간것이 보인다.

HTTP/1.1 200 OK
X-Container-Object-Count: 5
Accept-Ranges: bytes
X-Storage-Policy: gold
Last-Modified: Thu, 15 Mar 2018 10:40:33 GMT
X-Container-Bytes-Used: 20006
X-Timestamp: 1521110432.02210
Content-Type: text/plain; charset=utf-8
Content-Length: 59
X-Trans-Id: tx310d22185ade445aa336e-005aaa6b68
X-Openstack-Request-Id: tx310d22185ade445aa336e-005aaa6b68
Date: Thu, 15 Mar 2018 12:47:36 GMT

README.rst
bandit.yaml
requirements.txt
setup.cfg
setup.py

7. Swift Cluster에 대한 정보 얻기

이 명령어는 Token이 필요 없다고 한다. Swift Cluster에 대한 대략적인 정보를 보여주는것 같다. 자세한 정보를 얻기는 힘들어 보인다.

curl -s -X GET http://127.0.0.1:8080/info | python -m json.tool

{
    "account_quotas": {},
    "bulk_delete": {
        "max_deletes_per_request": 10000,
        "max_failed_deletes": 1000
    },
    "bulk_upload": {
        "max_containers_per_extraction": 10000,
        "max_failed_extractions": 1000
    },
    "container_quotas": {},
    "container_sync": {
        "realms": {
            "SAIO": {
                "clusters": {
                    "SAIO_ENDPOINT": {
                        "current": true
                    }
                }
            }
        }
    },
    "crossdomain": {},
    "ratelimit": {
        "account_ratelimit": 0.0,
        "container_listing_ratelimits": [],
        "container_ratelimits": [],
        "max_sleep_time_seconds": 60.0
    },
    "slo": {
        "max_manifest_segments": 1000,
        "max_manifest_size": 8388608,
        "min_segment_size": 1,
        "yield_frequency": 10
    },
    "staticweb": {},
    "swift": {
        "account_autocreate": true,
        "account_listing_limit": 10000,
        "allow_account_management": true,
        "container_listing_limit": 10000,
        "extra_header_count": 0,
        "max_account_name_length": 256,
        "max_container_name_length": 256,
        "max_file_size": 5368709122,
        "max_header_size": 8192,
        "max_meta_count": 90,
        "max_meta_name_length": 128,
        "max_meta_overall_size": 4096,
        "max_meta_value_length": 256,
        "max_object_name_length": 1024,
        "policies": [
            {
                "aliases": "gold",
                "default": true,
                "name": "gold"
            },
            {
                "aliases": "silver",
                "name": "silver"
            },
            {
                "aliases": "ec42",
                "name": "ec42"
            }
        ],
        "strict_cors_mode": true,
        "version": "2.17.1.dev79"
    },
    "symlink": {
        "symloop_max": 2
    },
    "tempauth": {
        "account_acls": true
    },
    "tempurl": {
        "allowed_digests": [
            "sha1",
            "sha256",
            "sha512"
        ],
        "incoming_allow_headers": [],
        "incoming_remove_headers": [
            "x-timestamp"
        ],
        "methods": [
            "GET",
            "HEAD",
            "PUT",
            "POST",
            "DELETE"
        ],
        "outgoing_allow_headers": [
            "x-object-meta-public-*"
        ],
        "outgoing_remove_headers": [
            "x-object-meta-*"
        ]
    },
    "versioned_writes": {
        "allowed_flags": [
            "x-versions-location",
            "x-history-location"
        ]
    }
}

8. 기본적인건 다 해본것 같다

지우는것만 빼고는 다 해본듯 하다. Object를 지우는 방법이야 금방 찾을수 있겠지 뭐.

Photo by Nathan Dumlao on Unsplash

Daewon Kim

Daewon Kim

Perpetual Learner of OpenStack on Kubernetes.