View a markdown version of this page

AWS Lambda Web Function 오리진에 대한 액세스 제한 - Amazon CloudFront

AWS Lambda Web Function 오리진에 대한 액세스 제한

오리진 액세스 제어(OAC)를 사용하여 AWS Lambda Web Function 오리진에 대한 액세스를 제한할 수 있습니다. Lambda Web Function은 CloudFront 배포의 오리진 도메인으로 사용하는 자체 리전 또는 글로벌 HTTPS 엔드포인트를 제공합니다. Lambda Web Functions에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 AWS Lambda Web Functions를 참조하세요.

참고

Lambda Web Functions에서의 OAC 사용은 옵트인 리전을 포함하는 글로벌 엔드포인트에서 지원되지 않습니다. 엔드포인트가 요청을 옵트인 리전으로 라우팅하는 경우 CloudFront는 해당 리전에 대한 요청에 서명할 수 없습니다. 그런 다음 오리진은 HTTP 403(금지됨) 오류를 반환합니다. 글로벌 엔드포인트와 연결된 모든 리전은 기본적으로 활성화된 리전에 있어야 합니다.

Lambda 함수 URL 오리진에 OAC 사용에 대한 자세한 내용은 AWS Lambda 함수 URL 오리진에 대한 액세스 제한 섹션을 참조하세요.

사전 조건

OAC를 만들고 설정하기 전에 Lambda Web Function을 오리진으로 사용하는 CloudFront 배포가 있어야 합니다. 오리진 도메인 이름은 Lambda Web Function 엔드포인트의 호스트 이름입니다. CloudFront는 다음과 같이 호스트 이름에서 엔드포인트 유형을 식별합니다.

  • 리전 엔드포인트(HomeRegion 및 PerRegion 엔드포인트 유형) – 호스트 이름은 .lambda-web.AWS-Region.on.aws로 끝납니다.

  • 글로벌 엔드포인트(MultiRegion 엔드포인트 유형) – 호스트 이름은 .lambda-web.global.on.aws로 끝납니다.

구성은 다음 요구 사항도 충족해야 합니다.

  • 엔드포인트 인증 유형 – 엔드포인트의 인증 유형은 IamAuth여야 합니다. IamAuth에서 엔드포인트는 AWS Identity and Access Management(IAM)를 사용하여 요청을 인증하고 승인합니다. CloudFront를 통한 요청의 경우 권한 부여는 Lambda Web Function의 리소스 기반 정책을 기반으로 합니다. CloudFront는 최종 사용자를 대신하여 요청에 서명하고 엔드포인트는 서명을 검증합니다. 자세한 내용은 AWS Lambda 개발자 안내서의 CloudFront 통합을 참조하세요.

  • 캐시 정책 – Lambda Web Function이 최종 사용자의 Authorization 헤더를 사용하는 경우 캐시 정책에 헤더를 추가해야 합니다. 이 요구 사항은 오리진을 사용하는 모든 캐시 동작에 적용됩니다. GET 및 HEAD 요청의 경우 CloudFront는 캐시 정책에 헤더가 없으면 요청을 전달하기 전에 Authorization 헤더를 제거합니다. 자세한 내용은 섹션을 참조하세요HTTP 요청 헤더 및 CloudFront 동작(사용자 지정 및 Amazon S3 오리진)

  • 오리진 요청 정책 – 최종 사용자의 Host 헤더를 제외하는 오리진 요청 정책을 사용합니다. Lambda Web Function 엔드포인트에서는 Host 헤더에 CloudFront 배포의 도메인 이름이 아니라 오리진 도메인 이름이 포함될 것으로 예상합니다. Host 헤더에 배포의 도메인 이름이 포함된 경우 엔드포인트는 HTTP 404(찾을 수 없음) 오류를 반환합니다. 관리형 오리진 요청 정책을 사용하는 경우 AllViewer가 아닌 AllViewerExceptHostHeader를 사용합니다. 자세한 내용은 섹션을 참조하세요AllViewerExceptHostHeader

참고

Lambda@Edge 오리진 요청 및 오리진 응답 트리거는 OAC로 Lambda Web Function 오리진을 사용하는 캐시 동작에서 지원되지 않습니다. 이는 리전 엔드포인트 및 글로벌 엔드포인트와 직접 또는 오리진 그룹을 통해 액세스하는 오리진에 적용됩니다. CloudFront는 둘 다를 포함하는 배포 구성을 거부합니다.

Lambda Web Function에 액세스할 수 있는 CloudFront 권한 부여

