최근에 oracle cloud를 사용하면서 aws s3와 호환되는 oracle object storage를 연동하였는데
oracle에서 공식적으로 제공하는 php 라이브러리가 없고 github에 있는 프로젝트도 애매해서 좀 찾아보고 직접 설정하였다.
어렵진 않지만 간단한 거에서 막히거나 한글문서가 없는 등 breakpoint가 많아 따로 글을 작성한다.
주요 목차와 진행 순서는 아래와 같다.
- oracle object storage 버킷 생성
- oracle cloude에서 접근 가능한 api key/secret 생성
- php 연동 library로 aws sdk 설치
- php 파일 업로드 테스트 (object storage endpoint 설정)
1. oracle object storage 버킷 생성
버킷 생성방법은 다른 문서도 많으므로 간단하게만 다룬다.
생성이 완료된 후 확인해야 할 정보는 리전과 버킷 이름, 네임스페이스 3가지이며. 스크린샷 기준으로는 다음과 같다.
- 리전: ap-chuncheon-1
- 버킷이름: mybucket
- 네임스페이스: axkhzc3adisu
2. oracle cloude에서 접근 가능한 api key/secret 생성
console 화면이 바뀌어서인지 찾는데 정말 한참 걸렸다.
내 계정이 아닌 다른 계정으로 생성이 필요하면 [ID 도메인 - 사용자]로 들어가서도 설정이 가능하다.
키를 생성하면 비밀번호(secret)가 1회에 한해 표시된다.
생성이 완료되면 아래 형식과 같은 접근 KEY가 생긴다.
- key: 50d79c0c177103093e782a13edd1537af39312ff
- secret: NYtCkmnGPpCUbc3fRHCdDCPpaS/miiNBI/lAWKQVIH4=
주의사항: 주 계정에다가 접근 KEY를 생성하면 cloud의 다른 기능에도 접근이 가능할 수 있으므로 보안이 중요하다면 공식 매뉴얼을 확인하여 접근 제어를 반드시 해야 한다.
3. php 연동 library로 aws sdk 설치
프로젝트 루트에서 composer를 이용해 아래와 같이 모듈을 설치한다.
composer require aws/aws-sdk-php
혹은 aws 문서를 참고하여 php sdk 모듈을 로드한다.
4. php 파일 업로드 테스트 (object storage endpoint 설정)
<?php
// composer 기준 autoload
include 'vendor/autoload.php';
use \Aws\Exception\AwsException;
use \Aws\S3\S3Client;
// cloud 환경에 맞게 설정
$region = '[REGION]';
$key = '[ACCESS_KEY]';
$secret = '[ACCESS_SECRET]';
$namespace = '[STORAGE_NAMESPACE]';
$bucket = '[STORAGE_BUCKET]';
$s3Client = new S3Client([
'region' => $region,
'version' => '2006-03-01',
'credentials' => [
'key' => $key,
'secret' => $secret,
],
'bucket_endpoint' => true,
'endpoint' => "https://{$namespace}.compat.objectstorage.{$region}.oraclecloud.com/{$bucket}"
]);
$filePath = 'README.md'; // 업로드 대상 파일
$uploadPath = 'sample/' . $filePath; // 업로드할 서버 경로
try {
$result = $s3Client->putObject(array(
'Bucket' => $namespace,
'Key' => $uploadPath,
'SourceFile' => $filePath,
));
} catch (AwsException $e) {
echo '업로드에 실패했습니다. - ' . $e->getMessage();
}
// 파일 URL 출력
echo $result['ObjectURL'] . PHP_EOL;
코드를 실행하면 업로드 수행 후 URL을 출력한다.
aws s3와 다른 점은 다음과 같다.
- S3Client 인스턴스 생성 시 bucket_endpoint와 endpoint 옵션을 전달
- putObject시 Bucket명으로 namespace을 전달
여러 번 테스트해가며 동작되는 endpoint와 namespace를 찾은 건데, 다른 방법이 있다면 댓글 부탁드립니다.
끝.