Deltacloud 2013-02-21

2013. 10. 23. 21:09Cloud/멀티클라우드

Deltacloud

- RedHat이 지원하는 하이브리드 클라우드 소프트웨어 프로젝트

1) 소개

DeltaCloud는 Public / private 클라우드 간에 상호 호환할 수 있는 개발자, 도구, 스크립트, 어플리케이션 생태계 조성을 위한 공통된 API개발을 목표로 시작되었으며, RedHot주도의 오픈소스 프로젝트로 진행되고 있다. DeltaCloud는 EC2등의 퍼블릭 클라우드 서비스와 OpenNebula등으로 구축한 내부 클라우드 팜을 하나로 통합하여 동일한 인터페이스로 관리 할 수 있도록 해준다. Deltacloud는 클라우드 서버들간에 하나의 추상화되고 통일된 Cloud API를 제공한다. 이렇게 함으로서 Deltacloud는 클라우드 API의 변경 및 비호환성으로 인한 개발자들의 애플리케이션을 보호해준다. 또한, 인터페이스가 개방형이라 자사의 솔루션 뿐만 아니라 타사의 솔루션을 쉽게 연결이 가능하고, 이를 통해서 클라우드 환경의 유연성을 확보가 가능하다. 이에 개발자들은 자신들이 원하는 클라우드 인스턴스를 관리하는데만 집중을 할 수 있는 장점을 가질 수 있다. Deltacloud는 드라이버 기반으로 API를 EC2와 같은 Public CLoud나 VMware 나 KVM등에 기반한 프라이빗 클라우드를 매핑시키며, 클라우드 브로커와 같은 다양한 클라우드 기반 서비스 모델을 가능하게 한다.

DeltaCloud는 컴퓨팅 노드에 대한 새로운 인스턴스를 생성하고, 인스턴스를 재부팅하며, 하드웨어 프로필 및 OS정보를 받아 올 수 있으며 Storage 측면에서는 이를 제어하고 데이터를 읽기/쓰기 기능을 지원하는 등의 기능을 제공한다.

2) 특징

DeltaCloud는 개발자나 ISV가 클라우드를 서비스를 이용하기 위해서 사용해야 하는 프로그래밍 인터페이스를 추상화하여 공통된 API를 제공하고 있으며 다음과 같은 특징을 가진다.

    - Ruby 언어로 구성되어 있다.

- REST API (simple, any-platform acesss) 기반 ( OS플랫폼이나 프로그래밍 언어에 관계없이 쉽게 연결하여 사용 )

    - EC2, RHEV-M, Rackspace 지원 ( VMware ESX 향후 지원 예정)

    - 버전간 하위 호환성 확보를 통한 안정성 향상

 

DeltaCloud Portal은 DeltaCloud API의 웹기반 UI로서 다음과 같은 기능들을 제공한다.

    - 이미지 상태나 클라우드 상태에 대한 중앙 집중적인 관리 가능

    - 클라우드 간에 인스턴스 마이그레이션 기능

    - 로컬 이미지 관리 및 클라우드 프로비저닝 지원

DeltaCloud가 지원하는 CloudService 별 기능은 다음과 같다.

< Compute Driver Functionality>

 

< Storage Driver Functionality >

 

 

 

3) 구조도

DeltaCloud는 드라이버 기반으로 각 클라우드 프로바이더에 접근할 수 있는 프레임워크를 제공하며 REST기반으로 이용할 수 있는 공통된 API집합을 제공한다.

< DeltaCloud Architecture >

Deltacloud는 Client나 사용자로부터 받는 REST API를 클라우드 Iaas 제공업체에 대한 API호출(드라이버)로 변경하여 Client와 클라우드 서비스 업체 간에 통신을 원활하게 한다.

 

Deltacloud는 Server 자체가 Ruby로 프로그래밍 되어 있으며, 내부적으로 두가지 주요한 영역이 있는데 서버코드의 첫번째 부분에는 수신 및 HTTP요청과 답변형식으로 웹서비스 작업의 일반적인 특성을 나타내고 있으며, 두번째 부분은 생성할 실제 서버에 대한 지식 없이도 클라우드 드라이버 API를 서로 연결하게 하는 간단한 인터페이스로 구성되어 있다.

클라이언트는 Deltacloud Server에 REST인터페이스를 통해 요청하며 이에 Deltacloud Server는 해당 Cloud Service Provider의 Driver를 사용한다. 즉 클라이언트는 HTTP인증에 대한 헤더를 사용하여 선택한 클라우드 엑세스 정보를 모두 보내게 되고, 정보를 받은 Deltacloud Server는 이를 바탕으로 각 Cloud Service Privder의 Driver를 사용하여 사용자의 요구하는 것에 대해 처리 해주는 것이다. 또한 Deltacloud는 모든 Cloud Service Provider에서 지원하는 기본 인터페이스를 지원한다.

REST API의 장점은 단 하나의 API entrypoint를 가지고 있다는 것이다. 진입점의 URL에서 XML, Deltacloud Server를 통하여 리소스인 하드웨어프로필, 인스턴스, 영역등에 대한 자원 컬렉션을 URL에 넣어 사용하게 되면 반환 되는XML문서에는 Cloud Service를 사용한거와 같은 통지를 받아 볼 수 있다.

DeltaCloud는 2010년 3월 8일부터 아파치 재단과 함께 소스 개발 프로젝트가 시작되었고, 현재 IBM, 아마존, Rackspace등이 참여하고 있으며 아래와 같이 3개의 파일들로 구성된다.

1. DetlaCloud 코어

2. DeltaCloud API를 통해서 Deltacloud에 액세스 하기 위한 라이브러리 (libdeltacloud-LPGLV2)

3. DeltaCloud API으로 통신을 하기 위한 콘솔기반의 DeltaCloud 클라이언트

Deltacloud를 사용하는 방법에는 Ruby Client를 이용한 방법, CuRL을 통하여 Deltacloud REST API의 REQUEST를 cUrl에 적용시키는 방법, 직접 http4e나 REST API Command Line TOOl을 사용하여 REQUEST하는 방법이 있다. ( * 각 방법에 대한 내용은 밑에 설명 되어있다 )

또한, Deltacloud의 REST 인터페이스에 대한 사용을 단순화하여 사용하기 위해서는 델타클라우드 프로젝트 CLI도구를 사용하면 된다.

*마지막으로, Deltacloud와 Libcloud(python), jcloud(java)와의 가장 큰 차별성은 언어 독립적이며, 웹 서비스로 사용할 수 있는 유일한 클라우드 추상 API라는 것이다.

 

 

4) 사용방법

DeltaCloud 패캐지를 설치 하기 위해서는 아래의 패키지들이 준비되어야한다.

Ruby / Ruby-devel / gcc-c++ / libxml2-devel / libxslt-devel

가) DeltaCloud 설치

DeltaCloud는 현재 DeltaCloud Portal에 대한 소스코드와 Fedora Corea 11 환경에서 빌드된 RPM 패키지를 다음의 사이트에서 다운로드받을 수 있다.

http://fedorahosted.org/released/deltacloud/

 

< Fedora, RedHat Enterprise Linux에서의 설치 >

Ruby and Ruby-devel

1) 먼저 기존에 Ruby가 설치 되었는지 확인을 한다.

$ ruby -v

ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-linux]

 

2) Ruby 설치 ( DeltaCloud는 최소한 Ruby1.8.7을 필요로 하며, C확장과 일부 Rubygems에 의존하기 때문에 Ruby-devel을 설치해야 한다. )

$ sudo yum install ruby

$ sudo yum install ruby-devel

 

3) RubyGems 설치

$ sudo yum install rubygems

 

4) Gcc-C++, Libxml2, Libxml2-devel, libxslt, libxslt-devel, sqlite, sqlite-devel 설치

$ sudo yum install gcc-c++

$ sudo yum install libxml libxml2-devel

$ sudo yum install libxslt libxslt-devel

$ sudo yum install sqlite sqlite-devel

 

5) Rake 설치

$ sudo gem install rake

 

나) DeltaCloud 서버를 실행

서버를 입력하여 시작

deltaCloudd –I driver_id

Driver_id는 당신이 사용하려는 Cloud의 이름 (EX. Deltacloudd –I ec2)

$ deltacloudd -l

Available drivers:

* condor

* vsphere

* opennebula

* eucalyptus

* rhevm

* sbc

* azure

* gogrid

* mock

* rackspace

* rimuhosting

* terremark

* ec2

 

다) CuRL 설치

CURL은 HTTP등 각종 프로톨 간의 데이터를 전송하는 커맨드 툴이다. Linux, Windows, Mac OS, Solaris등 여러가지 플랫폼에 대응하고 있으며, 대부분의 Linux 디스트리뷰션에는 CURL이 패키지로 동봉되어 있다

1) CURL 설치

Redhot enterprise linux의 경우 다음과 같이 커미널 코맨드를 사용하여 인스톨한다.

Yum install curl

 

2) CuRL 사용

Curl에서는 커맨드라인 인터페이스를 이용하여 HTTP 서버에 Request를 송신한다. 사용법은 다음과 같다.

Usage: curl [option] uri

Uri에 따라 HTTP 어드레스가 참조되어 Request가 송신된다. 이것은 API Entry point 내의 Red hat Enterprise Virutalization Manager 호스트상의 장소에 있다 (./api)

3) cUrl의 옵션

x COMMAND, --request COMMAND

Request 메소드를 지정하는 커맨드이다. REST API에서는 GET, POST, PUT, DELETE를 사용한다.

H Line, --header LINE

Request에 포함시킬 HTTP헤더이다. 헤더를 복수로 지정할 경우 복수의 옵션으로 지정할 수 있다.

-u USERNAME:PASSWORD, --user USERNAME:PASSWORD

Red Hat Enterpirsie virtualization 유저의 유저명과 패스워드이다. 이 속성은 Authorization:헤더를 대신에 동작하므로 편리하다.

--cacert CERTIFICATE

REST API와 SSL통신 증명서 파일의 장소를 지정한다. 증명서 파일은 클라이언트 머신상의 로컬에 저장된다. SSL을 회피할 경우는 -k속성을 사용한다.

예) –Cacert ~/Certificates/rhevm.cer

D body, --data BODY

송신할 Request의 내용을 지정한다. POST, PUT, DELETE등의 REQUEST에서 사용한다. 전송할 내용이 있을 경우 Content-type: application/xml을 필히 지정한다.

예) –d "<cdrom>><file id='rhel-server-6.0-x86_64-dvd.iso'/></cdrom>

 

4) 예시

