Amazon Web Services

PHP를 위한 S3 SDK

본 수업은 PHP SDK를 이용해서 S3를 이용하는 방법에 대한 수업입니다. 

선수학습

본 수업은 AWS SDK for PHP 수업을 먼저 들으셔야 합니다. 

권한

본 수업을 진행하기 위해서는 사용자나 역할이 AmazonS3FullAccess 권한이 있어야 합니다. 

API 사용법

파일 전송

s3_put.php

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$s3->putObject(Array(
    'ACL'=>'public-read',
    'SourceFile'=>'sample.txt',
    'Bucket'=>'codingeverybody2',
    'Key'=>'sample.txt'
));
?>

파일 목록 가져오기

s3_list.php

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$list = $s3->listObjects(Array('Bucket'=>'codingeverybody2'));
$listArray = $list->toArray();
foreach($listArray['Contents'] as $item){
    print($item['Key']."\n");
}
?>

파일 다운로드

s3_get.php

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$s3->getObject(Array(
    'Bucket'=>'codingeverybody2',
    'Key'=>'sample.txt',
    'SaveAs'=>fopen('sample_saved.txt', 'w')
));

웹애플리케이션에서 S3 활용

업로드 폼

upload.html

<html>
<body>
    <form enctype="multipart/form-data" action="./s3_upload.php" method="POST">
        <input type="file" name="userfile">
        <input type="submit">
    </form>
</body>
</html>

s3로 파일 전송

s3_upload.php

<?php
require 'vendor/autoload.php';
$param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
$s3 = new Aws\S3\S3Client($param);
$result = $s3->putObject(Array(
    'ACL'=>'public-read',
    'SourceFile'=>$_FILES['userfile']['tmp_name'],
    'Bucket'=>'codingeverybody2',
    'Key'=>$_FILES['userfile']['name'],
    'ContentType'=>$_FILES['userfile']['type']
));
unlink($_FILES['userfile']['tmp_name']);
$resultArray = $result->toArray();
var_dump($resultArray['ObjectURL']);
?>
<html>
<body>
<img src="<?php print($resultArray['ObjectURL']);?>" style="width:100%">
</body>
</html>

댓글

댓글 본문
작성자
비밀번호
  1. 시험모드
    음.. 우선 500 에러 에 대한 해결방법입니다.

    일단 과정을 말씀드리면..

    제 경우에는
    pubObject부분에서 계속 에러가 발생했기 때문에
    try catch 문을 넣어서 에러를 뽑았습니다.

    <?php
    require 'vendor/autoload.php';
    $param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01');
    $s3 = new Aws\S3\S3Client($param);
    try
    {
    $s3->putObject(Array(
    'ACL'=>'public-read',
    'SourceFile'=>'sample.txt',
    'Bucket'=>'codingeverybody2',
    'Key'=>'sample.txt'
    ));
    } catch (Exception e){
    echo $e;
    }
    ?>

    에러 로그를 보니..
    Error retrieving credentials from the instance profile metadata server
    이런 문구가 보이더군요.

    뭐.. 인증 정보가 제대로 인식이 안되는것 같습니다.

    그래서 우선,
    $param = Array('region'=>'ap-northeast-2', 'version'=>'2006-03-01', 'credentials' => array(
    'key' => '서버키',
    'secret' => '보안키',
    ));

    의 형태로 강제로 인증키를 넣어보았더니.. 에러 없이 파일이 잘 들어가더라구요.

    테스트 단계라 다른 인증방식은 사용해 보지 않았지만..
    인증키 부분만 잘 삽입되도록 하면 될 것같습니다.


    이걸 몰라서.. 이전에는 ec2 instance 새로 만들어서 IAM role 부여해서 했었는데..
    이번에는 다행히도 해결책을 찾았네요.

    도움이 되셨으면 좋겠습니다.
    대화보기
    • 시험모드
      답변 달아주신 그 부분에서 막히고 있습니다.

      CLI 로 실행하면 다운로드가 잘 되는데,
      브라우저 에서 실행하면 500 에러가 뜨고 아무 반응이 없습니다.

      로컬이 아닌 AWS EC2+S3 사용중이에요.

      IAM role을 부여하면 해결된다고 하셨는데..혹시 방법 좀 알 수 있을까요?
      대화보기
      • 구녹수수
        저도 서버오류500이 발생하는데 어떻게 해야하나요?
      • fabxoe
        9분 20초 무렵에, 저도 서버오류 500이 발생했어요.
      • SK Kim
        마지막 부분 작동이 안되어서 좀 고생했네요.
        원격으로 CLI에서 PHP가 정상 작동되지만 browser를 사용하면 서버오류 500가 나면서 작동을 안합니다.
        AWS를 사용하면 instance 생성시 IAM role을 부여하면 문제가 해결 되는데...
        로컬 환경에서 VM으로 서버를 생성하면 문제는 그대로 있네요.
      • egoing
        수정했습니다 ^^
        대화보기
        • 강의 잘보고 있습니다! 글에 있는 s3_get.php에 해당하는 소스코드가 잘못 된 것 같네요.
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기