2013. 10. 23. 21:09ㆍCloud/멀티클라우드
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 |