아마존 웹서비스

SDK - PHP

SDK란?

Software Development Kit의 약자로 특정한 소프트웨어나 플랫폼을 이용해서 소프트웨어를 개발할 때 이를 돕는 개발도구의 집합이다.

AWS SDK란?

AWS를 프로그래밍적으로 제어하는데는 많은 노력이 필요하다. 이 중에서 반복되고, 재활용 가능한 부분을 AWS 측에서 미리 개발해서 제공하고, 개발자들은 자신들의 비즈니스에 집중할 수 있도록 미리 만들어져서 제공되는 도구들의 집합이 AWS SDK이다.

AWS SDK의 종류

AWS는 아래와 같이 다양한 언어를 위한 SDK를 제공한다. 자신이 사용하는 언어에 맞는 SDK를 사용하면 된다.

AWS PHP SDK

PHP를 이용해서 AWS를 프로그래밍적으로 제어하는 방법에 도움을 주는 라이브러리의 집합이다. 인증과 같은 작업을 직접 구현하려면 많은 노력이 필요한데 SDK를 이용하면 최소한의 코드로 목적을 달성할 수 있다. 아래 링크를 통해서 다운로드 받을 수 있다.

준비사항

본 토픽을 이해하기 위한 선행사항은 아래와 같다.

AWS PHP SDK 설치

필자는 EC2 인스턴스를 생성하고 여기에 우분투를 설치했다. 거기에 Apache2를 설치했다. 이 과정은 이미 수업으로 제공되고 있기 때문에 EC2와 웹서버 토픽을 참고한다.  

PHP 설치

업로드 한 파일을 받아서 서버에 저장하기 위해서는 PHP가 설치되어 있어야 한다. PHP를 설치하는 명령은 아래와 같다.

sudo apt-get install php5-common php5 libapache2-mod-php5

SDK는 curl과 PHP-curl을 기본적으로 필요로 한다. 이것을 설치하는 방법은 아래와 같다.

sudo apt-get install curl php5-curl

php5-curl을 반영하기 위해서 apache를 재시작한다.

sudo /etc/init.d/apache2 restart;

개발환경 셋팅

웹을 통해서 서비스하려는 컨텐츠는 기본적으로 /var/www 디렉토리에 위치해야 한다. 이 디렉토리의 소유자가 root로 되어 있을 것인데 현재 접속한 사용자인 ubuntu로 변경하자. 아래와 같이 한다.

sudo chown ubuntu:ubuntu /var/www

/var/www에 AWS SDK PHP를 다운받는다. 아래와 같은 명령어를 실행한다. github에서 직접 필요한 소스를 다운받거나 버전관리를 할수도 있다.

wget https://github.com/aws/aws-sdk-php/archive/master.zip

ubuntu에는 압축 해제 프로그램이 기본적으로 설치되어 있지 않기 때문에 아래와 같이 설치한다.

sudo apt-get install unzip;

압축을 해제한다.

unzip master.zip

aws-sdk-php-master 디렉토리가 생성된다. 이 디렉토리로 이동한다.

cd aws-sdk-php-master;

아래의 명령을 실행해서 PHP의 의존성 관리자인 composer를 설치한다.

curl -s "http://getcomposer.org/installer" | php

실행 결과는 아래와 같다.

aws-sdk-php-master 디렉토리에는 composer.json 파일이 있는데 이 파일 안에는 AWS SDK를 사용하기 위한 외부 라이브러리들이 기술되어 있다. 아래 명령을 실행하면 이 파일에 기술된 라이브러리들을 설치한다.

php composer.phar install

실행 결과는 아래와 같다.

위와 같은 화면이 출력된다면 AWS SDK 설치에 성공한 것이다.

SDK를 이용한 개발

예제

SDK의 배포 채널인 github에는 AWS SDK php를 이용해서 DynamoDB를 제어하는 샘플 코드가 제공되고 있다. PHP를 이용해서 DynamoDB에 테이블을 만드는 예제다. 전체 코드는 아래와 같다.

<?php

// Include the SDK along with your other project dependencies
// using the Composer autoloader
require 'vendor/autoload.php';

use Aws\DynamoDb\DynamoDbClient;
use Aws\Common\Enum\Region;