다음의 예는 REST의 Requst를 CuRL커맨드 구문에 적용시키는 방법을 나타낸다.

예시 1) GET 리퀘스트

다음의 Get Request에서 VMS컬렉션 내의 가상 머신의 리스트를 표시한다. GET 리퀘스트는 내용을 포함하지 않는 점을 주의해야 한다.

메소드(GET), 헤더(accep: application/xml), URL(http://[rhevm-host]:8443/api/vms를 다음의 curl커맨드를 적용 시킨다.

Vms 컬렉션의 XML표현이 표시 된다.

 

라) HTTP4e를 설치

REST API를 사용하여 Request하고 Response 결과를 받기위해서는 HTTP4e가 필요하다.

설치과정은 생략

 

 

 

다) DeltaCloud API사용

< Deltacloud REST API>

DeltaCloud API는 서비스 기반 REST API로서 사용자 프로그램 내에 DeltaCloud라이브러리를 직접 링크할 필요는 없고 REST인터페이스를 구현한 서버에 HTTP기반으로 DeltaCloud API를 호출하여 사용하게 된다.

Deltacloud API에서 사용되는 추상적인 관념(콜렉션) 들은 다음과 같다.

Realms

데이터 센터 위치

Instances

클라우드에서 실행되는 가상 서버

인스턴스는 서버이미지에서 인스턴스화 됨

Images

인스턴스가 생성되는 템플릿, 각 이미지의 인스턴스의 운영체제에 루트파티션과 초기 스토리지를 정의한다.

Instance states

인스턴스 라이프 사이클 ( 중지, 실행중, 보류, 시작, 완료)

Keys

실행중인 인스턴스에 엑세스 하는데 있어 필요한 자격증명

키에는 암호화(RSA 키)된 형태를 포함한다.

Storage volume

인스턴스에 연결하고 OS의 가상 저장 장치

Storage snapshot

저장 볼륨에 복사한 스냅샷

Bucket

데이터 모양에 대한 컨테이너

Blob

지정된 버킷 내에 존재하는 일반적인 이진 데이터 항목 (Ex S3와 CloudFile에서 개체)

Address

IP주소, 클라우드 제공업체에 따라 공개,비공개 설정 가능, public주소는 라우팅 IP주소이며, private주소는 개인 네트워크내의 라우팅 주소

Load balancer

인스턴스의 수에 지정된 Ip주소로서 수신된 네트워크의 트래픽을 분산시킨다.

Filewalls

Public 인터넷을 통해 실행중인 인스턴스의 접근성에 적용 규칙을 설정한다

Metrics

CPU사용률, 네트워크 처리량에 대한 정보를 제공, 이것은 스케일링 및 모니터링을 위한 개발자들에게 도움이 된다 (EC2의 Cloudwatch등을 지원)

< Deltacloud Collection >

Deltacloud에서 클라이언트에 요청을 보내기 위해서는 REST의 원칙에 따라 표준 HTTP에 따라 GET / POST PUT / DELETE를 통해 요청을 한다. API의 URL 부분은 자원의 컬렉션(위 표) 로 구성되어 있다. (Realms, Images, instance state, instances, keys, storage volumes, storage snapshots, blob storage, hardware profiles and drivers) 또한 클라우드 Service에 대한 인증에 있어 Deltaccloud는 클라우드 서비스 공급업체에 대한 자격증명을 지원하지 않는다. 대신 HTTP기본인증을 사용하고, 고객의 인증 요청(사용자의 이름/비밀번호)를 전송하여 인증한다. 전송하는 방법은 클라우드 서비스 공급업체 별로 다르며, 일부 클라우드 제공업체는 API엑세스를 위한 사용자이름과 암호는 다른 특수한 API를 사용하여 요청한다.

<cloud Provider Credentials>

Cloud

Driver

UserName

Password

참고사항

AWS(EC2,S3)

EC2

Access key ID

Secret access key

Retrieve neccessary information from the Security Credentials page in your AWS account.

Eucalyptus

eucalyptus

Access Key ID

Secret access key

 

Opennebula

Opennebula

Opennebula user

OpenNebula password

Opennebula의 OCCI 서버가 수신대기하는 주소로 환경 변수 OCCI_URL을 설정

Openstack

openstack

Openstack user

The username is OpenStack user name and tenant_name concatenated with a '+' and password is your openstack service password

Set the environment variable API_PROVIDER to the URL of Keystone Identity service. Alternatively use the '-P' option when starting the Deltacloud server..

 

Deltacloud 서버는 다양한 형식의 클라이언트 요청에 응답할 수 있다. 응답형식은 HTTP에 의해 결정되며, 기본형식은 XML이다. 출력은 JSON으로 하며 HTML으로도 사용 가능하다. 클라이언트에 대한 특정 응답 요청은 format = request parameter (http://deltacloudserver.foo/api?format=xml or http://deltacloudserver.foo/api?format=json).

으로 할 수 있다. 또한 일반적으로 HTMl인터페이스의 경우 GET/api/Realms 으로 이 자원유형의 대한 객체목록을 볼 수 있다. 자세한 내용은 GET/API/Realams/:id로 확인 할수 있다.

API Convention은 객체를 나타내며, 모든 XML요소 (ex. 인스턴스)가 HREF, ID속성을 지정해야 한다. Href 속성이 객체 특정 작업( ex GET 개체의 세부 정보를 반환하는 GET 작업을 URL에 적용) 을 수행할 수 있는 URL을 제공한다.

<Deltacloud API - Working With cURL as a command Line Client >

- REST의 Request를 CURL 커맨드 구문에 적용 시킴

- 자격 증명은 –user "name:password"

- Request Header는 –H "header:value" 이며, Deletacloud에 원하는 응답 형식을 지정하는 방법을 사용할 수 있다. "?Format="

* 아래에 있는 모든 예제는 deltacloud Sever가 Localhost:3001에서 실행중인 것으로 가정한다.

① Working with instnaces

XmL 형식의 인스턴스 전체 목록을 표시한다.

curl --user "user:pass" http://localhost:3001/api/instances?format=xml

또는 수동으로 수락헤더를 지정할 수 있다.

curl --user "user:pass" -H "Accept: application/xml" http://localhost:3001/api/instances

인스턴스를 시작한다. 다음 예제에서는 매개변수가 Application/x-www.form-urlencoded를 지정한다.

curl -X POST --user "user:pass" -d "image_id=ami-84db39ed&hwp_id=m1.small&keyname=marios_key" http://localhost:3001/api/instances?format=xml

Instance –action : -reboot

curl -X POST --user "user:pass" http://localhost:3001/api/instances/reboot?format=xml

Instance에 명령을 실행

curl -X POST --user "user:pass" -F "cmd=uname -a; ls -l" -F "private_key=`cat /location/of/ssh/keyfile`" http://localhost:3001/api/instances/i-d77cd0ac/run?format=xml

 

Working with Image

특정 이미지에 대한 세부정보를 얻음

curl --user "user:pass" http://localhost:3001/api/images/ami-3dc06a54?format=xml

이미지 생성

curl -X POST --user "user:pass" -d "instance_id=i-d77cd0ac&name=mariostestimage" http://localhost:3001/api/images?format=

 

 

이미지 삭제

curl -X DELETE --user "user:pass" http://localhost:3001/api/images/ami-3dc06a54?format=xml

Working with hardware Profiles

모든 하드웨어 프로필 목록을 가져옴

curl --user "user:pass" http://localhost:3001/api/hardware_profiles?format=xml

특정 하드웨어 프로필에 대한 내용을 가져옴

curl --user "user:pass" http://localhost:3001/api/hardware_profiles/m2.4xlarge?format=xml

 

④ Working With Keys

모든 키의 목록을 가져옴

curl --user "user:pass" http://localhost:3001/api/keys?format=xml

키 생성

curl -X POST --user "user:pass" -d "name=mynewkey" http://localhost:3001/api/keys?format=xml

키 삭제

curl -X DELETE --user "user:pass" http://localhost:3001/api/keys/mynewkey?format=xml

 

Working with Filewalls

모든 방화벽 목록을 가져옴

curl -v --user "user:pass" http://localhost:3001/api/firewalls?format=xml

새로운 방화벽을 만듬

curl -v -X POST --user "user:pass" -d "name=my_new_firewall&description=a test firewall" http://localhost:3001/api/firewalls?format=xml

방화벽 규칙을 만듬

curl -v -X POST --user "user:pass" -F "protocol=tcp" -F "port_from=22" -F "port_to=22" -F "group1=default" -F "group1owner=821108636519" -F "ip_address1=192.168.1.1/24" -F "ip_address2=65.128.31.27/32" http://localhost:3001/api/firewalls/my_new_firewall/rules

방화벽 규칙을 삭제

curl -v -X DELETE --user "user:pass" http://localhost:3001/api/firewalls/marios_test_firewall/821108636519~tcp~22~22~@group,821108636519,default,@address,ipv4,192.168.1.1,24,@address,ipv4,65.128.31.27,32?format=xml

방화벽을 삭제

curl -v -X DELETE --user "user:pass" http://localhost:3001/api/firewalls/marios_test_firewall?format=xm

 

Working with address

모든 주소 목록을 가져옴

curl -v --user "user:pass" http://localhost:3001/api/addresses?format=xml

새 주소 생성

curl -v --user "user:pass" -X POST http://localhost:3001/api/addresses?format=xml

인스턴스와 주소를 연결

curl -v -X POST --user "user:pass" -d "instance_id=i-d77cd0ac" http://localhost:3001/api/addresses/23.23.176.127/associate?format=xml

인스턴스에서 주소와의 연결을 끊음

curl -v -X POST --user "user:pass" http://localhost:3001/api/addresses/23.23.176.127/disassociate?format=xml

주소 삭제

curl -v -X DELETE --user "user:pass" http://localhost:3001/api/addresses/23.23.176.127?format=xml

 

Working with load balancer

모든 load balancer 목록을 가져옴

curl -v --user "user:pass" http://localhost:3001/api/load_balancers?format=xml

Load balancer 생성

curl -v -X POST --user "user:pass" -d "name=webtraffic-balancer&realm_id=us-east-1c&listener_protocol=HTTP&listener_balancer_port=80&listener_instance_port=3001" http://localhost:3001/api/load_balancers?format=xml

Load balcaner 인스턴스 등록

curl -v -X POST --user "user:pass" -d "instance_id=i-4f06b52e" http://localhost:3001/api/load_balancers/webtraffic-balancer/register?format=xml

Load balancer에서 인스턴스의 등록을 취소

curl -v -X POST --user "user:pass" -d "instance_id=i-4f06b52e" http://localhost:3001/api/load_balancers/webtraffic-balancer/unregister?format=xml

 

Load balancer 삭제

curl -v --user "user:pass" -X DELETE http://localhost:3001/api/load_balancers/web-traffic-balancer

 

 

 

< Deltacloud API – REST API Entry Point >

Deltacloud REST API 의 Entry Point는 http://localhost:3001/api 이며 현재 클라우드 제공 업체의 리소스 정보를 보여준다. 예를 들어 아마존 EC2 드라이버는 다음과 같다.

  • instances
  • instance states
  • images
  • realms
  • hardware profiles
  • keys
  • buckets
  • storage volumes
  • storage snapshots
  • load balancers
  • addresses
  • firewalls

Example Request

GET /api?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 1439

 

<api driver='ec2' version='0.3.0'>

<link href='http://localhost:3001/api/instance_states' rel='instance_states'>

</link>

<link href='http://localhost:3001/api/drivers' rel='drivers'>

</link>

<link href='http://localhost:3001/api/addresses' rel='addresses'>

</link>

<link href='http://localhost:3001/api/hardware_profiles' rel='hardware_profiles'>

</link>

<link href='http://localhost:3001/api/firewalls' rel='firewalls'>

</link>

<link href='http://localhost:3001/api/storage_volumes' rel='storage_volumes'>

</link>

<link href='http://localhost:3001/api/images' rel='images'>

<feature name='owner_id'>

</feature>

</link>

<link href='http://localhost:3001/api/realms' rel='realms'>

</link>

<link href='http://localhost:3001/api/buckets' rel='buckets'>

<feature name='bucket_location'>

</feature>

</link>

<link href='http://localhost:3001/api/instances' rel='instances'>

<feature name='user_data'>

</feature>

<feature name='authentication_key'>

</feature>

<feature name='firewalls'>

</feature>

<feature name='instance_count'>

</feature>

<feature name='attach_snapshot'>

</feature>

</link>

<link href='http://localhost:3001/api/storage_snapshots' rel='storage_snapshots'>

</link>

<link href='http://localhost:3001/api/keys' rel='keys'>

</link>

<link href='http://localhost:3001/api/load_balancers' rel='load_balancers'>

</link>

</api>

Deletacloud API는 모든 리소스 유형을 지원하지는 않는다. 예를 들어 스토리지 전용 서비스의 인스턴스를 가르키는 Deltacloud 인스턴스는 인스턴스 및 하드웨어 프로필 같은 리소스를 알 수가 없다.

Deltacloud API는 콜렉션을 통하여 리소스 유형에 대한 정의를 할 수 있다.

사용자가 지정한 이름으로 인스턴스에 할당 시키는 예

<api driver='mock' version='0.3.0'>

...

<link href='http://localhost:3001/api/instances' rel='instances'>

<feature name='hardware_profiles'></feature>

<feature name='user_name'></feature>

<feature name='authentication_key'></feature>

</link>

...

</api>

이러한 기능은 다른 각 컬렉션에 응용하여 사용할 수 있다.

Feature

Collection

Operation

Description

Owner_id

Images

GET/api/images

Owner_id의 이미지 목록을 가져옴

User_name

Instance

POST/api/instnace

인스턴스 생성에 사용자 정의 이름으로 생성

User_data

Instance

OST/api/instnace

실행중인 인스턴스에 대해 엑세스

User_iso

Instance

OST/api/instnace

실행중인 인스턴스에 대해 CD-ROM 드라이브로 엑세스 할수 있는 base64로 압축 ISO파일을 제공

User_files

Instance

OST/api/instnace

사용자 파일 업로드

Firewwalls

Instance

OST/api/instnace

인스턴스에 방화벽 설정

Authentication_key

Instance

OST/api/instnace

인스턴스에 엑세스 할 인증키 부여

Authentication_password

Instance

OST/api/instnace

실행중인 인스턴스에 엑세스 할 암호 설정

Instance_count

Instance

OST/api/instnace

하나의 작업에서 실행되는 인스턴수 수 지정

Attach_snapshot

Instance

OST/api/instnace

인스턴스의 저장 볼륨에 스냅 샷을 설정

Sandboxing

Instance

OST/api/instnace

샌드 박스 이미지(GoGRID)에 서 인스턴스 실행

Bucket_location

buckets

OST/api/instnace

특정 클라우드 서비스 업체의 데이터센터 위치를 지정

 

< Deltacloud REST Compute API >

1) Realms

