Guide

[Guide | AWS] S3 / CloudFront 이미지 서비스 구축 (4) - 서비스를 위한 추가 고려사항

t-opendocs 2025. 5. 16. 16:35
반응형

서비스를 위한 추가 고려사항(저비용 고성능을 위한 옵션 및 설정)을 정리한다.


> 작성일 : 2025-05-16

<1> 이미지 사용 제한

업로드한 이미지 주소를 다른 사이트 또는 앱에 무분별하게 사용할 경우 과도한 트레픽 비용이 발생함

* 특정 국가로 차단
* AWS WAF 활성화
  - IP 주소, 리퍼러 기반 차단
* S3 버킷 정책 추가
* CloudFront Functions, Lambda@Edge
  - 사용자 지정코드로 유연하게 접근제어

CloudFront Functions 기반으로 특정 요청 제한 적용

<1-1> 함수 생성
  • CloudFront : 함수 : 함수 생성 클릭

  • 세부정보에서 이름 입력 & cloudfront-js-2.0 체크 하고 함수 생성 클릭

  • 특정 URL로 부터의 요청만 허용 : 아래코드 입력 후 변경 사항 저장
function handler(event) {
  const request = event.request;
  const headers = request.headers;
  const referer = headers.referer ? headers.referer.value : null;

  const urlList = [
    'https://www.allowed.com/',
    'https://allowed.com/'
  ];

  if (!referer || !urlList.includes(referer)) {
    const response = {
      statusCode: 403,
      statusDescription: 'Forbidden',
      headers: {
        'content-type': { value: 'text/plain' },
        'cache-control': { value: 'max-age=0, no-cache, no-store, must-revalidate' },
      },
      body: { value: 'Access Denied.' },
    };
    return response;
  }

  return request;
}
  • 특정 URL로 부터의 요청을 제한 : 아래코드 입력 후 변경 사항 저장
function handler(event) {
  const request = event.request;
  const headers = request.headers;
  const referer = headers.referer ? headers.referer.value : null;

  const urlList = [
    'https://not.allowed.com/'
  ];

  if (referer && urlList.includes(referer)) {
    const response = {
      statusCode: 403,
      statusDescription: 'Forbidden',
      headers: {
        'content-type': { value: 'text/plain' },
        'cache-control': { value: 'max-age=0, no-cache, no-store, must-revalidate' },
      },
      body: { value: 'Access Denied.' },
    };
    return response;
  }

  return request;
}
  • 테스트 탭에서 테스트 수행 : 게시 탭에서 함수 게시

<1-2> 생성한 함수 연결
  • CloudFront : 적용할 배포 선택 : 동작탭 : 선택 후 편집

  • 함수 연결 : 뷰어 요청 : 함수 유형 (CloudFront Functions) : 함수 ARN/이름 (위에서 등록한 함수 선택) : Save changes 클릭


<2> 적절한 가격 등급 선택

배포 목록에서 생성된 ID를 선택하고 일반 탭 : 설정 우측상단의 편집 클릭

서비스를 고려하여 3가지 요금 계층 (Price Class) 중 선택할 필요가 있다.

성능이 최우선 고려가 아니고 적은 비용을 원한다면 세번째 옵션을 선택한다.
* Use North America, Europe, Asia, Middle East, and Africa


<3> Origin Shield 사용

Origin Shield를 사용하게 되면 오리진 서버의 부하를 분산 시킬 수 있다.

* 추가적인 데이터 전송 비용 발생을 고려해야 한다.
* 오리진 서버 부하 감소를 성능향상 기대할 수 있다.

배포 목록에서 생성된 ID를 선택하고 원본 탭에서 버킷명을 선택 후 편집 클릭

Enable Origin Shield에서 예를 클릭하고 리전을 선택

반응형