Amazon CloudFront
개발자 안내서 (API 버전 2016-09-29)

자습서: 간단한 Lambda@Edge 함수 생성

이 자습서에서는 CloudFront에서 실행되는 샘플 Node.js 함수를 작성하고 추가하는 과정을 통해 Lambda@Edge 시작 방법을 보여줍니다. 여기서 살펴볼 예제에서는 응답에 HTTP 보안 헤더를 추가하여 웹 사이트의 보안 및 개인 정보 보호를 강화합니다. (이 예제 연습에는 웹 사이트가 필요 없습니다. CloudFront가 파일을 검색할 때 응답에 보안 헤더를 추가하는 연습만 합니다.)

이 예제에서는 Lambda@Edge 함수를 만들고 구성하는 방법을 단계별로 보여줍니다. 간단한 단계에 따라 사용자의 자체 Lambda@Edge 솔루션에 사용하는 것과 동일한 옵션 중에서 선택하면 됩니다.

1단계: AWS 계정에 가입

아직 Amazon Web Services에 가입하지 않았다면 https://aws.amazon.com/에서 가입하십시오. Sign Up Now(지금 가입)를 선택하고 필요한 정보를 입력합니다.

2단계: CloudFront 배포 만들기

예제 Lambda@Edge 함수를 만들려면 먼저 콘텐츠를 제공할 오리진이 있는 CloudFront 환경부터 갖춰야 합니다.

CloudFront를 처음 사용하십니까? CloudFront는 엣지 로케이션의 전 세계 네트워크를 사용해 콘텐츠를 전송합니다. Lambda 함수와 함께 CloudFront를 설정하면 이 함수로 보다 관련성 있는 콘텐츠가 표시되게 사용자 지정하여 성능을 높일 수 있습니다. CloudFront에 익숙하지 않은 경우, 자습서를 진행하기 전에 잠깐 시간을 들여 간단한 개요를 읽고 CloudFront가 콘텐츠를 캐시 및 제공하는 방법을 알아보십시오.

이 예제에서는 CloudFront 배포의 오리진이 될 Amazon S3 버킷을 사용하여 CloudFront 배포를 만들어 봅니다. 사용할 환경이 이미 있는 경우 이 단계를 건너뛸 수 있습니다.

Amazon S3 오리진으로 CloudFront 배포를 생성하려면

  1. 이미지 파일 등 샘플 콘텐츠가 될 파일 한두 개로 Amazon S3 버킷을 만듭니다. Amazon S3에 콘텐츠 업로드의 단계를 따르면 됩니다. 버킷의 객체에 대한 퍼블릭 읽기 액세스를 허용하는 권한을 설정해야 합니다.

  2. CloudFront 웹 배포 만들기의 단계에 따라 CloudFront 배포를 만들고 오리진으로 S3 버킷을 추가합니다. 이미 배포가 있다면 버킷을 그 배포의 오리진으로 추가할 수 있습니다.

    작은 정보

    배포 ID를 기록해 둡니다. 이 자습서 후반부에서 함수의 CloudFront 트리거를 추가할 때 드롭다운 목록에서 배포 ID를 선택해야 합니다(예: E653W22221KDDL).

3단계: 함수 생성

이 단계에서는 Lambda 콘솔에 있는 블루프린트 템플릿으로 시작하여 Lambda 함수를 생성합니다. 이 함수는 CloudFront 배포의 보안 헤더를 업데이트하는 코드를 추가합니다.

Lambda 또는 Lambda@Edge를 처음 사용하십니까? Lambda@Edge에서 CloudFront 트리거를 사용하여 Lambda 함수를 호출할 수 있습니다. CloudFront 배포를 Lambda 함수와 연결하면 CloudFront가 CloudFront 엣지 로케이션에서 요청 및 응답을 가로채고 함수를 실행합니다. Lambda 함수로 보안을 강화하거나 최종 사용자에게 더 관련성 있는 정보가 표시되도록 사용자 지정하여 성능을 높일 수 있습니다. 이 자습서에서 만드는 함수는 CloudFront 응답의 보안 헤더를 업데이트합니다.