Realm은 데이터 센터의 위치이며, 이는 클라우드 서비스 업체에 의해 제공 받는다.

< 서비스 가능한 Location의 목록을 가져오는 방법 >

사용 가능한 모든 location을 가져오려면 Get/api/realms 로 호출 한다. 또한 매개변수를 추가하여 해당 목록을 필터링 할 수 있다. 아래의 예는 AWS EC2 드라이버에 대한 서비스가 가능한 Location의 검색을 보여준다.

Example Request

GET /api/realms?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 639

<?xml version='1.0' encoding='utf-8' ?>

<realms>

<realm href='http://localhost:3001/api/realms/us-east-1a' id='us-east-1a'>

<name>us-east-1a</name>

<state>available</state>

</realm>

<realm href='http://localhost:3001/api/realms/us-east-1b' id='us-east-1b'>

<name>us-east-1b</name>

<state>available</state>

</realm>

<realm href='http://localhost:3001/api/realms/us-east-1c' id='us-east-1c'>

<name>us-east-1c</name>

<state>available</state>

</realm>

<realm href='http://localhost:3001/api/realms/us-east-1d' id='us-east-1d'>

<name>us-east-1d</name>

<state>available</state>

</realm>

</realms>

Location에 대한 세부정보를 가져 오려면 GET/api/realms/:id 로 호출하면 서버는 ID, State(AVAILABLE, UNAVILABLE), limit를 응답한다.

아래의 예는 Rackspace의 Location을 보여준다. Deltacloud의 Rackspace Driver는 Cloud Service Location에 대해 미국만을 지원한다.

Example Request

GET /api/realms/us?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 182

 

<?xml version='1.0' encoding='utf-8' ?>

<realm href='http://localhost:3001/api/realms/us' id='us'>

<name>United States</name>

<state>AVAILABLE</state>

<limit></limit>

</realm>

 

2) Hardware Profiles

하드웨어 프로필은 Cloud에 가상머신의 크기를 설정하고, 가상 CPU, 메모리, 인스턴스의 로컬저장소와 같은 세부 정보를 설정한다.

Cloud 가상 머신 크기 조정 하는 방법은 Service별로 차이가 있기 때문에 하드웨어 프로필은 일반적인 메커니즘을 제공한다.

- 고정 설정, 크기 고정 ( 메모리 2GB )

- 가변적 설정, 메모리 크기에 대한 범위 설정 (1~4GB)

- 미리 정의 된 집합에서 선택 (512MB~4GIB)

새 인스턴스를 만들 때 클라이언트는 인스턴스의 하드웨어 프로필을 지정해야 한다.

모든 사용 가능한 하드웨어 프로필 목록을 가져오기 위해서는 GET/api/hardware_profiles을 호출하여 불러올수 있다. 아래의 예는 EC2 클라우드에서 사용 할 수 있는 하드웨어 프로필을 나열하는 방법이다. EC2는 미리 정의 된 하드웨어 프로필 집합을 제공한다.

Example request

GET /api/hardware_profiles?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 3896

<?xml version='1.0' encoding='utf-8' ?>

<hardware_profiles>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/t1.micro' id='t1.micro'>

<name>t1.micro</name>

<property kind='fixed' name='cpu' unit='count' value='1' />

<property kind='fixed' name='memory' unit='MB' value='645.12' />

<property kind='fixed' name='architecture' unit='label' value='i386' />

<property kind='fixed' name='storage' unit='GB' value='160' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m1.small' id='m1.small'>

<name>m1.small</name>

<property kind='fixed' name='cpu' unit='count' value='1' />

<property kind='fixed' name='memory' unit='MB' value='1740.8' />

<property kind='fixed' name='architecture' unit='label' value='i386' />

<property kind='fixed' name='storage' unit='GB' value='160' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m1.large' id='m1.large'>

<name>m1.large</name>

<property kind='fixed' name='cpu' unit='count' value='4' />

<property kind='fixed' name='memory' unit='MB' value='7680.0' />

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

<property kind='fixed' name='storage' unit='GB' value='850' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m1.xlarge' id='m1.xlarge'>

<name>m1.xlarge</name>

<property kind='fixed' name='cpu' unit='count' value='8' />

<property kind='fixed' name='memory' unit='MB' value='15360' />

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

<property kind='fixed' name='storage' unit='GB' value='1690' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/c1.medium' id='c1.medium'>

<name>c1.medium</name>

<property kind='fixed' name='cpu' unit='count' value='5' />

<property kind='fixed' name='memory' unit='MB' value='1740.8' />

<property kind='fixed' name='architecture' unit='label' value='i386' />

<property kind='fixed' name='storage' unit='GB' value='350' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/c1.xlarge' id='c1.xlarge'>

<name>c1.xlarge</name>

<property kind='fixed' name='cpu' unit='count' value='20' />

<property kind='fixed' name='memory' unit='MB' value='7168' />

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

<property kind='fixed' name='storage' unit='GB' value='1690' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m2.xlarge' id='m2.xlarge'>

<name>m2.xlarge</name>

<property kind='fixed' name='cpu' unit='count' value='6.5' />

<property kind='fixed' name='memory' unit='MB' value='17510.4' />

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

<property kind='fixed' name='storage' unit='GB' value='420' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m2.2xlarge' id='m2.2xlarge'>

<name>m2.2xlarge</name>

<property kind='fixed' name='cpu' unit='count' value='13' />

<property kind='fixed' name='memory' unit='MB' value='35020.8' />

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

<property kind='fixed' name='storage' unit='GB' value='850' />

</hardware_profile>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m2.4xlarge' id='m2.4xlarge'>

<name>m2.4xlarge</name>

<property kind='fixed' name='cpu' unit='count' value='26' />

<property kind='fixed' name='memory' unit='MB' value='70041.6' />

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

<property kind='fixed' name='storage' unit='GB' value='1690' />

</hardware_profile>

</hardware_profiles>

 

특정 하드웨어 프로필 사용에 대한 자세한 내용을 검색하기 위해서는 GET/api/hardware profiles/:id를 호출하여 알 수 있다. 아래의 예는 Deltacloud 모의 드라이버의 M1 대형 프로필에 대한 요청을 보여준다. 이 하드웨어 프로필은 3가지형식 (고정, 범위, 열거)를 보여준다.

