간단하게 PHP에서 AWS의 S3 버킷에 파일을 업로드 합니다.

Explanation

간단하게 PHP로 AWS S3에 파일을 업로드하는 방법을 정리해보려 합니다.

1. AWS SDK FOR PHP 설치

AWS에서는 AWS SDK를 설치할 수 있는 3가지 방법을 안내하고 있습니다.

AWS SDK PHP 참고 : https://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/installation.html

저는 이미 FTP를 연결해서 사용하고 있어서 위 방법 중 3번 zip 파일을 다운로드 받아 FTP를 이용하여 업로드 하였습니다.

파일 구성
- Aws
- GuzzleHttp
- JmsPath
- Psr
aws-autoloader.php
CHANGELOG.md
LICENSE.md
NOTICE.md
READEME.md

2. PHP 코드 작성

<?php
define('S3_KEY', '.....');
define('S3_SECRET_KEY', '.....');
define('BUCKET', '.....');
include_once('aws/aws-autoloader.php');
// 앞서 다운로드한 SDK 파일의 autoloader를 불러옵니다.

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
// S3 파일 업로드에 필요한 클래스를 불러옵니다.

$s3Client = S3Client::factory(array(
  'region' => 'ap-northeast-2',
  'version' => 'latest',
  'signature' => 'v4',
  'key'    => S3_KEY,
  'secret' => S3_SECRET_KEY
));
// AWS IAM 에서 등록한 사용자의 Key와 Secret key로 서울 리전('ap-northeast-2')의 S3로 접근합니다.

$file_url = 'https://cheolguso.com/wp-content/themes/Cheolguso/img/logo200.png';
$s3_path = '/img/logo.png';
$file_data = file_get_contents($file_url);

$s3Client->putObject(array(
  'Bucket' => BUCKET,
  'Key'    => $s3Path,
  'Body'   => $file_data,
  'ACL'    => 'public-read'
));
// 이미지 파일('https://falsy.me/img/logo.png')을 S3버킷의 img디렉토리 안에 저장합니다.
?>

3. 마치며

사실 특별한 코드가 있는건 아니지만,
서울 리전을 사용하면 서명 버전을 v4 만 사용이 가능하다고 하여 factory를 선언할때 조금 헤맷던거 같습니다.

S3 region 참고 : https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html#s3_region

인터넷으로 통해 검색 하였을때에는 아래와 같이 factory를 선언하는 경우를 종종 본거 같은데, (factory의 버전에 따른 차이 때문인지?) 아래의 선언으로는 서명 버전 오류가 출력되었습니다.

<?php
$s3Client = S3Client::factory(array(
  'region' => 'ap-northeast-2',
  'version' => 'latest',
  'credentials' => array(
    'key' => '*********',
    'secret' => '***********************'
  )
));
?>

그리고 Wordpress 플러그인 ‘Amazon Web Service’ 의 코드를 살펴보던 중 ‘signature’ 의 값에 ‘v4’을 넣어주는 것을 보고 똑같이 적용하고, 실행해보니 정상 동작하는 것을 확인하였습니다.

<?php
$s3Client = S3Client::factory(array(
  'region' => 'ap-northeast-2',
  'version' => 'latest',
  'signature' => 'v4',
  'key'    => '**********',
  'secret' => '**********************'
));
?>