Tempo Di Valse

[Laravel/AWS] Laravel 에서 AWS SDK 을 이용하여 S3 에 파일 전송하기 본문

개발/Web

[Laravel/AWS] Laravel 에서 AWS SDK 을 이용하여 S3 에 파일 전송하기

TempoDiValse 2022. 7. 27. 17:30

Laravel 에서는 로컬이나 원격의 파일들을 관리하는데에 Storage 파사드를 사용하여 관리를 한다. 친절하게도 AWS 의 S3 까지도 Storage 로 접근할 수가 있다. 자세한 사항은 다음 홈페이지를 통해 알아보도록 한다.

 

라라벨 8.x - 파일 스토리지

라라벨 한글 메뉴얼 8.x - 파일 스토리지

laravel.kr

그러나 세부적으로 뭔가를 하기에는 Storage 파사드는 뭔가 부족한 것이 있다. 그래서 Storage 의 한계점을 깨닫고 Laravel 에서 AWS PHP SDK 를 통하여 직접 버킷을 다루도록 작업을 해 보았다.

 

1. S3 버킷 생성

 

버킷 생성은 AWS S3 콘솔에서 할 수 있다.

 

2. IAM 생성

 

Laravel 에서 특정 AccessKey 를 통해 AWS 서비스에 접근하기 위해 IAM 을 통해 계정을 생성해준다. 해당 계정은 'AmazonS3FullAccess' 권한을 주도록 하여 파일 전송 이외에 사용할 기능에 대해 열어주도록 한다. 제한이 필요하다면 권한에 대해 JSON 정책을 생성하거나 하면 된다.

 

만든 후에는 해당 계정의 Access Key 와 Secret Key 가 들어있는 credential.csv 파일을 잘 가지고 있는다.

 

3. AWS PHP SDK 설치

 

Laravel 프로젝트에서 AWS PHP SDK 를 설치 해준다. 그렇다고 AWS 에 나와있는 일반적인 PHP SDK는 아니고, Laravel 전용으로 Amazon 에서 만들어준 SDK 를 설치한다

 

GitHub - aws/aws-sdk-php-laravel: A Laravel 5+ (and 4) service provider for the AWS SDK for PHP

A Laravel 5+ (and 4) service provider for the AWS SDK for PHP - GitHub - aws/aws-sdk-php-laravel: A Laravel 5+ (and 4) service provider for the AWS SDK for PHP

github.com

 

먼저, composer.json 에 설치하고자 하는 SDK 와 버전을 작성해주고서 composer 를 실행 시킨다.

 

4. Laravel 기본 설정

 

config/app.php 의 'providers' 와 'aliases' 항목에 다음 값을 추가해주어야 한다.

다음, artisan 을 통해서 AWS 와 관련된 환경설정을 할 수 있는 파일을 만들도록 한다.

php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"

실행 한 후에는 config 폴더에 aws.php 파일이 생성된다.

해당 파일에서 s3 항목을 추가하고 버킷 이름을 가져올 수 있도록 만들어준다.

return [
	...,

    's3' => [
        'bucket' => env('AWS_BUCKET', '')
    ]
];

그 다음, .env 파일을 실행 시키고 'AWS_' 키가 몰려 있는 곳에 다음처럼 일부 값을 변경해준다.

AWS_ACCESS_KEY_ID=${IAM_ACCESS_KEY}
AWS_SECRET_ACCESS_KEY=${IAM_SECRET_KEY}
AWS_REGION=ap-northeast-2
AWS_DEFAULT_REGION=${AWS_REGION}
AWS_BUCKET=${BUCKET_NAME}
AWS_USE_PATH_STYLE_ENDPOINT=false

IAM 에서 발급받은 계정의 Access/Secret Key 와 S3 에서 만든 버킷명을 꼭 입력해 주어야 한다. 설정을 완료했다면 artisan 을 통하여 정보를 적용시켜주면 된다.

 

5. 코딩

 

이제 AWS 라는 파사드를 통해서 S3에 접근을 할 수 있다. 

public function upload(){
    $s3 = AWS::createClient('s3');
    
    $src = ${현재 로컬에서의 파일 위치};
    $dest = ${S3 안에 저장 될 파일명};
    
    $s3->putObject([
        'Bucket' => config('aws.s3.bucket');
        'Key' => $dest,
        'SourceFile' => $src,
        'ContentType' => ${파일의 Content-Type}
    ]);
}

 

간단하게 S3를 관리하는 Client 를 생성하고서 putObject 를 통해서 S3 에 전달 한다고 볼 수 있다.

 

6. 주의사항

 

몇 가지 사항이 있는데, 내가 개발하면서 발견한 것은 다음과 같다.

  • AWS 파사드는 사용되는 PHP 파일 안에 use AWS; 를 쓰지 않으면 작동을 하지 않는다.
  • Key 라는 개념은 S3 내에서는 파일 PATH 의 개념이다
  • S3 에서의 폴더는 개념만 있지 보통 생각하는 폴더의 기능을 잘 하지 못한다.
  • ContentType 을 정의 하지 않으면 application/octet-stream 이 디폴트로 들어간다. (파일이 열리지 않고 다운로드 된다)
반응형
Comments