Example Request

GET /api/hardware_profiles/m1-large?format=xml HTTP/1.1

Authorization: Basic bW9ja3VzZXI6bW9ja3Bhc3N3b3Jk

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3003

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 808

 

<?xml version='1.0' encoding='utf-8' ?>

<hardware_profile href='http://localhost:3003/api/hardware_profiles/m1-large' id='m1-large'>

<name>m1-large</name>

<property kind='fixed' name='cpu' unit='count' value='2' />

<property kind='range' name='memory' unit='MB' value='10240'>

<param href='http://localhost:3003/api/instances' method='post' name='hwp_memory' operation='create' />

<range first='7680.0' last='15360' />

</property>

<property kind='enum' name='storage' unit='GB' value='850'>

<param href='http://localhost:3003/api/instances' method='post' name='hwp_storage' operation='create' />

<enum>

<entry value='850' />

<entry value='1024' />

</enum>

</property>

<property kind='fixed' name='architecture' unit='label' value='x86_64' />

</hardware_profile>

 

3) Image

이미지는 인스턴스를 실행하는 데 사용 되며, 각 인스턴스 운영체제의 루트 파티션과 초기 스토리지를 포함한 가상 머신 이미지를 나타낸다. 이미지에는 속성이 있다.

- a human-readable name

- a description

- an owner_id

- an architecture

- a state

Owner_id는 이미지가 속해 있는 사용자 계정을 식별한다. Architecture 속성은 이미지가 32비트, 64비트 인스턴스를 생성할 지 여부를 나타낸다. State 속성은 이미지 상태 ( 실행, 대기, 실패, 보류) 를 나타낸다.

모든 이미지 목록을 가져오기 위해서는 GET/api/images를 호출 하면 된다. 이를 사용하면 사용자 계정에 사용할 수 있는 모든 이미지 목록을 반환한다. 또한 사용자는 Owner_id, architecture 매개 변수를 통하여 선택적으로 반환되는 이미지 목록을 제어 할 수 있다.

Example Request

GET /api/images?owner_id=023801271342&architecture=x86_64&format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 1971

 

<?xml version='1.0' encoding='utf-8' ?>

<images>

<image href='http://localhost:3001/api/images/ami-eea35787' id='ami-eea35787'>

<name>sles-10-sp3-v1.00.x86_64</name>

<owner_id>013907871322</owner_id>

<description>SUSE Linux Enterprise Server 10 Service Pack 3 for x86_64 (v1.00)</description>

<architecture>x86_64</architecture>

<state></state>

<actions>

<link href='http://localhost:3001/api/instances;image_id=ami-eea35787' method='post' rel='create_instance' />

</actions>

</image>

<image href='http://localhost:3001/api/images/ami-6e649707' id='ami-6e649707'>

<name>sles-11-sp1-hvm-v1.00.x86_64</name>

<owner_id>013907871322</owner_id>

<description>SUSE Linux Enterprise Server 11 Service Pack 1 for HVM x86_64 (v1.00)</description>

<architecture>x86_64</architecture>

<state></state>

<actions>

<link href='http://localhost:3001/api/instances;image_id=ami-6e649707' method='post' rel='create_instance' />

</actions>

</image>

<image href='http://localhost:3001/api/images/ami-e4a7558d' id='ami-e4a7558d'>

<name>sles-11-sp1-hvm-v1.01.x86_64</name>

<owner_id>013907871322</owner_id>

<description>SUSE Linux Enterprise Server 11 Service Pack 1 for HVM x86_64 (v1.01)</description>

<architecture>x86_64</architecture>

<state></state>

<actions>

<link href='http://localhost:3001/api/instances;image_id=ami-e4a7558d' method='post' rel='create_instance' />

</actions>

</image>

<image href='http://localhost:3001/api/images/ami-e4a3578d' id='ami-e4a3578d'>

<name>sles-11-sp1-v1.00.x86_64</name>

<owner_id>013907871322</owner_id>

<description>SUSE Linux Enterprise Server 11 Service Pack 1 for x86_64 (v1.00)</description>

<architecture>x86_64</architecture>

<state></state>

<actions>

<link href='http://localhost:3001/api/instances;image_id=ami-e4a3578d' method='post' rel='create_instance' />

</actions>

</image>

 

특정 이미지 사용에 대한 설명을 검색 하기 위해서는 GET/api/images/:id 를 호출 하면된다.

Example request

GET /api/images/14?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 433

 

<?xml version='1.0' encoding='utf-8' ?>

<image href='http://localhost:3002/api/images/14' id='14'>

<name>Red Hat Enterprise Linux 5.4</name>

<owner_id>jsmith</owner_id>

<description>Red Hat Enterprise Linux 5.4</description>

<architecture>x86_64</architecture>

<state>ACTIVE</state>

<actions>

<link href='http://localhost:3002/api/instances;image_id=14' method='post' rel='create_instance' />

</actions>

</image>

 

기존의 실행중인 인스턴스를 사용하여 새로운 이미지를 만들기 위해서는 POST/api/image를 호출하면 된다. 그러나 이 호출은 모든 클라우드 공급업체에 사용 할 수는 없다. 예를 들어 아마존 EC2 클라우드의 경우 EBS 백업 인스턴스가 아닌 Root인스턴스에서만 사용자 지정 이미지를 만들 수 있다.

* RHEV-M, vSphere은 실행중인 인스턴스에서 인스턴스를 만들 수 없으며 오직 중지된 인스턴스에서만 만들 수 있다.

DeltaCloud API는 클라이언트가 특정 인스턴스가 사용자 지정 이미지로 만들 수 있는지 여부를 확인 할 수 있는 메커니즘을 제공한다. 예를 들어 스냅 샷이 가능한 경우, XML<action>목록이 포함되어 있다. Create_image를 통하여 새로운 이미지를 만드는데 사용되는 클라이언트의 URI를 정의한다. 예를 들면 다음과 같다.

...

<actions>

<link href='http://localhost:3002/api/instances/20109341/reboot' method='post' rel='reboot' />

<link href='http://localhost:3002/api/instances/20109341/stop' method='post' rel='stop' />

<link href='http://localhost:3002/api/instances/20109341/run;id=20109341' method='post' rel='run' />

<link href='http://localhost:3002/api/images;instance_id=20109341' method='post' rel='create_image' />

</actions>...

새 이미지를 만들기 위해서는 클라이언트는 instance_id를 지정해야 한다. 선택적으로 클라이언트는 Name과 Description을 지정할 수 있다. 매개변수는 POST에서 Multipart/form-data로 정의 할 수 있다. 또한 application/x-www-form-ulencoded 콘텐츠 유형을 사용하여 매개변수를 지정할 수 있다.

Example Request

POST /api/images?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Content-Length: 96

Content-Type: application/x-www-form-urlencoded

 

instance_id=20109341&name=customisedserver&description=jsmith%20cu

stomised%20web%20server%20July%2021%202011

Server Response

HTTP/1.1 201 Created

Content-Type: application/xml

Content-Length: 427

 

<?xml version='1.0' encoding='utf-8' ?>

<image href='http://localhost:3002/api/images/12346145' id='12346145'>

<name>customisedserver</name>

<owner_id>mandreou</owner_id>

<description>customisedserver</description>

<architecture>x86_64</architecture>

<state>QUEUED</state>

<actions>

<link href='http://localhost:3002/api/instances;image_id=12346145' method='post' rel='create_instance' />

</actions>

</image>

지정된 이미지를 삭제 하려는 경우 DELETE/api/images/:id를 호출 하면 된다. 이에 대한 응답으로 Deltacloud Server는 반응하지 않는다.

Example Request

DELETE /api/images/12346145?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Server Response

HTTP/1.1 204 No Content

 

4) Instance states

각 Cloud 인스턴스에 대한 수명주기 모델을 정의한다. 각각의 상태에 대한 정의는 다음과 같다.

State

Meaning

Start

인스턴스 생성전의 상태

Pending

인스턴스의 생성이 진행중

Running

인스턴스가 실행 중

Shutting-down

인스턴스가 중지 되는 과정

Stoped

인스턴스 중지

finished

모든 리소스 반환

특정 인스턴스의 세부 사항은 인스턴스에서 수행 가능한 작업(상태전환)에 대해 알려준다. 상태 변화로 표시되어 있으면 자동으로 다른 전환으로 이루어진다. 가능한 인스턴스 동작은 다음과 같다.

Action

Meaning

Start

인스턴스 시작

Stop

인스턴스 종료

Reboot

인스턴스 재부팅

destory

인스턴스를 중지하고 완전히 삭제

 

인스턴스를 검색하기 위해서는 GET/api/instance_states를 호출한다.

Example request

GET /api/instance_states?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 583

 

<states>

<state name='start'>

<transition action='create' to='pending'></transition>

</state>

<state name='pending'>

<transition auto='true' to='running'></transition>

</state>

<state name='running'>

<transition action='reboot' to='running'></transition>

<transition action='stop' to='shutting_down'></transition>

</state>

<state name='shutting_down'>

<transition auto='true' to='stopped'></transition>

</state>

<state name='stopped'>

<transition auto='true' to='finish'></transition>

</state>

<state name='finish'>

</state>

</states>

 

5) Instance

Instance는 실행 중인 가상 머신이다. 인스턴스는 지정된 하드웨어 프로필 및 특정 Realm, 이미지에서 생성된다. 각 인스턴스는 다른 속성의 번호를 가질 수 있으며, 가능한 인스턴스의 속성의 전체 목록은 다음과 같다.

Attribute

Meaning

Owner_id

Cloud Provider Account의 ID

Image_id

실행중인 인스턴스의 이미지 ID

Name

인스턴스 시작 때 주어진 ID

Realm_id

인스턴스가 실행된 Location

State

인스턴스의 현재 상태(ex running)

Action

클라이언트가 인스턴스 현재 상태에 따라 주는 영향

Public_addresses

인스턴스의 라우팅 IP주소

Private_addresses

라우팅 전용 네트워크 내의 인스턴스의 개인 IP주소

Instance_profile

메모리, CPU, Storage

launch_time

인스턴스 실행 시간

Keyname

인증을 사용하는 경우의 인증키 이름 (ex. EC2)

User_name

인스턴스 연결 인증을 위한 사용자 이름

Password

사용자 이름과 함께 사용되는 비밀 번호

filewalls

인스턴스의 방화벽

Cloud( 지정된 계정 )에 현재의 모든 인스턴스 목록을 생성하려면 GET/api/instances 로 호출한다.아래의 예는 아마존 EC2 클라우드의 인스턴스 목록을 보여주는 예이다.

Example Request

