파즈의 삽질공간

'프로그래밍/PHP'에 해당되는 글 1건

  1. 2023.08.08 php에서 Oracle Storage에 파일 업로드 (s3 호환)

최근에 oracle cloud를 사용하면서 aws s3와 호환되는 oracle object storage를 연동하였는데

oracle에서 공식적으로 제공하는 php 라이브러리가 없고 github에 있는 프로젝트도 애매해서 좀 찾아보고 직접 설정하였다.

어렵진 않지만 간단한 거에서 막히거나 한글문서가 없는 등 breakpoint가 많아 따로 글을 작성한다.

 

주요 목차와 진행 순서는 아래와 같다.

  1. oracle object storage 버킷 생성
  2. oracle cloude에서 접근 가능한 api key/secret 생성
  3. php 연동 library로 aws sdk 설치
  4. php 파일 업로드 테스트 (object storage endpoint 설정)

 

1. oracle object storage 버킷 생성

버킷 생성방법은 다른 문서도 많으므로 간단하게만 다룬다.

Console 메뉴 - 스토리지 - 오브젝트 스토리지 및 아카이브 스토리지 - 버킷

 

[버킷 생성]으로 새로운 버킷 추가
생성된 버킷 정보 확인

생성이 완료된 후 확인해야 할 정보는 리전과 버킷 이름, 네임스페이스 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와 다른 점은 다음과 같다.

  1. S3Client 인스턴스 생성 시 bucket_endpoint와 endpoint 옵션을 전달
  2. putObject시 Bucket명으로 namespace을 전달

 

여러 번 테스트해가며 동작되는 endpoint와 namespace를 찾은 건데, 다른 방법이 있다면 댓글 부탁드립니다.

끝.

Posted by HyunGyu, LIM