PHP로 AWS S3에 파일 업로드 / 삭제

개발을 파헤치다/PHP|2018. 1. 11. 14:30

Composer 설치

Composer는 PHP에서 사용하는 의존성 관리 도구입니다.

프로젝트에서 필요한 라이브러리들을 선언해두면 이 Composer라는 녀석이 필요한 패키지들을 프로젝트 안에 모두 설치해주죠.

AWS SDK를 사용하기 위해 일단 이 Composer라는 녀석부터 설치해보도록 하겠습니다.

curl -sS https://getcomposer.org/installer | php 

curl을 사용해 Composer를 설치해줍니다.


AWS SDK 설치

이제 프로젝트의 최상위 폴더에 composer.json이라는 파일을 만들어 줍니다.

vi composer.json

이 파일에 AWS SDK를 설치하라는 선언을 해줄겁니다.

{
"require": {
"aws/aws-sdk-php": "^3.34"
}
}

이렇게 선언을 해 주고 Composer가 설치하도록 명령을 해줍시다.

php composer.phar install

설치가 성공적으로 끝나면 프로젝트 폴더 안에 vendor라는 폴더가 생깁니다.

안에 들어가 보면 autoload.php라는 파일이 생성됩니다. 이를 통해 AWS SDK를 로드해서 사용할 수 있습니다.

AWS SDK 사용

연결 생성하기

$connect_param = array('region' => 'us-west-2', 'version' => 'latest',
'credentials' => array('key' => 'access key ID값', 'secret' => 'secret access key값'));

$connect= new Aws\S3\S3Client($connect_param); //S3에 접속

연결을 하는데 필요한 인자값은 2가지 입니다.

  • region
  • version


region은 현재 AWS S3를 사용하는 지역정보이고 version은 말 그대로 SDK 버전을 의미합니다.

여기에 한 가지 인자가 더 들어가는데 바로 credentials입니다.

이 부분은 허용된 사용자만 AWS SDK를 통해서 S3에 접근할 수 있도록 하는 인자값입니다.

소중한 서버에 아무나 접속해서 파일들을 수정해서는 안되겠죠?

credential는 연관 배열 형태로 만드는데 key는 접근 ID값이고 secret은 접근하기 위한 패스워드 정도로 생각하시면 편하겠네요.

AWS S3에 파일 업로드하기

$result = $connect->putObject(Array(
'ACL' => 'public-read',
'SourceFile' => '로컬 파일 경로',
'Bucket' => '파일을 저장할 버킷 이름',
'Key' => '파일이 저장될 Key값'
));
  • ACL → 액세스 제어 목록이라는 녀석인데 이 값을 사용해서 버킷과 객체에 대한 접근 권한을 관리할 수 있습니다.
  • SourceFile → S3로 보낼 파일의 경로를 뜻합니다.
  • Bucket → 파일이 저장될 S3의 버킷 이름을 뜻합니다.
  • Key → 버킷안에 저장될 Key값입니다. 파일 이름이 될 수 있겠죠.
    Bucket에 폴더 개념은 없지만 Prefix를 추가해서 폴더처럼 구분할 수 있는 기능이 있습니다.
    아래 그림처럼 한 버킷안에서 구분지어서 파일을 저장하고 싶다면 이 Key 인자값에 '폴더이름/키값'으로 주면 된다.
    예를 들어 1.jpg를 user_profile이라는 폴더 아래 저장하고 싶다면 'Key' 인자에 user_profile/1.jpg라고 값을 넣어주면 된다.

결과값

[
'ETag' => '<string>',
'Expiration' => '<string>',
'ObjectURL' => '<string>',
'RequestCharged' => 'requester',
'SSECustomerAlgorithm' => '<string>',
'SSECustomerKeyMD5' => '<string>',
'SSEKMSKeyId' => '<string>',
'ServerSideEncryption' => 'AES256|aws:kms',
'VersionId' => '<string>',
]
  • ETag → 업로드 된 객체의 태그값
  • Expiration → 만료 시간이 설정되어 있으면 객체가 소멸되는 날짜를 알려준다
  • ObjectURL → S3에 저장된 파일 주소
  • RequestCharged → 요청에 대해 요청자가 요금을 지불했음을 알려준다
  • SSECustomerAlgorithm → 사용자가 암호화 요청을 하면 암호화가 되었는지 확인한 후 헤더값을 넣어서 Response를 준다.
  • SSECustomerKeyMD5 → 사용자가 요청한 암호화 키값의 정합성을 판단하여 Response에 헤더값을 넣어 보내준다.
  • SSEKMSKeyId → 객체 암호화에 사용된 AWS key값을 나타낸다.
  • ServerSideEncryption → 서버단에서 사용한 암호화 알고리즘을 나타낸다. 예를 들어 AES256
  • VersionId → 객체의 버전을 나타낸다


AWS S3 파일 삭제하기


인자값 구성이 위와 같이 되어있습니다.

Delete에 지울 객체들을 넣어야 합니다.

Delete안의 Objects 키 값에 대한 Value로 지울 파일들 목록을 넣어줍니다.

이때 파일 목록을 연관 배열로 만들어 줍니다.

Key값에 파일이름(S3에 저장된 파일 Key값)을 넣어주면 되죠.

구현은 아래와 같습니다.

$img_list = array("1.jpg", "2.jpg", "3.jpg");

$toDelete_img_list = array();
for($i = 0; $i < sizeof($img_list); $i++)
{
//{Key, '파일이름'}으로 이루어진 배열을 만듭니다.
array_push($toDelete_img_list, array('Key' => $img_list[$i]));
}

$objects = array('Objects' => $toDelete_img_list);

$result = $connect->deleteObjects(Array(
'Bucket' => '버킷 이름',
'Delete' => $objects
));

결과값

[
'Deleted' => [
[
'DeleteMarker' => true || false,
'RequestCharged' => 'requester',
'VersionId' => '<string>',
],
// ...
],
'Errors' => [
[
'Code' => '<string>',
'Key' => '<string>',
'Message' => '<string>',
'VersionId' => '<string>',
],
// ...
],
'RequestCharged' => 'requester',
]
  • DeleteMarker → 해당 버전의 객체가 완전히 지워졌는지 여부
  • RequestCharged → 요청 요금이 부과되었는지 여부
  • VersionId → 삭제된 객체의 버전 아이디

  • Code → 에러 코드값
  • Key → 객체의 키 값
  • Message → 에러 메시지
  • VersionId → 객체의 버전 아이디



Reference

  1. PHP용 AWS SDK를 사용하여 객체 업로드 → http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/UploadObjSingleOpPHP.html
  2. PHP 의존성 관리도구 Composer → http://www.haruair.com/blog/1860
  3. PHP용 AWS SDK 환경 설정 → http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/UsingTheMPphpAPI.html
  4. PHP용 AWS SDK Quick Start → http://docs.aws.amazon.com/aws-sdk-php/v2/guide/quick-start.html
  5. PHP AWS SDK Install → http://docs.aws.amazon.com/aws-sdk-php/v2/guide/installation.html
  6. AWS S3 Client Constructor Param → http://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.AwsClient.html#___construct
  7. AWS SDK Basic Usage → http://docs.aws.amazon.com/aws-sdk-php/v3/guide/getting-started/basic-usage.html
  8. AWS Credentials → http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html
  9. AWS ACL을 사용한 액세스 관리 → http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html
  10. AWS SDK Put Object → http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#putobject
  11. AWS SDK delete objects → http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-s3-2006-03-01.html#deleteobjects
  12. AWS Metadata 및 폴더개념 → http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/UsingMetadata.html


댓글()