GET /api/instances?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Client response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 2790

<?xml version='1.0' encoding='utf-8' ?>

<instances>

<instance href='http://localhost:3001/api/instances/i-1fbc627e' id='i-1fbc627e'>

<name>ami-f51aff9c</name>

<owner_id>393485797142</owner_id>

<image href='http://localhost:3001/api/images/ami-f51aff9c' id='ami-f51aff9c'></image>

<realm href='http://localhost:3001/api/realms/us-east-1c' id='us-east-1c'></realm>

<state>RUNNING</state>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/c1.medium' id='c1.medium'>

</hardware_profile>

<actions>

<link href='http://localhost:3001/api/instances/i-1fbc627e/reboot' method='post' rel='reboot' />

<link href='http://localhost:3001/api/instances/i-1fbc627e/stop' method='post' rel='stop' />

<link href='http://localhost:3001/api/instances/i-1fbc627e/run;id=i-1fbc627e' method='post' rel='run' />

</actions>

<launch_time>2011-07-22T11:29:48.000Z</launch_time>

<public_addresses><address>ec2-50-16-183-107.compute-1.amazonaws.com</address></public_addresses>

<private_addresses><address>domU-12-31-39-0F-79-D4.compute-1.internal</address></private_addresses>

<firewalls>

<firewall href='http://localhost:3001/api/firewalls/default' id='default'></firewall>

</firewalls>

<authentication type='key'>

<login>

<keyname>eftah</keyname>

</login>

</authentication>

</instance>

<instance href='http://localhost:3001/api/instances/i-f3ba6492' id='i-f3ba6492'>

<name>ami-2b5fba42</name>

<owner_id>393485797142</owner_id>

<image href='http://localhost:3001/api/images/ami-2b5fba42' id='ami-2b5fba42'></image>

<realm href='http://localhost:3001/api/realms/us-east-1d' id='us-east-1d'></realm>

<state>RUNNING</state>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/m1.small' id='m1.small'>

</hardware_profile>

<actions>

<link href='http://localhost:3001/api/instances/i-f3ba6492/reboot' method='post' rel='reboot' />

<link href='http://localhost:3001/api/instances/i-f3ba6492/stop' method='post' rel='stop' />

<link href='http://localhost:3001/api/instances/i-f3ba6492/run;id=i-f3ba6492' method='post' rel='run' />

</actions>

<launch_time>2011-07-22T11:32:25.000Z</launch_time>

<public_addresses><address>ec2-184-73-78-87.compute-1.amazonaws.com</address></public_addresses>

<private_addresses><address>ip-10-196-89-221.ec2.internal</address></private_addresses>

<firewalls>

<firewall href='http://localhost:3001/api/firewalls/default' id='default'></firewall>

<firewall href='http://localhost:3001/api/firewalls/test' id='test'></firewall>

</firewalls>

<authentication type='key'>

<login>

<keyname>eftah</keyname>

</login>

</authentication>

</instance>

</instances>

 

인스턴스의 세부 정보를 가져오기 위한 호출 방법으로는 GET/api/instance/:id 로 호출하면 된다. 아래의 예는 Rackspace의 인스턴스를 보여준다.

Example Request

GET /api/instances/20112212?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 1167

<?xml version='1.0' encoding='utf-8' ?>

<instance href='http://localhost:3002/api/instances/20112212' id='20112212'>

<name>myserver</name>

<owner_id>mandreou</owner_id>

<image href='http://localhost:3002/api/images/53' id='53'></image>

<realm href='http://localhost:3002/api/realms/us' id='us'></realm>

<state>RUNNING</state>

<hardware_profile href='http://localhost:3002/api/hardware_profiles/1' id='1'>

</hardware_profile>

<actions>

<link href='http://localhost:3002/api/instances/20112212/reboot' method='post' rel='reboot' />

<link href='http://localhost:3002/api/instances/20112212/stop' method='post' rel='stop' />

<link href='http://localhost:3002/api/instances/20112212/run;id=20112212' method='post' rel='run' />

<link href='http://localhost:3002/api/images;instance_id=20112212' method='post' rel='create_image' />

</actions>

<public_addresses><address>50.57.116.72</address></public_addresses>

<private_addresses><address>10.182.143.64</address></private_addresses>

<authentication type='password'>

<login>

<username>root</username>

<password></password>

</login>

</authentication>

</instance>

 

인스턴스에 작업을 시작하려면 POST/api/instances/:id/:action 을 호출 한다. 클라이언트가 주어진 시간에 인스턴스에서 수행 할 수 있는 허용 작업은 현재 인스턴스의 상태에 따라 달라 진다. 아래의 첫번째 예는 현재 실행중인 인스턴스에 재부팅을 요구하며, 그 후 정치 조치를 하는 예이다. Deltacloud Server는 클라우드 공급자 인스턴스에 있어 명령을 수행 시킬 수 있는 클라이언트SSH가 있다. 또한, Deltacloud Server는 클라이언트 명령의 출력을 반환한다. 이 정보를 통해 Private Key의 매개변수는 인스턴스에 연결하기 위한 인증(클라우드 제공업체에 대한 인증)을 지정한다. 즉 클라우드 제공업체에 대한 UserName/password에 대한 인증을 지정한다..

Example Request (reboot)

POST /api/instances/i-f3ba6492/reboot?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 1322

 

<?xml version='1.0' encoding='utf-8' ?>

<instance href='http://localhost:3001/api/instances/i-f3ba6492' id='i-f3ba6492'>

<name>ami-f51aff9c</name>

<owner_id>393485797142</owner_id>

<image href='http://localhost:3001/api/images/ami-f51aff9c' id='ami-f51aff9c'></image>

<realm href='http://localhost:3001/api/realms/us-east-1c' id='us-east-1c'></realm>

<state>RUNNING</state>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/c1.medium' id='c1.medium'>

</hardware_profile>

<actions>

<link href='http://localhost:3001/api/instances/i-f3ba6492/reboot' method='post' rel='reboot' />

<link href='http://localhost:3001/api/instances/i-f3ba6492/stop' method='post' rel='stop' />

<link href='http://localhost:3001/api/instances/i-f3ba6492/run;id=i-f3ba6492' method='post' rel='run' />

</actions>

<launch_time>2011-07-22T11:29:48.000Z</launch_time>

<public_addresses><address>ec2-50-16-183-107.compute-1.amazonaws.com</address></public_addresses>

<private_addresses><address>domU-12-31-39-0F-79-D4.compute-1.internal</address></private_addresses>

<firewalls> <firewall href='http://localhost:3001/api/firewalls/default' id='default'></firewall></firewalls>

<authentication type='key'>

<login>

<keyname>eftah</keyname>

</login>

</authentication>

</instance>

 

 

Example request (stop)

POST /api/instances/20112212/stop?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Server resonse

HTTP/1.1 200 OK

Content-Type: application/xml

Content-Length: 1167

 

<?xml version='1.0' encoding='utf-8' ?>

<instance href='http://localhost:3002/api/instances/20112212' id='20112212'>

<name>myserver</name>

<owner_id>mandreou</owner_id>

<image href='http://localhost:3002/api/images/53' id='53'></image>

<realm href='http://localhost:3002/api/realms/us' id='us'></realm>

<state>STOPPED</state>

<hardware_profile href='http://localhost:3002/api/hardware_profiles/1' id='1'>

</hardware_profile>

<actions>

<link href='http://localhost:3002/api/instances/20112212/reboot' method='post' rel='reboot' />

<link href='http://localhost:3002/api/instances/20112212/stop' method='post' rel='stop' />

<link href='http://localhost:3002/api/instances/20112212/run;id=20112212' method='post' rel='run' />

<link href='http://localhost:3002/api/images;instance_id=20112212' method='post' rel='create_image' />

</actions>

<public_addresses><address>50.57.116.72</address></public_addresses>

<private_addresses><address>10.182.143.64</address></private_addresses>

<authentication type='password'>

<login>

<username>root</username>

<password></password>

</login>

</authentication>

</instance>

 

Example Request (run-on-instance AMAZON EC2)

POST /api/instances/i-afde73ce/run?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Content-Length: 1927

Content-Type: multipart/form-data; boundary=----------------------------332ed6691ab8

 

------------------------------332ed6691ab8

Content-Disposition: form-data; name="cmd"

 

uname -a; ls -l

------------------------------332ed6691ab8

Content-Disposition: form-data; name="private_key"

 

-----BEGIN RSA PRIVATE KEY-----.BTTEpATBAAKDAQEA4t3R/PgUo3KDDuX4

vZZpZuXFkAA/5X2lFRY2/xsQqbPz9utPOsUoPf9Aajy+.vGRJrO2KAJ9U/JTNDzr

3NPbG3aHYPSnwsSxkFSG4Q6ukqYlxT9TPF/+wvdxfAtp3nYw3ZGuSX/DOtToWtQ8

F/+GvHTHKDQSB+TeEs1Sa/PFwxpspB+RqHbqOTWPsFOHL+9sZGTqd6D4B.R6DBNh

9Dabu9BVZrl5BTOKlbAgrKnzsGKvaBST/D2.AB/HB9/GOT36OoBmEr1y9gFwu4Xf

aKw+AXVf9y9TKxVD3TE5uB.oDZG8s4gr2e691xHG9YGzBBBbNzfFh94b3Td5JBGS

zRDTKYBfOgv+Zu5N+WyeaZ0ab50DwK9BXYB5hsRu5zbAqObbTZkwN9qwBOZHzATX

wVTZU+eTz.39OZPqu4fQwrBN13lDbUoZxlqT9g2+haQBB9sTDzQEZ08QKBgQDJyw

lBBZqQKBgQDz5E2rL59lNS5pBxDO9r6B9rXtBBTZ5tZUWNFRvyNsxY5nJT03.KDw

qo2VP5WDZeOhRWEUY96./pWN3hNFDkT44vDpeXQUh3rBHyD5DWvWxAze9Ds+UTO/

esuLwP5vXhfoYp6gV9XG.BEBzSVq8kZ2kZtlbWHTR/SGepTkDgYEA9zwHTDhtKR2

KS8/BSFZQ884ZqFkbwT9fTW6s0rgUSBDTUDgYEA9W5HXTOEPGFDnqBhKPLN.xD9D

vZZpZuXFkAA/5X2lFRY2/xsQqbPz9utPOsUoPf9Aajy+.vGRJrO2KAJ9U/JTNDzr

lBBZqQKBgQDz5E2rL59lNS5pBxDO9r6B9rXtBBTZ5tZUWNFRvyNsxY5nJT03.KDw

