개발
Dev: Laravel 6.x
라라벨 S3 링크 CDN 링크로 바꾸기
65 views as of December 10, 2024.
먼저 본 내용을 시작하기전에 이 게시글에서는 이미지, 파일 리소스를 s3링크를 이용하는것이 아닌 AWS Cloud Front 서비스를 사용해서 cdn 링크로 사용하는 경우에 링크 도메인을 변경하기 위한 작업이다.
AWS S3 를 Cloud Front 로 배포하기 | AWS - eruLabo
S3 서버를 이용한 파일 배포AWS S3서버를 이용해서 이미지나 기타 파일등을 배포하는 방식을 웹사이트 구현에 써먹을 수 있다.이는 호스팅 서버에 직접적으로 파일이 업로드되지 않으므로 웹 서버용량에 문제될일도...
https://erulabo.com/239
자세한 내용은 위 링크를 확인하면 된다.
헬퍼 함수를 만들어서 링크 대체
우리가 기존에 라라벨 스토리지 파사드를 이용해 링크주소를 얻어낼때는 아래와 같이 사용할것이다.
$result = array('link' => Storage::disk('s3')->url($storedFile));
Copy
스토리지 파사드를 호출하고 disk 메소드로 s3, 즉 AWS S3를 호출하면 우리가 .env 파일과 config/filesystems.php 에 적어둔 설정을 기반으로 아래와 같이 파일경로에 알맞는 도메인을 부착해준다.
config/filesystems.php
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
],
Copy
근데 만약에 위에서처럼 S3 링크가아닌 Cloud Front 링크, 즉 별도의 CDN 링크를 쓴다고하면
Storage::disk('s3')->url()
을 대신한 링크 제작 메소드가 있어야할것이다.그리고 이 메소드는 반복해서 쓸 사양이고 말이다.
가장좋은거는 Storage 파사드 모델에 해당역할을 하는 메소드가 있으면 좋겠지만 그런 메소드는 없고, 또 오버라이드를 하려고해도 파사드를 호출하는과정에서 스토리지 객체가
League\Flysystem\Filesystem
객체로 바뀌고 이 객체는 오버라이드를 하는것이 쉽지않아서 곧 문제에 봉착하게된다.뭐 이러면 결국 내가 따로 메소드를 만들어서 쓰는게 맞는데, 이를 위해서 클래스를 새로 정의하는건 바보 같은 짓이다.
이럴땐 라라벨의 헬퍼 함수를 이용하면 쉽게 이를 구현할 수 있다.
app/Helpers/helpers.php
파일을 열면 사용자가 임의로 헬퍼 함수, 즉 전역에서 어느때든지 쓸 수 있는 함수를 정의할 수있다.파일을 열어 아래에 다음과 같은 헬퍼 함수를 추가해주자.
if (!function_exists('cdn_url')) {
function cdn_url($path)
{
// 환경 변수에서 CloudFront URL 가져오기
$cloudFrontUrl = config('filesystems.disks.s3.cloudfront_url');
// 경로 조합
return rtrim($cloudFrontUrl, '/') . '/' . ltrim($path, '/');
}
}
Copy
해당 헬퍼함수 cdn_url()은 다음과 같은 역할을 한다.
1. 환경변수에서 새로 링크 도메인을 가져온다. 이 과정은 스킵하고 그냥 바로
$cloudFrontUrl = "https://cdn.your.domain";
처럼 헬퍼 함수에 바로 기재해도된다.2. 파라미터로 주어진 파일 경로와 도메인을 적절하게 조합한 후 반환한다.
그야말로 단순한 문자열 합치기 기능이다.
그렇다고 이런 문자열 합치기를 매번 필요할때마다 해버리면 코드가 복잡해지니 공용화해서 위 처럼 관리하면 좋을 것이다.
환경변수에 CDN URL 저장하기
만약에 위의 예제처럼 별도의 환경변수 파일에 CDN URL을 저장해두고 관리하고 싶다면 아래와 같은 작업을 추가하면된다.
우선
.env
파일을 열어 아래와 같은 변수를 정의해준다....
AWS_CLOUDFRONT_URL=https://cdn.your.domain
...
Copy
그리고
config/filesystems.php
설정 파일을 열어 .env
파일에 추가한 변수를 앱에 등록해준다.'s3' => [
...
'cloudfront_url' => env('AWS_CLOUDFRONT_URL'),
],
Copy
그리고 난 후 라라벨 루트 폴더의 터미널에서 설정 캐시를 다시 생성해주면,
$ php artisan config:cache
Copy
앞으로 프로젝트 어디에서든지
config('filesystems.disks.s3.cloudfront_url')
라는 호출로 해당 변수값을 이용할 수 있다.마무리
모든 S3에 해당하는 링크 작업을 CDN으로 대체하는거는 불가능하다.
무슨소리냐면 CDN은 GET 방식으로 읽기에 최적화 되어있는 캐싱서버라 해당 CDN 링크로 S3 서버로의 수정, 삭제 등의 역할을 부여하는것은 불가능하다.
뭐 다행히 라라벨에선 해당 역할을 Storage 파사드가 관리하고있고 도메인이 빠진 파일 경로로만 제어가 되므로 다운로드 용도의 CDN 링크 도메인은 크게 프로젝트에 다른 부분에 영향을 끼치진 않았다.
하지만 이런 부분에 대해서 전체 도메인으로 읽기 이외의 작업을 할 부분이 있다면 꼭 테스트 이후에 배포하는것도 고려해야할것이다.
#AWS #CloudFront
0
개의 댓글
Dev: Laravel 6.x 콜렉션의 다른 글
개발 카테고리의 다른 글
12/10
DNS 전파 확인 사이트
개발, 배포를 하다보면 시급히 DNS를 추가하는 경우가 많다.이럴때 기본적으로 전파주기(TTL) 300초를 바탕으로 네임서버간 정보...
12/09
AWS Cloud Front 대체 도메인 적용 방법 (내 도메인)
Cloud Front 도메인아마존의 클라우드 프론트는 S3의 리소스를 캐시 서버를 이용해 CDN 방식으로 전파 및 배포할 수 있는 기능이...
12/09
AWS Cloud Front 실시간 로그 설정 방법
AWS 클라우드 프론트를 이용하면 AWS 리소스를 각 리전의 엣지에서 캐싱해 빠르게 응답할 수 있는 기능이다. 더불어 이런 클라우...