간단하게 PHP에서 AWS의 S3 버킷에 파일을 업로드 합니다.
간단하게 PHP에서 AWS의 S3 버킷에 파일을 업로드 합니다.
2018-01-19
Explanation
간단하게 PHP로 AWS S3에 파일을 업로드하는 방법을 정리해보려 합니다.
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를 이용하여 업로드 하였습니다.
1 2 3 4 5 6 7 8 9 10 |
파일 구성 - Aws - GuzzleHttp - JmsPath - Psr aws-autoloader.php CHANGELOG.md LICENSE.md NOTICE.md READEME.md |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?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디렉토리 안에 저장합니다. ?> |
사실 특별한 코드가 있는건 아니지만,
서울 리전을 사용하면 서명 버전을 v4 만 사용이 가능하다고 하여 factory를 선언할때 조금 헤맷던거 같습니다.
S3 region 참고 : https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html#s3_region
인터넷으로 통해 검색 하였을때에는 아래와 같이 factory를 선언하는 경우를 종종 본거 같은데, (factory의 버전에 따른 차이 때문인지?) 아래의 선언으로는 서명 버전 오류가 출력되었습니다.
1 2 3 4 5 6 7 8 9 10 |
<?php $s3Client = S3Client::factory(array( 'region' => 'ap-northeast-2', 'version' => 'latest', 'credentials' => array( 'key' => '*********', 'secret' => '***********************' ) )); ?> |
그리고 WordPress 플러그인 ‘Amazon Web Service’ 의 코드를 살펴보던 중 ‘signature’ 의 값에 ‘v4’을 넣어주는 것을 보고 똑같이 적용하고, 실행해보니 정상 동작하는 것을 확인하였습니다.
1 2 3 4 5 6 7 8 9 |
<?php $s3Client = S3Client::factory(array( 'region' => 'ap-northeast-2', 'version' => 'latest', 'signature' => 'v4', 'key' => '**********', 'secret' => '**********************' )); ?> |