F/+GvHTHKDQSB+TeEs1Sa/PFwxpspB+RqHbqOTWPsFOHL+9sZGTqd6D4B.R6DBNh

wVTZU+eTz.39OZPqu4fQwrBN13lDbUoZxlqT9g2+haQBB9sTDzQEZ08QKBgQDJyw

lBBZqQKBgQDz5E2rL59lNS5pBxDO9r6B9rXtBBTZ5tZUWNFRvyNsxY5nJT03.KDw

DAAeVWKU1OyDXfN4v6Zn1nNrhSkdrd+XV0nTLExsfg==.-----END RSA PRIVAT

E KEY-----

------------------------------332ed6691ab8--

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Mon, 25 Jul 2011 12:56:02 GMT

Content-Length: 497

 

<instance href='http://localhost:3001/api/instances/i-afde73ce' id='i-afde73ce'>

<public_address>

ec2-50-19-59-126.compute-1.amazonaws.com

</public_address>

<command>

uname -a; ls -l

</command>

<output>Linux domU-12-31-39-0F-E1-78 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686 i686 i386 GNU/Linux

total 140

-rw-r--r-- 1 root root 137263 Mar 26 2008 ec2-ami-tools-1.3-19974.noarch.rpm

-rw-r--r-- 1 root root 0 Mar 26 2008 firstlogin

</output>

</instance>

 

새로운 인스턴스를 만들기 위해서는 POST/api/instances로 호출 한다. 이전에 클라인터으가 가상 머신 인스턴스가 생성되어 있는 이미지를 지정해야 한다. 또한, 클라이언트는 하드웨어 프로필과 Service Location(영역) 을 지정할 수 있다. 또한 모든 Cloud Service 업체가 다 지원하는 것은 아니지만 새로운 인스턴스에 대한 이름을 지정할 수 있다. 이러한 기능은 Deltacloud ApI entrypoint에 대한 응답에서 사용 할 지를 지정한다.

아마존 EC2에서 새로운 인스턴스를 만들려면 클라이언트는 사용된 EC2 키쌍 뿐만 아니라 방화벽(EC2의 Security Group)을 지정할 수 있다. DeltaCloud API의 다른 POST 작업과 마찬가지로 Mulitpart/form-data 또는 x-www-url-form-urlencode 의 유형과 같은 매개 변수를 지정할 수 있다.

Client Requst (AWS EC2)

POST /api/instances?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 107

Content-Type: application/x-www-form-urlencoded

 

keyname=eftah&image_id=ami-f51aff9c&realm_id=us-east-1c&hwp_id=c1.medium&

firewalls1=default&firewalls2=test

Server Response

HTTP/1.1 201 Created

Content-Type: application/xml

Content-Length: 1183

 

<?xml version='1.0' encoding='utf-8' ?>

<instance href='http://localhost:3001/api/instances/i-cbb861aa' id='i-cbb861aa'>

<name>ami-f51aff9c</name>

<owner_id>393485797142</owner_id>

<image href='http://localhost:3001/api/images/ami-f51aff9c' id='ami-f51aff9c'></image>

<realm href='http://localhost:3001/api/realms/us-east-1c' id='us-east-1c'></realm>

<state>PENDING</state>

<hardware_profile href='http://localhost:3001/api/hardware_profiles/c1.medium' id='c1.medium'>

</hardware_profile>

<actions>

<link href='http://localhost:3001/api/instances/i-cbb861aa/stop' method='post' rel='stop' />

<link href='http://localhost:3001/api/instances/i-cbb861aa/run;id=i-cbb861aa' method='post' rel='run' />

</actions>

<launch_time>2011-07-22T16:09:45.000Z</launch_time>

<public_addresses></public_addresses>

<private_addresses></private_addresses>

<firewalls>

<firewall href='http://localhost:3001/api/firewalls/test' id='test'></firewall>

<firewall href='http://localhost:3001/api/firewalls/default' id='default'></firewall>

</firewalls>

<authentication type='key'>

<login>

<keyname>eftah</keyname>

</login>

</authentication>

</instance>

 

다음 예제에서는 클라이언트가 옵션,이름,매개변수를 제공하고, 생성된 인스턴스를 사용하는 것을 알 수 있다.

Example Request (Rackspace Cloudservers)

POST /api/instances?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3002

