Amazon을 사용하여 VPC를 통해 Amazon S3 버킷의 정적 콘텐츠를 제공합니다. CloudFront - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon을 사용하여 VPC를 통해 Amazon S3 버킷의 정적 콘텐츠를 제공합니다. CloudFront

작성자: Angel Emmanuel Hernandez Cebrian

환경: PoC 또는 파일럿

기술: 콘텐츠 전송, 네트워킹, 보안, ID, 규정 준수, 서버리스, 웹 및 모바일 앱

AWS 서비스: 아마존 CloudFront, 엘라스틱 로드 밸런싱 (ELB), AWS Lambda

요약

Amazon Web Services (AWS) 에서 호스팅되는 정적 콘텐츠를 제공하는 경우 Amazon Simple Storage Service (S3) 버킷을 오리진으로 사용하고 CloudFront Amazon을 사용하여 콘텐츠를 배포하는 것이 좋습니다. 이 솔루션에는 두 가지 주요 이점이 있습니다. 하나는 엣지 로케이션에서 정적 콘텐츠를 캐싱할 수 있다는 편리함과 CloudFront 배포를 위한 웹 액세스 제어 목록 (웹 ACL) 을 정의할 수 있어 구성 및 관리 오버헤드를 최소화하면서 콘텐츠에 대한 요청을 보호할 수 있다는 점입니다.

하지만 권장되는 표준 접근 방식에는 일반적인 아키텍처 제한이 있습니다. 일부 환경에서 사용자는 가상 사설 클라우드(VPC)에 배포된 가상 방화벽 어플라이언스가 정적 콘텐츠를 포함한 모든 콘텐츠를 검사하기를 원합니다. 표준 접근 방식은 검사를 위해 VPC를 통해 트래픽을 라우팅하지 않습니다. 이 패턴은 대체 아키텍처 솔루션을 제공합니다. 여전히 CloudFront 배포를 사용하여 S3 버킷의 정적 콘텐츠를 제공하지만 Application Load Balancer를 사용하여 VPC를 통해 트래픽이 라우팅됩니다. 그러면 AWS Lambda 함수가 S3 버킷에서 콘텐츠를 검색하고 반환합니다.

사전 조건 및 제한 사항

사전 조건

  • 활성 상태의 계정

  • S3 버킷에 호스팅된 정적 웹 사이트 콘텐츠.

제한 사항

  • 이 패턴의 리소스는 단일 AWS 리전에 있어야 하지만 다른 AWS 계정에서 프로비저닝할 수 있습니다.

  • 제한은 Lambda 함수가 수신하고 전송할 수 있는 최대 요청 및 응답 크기에 각각 적용됩니다. 자세한 내용은 대상으로서의 Lambda 함수의 제한(Elastic Load Balancing 설명서)을 참고하십시오.

  • 이 접근 방식을 사용할 때는 성능, 확장성, 보안 및 비용 효율성 간에 적절한 균형을 찾는 것이 중요합니다. Lambda의 높은 확장성에도 불구하고 동시 Lambda 호출 수가 최대 할당량을 초과하는 경우 일부 요청에는 병목 현상이 발생합니다. 자세한 내용은 Lambda 할당량(Lambda 설명서)를 참고하십시오. Lambda를 사용할 때는 요금도 고려해야 합니다. Lambda 호출을 최소화하려면 배포용 캐시를 올바르게 정의해야 합니다. CloudFront 자세한 내용은 캐싱 및 가용성 최적화 (설명서) 를 참조하십시오. CloudFront

아키텍처

대상 기술 스택

  • CloudFront

  • Amazon Virtual Private Cloud(VPC)

  • Application Load Balancer

  • Lambda

  • Amazon S3

대상 아키텍처 

다음 이미지는 VPC를 통해 S3 버킷의 정적 콘텐츠를 제공하는 CloudFront 데 사용해야 할 때 권장되는 아키텍처를 보여줍니다.

VPC의 애플리케이션 로드 밸런서를 통해 Lambda 함수로 가는 트래픽 플로우입니다.
  1. 클라이언트는 S3 버킷의 특정 웹 사이트 파일을 가져오기 위해 CloudFront 배포 URL을 요청합니다.

  2. CloudFront 요청을 AWS WAF로 보냅니다. AWS WAF는 배포에 적용된 웹 ACL을 사용하여 요청을 필터링합니다. CloudFront 요청이 유효한 것으로 확인되면 플로우가 계속됩니다. 요청이 유효하지 않은 것으로 확인되면 클라이언트는 403 오류를 수신합니다.

  3. CloudFront 내부 캐시를 확인합니다. 수신 요청과 일치하는 유효한 키가 있는 경우 관련 값이 클라이언트에 응답으로 다시 전송됩니다. 그렇지 않은 경우에는 플로우가 계속됩니다.

  4. CloudFront 요청을 지정된 애플리케이션 로드 밸런서의 URL로 전달합니다.

  5. Application Load Balancer에는 Lambda 함수를 기반으로 하는 대상 그룹과 연결된 리스너가 있습니다. 애플리케이션 로드 밸런서는 Lambda 함수를 호출합니다.

  6. Lambda 함수는 S3 버킷에 연결하여 GetObject 작업을 수행하고 콘텐츠를 응답으로 반환합니다.

자동화 및 규모 조정

이 접근 방식을 사용하여 정적 콘텐츠 배포를 자동화하려면 CI/CD 파이프라인을 생성하여 웹사이트를 호스팅하는 Amazon S3 버킷을 업데이트하십시오.