CloudFront 서비스 위탁자(cloudfront.amazonaws.com)가 엔드포인트를 간접적으로 호출하도록 허용하는 리소스 기반 정책을 Lambda Web Function에 연결합니다. 엔드포인트를 간접적으로 호출하기 위한 IAM 작업은 lambda:InvokeWebFunctionEndpoint입니다. 정책은 Lambda Web Function에 연결되지만, 각 문은 Resource의 범위를 특정 엔드포인트 ARN으로 지정할 수 있습니다. Condition 요소를 사용하여 오리진이 포함된 CloudFront 배포를 위한 요청인 경우에만 CloudFront에서 엔드포인트에 액세스하도록 허용합니다.

예 CloudFront OAC에 대한 리소스 기반 정책
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontOACAccess", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "lambda:InvokeWebFunctionEndpoint", "Resource": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/prod", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE" } } } ] }

리소스 기반 정책을 연결하려면 함수 ARN(엔드포인트 ARN 아님)과 함께 put-resource-policy 명령을 사용합니다.

aws lambda-web put-resource-policy \ --resource-arn "arn:aws:lambda:us-east-1:111122223333:web-function/my-function" \ --policy file://policy.json \ --region us-east-1

get-resource-policy 및 delete-resource-policy 명령을 사용하여 정책을 검토하거나 제거할 수 있습니다.

참고

둘 이상의 리전에 걸쳐 있는 엔드포인트의 경우 Lambda는 엔드포인트를 제공하는 모든 리전에 정책 변경 사항을 복제합니다. 새 정책 또는 업데이트된 정책이 모든 리전에 적용되는 데 다소 시간이 걸릴 수 있습니다. 자세한 내용은 AWS Lambda 개발자 안내서의 Replication and eventual consistency를 참조하세요.

오리진 액세스 제어 생성

오리진 액세스 제어(OAC)를 생성하려면 AWS Management Console, CloudFormation, AWS CLI 또는 CloudFront API를 사용할 수 있습니다.

Console
오리진 액세스 제어를 생성하려면
  1. AWS Management Console에 로그인한 다음 https://console.aws.amazon.com/cloudfront/v4/home에서 CloudFront 콘솔을 엽니다.

  2. 탐색 창에서 Origin access(원본 액세스)를 선택합니다.

  3. Create control setting(제어 설정 생성)을 선택합니다.

  4. Create control setting(제어 설정 생성) 양식을 사용하여 다음을 수행합니다.

    1. Details(세부 정보) 창에서 오리진 액세스 제어의 Name(이름) 및 선택적 Description(설명)을 입력합니다.

    2. 오리진 유형 드롭다운에서 Lambda를 선택합니다. 이 오리진 유형은 Lambda 함수 URL과 Lambda Web Functions 모두에 사용됩니다.

    3. 오리진이 글로벌 엔드포인트(호스트 이름이 .lambda-web.global.on.aws로 끝남)인 경우 SigV4a 서명 프로토콜 사용 옵션을 선택합니다. 리전 엔드포인트(호스트 이름이 .lambda-web.AWS-Region.on.aws로 끝남)의 경우 이 옵션을 선택 취소한 상태로 둡니다.

    4. 서명 동작에서 항상 서명, 최종 사용자 권한 부여 유지를 선택합니다. 이 옵션은 기본적으로 선택된 서명 요청(권장) 아래에 나타납니다. Lambda Web Function 오리진은 이 서명 동작만 지원합니다. 자세한 내용은 섹션을 참조하세요서명 동작

  5. 생성(Create)을 선택합니다.

배포의 Lambda Web Function 오리진에 오리진 액세스 제어를 추가하려는 경우
  1. https://console.aws.amazon.com/cloudfront/v4/home에서 CloudFront 콘솔을 엽니다.

  2. OAC를 추가하려는 Lambda Web Function 오리진이 있는 배포를 선택한 다음 오리진 탭을 선택합니다.

  3. OAC를 추가할 Lambda Web Function 오리진을 선택한 다음 편집을 선택합니다.

  4. 원본 액세스의 경우 원본 액세스 제어 설정(권장)를 선택합니다.

  5. Origin access control(원본 액세스 제어) 드롭다운 메뉴에서 사용할 OAC를 선택합니다.

  6. 변경 사항 저장을 선택합니다.

모든 CloudFront 엣지 로케이션에 배포가 시작됩니다. 엣지 로케이션은 새 구성을 수신하면 Lambda Web Function 오리진으로 보내는 모든 요청에 서명합니다.

