에루샤
erusya
Back-end Developer
Web Geek
Anime Otaku
에루샤
개발
Dev: Laravel 6.x

라라벨 S3 링크 CDN 링크로 바꾸기

65 views as of December 10, 2024.
먼저 본 내용을 시작하기전에 이 게시글에서는 이미지, 파일 리소스를 s3링크를 이용하는것이 아닌 AWS Cloud Front 서비스를 사용해서 cdn 링크로 사용하는 경우에 링크 도메인을 변경하기 위한 작업이다.

AWS S3 를 Cloud Front 로 배포하기 | AWS - eruLabo
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:cacheCopy


앞으로 프로젝트 어디에서든지 config('filesystems.disks.s3.cloudfront_url') 라는 호출로 해당 변수값을 이용할 수 있다.


마무리

모든 S3에 해당하는 링크 작업을 CDN으로 대체하는거는 불가능하다.
무슨소리냐면 CDN은 GET 방식으로 읽기에 최적화 되어있는 캐싱서버라 해당 CDN 링크로 S3 서버로의 수정, 삭제 등의 역할을 부여하는것은 불가능하다.

뭐 다행히 라라벨에선 해당 역할을 Storage 파사드가 관리하고있고 도메인이 빠진 파일 경로로만 제어가 되므로 다운로드 용도의 CDN 링크 도메인은 크게 프로젝트에 다른 부분에 영향을 끼치진 않았다.

하지만 이런 부분에 대해서 전체 도메인으로 읽기 이외의 작업을 할 부분이 있다면 꼭 테스트 이후에 배포하는것도 고려해야할것이다.
#AWS #CloudFront
0 개의 댓글
×