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를 사용할 수 있습니다.
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는 오리진 요청에 서명할 때 이를 사용하지 않습니다.