OpenStack APIs

OpenStack 서비스에 접근하여 인증하기 위해서는 먼저 인증 토큰을 얻기 위해 OpenStack Identity에 credential에 대한 payload를 요청하는 인증을 발급해야 합니다.

자격 증명은 대개 사용자 이름과 암호의 조합이며, 선택적으로 클라우드 프로젝트의 이름 또는 ID입니다. 클라우드 관리자에게 사용자 이름, 암호 및 프로젝트를 문의하여 인증 토큰을 생성 할 수 있도록하십시오. 또한 사용자 이름과 암호 대신 토큰을 제공 할 수도 있습니다.

API 요청을 보낼때, X-Auth-Token 헤더에 토큰을 포함하여 보냅니다. 여러 OpenStack 서비스에 접근한다면, 각 서비스에 대한 토큰을 가져올 수 있습니다. 토큰은 제한시간 전까지만 유효합니다. 다른 이유로도 토큰이 만료될 수 있습니다. 예를 들어, 사용자 역할이 변경되었다면, 사용자가 사용하던 토큰은 더 이상 유효하지 않습니다.

인증과 API 요청에 대한 작업 흐름도

  1. 클라우드 관리자가 발급한 identity 엔드포인트에서 인증 토큰을 요청합니다. 인증 에 보여지는 바와 같이 요청 내에 credential에 대한 payload를 보냅니다. 요청이 성공하면, 서버는 인증 토큰을 반환해 줍니다.

  2. API를 요청하고 X-Auth-Token 헤더에 토큰을 포함합니다. 서비스가 요청을 완료하거나 권한 없음 (401) 에러가 발생할 때까지 토큰을 이용하여 API 요청을 계속 보냅니다.

  3. 만약 권한 없음 (401) 에러가 발생하게 되면, 다른 토큰을 요청합니다.

cURL 명령을 이용하는 섹션 예제입니다. cURL에 대한 자세한 정보는 http://curl.haxx.se/ 를 확인합니다. OpenStack API에 대한 자세한 정보는 최신 API 버전 를 확인합니다.

인증

인증 credential에 대한 payload는 다음과 같은 매개 변수를 가집니다:

Credential 매개 변수

매개 변수

타입

설명

User Domain (필수)

string

사용자의 도메인.

username (필수 항목)

string

사용자 이름입니다. 만약 사용자 이름과 암호를 제공하지 않는다면, 토큰을 제공해야 합니다.

password (필수 항목)

string

사용자의 암호입니다.

Project Domain (선택적)

string

프로젝트의 도메인. 이것은 범위 오브젝트의 필수 부분입니다.

Project Name (선택적)

string

프로젝트 이름. * Project ID * 및 * Project Name *은 모두 선택 사항입니다.

Project ID (선택적)

string

프로젝트 ID.*project ID* 및 Project Name 모두 선택 사항입니다. 그러나 그 중 하나는 * Project Domain *과 함께 필요합니다. 그것들은 scope 오브젝트 아래에 싸여있습니다. 프로젝트 이름이나 ID를 모르는 경우 범위 오브젝트없이 요청을 보냅니다.

Identity가 작동하는 전형적인 OpenStack 배포에서는 사용자 프로젝트 이름, authenticate를 하기위한 사용자 이름, 암호를 지정해야합니다.

먼저, 프로젝트 이름을 OS_PROJECT_NAME 환경 변수로, 프로젝트 도메인 이름을 OS_PROJECT_DOMAIN_NAME 환경 변수로, 사용자 이름을 OS_USERNAME 환경 변수로, 암호를 OS_PASSWORD 환경 변수로, 그리고 사용자 도메인 이름을 OS_USER_DOMAIN_NAME 환경 변수로 내보내기를 합니다.

아래 예제는 설치 가이드에 따라 Ocata 설치에 따른 엔드 포인트를 사용합니다. 그러나, $OS_AUTH_URL 를 환경 변수로 사용하여 필요로 하는 경우 URL을 변경할 수 있습니다.

그런 다음, 토큰 요청을 위해 cURL 명령을 실행합니다:

$ curl -v -s -X POST $OS_AUTH_URL/auth/tokens?nocatalog   -H "Content-Type: application/json"   -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name":  "'"$OS_PROJECT_NAME"'" } } }}' \
| python -m json.tool

만약 요청이 성공하면, Created (201) 응답 코드를 X-Subject-Token 응답 헤더 안에 있는 토큰 값과 함께 반환합니다. 이 헤더 다음에는 다른 속성과 함께 "expires_at":"datetime" 폼에서 토큰 만료 날짜 및 시각을 가지고 있는 token 유형 객체에 대한 응답 본문이 뒤따릅니다.