Accept: */*

Content-Length: 34

Content-Type: application/x-www-form-urlencoded

 

image_id=53&hwp_id=1&name=myserver

Server Response

HTTP/1.1 201 Created

Content-Type: application/xml

Content-Length: 883

 

<?xml version='1.0' encoding='utf-8' ?>

<instance href='http://localhost:3002/api/instances/20112212' id='20112212'>

<name>myserver</name>

<owner_id>mandreou</owner_id>

<image href='http://localhost:3002/api/images/53' id='53'></image>

<realm href='http://localhost:3002/api/realms/us' id='us'></realm>

<state>PENDING</state>

<hardware_profile href='http://localhost:3002/api/hardware_profiles/1' id='1'>

</hardware_profile>

<actions>

<link href='http://localhost:3002/api/instances/20112212/run;id=20112212' method='post' rel='run' />

</actions>

<public_addresses><address>50.57.116.72</address></public_addresses>

<private_addresses><address>10.182.143.64</address></private_addresses>

<authentication type='password'>

<login>

<username>root</username>

<password>myserver4OvKh7Ak3</password>

</login>

</authentication>

</instance>

 

6) Key

키는 인스턴스에 엑세스하는데 있어 필요한 자격 증명을 나타낸다. DeltaCloud API는 두가지 주요 유형을 지원한다.

① Password ( 사용자 이름과 암호 속성 )

② Key ( PEM(개인키), public/private keypair)

키 유형은 클라우드 서비스 업체에 따라 다르다. 가능한 모든 키의 목록을 가져 오기 위해서는 GET/api/keys로 호출한다. 아래의 예는 EC2 클라우드의 key를 보여준다. XML응답은 개인키 속성을 포함하지 않는다. 왜냐하면 key가 생성될 때 EC2는 Private key를 먼저 제공하기 때문이다.

Example Request

GET /api/keys?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*    

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Tue, 26 Jul 2011 08:09:26 GMT

Content-Length: 733

 

<?xml version='1.0' encoding='utf-8' ?>

<keys>

<key href='http://localhost:3001/api/keys/deltacloud_jsmith' id='deltacloud_jsmith' type='key'>

<actions>

<link href='http://localhost:3001/api/keys/deltacloud_jsmith' method='delete' rel='destroy' />

</actions>

<fingerprint>38:93:81:11:83:c2:c7:27:e8:79:17:e2:08:c9:13:99:73:90:8e:cc</fingerprint>

<state>AVAILABLE</state>

</key>

<key href='http://localhost:3001/api/keys/the_key' id='the_key' type='key'>

<actions>

<link href='http://localhost:3001/api/keys/the_key' method='delete' rel='destroy' />

</actions>

<fingerprint>39:d3:9b:bb:93:92:97:27:e9:7d:b7:e2:09:9d:b3:dd:73:d0:9e:99</fingerprint>

<state>AVAILABLE</state>

</key>

</keys>

 

특정 키 에 대해서 세부사항을 얻으려면 GET/api/keys/:id로 호출 한다. 아래 의 예는 Gogird의 key에 대한 설명을 받아오는 예이다.

Example request

GET /api/keys/72398?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.21.2 (x86_64-apple-darwin10.3.1)

Host: localhost:3001

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Tue, 26 Jul 2011 11:13:25 GMT

Content-Length: 269

 

<?xml version='1.0' encoding='utf-8' ?>

<key href='http://localhost:3001/api/keys/72398' id='72398' type='password'>

<actions>

</actions>

<username><![CDATA[26648]]></username>

<password><![CDATA[3woc7UWdJsJEcm8@]]></password>

<state></state>

</key>

 

새로운 키를 만들기 위해서는 POST/api/keys로 호출 하면 된다. 이로 인하여 인스턴스를 엑세스 하기 위한 새로운 자격 증명을 얻을 수 있다. 이 함수에 필요한 매개변수는 Cloud Service Provider 마다 다르며, 관련 드라이버에 명시되어 있다. 아마존 EC2의 Key 생성 방법은 매개변수로 key이름을 지정하며, 새로 만들 키의 개인키 속성을 지정한다.

Example request

POST /api/keys?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 19

Content-Type: application/x-www-form-urlencoded

 

name=jsmith_new_key

Server response

HTTP/1.1 201 Created

Content-Type: application/xml

Date: Tue, 26 Jul 2011 10:58:58 GMT

Content-Length: 2062

 

<?xml version='1.0' encoding='utf-8' ?>

<key href='http://localhost:3001/api/keys/jsmith_new_key' id='jsmith_new_key' type='key'>

<actions>

<link href='http://localhost:3001/api/keys/jsmith_new_key' method='delete' rel='destroy' />

</actions>

<fingerprint>c6:80:5c:0a:b8:66:0d:58:5a:bf:0f:c2:5d:35:d3:c7:49:f3:5a:5f</fingerprint>

<pem>

<![CDATA[-----BEGIN RSA PRIVATE KEY-----

MIIEpgIBAAKCAQEAsPIzLQEpoLkxd0WESPEWQ4AMn9e0T6jHIMl/a2GUx2TA2Q10n6i5h4VAXXrK

m9fNnPJhw1uRbuL7Oz57QSftGUfz05EaLOsvIEq3OXA0HqnFPF7Dd4yvy07KfgNHe2c26NqIqxgw

GCy6tfd/9iKQIlFCG8I/M6fgEG/vw30GP5EywYLS0J7lYfNHJAVAznjX0LoOWvT0zYajZ7gWJ30/

sQ/IFaKxC3BpT6K2aQP+RgAimALHinFuoT4+07SsrQXEezLemAG/gdbw3+7DL9BGq0CCoY1RxeC7

qNh9BJwHtq9QPYg/RKruiYak/TSoB71/VP67lJv0WEkCRJKEFpz5SQIDAQABAoIBAQChVyZcmdvI

JjS5aVSWYeWIBMD+GmPZ4q428iPR2LcdHHxPLVqyndkVfeXTlrwZX6umuMd1pw+zyRmEypL+NRaW

36mutnbkkEl3K0loASw07V3fjxSx9EDyo1Q1lG3gUpuZtHG7eCGaWWahtxwhZSCBehBKWVLhmefP

dRFs8Zn56LhfxByS/HcmHYddq1ggynFgg1DszYKTiJ0k5Zd/w4gh3GXH02S50cNFumJh9tbZNeDz

yqa6a12N21loZ/VRRL7lEjpf3K2n0DCQ5pp0I9/FiwuwHMWr6qPSsQt9N/XclNiVg7fz+btNsqVY

US1kBkvazoaANmF3VOXT9bmiFnuBAoGBAOkURD2uBe9UUl7xvWON7yS+tBcs1KyYDsTEhsS5dLdk

n73/5vyEVzozdywTR7lQWVQhWWwkK/FJd9Xo/VV5bGXl+MK/JxIQHrEhLzO1OeYEBiw2eKhigyDb

lm7pk/DuBNqgnA9YVnSvRYjpnvgBeb89CHvdhqn52GcbB2ShXurRAoGBAMJYyqNyl8CiIqesigts

tlRk0UmS/LS6I58f7nbcrkgO3ZDsYhXhj9aKSJx56bpWTwoFdl7nTSUwkFgq2ts3g7EPQbYD/5G6

kwpq0tvC23zZTfYvjExNVORh9PJBCrBl1tC/5nqYSrHC7H3Ys/SW3DF+0LPTdOtx5FwL5Utr3lT5

AoGBAM3Y8EvpHaS5O+ZOaY07FTHGmxa8qTelM6XkS4ICqGovnEUZdM8fskncmit6+6VWqQ38RhWT

/Jsk34k0NEkA7BMyf/i/CaqSQgj93co1C+VxOGJj2TwdhOHIDZv2/omSLQdJQYrr4a87/JVmftdZ

tkSHiq6afwwvdEfbPzRIsKOBAoGBAK5EjEAP6z+So1yS/J3N95ipZnmA0hUErBhtu5jdvXFj0w22

ySUxw5bvHLkjIJA0AF/OEhx7b9OfPm+wzdqwZugH9DZQU4TLNjqrGzRv//xtptjQPg/Vb//yToBE

Dl+qkftReEwJ70CCtykJfiQeeofvXRlCzZ6p28kl6Y+9w/mRAoGBANI8AGB1iUDMQDiEfTAuH7jB

nZTZUsfAaysoku3gyVmtcu1Zo7T02b8YW3ypuNu664KO7eNik9q68yKa7oDuLVrVj6Sh2DInoeW9

vbjp2KcyMVEPHzWh86LV9IY5oHjQxlK/PMhQWMEeysi6j2qFqrx2rqRhG6kZUcFHFoHQpmv2

-----END RSA PRIVATE KEY-----]]>

</pem>

<state>AVAILABLE</state>

</key>

 

키를 삭제 하기 위해서는 DELETE/api/keys/:id를 호출 하면 된다. 이 기능은 아마존 EC2 드라이버에서만 사용할 수 있다.

Example Request

DELETE /api/keys/jsmith_new_key?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server response

HTTP/1.1 204 No Content

Date: Tue, 26 Jul 2011 10:18:38 GMT

 

7) Firewall

방화벽은 공공 인터넷을 통해 실행중인 인스턴스에 대한 접근성을 나타낸다. 방화벽에는 이러한 특성이 있다.

- a name

- a description

- an owner_id

- set of rules

아마존 EC2의 경우 인스턴스 생성시 지정한 방화벽으로 시작된다. 각 방화벽에 대한 규칙은 인터넷을 통해 인스턴스와 통신하려는 사용자에게 부여한 권한에 대한 자세한 사항을 알려주는 속성을 가지고 있다. 그 규칙은 다음과 같다.

- an allow_protocol (tcp, udp or icmp)

- port , port 엑세스 범위

- 방화벽 소스

각 규칙은 진입, 출구 트래픽에 대해 방화벽 지정 적용 여부를 나타내며, 이 규칙 또한 rules-action(거부, 허용) 사용자가 지정할 수 있다. 그리고 rog_rule(true/false) 항목은 로그에 추가할지 여부를 나타낸다. 아마존 EC2는 방화벽 규칙 대한 ID개념이 없기 때문에 Deltacloud Server는 각 규칙에 대한 하나의 ID를 생성한다. 사용하는 방법은 다음과 같다. Owner_id~protocol~from_port-to_port~@sources

위의 코드를 설명하면 주소는 IP유형(ipv4/ipv6), IP주소, 라우팅프리픽스(CIDR의 넷마스크)를 정의하는 경우에 입력하고, Owner_id는 지정된 방화벽을 만든 계정의 식별자이다.

모든 방화벽 목록을 검색하기 위해서는 GET/api/firewalls를 호출하면 된다.

Example Request

GET /api/firewalls?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Tue, 26 Jul 2011 15:56:04 GMT

Content-Length: 1640

 

<?xml version='1.0' encoding='utf-8' ?>

<firewalls>

<firewall href='http://localhost:3001/api/firewalls/default' id='default'>

<name><![CDATA[default]]></name>

<description><![CDATA[default group]]></description>

<owner_id>393485797142</owner_id>

<rules>

<rule id='393485797142~tcp~22~22~@address,ipv4,87.228.192.251,32'>

<allow_protocol>tcp</allow_protocol>

<port_from>22</port_from>

<port_to>22</port_to>

<direction>ingress</direction>

<sources>

<source address='87.228.192.251' family='ipv4' prefix='32' type='address'></source>

</sources>

</rule>

</rules>

</firewall>

<firewall href='http://localhost:3001/api/firewalls/test' id='test'>

<name><![CDATA[test]]></name>

<description><![CDATA[this is just a test]]></description>

<owner_id>393485797142</owner_id>

<rules>

<rule id='393485797142~tcp~22~22~@group,393485797142,default,@address,ipv4,10.1.2.3,24'>

<allow_protocol>tcp</allow_protocol>

<port_from>22</port_from>

<port_to>22</port_to>

<direction>ingress</direction>

<sources>

<source name='default' owner='393485797142' type='group'></source>

<source address='10.1.2.3' family='ipv4' prefix='24' type='address'></source>

</sources>

</rule>

</rules>

</firewall>

<firewall href='http://localhost:3001/api/firewalls/new_firewall' id='new_firewall'>

<name><![CDATA[new_firewall]]></name>

<description><![CDATA[new_one]]></description>

<owner_id>393485797142</owner_id>

<rules>

</rules>

</firewall>

특정 방화벽에 대한 자세한 사항을 가져오기 위해서는 GET/api/firewalls/:id로 호출한다.

Example Request

GET /api/firewalls/test?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Wed, 27 Jul 2011 08:20:29 GMT

Content-Length: 835

 

<?xml version='1.0' encoding='utf-8' ?>

<firewall href='http://localhost:3001/api/firewalls/test' id='test'>

<name><![CDATA[test]]></name>

<description><![CDATA[this is just a test]]></description>

<owner_id>393485797142</owner_id>

<rules>

<rule href='http://localhost:3001/api/firewalls/test/393485797142~tcp~22~22~@group,393485797142,default,@address,ipv4,10.1.2.3,24' id='393485797142~tcp~22~22~@group,393485797142,default,@address,ipv4,10.1.2.3,24'>

<allow_protocol>tcp</allow_protocol>

<port_from>22</port_from>

<port_to>22</port_to>

<direction>ingress</direction>

<sources>

<source name='default' owner='393485797142' type='group'></source>

<source address='10.1.2.3' family='ipv4' prefix='24' type='address'></source>

</sources>

</rule>

</rules>

</firewall>

 

새로운 방화벽을 사용하기 위해서는 GET/api/firewalls/:id로 호출 한다. 클라이언트의 요청에 매개변수로 방화벽 이름과 설명을 지정해야한다.

Example Request

POST /api/firewalls?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 64

Content-Type: application/x-www-form-urlencoded

 

name=Devel_Group&description=Access%20for%20all%20development%20machines

Server response

HTTP/1.1 201 Created

Content-Type: application/xml

Date: Wed, 27 Jul 2011 08:35:43 GMT

Content-Length: 296

 

<?xml version='1.0' encoding='utf-8' ?>

<firewall href='http://localhost:3001/api/firewalls/Devel_Group' id='Devel_Group'>

<name><![CDATA[Devel_Group]]></name>

<description><![CDATA[Access for all development machines]]></description>

<owner_id></owner_id>

<rules>

</rules>

</firewall>

클라우드 공급자 사용 호출에서 지정된 방화벽을 삭제 하기 위해서는 DELETE/api/firewalls/:id로 호출한다.

Example Request

DELETE /api/firewalls/test?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Client Response

HTTP/1.1 204 No Content

Date: Wed, 27 Jul 2011 09:47:43 GMT

방화벽 삭제에 관한 규칙은 Cloud Service 업체마다 다르다.

특정 방화벽 규칙을 만들기 위해서는 POST/api/firewalls/id/rules 로 호출한다.

또한 규칙을 삭제하기 위해서는 DELETE/api/firewall/:id/:rule_id로 호출하면 된다.

8) Address

Addreess Collection은 IP주소를 나타내며 IP주소를 관리 한다. Address는 다음과 같은 작업을 지원한다.

- 주소를 생성

- 주소를 삭제

- 실행중인 인스턴스 주소

- 실행중인 인스턴스에서 주소를 dissociating

모든 주소 목록을 가져오기 위해서는 GET/api/addresses로 호출한다.

Example Request

GET /api/addresses?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Wed, 27 Jul 2011 12:55:16 GMT

Content-Length: 817

 

<?xml version='1.0' encoding='utf-8' ?>

<addresses>

<address href='http://localhost:3001/api/addresses/107.20.232.251' id='107.20.232.251'>

<ip>107.20.232.251</ip>

<actions>

<link href='http://localhost:3001/api/addresses/107.20.232.251' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/addresses/107.20.232.251/associate' method='post' rel='associate' />

</actions>

</address>

<address href='http://localhost:3001/api/addresses/107.20.234.161' id='107.20.234.161'>

<ip>107.20.234.161</ip>

<actions>

<link href='http://localhost:3001/api/addresses/107.20.234.161' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/addresses/107.20.234.161/associate' method='post' rel='associate' />

</actions>

</address>

</addresses>

특정 주소에 대해 자세한 내용을 검색하기 위해서는 GET/api/addresses/:id로 호출 한다.

Example Request

GET /api/addresses/107.20.232.251?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Wed, 27 Jul 2011 12:57:27 GMT

Content-Length: 402

 

<?xml version='1.0' encoding='utf-8' ?>

<address href='http://localhost:3001/api/addresses/107.20.232.251' id='107.20.232.251'>

<ip>107.20.232.251</ip>

<actions>

<link href='http://localhost:3001/api/addresses/107.20.232.251' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/addresses/107.20.232.251/associate' method='post' rel='associate' />

</actions>

</address>

새로운 주소를 만들기 위해서는 POST/api/addresses로 호출한다.

Example Request

POST /api/addresses?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 201 Created

Content-Type: application/xml

Content-Length: 388

 

<?xml version='1.0' encoding='utf-8' ?>

<address href='http://localhost:3001/api/addresses/107.20.232.251' id='107.20.232.251'>

<ip>107.20.232.251</ip>

<actions>

<link href='http://localhost:3001/api/addresses/107.20.232.251' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/addresses/107.20.232.251/associate' method='post' rel='associate' />

</actions>

지정된 주소를 삭제하기 위해서는 DELETE/api/addresses/:id로 호출 한다.

Example Request

DELETE /api/addresses/107.20.232.251?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server response

HTTP/1.1 204 No Content

Date: Wed, 27 Jul 2011 13:29:00 GMT

실행중인 인스턴스를 특정 주소로 연결하기 위해서는 POST/api/addresses/:id/associate로 호출 한다. 이때 클라이언트는 Instance_id를 호출의 매개변수로 지정해야한다. 아마존EC2의 경우 지정된 주소는 인스턴스의 현재 할당된 Public_address로 대체한다.

Example request

POST /api/addresses/107.20.232.251/associate?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 22

Content-Type: application/x-www-form-urlencoded

 

instance_id=i-9d8a3dfc

Server Response

HTTP/1.1 202 Accepted

Content-Type: application/xml

Date: Wed, 27 Jul 2011 13:01:11 GMT

Content-Length: 0

인스턴스에 할당된 주소를 해제 하려면 POST/api/addresses/:id/disassociate로 호출 한다.

Example Request

POST /api/addresses/107.20.232.251/disassociate?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 202 Accepted

Content-Type: application/xml

Date: Wed, 27 Jul 2011 13:05:38 GMT

Content-Length: 0

 

9) Load balancers

Load Balancer는 실행중인 인스턴스에 지정된 IP주소로 수신 진입 네트워크 트래픽의 분배를 허용한다. 예를 들어 웹서버의 역할을 수행하는 경우 하나의 Load Balancer로 여러 개의 인스턴스에 대한 요청을 처리 할 수 있다.

모든 Road Balancer에 대한 세부 정보를 가져오기 위해서는 GET/api/load_balancers로 호출하면 된다.

Example request

GET /api/load_balancers?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Resonese

HTTP/1.1 200 OK

Content-Type: application/xml

Date: Thu, 28 Jul 2011 13:37:19 GMT

Content-Length: 1844

 

<?xml version='1.0' encoding='utf-8' ?>

<load_balancers>

<load_balancer href='http://localhost:3001/api/load_balancers/webtraffic-balancer' id='webtraffic-balancer'>

<actions>

<link href='http://localhost:3001/api/load_balancers/webtraffic-balancer' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/load_balancers/webtraffic-balancer/register' method='post' rel='register' />

</actions>

<public_addresses>

<address>webtraffic-balancer-1306196965.us-east-1.elb.amazonaws.com</address>

</public_addresses>

<created_at>Thu Jul 28 13:29:52 UTC 2011</created_at>

<realm href='http://localhost:3001/api/realms/us-east-1a' id='us-east-1a'></realm>

<listeners>

<listener protocol='HTTP'>

<load_balancer_port>80</load_balancer_port>

<instance_port>3001</instance_port>

</listener>

</listeners>

<instances>

</instances>

</load_balancer>

<load_balancer href='http://localhost:3001/api/load_balancers/secure-site-balancer' id='secure-site-balancer'>

<actions>

<link href='http://localhost:3001/api/load_balancers/secure-site-balancer' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/load_balancers/secure-site-balancer/register' method='post' rel='register' />

</actions>

<public_addresses>

<address>secure-site-balancer-1347100846.us-east-1.elb.amazonaws.com</address>

</public_addresses>

<created_at>Thu Jul 28 13:36:29 UTC 2011</created_at>

<realm href='http://localhost:3001/api/realms/us-east-1a' id='us-east-1a'></realm>

<listeners>

<listener protocol='HTTP'>

<load_balancer_port>443</load_balancer_port>

<instance_port>443</instance_port>

</listener>

</listeners>

<instances>

</instances>

</load_balancer>

</load_balancers>

새로운 Road Balcer을 만들기 위해서는 POST/api/load_balancers로 호출 한다 listener_balncer_port를 통하여 로드밸런서가 네트워크 트래픽을 분산 시킬 포트를 지정한다.

Example Request

OST /api/load_balancers?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 121

Content-Type: application/x-www-form-urlencoded

 

name=webtraffic-balancer&realm_id=us-east-1c&listener_protocol=HTTP&

listener_balancer_port=80&listener_instance_port=3001

Server Response

HTTP/1.1 201 Created

Content-Type: application/xml

Date: Thu, 28 Jul 2011 13:30:05 GMT

Content-Length: 884

 

<?xml version='1.0' encoding='utf-8' ?>

<load_balancer href='http://localhost:3001/api/load_balancers/webtraffic-balancer' id='webtraffic-balancer'>

<actions>

<link href='http://localhost:3001/api/load_balancers/webtraffic-balancer' method='delete' rel='destroy' />

<link href='http://localhost:3001/api/load_balancers/webtraffic-balancer/register' method='post' rel='register' />

</actions>

<public_addresses>

<address>webtraffic-balancer-1306196965.us-east-1.elb.amazonaws.com</address>

</public_addresses>

<created_at>Thu Jul 28 13:29:52 UTC 2011</created_at>

<realm href='http://localhost:3001/api/realms/us-east-1a' id='us-east-1a'></realm>

<listeners>

<listener protocol='HTTP'>

<load_balancer_port>80</load_balancer_port>

<instance_port>3001</instance_port>

</listener>

</listeners>

<instances>

</instances>

</load_balancer>

지정된 Road Balncer을 삭제시키기 위해서는 Delete/api/load_balacners/:id로 호출하면 된다.

Example Request

DELETE /api/load_balancers/webtraffic-balancer?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Server Response

HTTP/1.1 204 No Content

Date: Thu, 28 Jul 2011 13:23:33 GMT

Road Balancer에 실행중인 인스턴스를 적용 하려면 POST/api/load_balncers/:id/register로 호출하면 된다. 클라이언트는 Instance_id을 매개변수로 제공해야 한다.

Example Request

POST /api/load_balancers/secure-site-balancer/register?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 22

Content-Type: application/x-www-form-urlencoded

 

instance_id=i-4f06b52e

Server Response

HTTP/1.1 204 No Content

Date: Thu, 28 Jul 2011 18:20:03 GMT

Road Balncer에 지정된 인스턴스에 대한 적용을 취소 하려면 POST/api/load_balncers/:id/unregister로 호출하면 된다. 클라이언트는 instance_id을 매개변수로 제공해야 한다.

Example request

POST /api/load_balancers/secure-site-balancer/unregister?format=xml HTTP/1.1

Authorization: Basic AU1J3UB2121Afd1DdyQWxLaTYTmJMNF4zTXBoRGdhMDh2RUw5ZDAN9zVXVa==

User-Agent: curl/7.20.1 (i386-redhat-linux-gnu)

Host: localhost:3001

Accept: */*