CLI

create-origin-access-control 명령을 사용합니다. 리전 엔드포인트(호스트 이름이 .lambda-web.AWS-Region.on.aws로 끝남)의 경우 sigv4 서명 프로토콜을 사용합니다.

aws cloudfront create-origin-access-control \ --origin-access-control-config '{ "Name": "my-lambda-web-oac", "Description": "OAC for Lambda Web Function origin", "SigningProtocol": "sigv4", "SigningBehavior": "always-amz-auth", "OriginAccessControlOriginType": "lambda" }'

글로벌 엔드포인트(호스트 이름이 .lambda-web.global.on.aws로 끝남)의 경우 sigv4a 서명 프로토콜을 사용합니다.

aws cloudfront create-origin-access-control \ --origin-access-control-config '{ "Name": "my-lambda-web-global-oac", "Description": "OAC for global Lambda Web Function origin", "SigningProtocol": "sigv4a", "SigningBehavior": "always-amz-auth", "OriginAccessControlOriginType": "lambda" }'
CloudFormation

OriginAccessControlConfig에서 다음 값을 지정하세요.

  • SigningProtocol: sigv4(리전 엔드포인트) 또는 sigv4a(글로벌 엔드포인트)

  • SigningBehavior: always-amz-auth

  • OriginAccessControlOriginType: lambda

예 CloudFormation 템플릿
Type: AWS::CloudFront::OriginAccessControl Properties: OriginAccessControlConfig: Description: An optional description for the origin access control Name: my-lambda-web-oac OriginAccessControlOriginType: lambda SigningBehavior: always-amz-auth SigningProtocol: sigv4a

자세한 내용은 AWS CloudFormation 사용 설명서의 AWS::CloudFront::OriginAccessControl을 참조하세요.

OAC는 배포가 완료된 후에만 모든 요청에 적용됩니다. 둘 이상의 리전에 걸쳐 있는 엔드포인트의 경우 이전에 연결한 리소스 기반 정책도 엔드포인트를 제공하는 모든 리전에 복제를 완료해야 합니다. 두 작업이 모두 완료될 때까지 일부 요청은 오리진에서 일시적인 HTTP 403 응답을 수신할 수 있습니다. 이러한 오류는 배포가 완료되고 정책 복제가 완료되면 자동으로 해결됩니다.

서명 동작

Lambda Web Function 오리진은 always-amz-auth 서명 동작(콘솔의 항상 서명, 최종 사용자 권한 부여 유지)만 지원합니다. CloudFront는 항상 Lambda Web Function으로 보내는 모든 요청에 서명하지만, 최종 사용자 요청의 Authorization 헤더를 대체하지는 않습니다. 대신 CloudFront는 전용 CloudFront 헤더에 서명을 추가하고 최종 사용자의 Authorization 헤더를 수정하지 않은 상태로 오리진에 전달합니다. 이 동작을 사용하면 Lambda Web Function이 최종 사용자의 원래 Authorization 헤더를 수신할 수 있습니다(예: 자체 인증 또는 권한 부여 수행). CloudFront는 여전히 오리진에 전송하는 모든 요청에 서명합니다. 최종 사용자의 Authorization 헤더를 전달하려면 오리진을 사용하는 모든 캐시 동작의 캐시 정책에 헤더를 추가해야 합니다.

Lambda Web Function 오리진에는 다른 서명 동작(always, never, no-override)이 지원되지 않습니다. always-amz-auth 서명 동작은 Lambda 함수 URL 오리진을 비롯한 다른 오리진 유형에서는 지원되지 않습니다.

PUT, POST 및 PATCH 요청의 경우 CloudFront는 서명되지 않은 페이로드(UNSIGNED-PAYLOAD)로 오리진 요청에 서명합니다. 요청 본문은 CloudFront 서명에 포함되지 않습니다. 서명은 여전히 요청 방법, 경로, 쿼리 문자열 및 배포를 식별하는 헤더를 포함합니다. 따라서 엔드포인트는 Lambda Web Function을 간접적으로 호출하기 전에 각 요청이 배포를 대신하여 CloudFront에서 보낸 요청인지 확인할 수 있습니다. 요청 본문은 CloudFront와 엔드포인트 간의 HTTPS 연결을 통해 전송 중에 보호됩니다. CloudFront에 대한 요청에 x-amz-content-sha256 헤더를 포함하지 않아도 됩니다. 최종 사용자가 해당 항목을 전송하면 CloudFront는 오리진 요청에 서명할 때 이를 사용하지 않습니다.