다음은 성공한 응답을 보여줍니다:

*   Trying 192.168.56.101...
* Connected to controller (192.168.56.101) port 5000 (#0)
> POST /v3/auth/tokens?nocatalog HTTP/1.1
> Host: controller:5000
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 226
>
} [226 bytes data]
* upload completely sent off: 226 out of 226 bytes
< HTTP/1.1 201 Created
< Date: Fri, 26 May 2017 06:48:58 GMT
< Server: Apache/2.4.18 (Ubuntu)
< X-Subject-Token: gAAAAABZJ8_a7aiq1SnOhbNw8vFb5WZChcvWdzzUAFzhiB99BHrjdSGai--_-JstU3WazsFXmRHNbD07qOQKTp5Sen2R_b9csaDkU49VXqSaJ0jh2nAlwJkys8aazz2oa3xSeUVe3Ndv_HRiW23-iWTr6jquK_AXdhRX7nvM4lmVTrxXFpelnJQ
< Vary: X-Auth-Token
< X-Distribution: Ubuntu
< x-openstack-request-id: req-0e9239ec-104b-40e0-a337-dca91fb24387
< Content-Length: 521
< Content-Type: application/json
<
{ [521 bytes data]
* Connection #0 to host controller left intact
{
    "token": {
        "audit_ids": [
            "HOGlhnMFT52xY7PjbuJZlA"
        ],
        "expires_at": "2017-05-26T07:48:58.000000Z",
        "is_domain": false,
        "issued_at": "2017-05-26T06:48:58.000000Z",
        "methods": [
            "password"
        ],
        "project": {
            "domain": {
                "id": "default",
                "name": "Default"
            },
            "id": "05ef0bf2a79c42b2b8155873b6404061",
            "name": "demo"
        },
        "roles": [
            {
                "id": "b18239b7026042ef8695c3c4cf10607b",
                "name": "user"
            }
        ],
        "user": {
            "domain": {
                "id": "default",
                "name": "Default"
            },
            "id": "12846256e60c42f88d0e1ba9711a57f5",
            "name": "demo",
            "password_expires_at": null
        }
    }
}

참고

위 요청에서, 쿼리 문자열 nocatalog 는 토큰을 얻고자 할 때, 그리고 (사용자가 사용 가능한) 서비스 카탈로그를 채우지 않도록 할 때 사용합니다. 사용자가 서비스 카탈로그를 가져오려면 이 쿼리 문자열을 URL에 덧붙일 필요가 없습니다.

API 요청 보내기

이번 섹션에서는 어떻게 기본 Compute API 요청을 생성할 것인지에 대해 알려줍니다. 전체 Compute API 요청 리스트는 Compute API 를 참고하세요.

OS_TOKEN 환경 변수에 토큰 ID를 출력합니다. 예를 들면:

export OS_TOKEN=gAAAAABZJ8_a7aiq1SnOhbNw8vFb5WZChcvWdzzUAFzhiB99BHrjdSGai--_-JstU3WazsFXmRHNbD07qOQKTp5Sen2R_b9csaDkU49VXqSaJ0jh2nAlwJkys8aazz2oa3xSeUVe3Ndv_HRiW23-iWTr6jquK_AXdhRX7nvM4lmVTrxXFpelnJQ

The token expires every hour by default, though it can be configured differently - see the expiration option in the Identity Service Configuration Guide.

프로젝트 이름을 OS_PROJECT_NAME 환경 변수로 내 보냅니다. 예 :

export OS_PROJECT_NAME=demo

그 다음, Compute API 엔드 포인트를 프로젝트 ID를 포함하는 값으로 변경하여 flavors 목록을 살펴보기 위한 Compute API를 사용합니다:

$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
  $OS_COMPUTE_API/flavors \
  | python -m json.tool
{
    "flavors": [
        {
            "id": "1",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/1",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/1",
                    "rel": "bookmark"
                }
            ],
            "name": "m1.tiny"
        },
        {
            "id": "2",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/2",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/2",
                    "rel": "bookmark"
                }
            ],
            "name": "m1.small"
        },
        {
            "id": "3",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/3",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/3",
                    "rel": "bookmark"
                }
            ],
            "name": "m1.medium"
        },
        {
            "id": "4",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/4",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/4",
                    "rel": "bookmark"
                }
            ],
            "name": "m1.large"
        },
        {
            "id": "5",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/5",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/5",
                    "rel": "bookmark"
                }
            ],
            "name": "m1.xlarge"
        }
    ]
}

해당 토큰 요청에서 $OS_PROJECT_ID를 export하고, Compute API를 사용하여 이미지 목록을 살펴봅니다:

