동일한 도메인에 AWS CloudFront와 API Gateway를 함께 사용하려면 어떻게해야합니까? 자산을 배치하고 배포 할 CloudFront를 설정합니다. 이것들은

S3에 내 웹 사이트의 정적 자산을 배치하고 배포 할 CloudFront를 설정합니다. 이것들은 본질적으로 사용자가 내 사이트에서 GET 요청에 필요한 콘텐츠, 기존 경로, 즉 오류에 대한 정보를 담고 있습니다.

처리해야 할 POST 요청도 있습니다. 양식 제출, 이메일 전송, 알림, 데이터베이스와의 상호 작용

CloudFront가 GET 요청을 처리하고 API 게이트웨이가 본문 또는 POST 요청으로 요청을 처리하도록 동일한 도메인에 대해 CloudFront와 Lambda (또는 API 게이트웨이)를 나란히 설정하려면 어떻게해야합니까? 아니면 어떻게 든 개별 URL로 할 수 있습니까?



답변

제안 된 디자인으로 여러 웹 앱을 정확하게 실행 하고 기술을 공유하기 위해 교육용 Go 및 Lambda 앱인 gofaas를 추출 했습니다 .

www.gofaas.netS3 + CloudFront 및 api.gofaas.netAPI Gateway + Lambda 와 같은 두 개의 별도 도메인이 필요합니다 .

그런 다음 정적 사이트가 API Gateway CORS 구성 및 일부 JavaScript를 사용하여 API와 상호 작용하도록 할 수 있습니다.

fetch(`https://api.gofaas.net/work`, {
    method: "POST",
    mode: "cors",
    headers: {
        "Accept": "application/json",
        ...
    },
    body: JSON.stringify(...)
})
    .then(function(response) {
        return response.json();
    })
    .then(function (json) {
        // use response
    })
    .catch(function (err) {
        console.log("fetch error", err);
    });

다음은이 모든 설정을위한 안내서입니다.

S3, CloudFront 및 ACM이 포함 된 정적 웹 사이트

Lambda, API Gateway, CORS 및 JWT를 사용한 API 보안


답변

람다 함수를 생성하고 API 게이트웨이를 설정 한 다음 특정 경로 (예 : / rest / *)를 API 게이트웨이로 전달하고 S3 버킷에서 다른 모든 것을 제공하도록 CloudFront를 구성 할 수 있습니다.

이 작업을 수행하는 방법을 보여주는 전체 과정은 다음과 같습니다. https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/


답변

연결 관점에서 “무언가”는 요청 (GET, POST, PUT 등)에 응답해야합니다. 우선 TCP 연결이 있고 “무언가”는 계층 7을 이해하고 클라이언트가 전송하는 바이트에서 의미가 있는지 확인해야합니다. 이 시점에서만 POST 요청과 다른 URL 또는 다른 URL과 다른 GET 요청을 처리 할 수 ​​있습니다. 결국에는 HTTP를 이해하고 라우팅 할 수있는 서비스가 필요합니다. 다음과 같은 서비스가이를 수행 할 수 있습니다. CloudFront ELB / ALB API Gateway (제한은 나중에 제공)

API Gateway는 내부적으로 CloudFront를 사용하여 (실제로 CloudFront 수준에서 무엇이든 구성 할 수있는 기회를 제공하지 않음)-결국 CloudFront와 API Gateway를 나란히 실행할 수있는 방법이 없으므로 결국 CloudFront에서 CloudFront를 실행한다는 의미입니다 나란히.

CloudFront는 패턴에 따라 다른 원점을 선택할 수있는 기회를 제공하지만 Lambda 함수가 아닌 Lambda @ Edge 기능 외에 S3 또는 ELB / ALB 만 원점으로 선택할 수 있습니다.

ALB / ELB는 EC2 인스턴스 만 백엔드로 사용할 수 있습니다 (여기서는 Lambda 또는 S3 없음).

내가 생각할 수있는 유일한 방법은 다음과 같습니다.

  • API Gateway를 사용하고 특정 “자산”경로를 S3에 대한 일종의 역방향 프록시 (따라서 정적 자산을 람다를 통해 파이프하는)를 수행하는 Lambda 함수로 라우팅하십시오. 여기에서 Lambda의 비용을 알고 있어야합니다!
  • 동일한 작업을 수행 할 수 있지만 Lambda를 통해 자산을 파이핑하는 대신 Lambda 내에서 서명 된 URL을 생성하기 위해 S3로 직접 리디렉션합니다 (비용이 더 많이들 수 있음)
  • 자산의 다른 응용 프로그램과 다른 하위 도메인을 사용하는 경우-DNS 수준에서 쉽게 분리하고 다양한 사용 사례 (자산에 대한 CloudFront 및 비 정적에 대한 API 게이트웨이)에 대해 서로 다른 서비스를 사용할 수 있으므로 매우 일반적인 패턴입니다 부속)

따라서 내 전화는 마지막 옵션이 될 것입니다. 그러나 모든 정적 자산 (또는 모든 POST 요청)에 대해 클라이언트 / 브라우저를 별도의 하위 도메인으로 지정해야합니다.

브라우저에서 진정한 API 중심의 애플리케이션을 구축하기 위해 AngularJS 또는 React와 같은 기술을 살펴보고 싶은 것 같습니다. 이 접근 방식을 사용하면 API 게이트웨이로 모든 “동적”요청을 처리하고 S3에서 애플리케이션 자체를 정적 자산으로 제공하는 실제 API를 실행합니다. 어쩌면 그것들을 보면 길을 찾는 데 도움이 될 수 있습니다-사용하지 않더라도 이와 같은 것을 만드는 방법에 대한 건축 패턴은 imho를 요구하는 것입니다.


답변

같은 설정이 있습니다. S3의 정적 자산, Lambda 함수는 API 게이트웨이를 통해 제공되며 동일한 도메인 이름을 공유합니다.

이미 CloudFront를 사용하고 캐싱과 같은 일부 기능을 노출하는 API 게이트웨이를 사용합니다. 그런 다음 정적 자산에 매핑되는 URI를 구성합니다. API Gateway에서 리소스는 Lambda 함수, AWS 함수, 모의 또는 다른 URL 일 수 있습니다. 내 S3 URL을 가리 킵니다.

URI는 서브 패스를 glob하도록 설정 될 수 있습니다 /assets/*.


답변