Lambda 함수는 서비스의 할당량 및 한도 내에서 동시 요청을 처리하도록 자동으로 확장됩니다. 자세한 내용은 Lambda 함수 조정Lambda 할당량(Lambda 설명서)을 참조하세요. Application Load Balancer와 같은 다른 AWS 서비스 CloudFront 및 기능의 경우 AWS는 이러한 서비스 및 기능을 자동으로 조정합니다.

도구

  • Amazon은 전 세계 데이터 센터 네트워크를 통해 웹 콘텐츠를 전송함으로써 웹 콘텐츠 배포 CloudFront 속도를 높여 지연 시간을 줄이고 성능을 개선합니다.

  • Elastic Load Balancing(ELB)은 들어오는 애플리케이션 또는 네트워크 트래픽을 여러 대상에 분산합니다. 이 패턴에서는 Elastic Load Balancing을 통해 프로비저닝된 Application Load Balancer를 사용하여 트래픽을 Lambda 함수로 전달합니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • Amazon Simple Storage Service(S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

  • Amazon Virtual Private Cloud(VPC)를 사용하면 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 사용자의 자체 데이터 센터에서 운영하는 기존 네트워크와 유사하며 AWS의 확장 가능한 인프라를 사용한다는 이점이 있습니다.

에픽

작업설명필요한 기술

VPC를 생성합니다.

이 패턴으로 배포된 리소스(예: Application Load Balancer 및 Lambda 함수)를 호스팅하기 위한 VPC를 생성합니다.  지침은 VPC 생성(Amazon VPC 설명서)을 참고하십시오.

클라우드 아키텍트

AWS WAF 웹 ACL을 생성합니다.

AWS WAF 웹 ACL을 생성합니다. 이 패턴 후반부에서는 이 웹 ACL을 배포에 CloudFront 적용합니다. 지침은 웹 ACL 생성(AWS WAF 설명서)을 참고하십시오.

클라우드 아키텍트

Lambda 함수를 생성합니다.

S3 버킷에 호스팅된 정적 콘텐츠를 웹사이트로 제공하는 Lambda 함수를 생성합니다. 이 패턴의 추가 정보 섹션에 제공되는 코드를 사용합니다. 대상 S3 버킷을 식별하도록 코드를 사용자 지정합니다.

일반 AWS

Lambda 함수를 업로드합니다.

다음 명령을 입력하여 Lambda 함수 코드를 Lambda의 .zip 파일 아카이브에 업로드합니다.

aws lambda update-function-code \ --function-name \ --zip-file fileb://lambda-alb-s3-website.zip
일반 AWS

Application Load Balancer을 생성합니다.

Lambda 함수를 가리키는 인터넷 연결 애플리케이션 로드 밸런서를 생성합니다. 지침은 Lambda 함수의 대상 그룹 생성(Elastic Load Balancing 설명서)을 참고하십시오. 가용성이 높은 구성을 하기 위해 Application Load Balancer를 생성하고 이를 다른 가용 영역의 개인 서브넷에 연결합니다.

클라우드 아키텍트

CloudFront 배포판 만들기.

생성한 Application Load Balancer를 가리키는 CloudFront 배포를 생성합니다.

  1. AWS 관리 콘솔에 로그인하고 https://console.aws.amazon.com/cloudfront/v3/home 에서 CloudFront 콘솔을 엽니다.

  2. [Create Distribution]을 선택합니다.

  3. Create Distribution Wizard(배포 만들기 마법사)의 첫 번째 페이지에서 Web(웹) 섹션의 Get Started(시작하기)를 선택합니다.

  4. 배포에 대해 설정을 지정합니다. 자세한 내용은 배포를 생성하거나 업데이트할 때 지정하는 값을 참조하세요. 유의할 사항:

    1. Application Load Balancer를 오리진으로 설정합니다.

    2. 배포 설정에서 AWS WAF를 통해 적용하려는 기존 웹 ACL을 선택합니다. 자세한 내용은 AWS WAF 웹 ACL을 참조하세요.

  5. 변경 내용을 저장합니다.

  6. 배포를 CloudFront 생성한 후에는 배포의 상태 열 값이 Deployed에서 InProgressDeployed로 변경됩니다. 배포를 활성화하도록 선택한 경우 상태가 배포 완료로 전환되면 요청을 처리할 수 있습니다.

클라우드 아키텍트

관련 리소스

설명서

AWS 서비스 웹사이트

추가 정보

코드

다음 예제 Lambda 함수는 Node.js로 작성됩니다. 이 Lambda 함수는 웹사이트 리소스가 포함된 S3 버킷에 GetObject 작업을 수행하는 웹 서버 역할을 합니다.

/** * This is an AWS Lambda function created for demonstration purposes. * It retrieves static assets from a defined Amazon S3 bucket. * To make the content available through a URL, use an Application Load Balancer with a Lambda integration. * * Set the S3_BUCKET environment variable in the Lambda function definition. */ var AWS = require('aws-sdk'); exports.handler = function(event, context, callback) { var bucket = process.env.S3_BUCKET; var key = event.path.replace('/', ''); if (key == '') { key = 'index.html'; } // Fetch from S3 var s3 = new AWS.S3(); return s3.getObject({Bucket: bucket, Key: key}, function(err, data) { if (err) { return err; } var isBase64Encoded = false; var encoding = 'utf8'; if (data.ContentType.indexOf('image/') > -1) { isBase64Encoded = true; encoding = 'base64' } var resp = { statusCode: 200, headers: { 'Content-Type': data.ContentType, }, body: new Buffer(data.Body).toString(encoding), isBase64Encoded: isBase64Encoded }; callback(null, resp); } ); };