// Instantiate the DynamoDB client with your AWS credentials
$client = DynamoDbClient::factory(array(
    'key'    => 'your-aws-access-key-id',
    'secret' => 'your-aws-secret-access-key',
    'region' => Region::US_WEST_2
));

$table = 'posts';

// Create a "posts" table
$result = $client->createTable(array(
    'TableName' => $table,
    'KeySchema' => array(
        'HashKeyElement' => array(
            'AttributeName' => 'slug',
            'AttributeType' => 'S'
        )
    ),
    'ProvisionedThroughput' => array(
        'ReadCapacityUnits'  => 10,
        'WriteCapacityUnits' => 5
    )
));

// Wait until the table is created and active
$client->waitUntil('TableExists', $table);

echo "The {$table} table has been created.\n";
?>

위의 코드는 그대로 사용할 수 없다. 그 전에 AWS에 회원가입을 해야하고, 비밀키(Secret Access Key)를 알아내야 한다. 회원가입은 회원가입 토픽을 참고한다. 아래는 비밀키를 알아내는 방법이다.

페이지 상단의 메뉴 중에 보안자격(Security Credentials)을 선택해서 보안자격 페이지로 이동한다. 페이지 내에 Access Credential 항목을 찾는다. 거기에 Access Key ID와 Secret Access Key의 show를 누르면 나타나는 키를 복사한다. 보라색으로 강조 표시한 부분이다. 만약 키가 없다면 Create a new Access Key를 클릭해서 새로운 키를 발급 받는다.

AWS 웹페이지에 로그인 할 때 사용하는 이메일과 비밀번호는 아마존 웹서비스를 제어하는 가장 강력한 권한이다. 이것을 직접적으로 SDK에서 사용하면 비밀번호가 유출될 수 있기 때문에 Secret Access Key를 별도로 두는 것이다. 만약 이 key가 유출 되었다면 폐기하고 새로운 키를 발급 받으면 된다. 그런 이유로 이메일과 비밀번호를 직접적으로 사용하지 않는 것이다.

이제 샘플 SDK의 내용을 수정해보자. 아래 내용을 수정할 것이다.

$client = DynamoDbClient::factory(array(
    'key'    => 'your-aws-access-key-id',
    'secret' => 'your-aws-secret-access-key',
    'region' => Region::US_WEST_2
));
  • your-aws-access-key-id : 위의 과정에서 알아낸 Access Key ID로 치환한다.
  • your-aws-secret-access-key : Secret Access Key로 치환한다.
  • Region::US_WEST_2 : 사용할 인프라의 지역을 기술하는 것인데 필자는 한국에서 가까운 도쿄를 사용할 것이기 때문에 AP_NORTHEAST_1 를 사용할 것이다. 이렇게 코드를 바꾸면 된다. 'region' => Region::AP_NORTHEAST_1

수정한 파일을 dynamodb.php로 저장 한 후에 아래와 같이 실행한다. 이 파일은 sdk가 설치된 디렉토리와 같은 디렉토리에 만들어야 한다.

php dynamodb.php

아래와 같은 결과가 출력 되었다면 성공한 것이다.

실행 결과를 확인하기 위해서 DynamoDB에 접속해보자.

AWS Management Console DynamoDB에 접근한다. URL은 아래와 같다.

https://console.aws.amazon.com/dynamodb/

지역(Region)을 도쿄로 지정한다.

아래와 같은 화면이 나타나면 성공적으로 테이블이 생성된 것이다.

SDK 사용하기

위의 예제를 통해서도 알 수 있듯이 AWS PHP SDK를 사용하기 위해서는 코드의 초입에서 라이브러리를 불러와야 한다.

require 'vendor/autoload.php';

SDK에서 제공하는 API는 아래의 API Document를 통해서 열람 할 수 있다.

http://docs.amazonwebservices.com/aws-sdk-php-2/latest/index.html

댓글