$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
  http://8.21.28.222:8774/v2/$OS_PROJECT_ID/images \
  | python -m json.tool
{
    "images": [
        {
            "id": "2dadcc7b-3690-4a1d-97ce-011c55426477",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/2dadcc7b-3690-4a1d-97ce-011c55426477",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/2dadcc7b-3690-4a1d-97ce-011c55426477",
                    "rel": "bookmark"
                },
                {
                    "href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/2dadcc7b-3690-4a1d-97ce-011c55426477",
                    "type": "application/vnd.openstack.image",
                    "rel": "alternate"
                }
            ],
            "name": "Fedora 21 x86_64"
        },
        {
            "id": "cfba3478-8645-4bc8-97e8-707b9f41b14e",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/cfba3478-8645-4bc8-97e8-707b9f41b14e",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/cfba3478-8645-4bc8-97e8-707b9f41b14e",
                    "rel": "bookmark"
                },
                {
                    "href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/cfba3478-8645-4bc8-97e8-707b9f41b14e",
                    "type": "application/vnd.openstack.image",
                    "rel": "alternate"
                }
            ],
            "name": "Ubuntu 14.04 amd64"
        },
        {
            "id": "2e4c08a9-0ecd-4541-8a45-838479a88552",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/2e4c08a9-0ecd-4541-8a45-838479a88552",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/2e4c08a9-0ecd-4541-8a45-838479a88552",
                    "rel": "bookmark"
                },
                {
                    "href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/2e4c08a9-0ecd-4541-8a45-838479a88552",
                    "type": "application/vnd.openstack.image",
                    "rel": "alternate"
                }
            ],
            "name": "CentOS 7 x86_64"
        },
        {
            "id": "c8dd9096-60c1-4e23-a486-82955481df9f",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/c8dd9096-60c1-4e23-a486-82955481df9f",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/c8dd9096-60c1-4e23-a486-82955481df9f",
                    "rel": "bookmark"
                },
                {
                    "href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/c8dd9096-60c1-4e23-a486-82955481df9f",
                    "type": "application/vnd.openstack.image",
                    "rel": "alternate"
                }
            ],
            "name": "CentOS 6.5 x86_64"
        },
        {
            "id": "f97b8d36-935e-4666-9c58-8a0afc6d3796",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/f97b8d36-935e-4666-9c58-8a0afc6d3796",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/f97b8d36-935e-4666-9c58-8a0afc6d3796",
                    "rel": "bookmark"
                },
                {
                    "href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/f97b8d36-935e-4666-9c58-8a0afc6d3796",
                    "type": "application/vnd.openstack.image",
                    "rel": "alternate"
                }
            ],
            "name": "Fedora 20 x86_64"
        }
    ]
}

해당 토큰 요청에서 $OS_PROJECT_ID를 export하고, Compute API를 사용하여 서버 목록을 살펴봅니다:

$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
  http://8.21.28.222:8774/v2/$OS_PROJECT_ID/servers \
  | python -m json.tool
{
    "servers": [
        {
            "id": "41551256-abd6-402c-835b-e87e559b2249",
            "links": [
                {
                    "href": "http://8.21.28.222:8774/v2/f8828a18c6484624b571e85728780ba8/servers/41551256-abd6-402c-835b-e87e559b2249",
                    "rel": "self"
                },
                {
                    "href": "http://8.21.28.222:8774/f8828a18c6484624b571e85728780ba8/servers/41551256-abd6-402c-835b-e87e559b2249",
                    "rel": "bookmark"
                }
            ],
            "name": "test-server"
        }
    ]
}

OpenStack 커맨드라인 클라이언트

스크립트 작업 및 간단한 요청의 경우, openstack-client 클라이언트와 같은 커맨드라인 클라이언트를 사용할 수 있습니다. 이 클라이언트는 커맨드 인터페이스를 이용하여 Compute API를 사용할 수 있도록 합니다. 또한, 각 OpenStack 프로젝트는 Python API 바인딩과 명령 라인 인터페이스 (CLI)를 포함하는 적절한 클라이언트 프로젝트를 가집니다.

커맨드라인 클라이언트에 대한 자세한 정보는, OpenStack Command-Line Interface Reference 를 확인합니다.

클라이언트 설치

pip 를 사용하여 OpenStack 클라이언트를 Mac OS X 또는 Linux 시스템에 설치합니다. 쉬우며 Python Package Index 으로부터 최신 버전의 클라이언트를 얻는 것을 보장합니다. 또한, pip 로 패키지를 업데이트하거나 제거할 수 있습니다.