Content-Length: 22

Content-Type: application/x-www-form-urlencoded

 

instance_id=i-4f06b52e

Server response

HTTP/1.1 204 No Content

Date: Thu, 28 Jul 2011 19:09:17 GMT

 

 

<Deltacloud API – Working Deltacloud Ruby Client >

DeltaCloud API는 클라우드 프로바이더와 통신할 수 있는 프레임워크와 드라이버를 제공한다. Deltacloud API에 대한 자세한 사항은 http://deltacloud.org/api.html에서 확인 가능하다.

DeltaCloud는 현재 Ruby클라이언트를 제공하여 클라이언트가 HTTP기반 REST를 직접적으로 사용하지 않고 DeltaCloud를 사용할 수 있게 해준다 사용하는 방법은 다음과 같다.

.인스턴스는 각 유형별로 모델이 있다. 이 경우 이러한 인스턴스 모델에 대하여 불러올 수 있다.

puts instance.image.name

puts instance.hardware_profile.architecture

 

<Listing realms>

서비스 가능한 지역에 대해 전체 목록을 검색

realm = client.realms

식별자를 통하여 특정 가능한 지역에 엑세스 할 수 있다.

realm = client.realm( 'us' )

<Listing Hardware Profiles>

인스턴스 머신에 사용할 수 있는 하드웨어 전체 목록을 표시한다.

hwp = client.hardware_profiles

또한 이를 필터링 하여 볼 수도 있다.

hardware_profiles = client.hardware_profiles( :architecture=>'x86_64' )

또한 식별자를 통하여 특정 하드웨어 프로필을 검색 할 수도 있다.

hardware_profile = client.hardware_profile ( 'M1-small')

< Listing Image>

이미지의 전체 목록을 반환한다.

images = client.images

현재 인증된 사용자가 쓰고 있는 이미지의 목록을 검색

images = client.images( :owner_id=>:self )

특정 사용자가 소유한 이미지의 목록을 검색 할 수 있다.

images = client.images( :owner_id=>'daryll' )

식별자로 특정 이미지에 엑세스 할 수 있다.

image = client.image( 'ami-8675309' )

 

<Launching Instances>

이미지 식별자를 사용하여 인스턴스를 시작한다.

instance = client.create_instance(image_id)

하드웨어 사항을 지정할 수 있다.

instance = client.create_instance(image_id, :hwp_id => 'm1-small')

새로운 인스턴스를 만들 때 NAME을 지정할 수 있다.

instance = client.create_instance(image_id, :name => 'myinst1')

< Connect to a Deltacloud provider >

require 'deltacloud'

api_url = 'http://localhost:3001/api'

api_name = 'mockuser'

api_password = 'mockpassword'

client = DeltaCloud.new( api_name, api_password, api_url )

# work with client here

여러 개의 드라이버를 연결하려는 경우 다음과 같은 예로 실행

client = DeltaCloud.new( api_name, api_password, api_url )

# switch the client to use EC2 driver

ec2 = client.with_config(:driver => :ec2)

# switch the client to use OpenStack driver

openstack = client.with_config(:driver => :openstack)

 

'Cloud > 멀티클라우드' 카테고리의 다른 글

[Paper Review] Metacloud - Wind of Change: From Vendor Lock-in to the Meta Cloud  (0) 2013.10.23
Jcloud  (0) 2013.10.23
Libcloud 2013-02-14  (0) 2013.10.23
Libcloud와Libvirt 2013-02-13  (1) 2013.10.23
Libvirt Overview 2013-02-13  (0) 2013.10.23