댓글 본문
  1. [RuntimeException]
    Could not scan for classes inside "build/" which does not appear to be a file nor a folder
    이런 에러가 발생하는데 어떻게 해결하나요
  2. Hyukjoon Lee
    AWS SDK 가 v3 으로 올라가면서 위의 강의와는 다른게 많네요.
    v3 사용하실 분들 참고하세요.
  3. test1234
  4. Bongchul Ki
    이거 설치할 때 var/www폴더에 하는게 좋은가요. 아님 va/www/html 폴더에 하는게 좋을까요?
  5. soarhigh7
    윈도우 서버에서는 어떻게 되는건가요....우분투만있어서..ㅜㅜ
  6. redpepper180
    저도 같은 문제가 생기네요 ㅜㅠ
    대화보기
    • yamkoh
      "php composer.phar install" 명령어를 수행하면 진행이 되다가..
      [RuntimeException]
      Could not scan for classes inside "build/" which does not appear to be a file nor a folder

      이런 에러가 발생하네요. 다른분들은 잘 진행되는것같은데..
    • 몸종돼지
      PHP Fatal error: Uncaught Aws\DynamoDb\Exception\DynamoDbException: AWS Error Code: SerializationException, Status Code: 400, AWS Request ID: QQ08DV81EO2KEPTMI230NRMH2VVV4KQNSO5AEMVJF66Q9ASUAAJG, AWS Error Type: client, AWS Error Message: Start of structure or map found where not expected., User-Agent: aws-sdk-php2/2.7.27 Guzzle/3.9.3 curl/7.22.0 PHP/5.3.10-1ubuntu3.17
      thrown in /var/www/aws-sdk-php-master/src/Aws/Common/Exception/NamespaceExceptionFactory.php on line 91

      이런 에러 나오는 상황은 위에 예제로 나온 createTable 함수가 잘못 되어 그런것 같습니다.
      함수 정의가 바뀌었던가요
      그리고 하단에 테이블 만들어졌는지 확인하는 함수도 array 형식으로 넣어야 하구요

      http://docs.aws.amazon.com......ble

      위에 링크 참조하셔서 적절히 수정하시면 됩니다.


      // Create a "posts" table
      $result = $client->createTable(array(
      'TableName' => $table,
      'AttributeDefinitions' => array(
      array(
      'AttributeName' => 'id',
      'AttributeType' => 'N'
      ),
      array(
      'AttributeName' => 'time',
      'AttributeType' => 'N'
      )
      ),
      'KeySchema' => array(
      array(
      'AttributeName' => 'id',
      'KeyType' => 'HASH'
      ),
      array(
      'AttributeName' => 'time',
      'KeyType' => 'RANGE'
      )
      ),
      'ProvisionedThroughput' => array(
      'ReadCapacityUnits' => 10,
      'WriteCapacityUnits' => 20
      )
      ));

      // Wait until the table is created and active
      //$client->waitUntil('TableExists', $table);

      $client->waitUntil('TableExists', array('TableName' => $table));
    • seojunkyo
      저도 이런 에러가 나네요.....
      대화보기
      • 육점이
        PHP Fatal error: Uncaught Aws\DynamoDb\Exception\DynamoDbException: AWS Error Code: SerializationException, Status Code: 400, AWS Request ID: QQ08DV81EO2KEPTMI230NRMH2VVV4KQNSO5AEMVJF66Q9ASUAAJG, AWS Error Type: client, AWS Error Message: Start of structure or map found where not expected., User-Agent: aws-sdk-php2/2.7.27 Guzzle/3.9.3 curl/7.22.0 PHP/5.3.10-1ubuntu3.17
        thrown in /var/www/aws-sdk-php-master/src/Aws/Common/Exception/NamespaceExceptionFactory.php on line 91
        nano로 내용을 추가해서 php dynamodb.php를 실행하게 되면 위의 에러가 뜨네요ㅠㅠㅠ
        구글링 해보아도 어떤 의미로 잘못 된 것인지 잘 캐치하지 못했는데 아시는 분 도움 부탁 드립니다!!
      • YG.OK
        아마존리눅스 설치해서 해봤는데..
        제 지식이 짧아서 그런지.. 잘 안되네요~

        unzip master.zip 이후 진행이 안되네요..

        우분투에선 잘 됩니다..
      • Choi Woo Geun
        수업 잘 들었습니다. 근데 실행을 시키고 나니 시간이 좀 있다가
        killed 명령어만 뜨는데 왜 그러는 건가요>??
      • ysyang99
        좋은 자료 감사합니다