각 프로젝트에 대한 클라이언트를 별도로 설치해야 하지만, python-openstackclient 는 여러 프로젝트를 포함합니다.

클라이언트 패키지 설치 또는 업데이트:

$ sudo pip install [--upgrade] python-PROJECTclient

PROJECT 은 프로젝트 이름입니다.

예를 들면, openstack 클라이언트를 설치하려면:

$ sudo pip install python-openstackclient

openstack 클라이언트를 업데이트 하려면, 이 명령을 실행합니다:

$ sudo pip install --upgrade python-openstackclient

openstack 클라이언트를 제거하려면, 이 명령을 실행합니다:

$ sudo pip uninstall python-openstackclient

클라이언트 명령어를 실행 가능하도록 하기 전에, openrc 파일을 다운로드 및 소스로 사용하여 환경 변수를 설정해야 합니다.

openrc 파일을 소스로 사용하는 법을 포함한 OpenStack 클라이언트에 대한 자세한 정보는 OpenStack End User Guide, OpenStack Administrator Guide, 그리고 OpenStack Command-Line Interface Reference 를 살펴봅니다.

인스턴스 실행

인스턴스를 시작하기 위해 이름, 이미지, 인스턴스의 flavor를 선택해야 합니다.

사용 가능한 이미지 목록을 확인하려면, openstack 클라이언트를 통해 Compute API를 호출합니다:

$ openstack image list
+--------------------------------------+------------------+
| ID                                   | Name             |
+--------------------------------------+------------------+
| a5604931-af06-4512-8046-d43aabf272d3 | fedora-20.x86_64 |
+--------------------------------------+------------------+

Flavor 목록을 확인하려면, 다음 명령을 실행하십시오:

$ openstack flavor list
+----+-----------+-----------+------+-----------+------+-------+-----------+
| ID | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-----------+
| 1  | m1.tiny   | 512       | 0    | 0         |      | 1     | True      |
| 2  | m1.small  | 2048      | 20   | 0         |      | 1     | True      |
| 3  | m1.medium | 4096      | 40   | 0         |      | 2     | True      |
| 4  | m1.large  | 8192      | 80   | 0         |      | 4     | True      |
| 42 | m1.nano   | 64        | 0    | 0         |      | 1     | True      |
| 5  | m1.xlarge | 16384     | 160  | 0         |      | 8     | True      |
| 84 | m1.micro  | 128       | 0    | 0         |      | 1     | True      |
+----+-----------+-----------+------+-----------+------+-------+-----------+

인스턴스를 시작하기 전, 원하는 이미지와 flavor의 ID를 확인합니다.

my_instance 인스턴스를 구동하려면, 이미지, flavor ID, 서버 이름과 같이 openstack server create 명령어를 다음과 같이 실행합니다:

$ openstack server create --image a5604931-af06-4512-8046-d43aabf272d3 --flavor 1 my_instance
+--------------------------------------+---------------------------------------------------------+
| Field                                | Value                                                   |
+--------------------------------------+---------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                  |
| OS-EXT-AZ:availability_zone          | nova                                                    |
| OS-EXT-STS:power_state               | 0                                                       |
| OS-EXT-STS:task_state                | scheduling                                              |
| OS-EXT-STS:vm_state                  | building                                                |
| OS-SRV-USG:launched_at               | None                                                    |
| OS-SRV-USG:terminated_at             | None                                                    |
| accessIPv4                           |                                                         |
| accessIPv6                           |                                                         |
| addresses                            |                                                         |
| adminPass                            | 3vgzpLzChoac                                            |
| config_drive                         |                                                         |
| created                              | 2015-08-27T03:02:27Z                                    |
| flavor                               | m1.tiny (1)                                             |
| hostId                               |                                                         |
| id                                   | 1553694c-d711-4954-9b20-84b8cb4598c6                    |
| image                                | fedora-20.x86_64 (a5604931-af06-4512-8046-d43aabf272d3) |
| key_name                             | None                                                    |
| name                                 | my_instance                                             |
| os-extended-volumes:volumes_attached | []                                                      |
| progress                             | 0                                                       |
| project_id                           | 9f0e4aa4fd3d4b0ea3184c0fe7a32210                        |
| properties                           |                                                         |
| security_groups                      | [{u'name': u'default'}]                                 |
| status                               | BUILD                                                   |
| updated                              | 2015-08-27T03:02:28Z                                    |
| user_id                              | b3ce0cfc170641e98ff5e42b1be9c85a                        |
+--------------------------------------+---------------------------------------------------------+

참고

OpenStack 구성요소들이 사용하는 디폴트 포트에 관한 정보는, OpenStack Installation GuideFirewalls and default ports 를 살펴봅니다.