 |
|
난이도 : 중급 Doug Tidwell, developerWorks staff, IBM
원문 게재일 : 2009 년 9 월 22 일 번역 게재일 : 2009 년 10 월 06 일 Zend Framework에는 클라우드 기반 스토리지 서비스를 쉽게 사용할 수 있도록
도와주는 여러 가지 클래스가 있습니다. 이 기사에서는 이러한 클래스를 Amazon의 S3 클라우드
스토리지 서비스와 함께 사용하는 방법에 대해 설명합니다.
클라우드 컴퓨팅 환경에서 사용자와 애플리케이션은 디스크 공간을 무제한으로
사용할 수 있다. 이상적인 환경만 갖추어진다면 로컬 하드 드라이브에 액세스하는 것처럼 쉽게
스토리지에 액세스할 수 있다. 하지만 아쉽게도 대부분의 클라우드 스토리지 서비스의 기본 API를
사용할 경우 간단히 데이터 작업만 수행하면 되는 것이 아니라 프로토콜 및 구성 세부 사항을
고려해야 한다. 이 기사에서는 Amazon의 S3 클라우드 스토리지 서비스를 용량 제한이 없는 하드
드라이브로 쉽게 사용할 수 있도록 도와주는 Zend Framework에 대해 살펴봅니다.
연결 형식 및 클라우드 컴퓨팅
클라우드에서 작동하는 애플리케이션을 개발하는 과정에서는 서비스에 대한 인터페이스를
마련하는 것이 주요 과제 중 하나이다. 대부분의 서비스에서는 REST 또는 SOAP 인터페이스를 제공하고
있으며 S3에서는 두 가지 인터페이스를 모두 제공하고 있다. REST 또는 SOAP 인터페이스의 주요 장점 중
하나는 특정 언어에 얽매이지 않는다는 것이다. 이 말은 곧 누구나 자신이 주로 사용하는 프로그래밍
언어를 통해 서비스를 호출할 있다는 것을 뜻한다. 하지만 REST나 SOAP를 사용하려면 사용 중인 데이터가
아닌 요청과 관련된 세부 사항에 많은 주의를 기울여야 한다는 단점이 있다. 예를 들어, S3에 대한 모든
요청에는 Amazon 액세스 키와 서명 값으로 구성된 인증 토큰이 있어야 한다. 즉, 요청에 0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=와
같은 값이 들어 있어야 한다.
서명과 기타 세부 사항보다는 데이터 자체에 중점을 둘 수 있는 개선된 방법이
있다면 분명 생산성 향상에 큰 도움이 될 것이다. 바로 이 점이 Zend_Service_Amazon_S3
클래스의 목적이다. 이 클래스를 사용하면 HTTP 헤더, SOAP 엔벨로프 또는 관련이 없는 기타
세부 사항을 처리하기 위한 작업이 아닌 데이터에 집중할 수 있다.
시작
Zend Framework가 설치되어 있지 않다면 zend.com/community/downloads에서
전체 패키지를 다운로드하고 설치한다. 이 패키지를 설치하면 Zend Framework, PHP 및 Apache 웹
서버가 시스템에 설치된다. 설치가 완료되면 http://localhost/ZendServer/에서 Zend Framework
설치 설명서를 보고 자세한 정보를 확인한다. ZendServer 콘솔에 로그인할 수 있다면 모든 준비가
완료된 것이다.
이 과정을 따라서 수행하려면 Amazon 계정을 설정해야 한다(참고자료에서
계정 관리 페이지에 링크 참조). 계정을 설정한 후에는 신임 정보를 관리해야 한다. Amazon에서는 액세스 키와 비밀
키를 제공하고 있으며 S3 작업을 수행하려면 이러한 값을 PHP 페이지에서 관리해야 한다. 이러한 정보를 관리할 수
있는 간편한 방법 중 하나는 코드에 값을 넣어두는 것이다.
Listing 1. PHP 코드에 신임 정보 저장하기
// Credentials for Amazon - Don't do this!
$awsKey = "0123456789ABCDEFGHIJ";
$awsSecret = "0123456789abcdefghiABCDEFGHI1234567890AB"; |
이 방법은 정상적으로 작동하기는 하지만 신임 정보가 필요한 모든 PHP 파일에
이 코드를 넣어야 한다는 단점이 있다. 보다 효과적인 방법은 Listing 2와 같이 이러한 값을 PHP
.ini 파일에 넣어두는 것이다.
Listing 2. PHP .ini 파일에 신임 정보 저장하기
; Configuration file to hold secret keys, account numbers and other useful
; strings for Amazon and other cloud accounts.
[amazon]
accessKey=0123456789ABCDEFGHIJ
secretKey=0123456789abcdefghiABCDEFGHI1234567890AB
ownerId=123456789012
[nirvanix]
username=jane_doe
password=XXXXXXXX
appKey=01234567-89ab-cdef-0123-456789abcdef
|
간단한 PHP 클래스를 사용하여 다음과 같을 쉽게 처리할 수 있다.
Listing 3. 신임 정보를 검색하는 간단한 PHP 클래스
<?php
// Simple class to retrieve credentials from an .ini file
class Credentials
{
var $key_array;
function Credentials() {
$this->key_array = parse_ini_file("..\conf\cloud.ini", true);
}
function getCredential($group, $key) {
return $this->key_array[$group][$key];
}
}
?> |
이 클래스에서는 PHP parse_ini_file() 함수를 사용하여
.ini 형식의 파일에 있는 값을 읽는다. 이 함수의 첫 번째 인수는 파일의 이름이고 두 번째 인수는
PHP에게 파일을 다양한 섹션으로 구문 분석하도록 지시한다. 즉, $key_array
배열은 2차원 배열이다. 배열 키는 첫 번째 차원에 있는 amazon 및
nirvanix와 두 번째 차원에 있는 accessKey,
secretKey, appKey 등이다. Credentials
클래스에는 .ini 파일에서 값을 검색할 수 있는 getCredential() 메소드가
있다. 이 기사에서는 모든 PHP 파일에 신임 정보를 하드 코딩하는 방법을 사용하지 않고 대신 다음
예제처럼 몇 줄의 행으로 구성된 간단한 샘플부터 시작한다.
Listing 4. Credentials 오브젝트 만들고 사용하기
<?php
require_once 'Credentials.php';
$creds = new Credentials;
$s3 = new Zend_Service_Amazon_S3($creds->getCredential('amazon', 'accessKey'),
$creds->getCredential('amazon', 'secretKey')); |
이렇게 하면 코드를 설정하는 데 시간이 좀 더 걸리기는 하지만 일단 해놓고
나면 신임 정보를 한 위치에 한 번만 정의하면 되기 때문에 편리하다. 신임 정보를 변경해야
할 경우 모든 PHP 파일에 변경 사항을 적용하지 않아도 된다는 장점이 있다.
몇 가지 참고 사항:
- .ini 파일은 웹 서버의 문서 루트에 있지 않고 문서 루트의 피어 디렉토리인
conf 디렉토리에 있다. 이는 권한이 없는 사용자가 볼 수 있는 위치에
신임 정보 파일을 저장해서는 안되기 때문이다.
- 이에 반해 이 기사의 모든 PHP 파일은 웹 서버의 문서 루트에 저장된다.
- .ini 파일의 주석은 세미콜론으로 시작하며 PHP 스타일의 주석은 작동하지 않는다.
샘플 애플리케이션 정보
클라우드 컴퓨팅이라고 불리는 초기 서비스 중 하나인 Amazon의 S3는 무제한의
온라인 스토리지를 제공하는 분산 파일 시스템이다. S3 데이터 모델에는 버켓과 오브젝트라는
두 가지 개념이 있다. 버켓은 오브젝트를 무제한으로 포함할 수 있으며, 각 오브젝트에는 데이터와
메타데이터가 들어 있다. 버켓은 다른 버켓을 포함할 수 없다. 버켓을 작성할 때 버켓의 이름은
모든 S3 사용자 중에서 고유해야 한다. 작성된 오브젝트는 바꾸거나 삭제할 수 있지만 수정할 수는
없다. 오브젝트를 작성할 때 오브젝트에 대한 액세스 제어 매개변수를 설정할 수 있다. 기본적으로
오브젝트는 개인용이지만 원할 경우 다른 사용자와 공유할 수도 있다.
이 기사의 샘플 애플리케이션은 S3를 위한 웹 기반 파일 관리 프로그램으로 Zend_Service_Amazon_S3
클래스를 사용하여 다음 기능을 수행하는 PHP 페이지를 작성하는 과정을 보여 준다.
- S3 계정의 모든 버켓을 본다.
- 새 버켓을 작성한다.
- 버켓에 있는 모든 오브젝트를 본다.
- 새 오브젝트를 작성한다.
- 오브젝트를 삭제한다.
- 버켓을 삭제한다.
이 애플리케이션은 s3.php와 bucketlist.php라는 두 개의 PHP 파일로 작성된다. s3.php
파일은 계정 내의 모든 버켓을 표시하는 데 사용되며 새 버켓을 작성하고 기존 버켓을 삭제하는 기능도
제공한다. bucketlist.php 파일은 지정한 버켓 내의 모든 오브젝트를 표시하는 데 사용되며 새 오브젝트를
작성하고 기존 오브젝트를 삭제하는 기능도 제공한다. 또한 bucketlist.php 파일은 각 오브젝트에 대한
메타데이터를 표시하며 Amazon에 있는 오브젝트에 대한 직접 링크도 제공한다. (해당 오브젝트에 대한 액세스
권한이 없으면 예상대로 오류 메시지가 표시된다.)
Zend_Service_Amazon_S3 오브젝트 작성하기
이미 예상하고 있듯이 가장 먼저 수행할 작업은 Zend_Service_Amazon_S3
오브젝트를 작성하는 것이다. 생성자 함수는 Amazon 액세스 키와 비밀 키를 매개변수로 받는다. 이 애플리케이션에서는
앞에서 설명한 Credentials 클래스를 사용한다.
Listing 5. Zend_Service_Amazon_S3 오브젝트 작성하기
<?php
require_once 'Zend/Service/Amazon/S3.php';
require_once 'Credentials.php';
// Initialize our credentials and create an S3 object
$creds = new Credentials;
$s3 = new Zend_Service_Amazon_S3($creds->getCredential('amazon', 'accessKey'),
$creds->getCredential('amazon', 'secretKey'));
?> |
두 PHP 파일 모두 위와 같은 코드로 시작하며 버켓이나 오브젝트 어느 쪽을 보더라도
여기에서 작성한 $s3 오브젝트가 대부분을 작업을 수행한다.
S3 계정의 모든 버켓 나열하기
사용자가 s3.php를 로드하면 사용자의 Amazon 계정에 있는
모든 버켓을 보여 주는 목록이 표시된다. 화면 레이아웃은 상당히 단순하다.
그림 1. 계정 내 버켓의 목록
getBuckets() 메소드는 버켓 이름으로 구성된 배열을
리턴한다. 각 버켓 이름은 링크 형식으로 표시되며, 이 링크를 클릭하면 bucketlist.php 페이지로
연결된다. 각 버켓 이름 옆의 Delete 단추를 사용하면 해당 버켓을 완전히 삭제할 수 있다. (버켓을
삭제하는 코드는 뒷부분에서 설명한다.) 여기에서는 테이블 행을 생성하는 방법에 대해 설명한다.
Listing 6. 버켓 목록 작성하기
<p>Here are your buckets:</p>
<table border='1' cellpadding='5'>
<?php
// Create a table row for each bucket.
$list = $s3->getBuckets();
foreach($list as $bucket) {
echo "<tr><td> <a href='bucketlist.php?bucketname=$bucket'>$bucket</a>";
echo "</td><td>";
$contents = $s3->getObjectsByBucket($bucket);
if (count($contents)) {
echo "<form action='$PHP_SELF' method='post' ";
echo "onsubmit='return confirm(\"Bucket $bucket is not empty! Do you ";
echo "really want to delete it?\");'>";
echo "<input type='hidden' name='deleteeverything' value='1'/>";
}
else {
echo "<form action='$PHP_SELF' method='post' ";
echo "onsubmit='return confirm(\"Do you really want to delete ";
echo "bucket $bucket?\");'>";
}
echo "<input type='hidden' name='buckettodelete' value='$bucket'/>";
echo "<input type='submit' value='Delete'>";
echo "</form></td></tr>";
}
?>
</table> |
링크가 버켓의 이름을 bucketlist.php 파일에 전달한다는 것을 알 수 있다.
새 버켓 작성하기
Amazon에서는 버켓 이름과 관련하여 다음과 같은 제한 사항을 두고 있으므로
새 버켓을 작성할 때 고려해야 한다.
- 이름의 길이는 3 - 63자 사이여야 한다.
- 소문자, 숫자, 마침표 및 대시 기호만 사용할 수 있다. 이전 버전의
S3에서는 버켓 이름에 밑줄을 사용할 수 있었다. 장기간 사용하고 있는 S3 계정에 액세스할
경우에는 이 규칙이 적용되지 않는 버켓을 볼 수도 있다.
- 숫자나 문자로 시작되어야 한다.
- IP 주소(예:
10.14.14.107)를 사용할 수 없다.
- 이름 끝에 대시 기호를 사용할 수 없다.
- 마침표 옆에 대시 기호(예:
doug-.tidwell)를 사용할 수 없다.
Zend_Service_Amazon_S3 클래스에는 버켓 이름을
검사하는 _validBucketName() 메소드가 있지만 아쉽게도 이 메소드의
코드에는 아직까지 Amazon에서 적용하고 있는 최신 이름 지정 규칙이 반영되어 있지 않다. 따라서
_validBucketName() 테스트를 통과한 버켓 이름이더라도 Amazon에서
통과되지 않을 수 있다.
새 버켓 이름을 작성하기 위한 양식은 다음처럼 단순하다.
Listing 7. 새 버켓을 작성하는 양식
<h2>Create a new bucket</h2>
<form action="<?= $PHP_SELF ?>" method="post">
<p>Enter a name for your new bucket:
<br/><br/>
<input type="text" name="newbucketname" size="63"/>
<br/><br/>
<i>A bucket name can contain only lowercase letters,
periods and dashes, <br/>it should start with a
letter or digit, and it can't be an IP address.</i>
<br/><br/>
<input type="submit" value="Create bucket"/>
</p>
</form> |
이 양식은 새 버켓 이름을 자신에게 제출한다. Create bucket 단추를
클릭하면 PHP 파일이 새 버켓 이름을 사용하여 자기 자신을 호출한다.
그림 2. 새 버켓을 작성하는 양식
새 버켓을 작성하는 PHP 코드에서는 이름의 유효성을 검사한다. 이름이 Zend_Service_Amazon_S3
클래스에서 제공하는 테스트를 통과하면 createBucket() 메소드가
호출된다. 0이 아닌 응답 코드는 버켓이 성공적으로 작성되었음을 의미하며 0은 버켓이 이미
존재하고 있다는 것을 의미한다. 기타 심각한 오류는 예외로 간주되어 최대한 적절하게 처리됩니다.
Listing 8. 새 버켓 작성하기
<?php
if (array_key_exists('newbucketname', $_POST) &&
strlen($_POST['newbucketname']) > 0) {
try {
if ($s3->_validBucketName($_POST['newbucketname'])) {
$responseCode = $s3->createBucket($_POST['newbucketname']);
if ($responseCode)
echo "The bucket ".$_POST['newbucketname']." was created successfully.";
else
echo "The bucket ".$_POST['newbucketname']." already exists.";
}
else
echo "Sorry, but ".$_POST['newbucketname']." isn't a valid bucket name.";
}
catch (Zend_Service_Amazon_S3_Exception $s3e) {
...
}
catch (Zend_Uri_Exception $urie) {
...
}
} |
버켓의 모든 오브젝트 나열하기
s3.php에서 버켓 이름을 클릭하면 bucketlist.php 파일로 연결된다. 이 파일은 버켓에 있는
모든 오브젝트와 각 오브젝트에 대한 메타데이터 및 오브젝트의 컨텐츠에 대한 링크를 표시한다.
그림 3. 버켓 내 오브젝트의 목록
Zend에는 매우 유용한 getObjectsByBucket() 메소드가
있다. getObjectsByBucket()은 버켓 이름을 받아서 오브젝트 이름으로
구성된 배열을 리턴한다. 이 코드에서는 메타데이터를 표시하기 위해 버켓의 각 항목에 대해 getInfo()
메소드를 호출한다. 이 코드처럼 getInfo()를 여러 번 호출하는
것은 매우 비효율적인 방법이기 때문에 프로덕션 애플리케이션에서는 이 작업을 수행하지 않아야 한다.
Listing 9. 메타데이터 검색 및 표시하기
$stuff = $s3->getObjectsByBucket($bucketName);
if (count($stuff)) {
?>
<table border='1' cellpadding='5'>
...
<?php
foreach ($stuff as $name) {
?>
<tr>
<?php
echo "<td> <a href='$s3_url/$bucketName/$name'>$name</a></td>";
$metadata = $s3->getInfo($bucketName."/".$name);
?>
<td style='text-align: right;'>
<?= number_format($metadata['size']) ?></td>
<td> <?= $metadata['type'] ?></td>
<td> <?= date("j M Y - H:i", $metadata['mtime']) ?></td>
<td>
?> |
새 오브젝트 작성하기
이 작업은 이 예제에서 가장 복잡한 부분이다. 새 오브젝트를 작성하려면 오브젝트의
이름이 Amazon에서 적용하는 규칙을 따라야 하고 오브젝트의 데이터를 사용할 수 있어야 한다. 오브젝트에
대한 파일, 액세스 정책 및 옵션 이름을 선택할 수 있는 양식이 표시된다.
그림 4. 새 오브젝트를 작성하는 양식
이 코드는 Browse 단추를 통해 선택한 파일을 받은 후 오브젝트 이름(있는
경우)과 기본 파일 이름을 결합하여 새 오브젝트의 이름을 작성한다. 예를 들어 선택한 파일이
c:\Documents and Settings\My Documents\My Pictures\doug.jpg이고 오브젝트 이름이 pictures라면
PHP 코드가 pictures/doug.jpg라는 오브젝트를 작성한다.
파일을 성공적으로 업로드하려면 HTML 양식에서 POST
메소드를 사용해야 하며 enctype 속성을 multipart/form-data로
설정해야 한다.
Listing 10. 새 오브젝트를 작성하는 양식
<h2>Add an object to this bucket</h2>
<form action='<?= $PHP_SELF ?>' method='POST' enctype='multipart/form-data'>
<input type='hidden' name='bucketname' value='<?= $bucketName ?>'/>
<input type='file' name='objecttoadd'/>
<p>Enter text to be appended to the object name (optional):
<input type='text' name='objectname'/>
<br/><i>Example: pictures/2009</i>
<br/><br/>Who can see this object:
<input type='radio' name='permissions' value='private'>Just me</input>
<input type='radio' name='permissions' value='public' checked>Anybody</input>
<br/><br/>
<input type='submit' value='Add this object'/>
</p>
</form> |
Listing 11에서는 새 오브젝트를 작성하는 코드를 보여 준다.
Listing 11. 새 오브젝트 작성하기
try {
$baseFileName = basename($_FILES['objecttoadd']['name']);
if (strlen($_POST['objectname']))
$newFileName = $_POST['objectname']."/".$baseFileName;
else
$newFileName = $baseFileName;
$escapedFileName = str_replace(array("\\", "_", ":"), "-", $newFileName);
if ($_POST['permissions'] == 'private')
$permissions = array(Zend_Service_Amazon_S3::S3_ACL_HEADER
=> Zend_Service_Amazon_S3::S3_ACL_PRIVATE);
else
$permissions = array(Zend_Service_Amazon_S3::S3_ACL_HEADER
=> Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ);
$s3->putObject($bucketName."/".$escapedFileName,
file_get_contents($_FILES['objecttoadd']['tmp_name']),
$permissions);
echo "The object $escapedFileName was created successfully.";
}
catch (Zend_Service_Amazon_S3_Exception $s3e) {
...
}
catch (Zend_Http_Client_Exception $hce) {
...
} |
이 코드에서는 PHP의 basename() 및 str_replace()
함수를 사용하여 기본 파일 이름을 가져와서 백슬래시, 밑줄 또는 마침표를 대시 기호로 바꾼다. 양식의
permissions 값은 새 오브젝트에 대한 액세스 정책을 결정하는 데
사용된다. 사용자가 "Just me"를 선택하면 오브젝트가 개인용으로 표시되며, 그렇지 않은 경우에는
모든 사용자가 오브젝트에 액세스할 수 있다. (S3 및 Zend Framework 모두 액세스 정책과 관련된
두 가지 옵션을 지원한다. 한 옵션은 인증된 특정 S3 사용자와만 오브젝트를 공유하는 것이며 다른
옵션은 오브젝트를 전달하는 데 필요한 대역폭에 대한 비용을 오브젝트 요청자에게 청구하는 방식으로
오브젝트를 공유하는 것이다.)
오브젝트 삭제하기
사용자가 오브젝트 옆의 Delete 단추를 클릭하면 오브젝트 삭제를 확인하는 메시지가 표시된다.
그림 5. 오브젝트 삭제하기
Delete 단추와 메시지 상자의 텍스트는 버켓 목록이 작성될 때 생성된다. Listing 12에서는
Delete 단추를 작성하는 PHP 코드를 보여 준다.
Listing 12. 오브젝트 삭제를 확인하는 양식
<form action='<?= $PHP_SELF ?>' method='post'
onsubmit='return confirm("Do you really want to delete this object?");'>
<input type='hidden' name='objecttodelete' value='$name'/>
<input type='hidden' name='bucketname' value='$bucketName'/>
<input type='submit' value='Delete'/>
</form> |
버켓이나 오브젝트를 작성하거나 삭제하는 모든 양식과 마찬가지로 이 양식도
자신을 호출한다. JavaScript confirm() 함수는 사용자가 Cancel을
클릭하면 작업을 취소한다. 사용자가 오브젝트를 삭제하기로 선택할 경우 삭제 작업을 실제로
수행하는 코드는 다음과 같이 매우 간단하다.
Listing 13. 오브젝트 삭제하기
try {
$s3->removeObject($bucketName."/".$_POST['objecttodelete']);
}
catch (Zend_Service_Amazon_S3_Exception $s3e) {
...
} |
페이지가 다시 로드되면서 버켓에 현재 포함되어 있는 오브젝트의 업데이트된 목록이 표시된다.
참고: Amazon S3는 개별 장치의 여러 오류를 안정적으로 처리할 수 있도록
설계되었다. 오브젝트가 추가 또는 삭제된 경우 변경 사항이 시스템 전체에 반영되기까지 지연
시간이 발생할 수 있으며 어떤 경우에는 다시 로드된 페이지에 삭제된 오브젝트가 버켓에 아직도
존재하는 것처럼 표시되기도 한다. 하지만 표시되더라도 대부분의 경우에는 크기가 0으로 표시된다. 일반적으로
페이지를 다시 로드할 때는 S3에 동기화를 수행할 수 있는 시간을 충분히 제공한다.
버켓 삭제하기
이 예제에서 지원되는 작업 중 가장 과감한 작업은 버켓을 삭제하는 것이다. 버켓
이름은 S3 전체에서 고유해야 하므로 어떤 사용자는 버켓을 삭제한 후 그 동안 같은 이름의 버켓을
작성한 사용자가 있는지 알아보기 위해 나중에 같은 이름의 버켓을 다시 작성해 볼 수도 있다. 예제를
좀 더 강력하게(혹은 위험하게) 만들기 위해 이 코드에서는 비어 있지 않은 버켓을 삭제할 수 있는 기능도
제공한다. S3에서는 비어 있지 않은 버켓을 삭제하는 기능이 지원되지 않는다. 이 기능은 Zend에서 제공하는
편리한 메소드를 사용하여 구현한 것이다.
사용자가 빈 버켓의 Delete 단추를 클릭하면 삭제를 확인하는 메시지가 표시된다.
그림 6. 빈 버켓 삭제하기
사용자가 비어 있지 않은 버켓의 Delete 단추를 클릭하면 구체적인 경고 내용이 포함된 확인 메시지가 표시된다.
그림 7. 비어 있지 않은 버켓 삭제하기
지정한 버켓이 비어 있는지 여부는 버켓 목록이 작성될 때 결정된다. 다음은 버켓 목록을 작성하는 PHP 코드이다.
Listing 14. 비어 있지 않은 버켓에 대한 경고 메시지 생성하기
$list = $s3->getBuckets();
foreach($list as $bucket) {
...
$contents = $s3->getObjectsByBucket($bucket);
if (count($contents)) {
echo "<form action='$PHP_SELF' method='post' ";
echo "onsubmit='return confirm(\"Bucket $bucket is not empty! Do you ";
echo "really want to delete it?\");'>";
echo "<input type='hidden' name='deleteeverything' value='1'/>";
}
else {
echo "<form action='$PHP_SELF' method='post' ";
echo "onsubmit='return confirm(\"Do you really want to delete ";
echo "bucket $bucket?\");'>";
}
echo "<input type='hidden' name='buckettodelete' value='$bucket'/>";
echo "<input type='submit' value='Delete'>";
echo "</form></td></tr>";
}
?>
</table> |
이 PHP 코드에서는 사용자의 계정에 있는 모든 버켓을 보여 주는 테이블을 작성하기
때문에 getObjectsByBucket()을 사용하여 각 버켓에 있는 모든 오브젝트의
이름이 포함된 배열을 가져온다. 그런 다음 배열이 비어 있지 않으면 엄격한 확인 메시지가 생성된다.
이 코드에서는 버켓을 실제로 삭제하는 작업을 수행하기 전까지 여러 단계를 거치게
된다. 먼저 버켓 이름이 유효한지 여부를 확인한다. 버켓 이름이 유효하면 버켓의 컨텐츠를 검사하여
빈 버켓인지 여부를 확인한다. 버켓이 비어 있으면 해당 버켓이 삭제되고 그렇지 않으면 deleteeverything
매개변수를 검사한다. 이 매개변수가 true로 설정되어 있으면 버켓이 삭제된다. 이 코드에서는
Zend Framework에서 제공되는 cleanBucket() 메소드를 사용한다. cleanBucket()
메소드는 버켓에 있는 모든 오브젝트의 목록을 가져온 다음 빈 버켓이 될 때까지 오브젝트를
하나씩 삭제한다. 이렇게 해서 오브젝트가 모두 삭제되면 마지막으로 버켓이 삭제된다.
Listing 15. 버켓 삭제하기
try {
if ($s3->_validBucketName($_POST['buckettodelete'])) {
$stuff = $s3->getObjectsByBucket($_POST['buckettodelete']);
if (!count($stuff))
$responseCode = $s3->removeBucket($_POST['buckettodelete']);
else
if (array_key_exists('deleteeverything', $_POST)) {
$s3->cleanBucket($_POST['buckettodelete']);
$responseCode = $s3->removeBucket($_POST['buckettodelete']);
}
... |
요약
이 기사에서는 Zend_Service_Amazon_S3 클래스의 다양한
기능을 사용하는 버켓 브라우저를 살펴보았다. 클라우드에 저장된 오브젝트를 보거나, 삭제하거나 바꿀
수 있으며 새 오브젝트를 쉽게 업로드할 수도 있다. 무엇보다도 REST 또는 SOAP 호출을 사용할 필요가
없었다. Zend Framework를 사용하는 개발자는 서명을 계산하지 않아도 되며 HTTP 응답 코드를 고려할
필요도 없으며 단지 데이터 작업만 수행하면 된다. 이 시리즈의 후속 기사에서는 클라우드 컴퓨팅 작업을
간소화할 수 있는 다른 Zend 클래스에 대해 설명한다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Sample code | os-php-zend1-zendcloud_s3.zip | 7KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Doug Tidwell은 IBM Emerging Technology 그룹의 Senior Software Engineer이며 1997년
1회 XML 컨퍼런스에 연사로 참여한 이후 여러 해 동안 마크업 언어, 웹 서비스 및 SOA 기술과
관련된 활동을 하고 있다. 기술 전도사로서 그는 클라우드 컴퓨팅과 관련된 표준 및 기술을
설명하고 이러한 기술을 전체 비즈니스 아키텍처 및 전략에 통합하는 데 필요한 도움을 고객에게
제공한다. developerWorks에 여러 편의 기사를 기고했으며 XSLT에 관한 다양한 주제를 자세히
다룬 O’Reilly에서 출판한 XSLT(ISBN 0-596-52721-7)의 저자이기도 하다. 노스캐롤라이나의 채펄힐에서
부인과 딸 그리고 애견과 함께 살고 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|