개발을 하다보면 서버 이외의 스토리지 서버를 운영해야 하는 일이 잦습니다.
오늘은, Laravel을 이용하여 AWS의 스토리지 서비스인 S3 연동 방법을 소개해 드리려고 합니다.
Laravel은 기본 설정이 되어있다는 가정 하에 설명 하겠습니다!
[실무에서 작업하시는 분들은, 아래 포스트를 겸하여 개발을 진행해 주세요!!!]
1.composer를 이용하여 flysystem-aws-s3-v3 확장
먼저, AWS S3 연결에 필요한 소스 코드를 확장 시켜 줘야 합니다.
자세한 내용은 아래 링크를 확인해 주시면 될 것 같습니다.
composer require league/flysystem-aws-s3-v3
위와 같은 명령어를 터미널을 이용하여 프로젝트 루트폴더에서 입력해 줍시다.
만약 Laravel 버전이 8점대라면 오류가 발생하니 다음과 같이 입력해 줍시다.
composer require league/flysystem-aws-s3-v3:^1.0
2. AWS S3 생성 및 보안 설정
그 다음으로는 스토리지가 있어야 겠죠?
AWS 에서 S3를 생성해 줍니다.
저는 일단 한국 서버를 이용하기 때문에 리전을 한국으로 지정하고 생성하였습니다. (나중에 리전값이 쓰이기 때문에 이부분은 링크로 달아두겠습니다.)
일단 한국(서울)의 리전 코드값은, ap-northeast-2 입니다.
https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html
버킷 생성시에는 이름 및 지역, 옵션 구성, 권한 설정, 검토의 순서로 진행되는데 다른 부분은 넘어가고 3 권한 설정에서 모든 퍼블릭 엑세스 차단을 해제해 주세요.
이름 및 지역에서 버킷명(S3 명)을 지정해 주는 것 과 퍼블릭 엑세스 차단 해제를 제외하고는 다음만 계속 눌러주세요.
버킷 생성 이후에는, IAM 키를 만들어 주셔야 합니다.
AWS 의 IAM 콘솔에 들어가 주신 후,
위에서 보안자격 증명 관리를 눌러줍니다.
그 다음, 세번째 탭인 엑세스 키에서 새 엑세스 키 만들기를 이용하여 엑세스키를 발급 받아 주세요.
다운 받은 파일이나, 액세스 키 표시 버튼을 눌러주시면 AWSAccessKeyId, AWSSecretKey 두가지를 확인 해 주실 수 있습니다.
3. 연동
마지막으로는 연동입니다.
일단 laravle의 .env 파일에 다음 값들을 추가하여 주세요!
AWS_ACCESS_KEY_ID=aaaaa //IAM ACCESS KEY
AWS_SECRET_ACCESS_KEY=b //IAM SECRET KEY
AWS_DEFAULT_REGION=cccc //REGION CODE (링크 참조)
AWS_BUCKET=dddddddddddd //버킷 명
필요하다면 , 기본 S3 주소도 넣어주시는 편이 나중에 사용 할 때 편하긴 합니다.
AWS_ACCESS_KEY_ID=aaaaa //IAM ACCESS KEY
AWS_SECRET_ACCESS_KEY=a //IAM SECRET KEY
AWS_DEFAULT_REGION=aaaa //REGION CODE (링크 참조)
AWS_BUCKET=aaaaaaaaaaaa //버킷 명
AWS_S3_URL=aaaaaaaaaaaa //S3 기본 주소
S3 기본 주소는 S3 버킷 생성 후, 파일 업로드를 아무 파일이나 하나 해 주시면 파일의 endPoint 에서 확일 해 주실 수 있습니다.
이후의 업로드 방식은 다음 코드를 참조하여 작성해 주시면 될 것 같습니다.
(제 모듈중 일부를 복사 붙여넣기 하여서 변수명들이 다를 수 있습니다)
if(Input::hasFile($uploadName)) {
$uploadFile = $request::file($uploadName);
if(is_array($uploadFile)) {
foreach($uploadFile as $file) {
$url = "";
$now = date("Y-m-d H:i:s");
$tempFileName = $uuidLibrary->createUUID();
$fileSize = $file->getClientSize();
$fileRealName = $file->getClientOriginalName();
$fileExtension = $file->getClientOriginalExtension();
$filePath = Storage::disk('s3')->put($uploadFolder.$tempFileName,file_get_contents($file),'public');
$url = $s3URL.'/'.$uploadFolder.$tempFileName;
}
} else {
$url = "";
$now = date("Y-m-d H:i:s");
$tempFileName = $uuidLibrary->createUUID();
$fileSize = $request::file($uploadName)->getClientSize();
$fileRealName = $request::file($uploadName)->getClientOriginalName();
$fileExtension = $request::file($uploadName)->getClientOriginalExtension();
$filePath = Storage::disk('s3')->put($uploadFolder.$tempFileName,file_get_contents($request::file($uploadName)),'public');
$url = $s3URL.$uploadFolder.$tempFileName;
}
}
필요한 코드만 설명드리자면,
$uploadName은 Input type='file' 의 name 값 입니다.
Input::hasFile($uploadName)은 Input Form으로 받은 파일값이 존재하는지 확인 합니다.
$fileSize = $request::file($uploadName) Illuminate\Support\Facades\Request 를 이용하며, 파일의 정보를 가져옵니다.
getClientSize() = 파일 용량 반환를 반환합니다.
getClientOriginalName = 파일 명 반환를 반환합니다.
getClientOriginalExtension = 파일 확장자를 반환합니다.
Storage::disk('s3')->put(...) 는 파일을 직접 업로드 합니다.
이렇게 까지 하면 S3에 파일이 업로드 되시는 것을 확인 해 주실수 있습니다.
즐거운 개발 되세요!
'PHP > PHP' 카테고리의 다른 글
Laravel - passport를 이용한 로그인 구현 (Oauth) (2) | 2022.05.03 |
---|---|
[Laravel] Laravel + Vue 연동 (0) | 2020.12.15 |
[PHP Mailer] PHP 메일 발송하기 (0) | 2019.11.27 |
PHP를 이용한 동영상 썸네일 추출 (2) | 2018.03.13 |
dompdf를 이용한 HTML -> PDF 변환 (0) | 2018.03.08 |