Lambda 함수를 만들려면 몇 가지 단계를 거쳐야 합니다. 이 자습서에서는 블루프린트 템플릿을 함수의 토대로 사용한 다음, 보안 헤더를 설정하는 코드로 함수를 업데이트합니다. 마지막으로 함수를 실행할 CloudFront 트리거를 추가하고 배포합니다.

Lambda 함수를 만들려면

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

    중요

    현재 US-East-1(버지니아 북부) 리전에 있는지 확인합니다. 이 리전에 있어야 Lambda@Edge 함수를 만들 수 있습니다.

  2. 함수 생성을 선택합니다.

  3. 함수 생성 페이지에서 Blueprints(블루프린트)를 선택한 후 CloudFront 블루프린트에 대해 필터링합니다. 검색 필드에 cloudfront를 입력하고 Return(반환)을 누릅니다. cloudfront 키워드가 표시되고, CloudFront 태그가 지정된 블루프린트가 모두 나열됩니다.

    참고

    CloudFront 블루프린트는 US-East-1(버지니아 북부) 리전에서만 사용 가능합니다.

    
								 Lambda 콘솔에서 CloudFront 블루프린트에 대한 필터.
  4. 함수의 템플릿으로 사용할 cloudfront-modify-response-header 블루프린트를 선택합니다.

  5. 다음과 같이 함수에 대한 정보를 입력합니다.

    이름

    함수 이름을 입력합니다.

    역할

    함수에 대한 권한 설정 방법을 선택합니다. 처음에는 기본 Lambda@Edge 권한 정책 템플릿을 사용하는 것이 가장 쉽기 때문에, 이 옵션에 템플릿에서 새 역할 생성을 선택합니다.

    역할 이름

    정책 템플릿으로 만들 역할의 이름을 입력하고, 이어서 정책 템플릿에서 그 이름을 선택합니다.

    정책 템플릿

    CloudFront 블루프린트를 함수의 기본으로 선택했으므로 정책 템플릿 기본 Edge Lambda 권한이 자동으로 추가됩니다. 이 정책 템플릿은 CloudFront이(가) 전 세계 CloudFront 로케이션에서 이 Lambda 함수를 실행하도록 하는 실행 역할 권한을 추가합니다. 자세한 내용은 Lambda@Edge에 대한 IAM 권한 및 역할 설정 단원을 참조하십시오.

  6. 함수 생성을 선택합니다. Lambda가 함수를 생성하면 다음 페이지에 축하합니다!라는 성공 메시지 상자가 나타납니다.

    
								Lambda 콘솔의 함수 코드 편집 및 구성 페이지.

    구성 탭에는 함수가 이름으로 표시된 다이어그램(이 예제에서는 UpdateSecurityHeaders), 함수에 대한 트리거, 로깅 정보 등 세 가지 주요 영역이 있습니다. 하단에는 사용자가 주요 영역에서 선택하는 상자에 따라 다른 옵션(예: 함수 이름, 트리거 또는 Amazon CloudWatch Logs)을 선택할 수 있는 섹션이 있습니다.

    또한 좌측에는 트리거 유형을 선택할 수 있는 목록이 있습니다. 함수를 만들 때 CloudFront 블루프린트를 선택했기 때문에 함수에 대해 CloudFront 트리거가 자동으로 추가되었습니다.

    이제 함수 코드를 업데이트하여 보안 헤더를 수정한 후, 다음 단계에서 코드를 실행할 CloudFront 트리거를 구성하고 배포할 수 있습니다.

    
								함수의 코드 또는 트리거를 추가할 수 있는 Lambda 콘솔 페이지.
  7. 함수 이름이 있는 상자를 선택한 후, Function code(함수 코드) 섹션에 있는 템플릿 코드를 오리진에서 반환된 보안 헤더를 수정하는 함수로 바꿉니다. 예를 들면 다음과 비슷한 코드를 사용할 수 있습니다.

    'use strict'; exports.handler = (event, context, callback) => { //Get contents of response const response = event.Records[0].cf.response; const headers = response.headers; //Set new headers headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}]; headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}]; headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}]; headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}]; headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}]; headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}]; //Return modified response callback(null, response); };
  8. 저장을 선택하여 업데이트된 코드를 저장합니다.

4단계: 함수를 실행할 CloudFront 트리거 추가

이제 보안 헤더를 업데이트할 Lambda 함수가 생성되었으므로, 그 함수를 실행하여 오리진에서 해당 배포에 대해 CloudFront(으)로 보내는 모든 응답에 헤더를 추가할 CloudFront 트리거를 구성해야 합니다.

함수의 CloudFront 트리거를 구성하려면

  1. CloudFront 상자를 선택하여 강조 표시합니다.

  2. 아래 트리거 구성 섹션에서 Deploy to Lambda@Edge(Lambda@Edge에 배포)를 선택하여 트리거를 정의한 후 배포할 수 있는 페이지를 엽니다.

    
								CloudFront 트리거를 구성 및 배포할 수 있는 Lambda 콘솔 페이지.
  3. Deploy to Lambda@Edge(Lambda@Edge로 배포) 페이지에서 CloudFront 트리거 구성 아래에 다음 정보를 입력합니다.

    Distribution

    함수와 연결할 CloudFront 배포 ID입니다. 드롭다운 목록에서 배포 ID를 선택합니다.

    캐시 동작

    트리거에 사용할 캐시 동작입니다. 이 예제에서는 *로 설정된 값을 그대로 둡니다. 이 값은 모든 요청에 해당 배포의 기본 캐시 동작을 적용합니다. 자세한 내용은 캐시 동작 설정 주제에서 배포를 만들거나 업데이트할 때 지정하는 값 단원을 참조하십시오.

    CloudFront 이벤트

    언제 함수를 실행할지 지정하는 트리거입니다. 여기서는 CloudFront가 오리진에서 응답을 반환할 때마다 보안 헤더 함수가 실행되도록 하겠습니다. 드롭다운 목록에서 오리진 응답을 선택합니다. 자세한 내용은 Lambda@Edge 함수에 대한 트리거 추가 단원을 참조하십시오.

    (선택 사항) 본문 포함

    함수에서 최종 사용자 요청 또는 오리진 요청 이벤트의 요청 본문을 읽고 싶으시면 이 확인란을 선택하십시오. 자세한 정보는 본문 포함 옵션을 선택해 요청 본문에 액세스 단원을 참조하십시오.

    
								함수의 코드 또는 트리거를 추가할 수 있는 Lambda 콘솔 페이지.
  4. Confirm deploy to Lambda@Edge(Lambda@Edge로 배포 확인)에서 확인란을 선택하여 트리거가 배포되어 모든 AWS 위치에서 함수를 실행함을 확인합니다.

  5. 배포를 선택하여 트리거를 추가하고 함수를 전 세계 AWS 위치에 복제합니다.

  6. 함수가 복제될 때까지 기다립니다. 일반적으로 몇 분이면 되지만 최대 15분까지 걸릴 수 있습니다.

    다음과 같이 CloudFront 콘솔에서 해당 배포를 보고 복제가 완료되었는지 확인할 수 있습니다.

    배포 상태가 진행 중에서 다시 배포 완료로 바뀌었는지 확인합니다. 이것은 함수가 복제되었다는 의미입니다. 이제 다음 단원의 단계에 따라 함수가 작동하는지 확인합니다.

5단계: 함수 실행 확인

Lambda 함수를 만들고 CloudFront 배포에 대해 이를 실행하는 트리거를 구성했으니 이제 이 함수가 원하는 결과를 달성하는지 확인해야 합니다. 이 예제에서는 오리진에서 반환된 HTTP 헤더를 확인하여 보안 헤더가 추가되었는지 알아보겠습니다.

Lambda@Edge 함수가 보안 헤더를 추가하는지 확인하려면

  1. 브라우저에서 S3 버킷에 있는 파일의 URL을 입력합니다. 예를 들면 http://d111111abcdef8.cloudfront.net/image.jpg와 비슷한 URL을 사용할 수 있습니다.

    파일 URL에 사용할 CloudFront 도메인 이름에 대한 자세한 내용은 CloudFront에서 파일에 대한 URL 형식 사용자 지정 단원을 참조하십시오.

  2. 브라우저에서 웹 개발자 도구 모음을 엽니다. 예를 들어 Chrome 브라우저 창에서는 컨텍스트(마우스 오른쪽 버튼 클릭) 메뉴를 연 다음 Inspect(검사)를 선택합니다.

  3. 네트워크 탭을 선택합니다.

  4. 페이지를 새로 고쳐 이미지를 확인한 다음 왼쪽 창에서 HTTP 요청을 선택합니다. HTTP 헤더가 별도의 창에 표시됩니다.

  5. HTTP 헤더 목록을 살펴보면서 원하는 보안 헤더가 목록에 포함되어 있는지 확인합니다. 예를 들어, 다음 스크린샷에 표시된 것과 비슷한 헤더가 보일 것입니다.

    
								원하는 보안 헤더가 강조 표시된 HTTP 헤더 목록.

추가한 보안 헤더가 헤더 목록에 있으면 완료된 것입니다. 첫 번째 Lambda@Edge 함수가 생성되었습니다. 반면, CloudFront에서 오류를 반환하거나 다른 문제가 있는 경우에는 계속해서 다음 단계로 넘어가 문제를 해결하십시오.

6단계: 문제 해결

CloudFront가 오류를 반환하거나 원하는 보안 헤더를 추가하지 않는 경우, CloudWatch 로그를 조사하여 함수의 실행 상태를 확인할 수 있습니다. 함수를 실행한 위치와 가장 가까운 AWS 위치에 저장된 로그를 사용해야 합니다.

예를 들어, 런던에서 파일을 볼 때는 CloudWatch 콘솔에서 리전을 EU(런던)로 변경해야 합니다.

Lambda@Edge 함수에 대한 CloudWatch 로그를 검사하려면

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 리전을 함수가 실행되는 리전, 즉 브라우저에서 파일을 볼 때 표시되는 리전으로 변경합니다.

  3. 왼쪽 창에서 로그를 선택하여 해당 배포의 로그를 봅니다.

자세한 정보는 CloudFront 모니터링 및 경보 설정 단원을 참조하십시오.

7단계: 예제 리소스 정리

이 자습서의 학습 예제에만 사용할 용도로 S3 버킷과 CloudFront 배포를 만들었다면 할당한 AWS 리소스를 삭제하여 더 이상 요금이 발생하지 않도록 하십시오. AWS 리소스를 삭제한 뒤에는 추가한 콘텐츠를 이용할 수 없게 됩니다.

작업

S3 버킷 삭제

S3 버킷을 삭제하기 전에 버킷에 대한 로깅이 비활성화되어 있는지 확인하십시오. 그렇지 않으면 삭제해도 AWS가 해당 버킷에 계속 로그를 기록합니다.

버킷에 대한 로깅을 비활성화하려면

  1. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 버킷을 선택한 다음, 속성를 선택합니다.

  3. 속성에서 로깅을 선택합니다.

  4. 활성화 확인란의 선택을 취소합니다.

  5. Save를 선택합니다.

이제 버킷을 삭제할 수 있습니다. 자세한 내용은 Amazon Simple Storage Service Console 사용 설명서S3 버킷을 삭제하려면 어떻게 해야 합니까? 단원을 참조하십시오.

CloudFront 배포 삭제

CloudFront 배포를 삭제하기 전에 반드시 배포를 비활성화해야 합니다. 비활성화된 배포가 작동하지 않아 요금이 발생하지 않습니다. 언제든지 비활성화된 배포를 활성화할 수 있습니다. 비활성화된 배포를 삭제한 뒤에는 사용할 수 없습니다.

CloudFront 배포를 비활성화 및 삭제하는 방법

  1. https://console.aws.amazon.com/cloudfront/에서 CloudFront 콘솔을 엽니다.

  2. 비활성화하려는 배포를 선택한 후 비활성화를 선택합니다.

  3. 확인 메시지가 표시되면 예, 비활성화를 선택합니다.

  4. 비활성화된 배포를 선택한 후 삭제를 선택합니다.

  5. 확인 메시지가 나타나면 예, 삭제합니다를 선택합니다.

추가 정보 리소스

Lambda@Edge 함수의 작동 방식에 대한 기본적인 내용을 배웠습니다. 이제 다음 자료를 읽고 자세히 알아보십시오.