s3 버킷에 php 코드를 통해 파일 업로드
Amazon S3로 파일을 업로드하기 위해서는 AWS에서 제공하는 GUI 콘솔을 이용하는게 가장 일반적인 사용 방법이지만, 지난 게시글에서 관리형 FTP 서비스인 AWS Transfer Family(비용 비쌈...)와 FTP 클라이언트 프로그램에서 S3 액세스를 지원하는 것을 확인했습니다.
오늘은 S3 버킷에 SDK(소프트웨어 개발 킷) for PHP를 이용하여 php 코드를 작성하고 버킷 리스트와 버킷에 포함된 오브젝트 리스트를 확인하고, 웹서버의 파일을 S3로 업로드하는 방법에 대해 알아보겠습니다.
AWS SDK for PHP란
AWS SDK for PHP는 php 코드를 통해 AWS의 여러 서비스에 액세스하기 위한 개발 도구로 현재 버전은 3점대 버전입니다.
요구사항
AWS SDK for PHP를 사용하기 위해서는 php버전 5.5 이상이 요구됩니다.
추가로 아래와 같은 권장 사항이 있습니다.(필수는 아니지만 권장되는 사항)
AWS SDK for PHP 설치
aws sdk for php 설치 관련 aws 공식 가이드
https://docs.aws.amazon.com/ko_kr/sdk-for-php/v3/developer-guide/getting-started_installation.html
AWS SDK for PHP 설치 방법에는 크게 1) php composer를 통한 설치, 2) phar(php 아카이브)를 통한 설치, 3) zip 파일을 통한 설치가 있습니다. 저는 여기서 zip 파일을 통해 설치하였습니다. 설치 방법은 굉장히 심플합니다. zip 파일을 다운로드하여 압축을 풀면 됩니다.
mkdir /var/www/html/s3 -> sdk for php를 이용하여 코드를 작성할 프로젝트의 경로로 지정해주면 되겠습니다.
cd /var/www/html/s3
wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
unzip aws.zip
AWS SDK for PHP를 위한 자격 증명 설정 방법
php 코드를 통해 S3를 포함한 aws 리소스에 액세스하려면 적절한 권한이 부여된 iam 사용자 계정의 액세스키와 시크릿 액세스키가 필요합니다. 자격 증명 설정 방법에는 크게 1) 환경 변수를 통한 자격 증명 방법, 2) aws 자격 증명 파일을 통한 자격 증명 방법, 3) iam 역할 부여를 통한 자격 증명 방법이 있습니다.
이 중 iam 역할을 통한 자격 증명은 웹서버가 AWS 클라우드 내에 있는 경우에만 사용이 가능하므로, 여기서는 환경 변수를 통한 방법과 aws 자격 증명 파일을 통한 방법을 다룹니다. 아래 두 가지 방법 중 현재 환경에서 사용가능한 방법 혹은 더 편한 방법을 사용하면 됩니다. (이 외에도 자격 증명을 php 소스 코드에 하드코딩하는 방법도 있으나 보안상 권장하지 않는 방법이라고 합니다)
1) 환경 변수를 통한 자격 증명 방법
말 그대로 환경 변수를 설정하여 자격을 증명하는 방법입니다. php 파일을 php cli 명령어를 통해 액세스하는 경우 해당 계정의 환경 변수를 아래와 같이 세팅합니다.
export AWS_ACCESS_KEY_ID=S3_액세스_권한이_있는_계정의_액세스키
export AWS_SECRET_ACCESS_KEY=S3_액세스_권한이_있는_계정의_시크릿_액세스키
아파치 웹서버를 통해 php 파일을 액세스하는 경우 httpd.conf 파일 혹은 .htaccess 파일에 아래와 같이 SetEnv 지시자를 이용하여 환경 변수를 세팅합니다.
SetEnv AWS_ACCESS_KEY_ID S3_액세스_권한이_있는_계정의_액세스키
SetEnv AWS_SECRET_ACCESS_KEY S3_액세스_권한이_있는_계정의_시크릿_액세스키
aws sdk for php는 환경변수를 getenv 함수를 통해 환경 변수를 인식하여 자격 증명을 통해 aws api로 액세스합니다.
2) aws 자격 증명 파일을 통한 자격 증명 방법
aws 자격 증명 파일을 통해 자격 증명을 제공하기 위해서는 ~/.aws/credentials 파일을 생성하여 적절히 권한이 부여된 iam 사용자 계정의 액세스키를 제공합니다. 아파치 웹서버를 통해 액세스하는 경우에도 /root/.aws/credentials 파일을 통해 자격 증명을 찾기 때문에 아파치 웹서버를 실행하는 계정과 관계 없이 /root 하위에 자격 증명 파일을 세팅합니다. 이미 aws cli를 설치하여 사용자 자격 증명 설정이 완료된 경우 별도의 설정 없이 바로 사용이 가능합니다.
mkdir ~/.aws
vim ~/.aws/credentials
[default]
aws_access_key_id = S3_액세스_권한이_있는_계정의_액세스키
aws_secret_access_key = S3_액세스_권한이_있는_계정의_시크릿_액세스키
샘플 코드 작성
1) 모든 버킷 리스트 출력
vim listBuckets.php
<?php
require './aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
# 'profile' => 'default', -> aws 자격 증명 파일을 통해 자격 증명 설정을 진행한 경우 주석 해제합니다. 환경 변수를 통한 자격 증명을 제공하는 경우 주석을 그대로 둡니다.
'region' => 'ap-northeast-2',
'version' => '2006-03-01'
]);
//Listing all S3 Bucket
$buckets = $s3Client->listBuckets();
echo $buckets . "
";
foreach ($buckets['Buckets'] as $bucket) {
echo "버킷 이름 = " . $bucket['Name'] . "
";
}
?>
위와 같이 코드를 작성하고 listBuckets.php 파일에 웹을 통해 액세스합니다. 위에 보기 어렵게 출력된 것은 전체 출력 내용이며, 아래는 버킷 이름만 따로 출력한 내용입니다.
2) 버킷의 모든 오브젝트 리스트 출력
vim listObjects.php
<?php
require './aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
# 'profile' => 'default', -> aws 자격 증명 파일을 통해 자격 증명 설정을 진행한 경우 주석 해제. 환경 변수를 통한 자격 증명을 제공하는 경우 주석
'region' => 'ap-northeast-2',
'version' => '2006-03-01'
]);
$result = $s3Client->listObjects([
'Bucket' => 'my-bucket' -> 오브젝트 리스트를 확인할 버킷의 이름으로 변경합니다.
]);
echo $result . "
";
foreach ($result['Contents'] as $Content) {
echo "파일 이름 = " . $Content['Key'] . "
파일 사이즈 = " . $Content['Size'] . "
";
}
?>
위와 같이 코드를 작성하고 listObjects.php 파일을 웹을 통해 액세스합니다. 테스트 환경에서는 my-bucket 버킷의 리스트를 출력하도록 코드를 작성하였습니다. 현재 버킷에 업로드된 디렉토리, 파일의 목록이 보여집니다. 위에 보기 어렵게 출력된 것은 전체 출력의 내용이며, 아래 부분은 파일 이름과 사이즈만 따로 출력한 내용입니다.
3) 특정 파일 업로드
업로드할 대상 이미지를 아래 경로에 생성하였습니다.
vim putObject.php
<?php
require './aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
# 'profile' => 'default', -> aws 자격 증명 파일을 통해 자격 증명 설정을 진행한 경우 주석 해제. 환경 변수를 통한 자격 증명을 제공하는 경우 주석
'region' => 'ap-northeast-2',
'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
'Bucket' => 'my-bucket', -> 파일을 업로드할 버킷의 이름으로 치환합니다.
'Key' => 'flowers-V2.jpg', -> 버킷에 올라갈 파일이 저장될 이름을 지정합니다.
'SourceFile' => './upload/flowers-new.jpg', -> 업로드할 파일의 경로를 지정합니다.
]);
echo $result . "
";
?>
코드를 위와 같이 작성하고 putObject.php 파일을 웹을 통해 액세스합니다. 아래와 같이 정상적으로 결과값이 출력됩니다. 업로드된 파일의 URI 경로나 ETag 값, 업로드 날짜 등을 확인 가능합니다.
실제로 파일이 잘 업로드되었는지 S3 콘솔을 통해 확인해봅니다.
또한 이전 생성한 샘플 페이지2(버킷의 모든 오브젝트 출력)에서도 정상적으로 새로 업로드한 파일이 보이는지 확인합니다.