동일한 도메인에 AWS CloudFront와 API Gateway를 함께 사용하려면 어떻게해야합니까?


9

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

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

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

답변:


2

제안 된 디자인으로 여러 웹 앱을 정확하게 실행 하고 기술을 공유하기 위해 교육용 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 보안


사이트 테스트는 항상 여기서 흥미로워집니다. 로컬로 통합 테스트를 수행 할 수 있도록 AWS 인프라를 로컬로 복제하기가 어렵습니다. 하위 도메인 대신 경로를 사용합니다. 그것은 테스트의 일부를 돕습니다. CORS 과제도 제거합니다. 그런 다음 API 게이트웨이는 해당 경로의 CloudFront의 원점이됩니다.
Costa


2

연결 관점에서 "무언가"는 요청 (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를 요구하는 것입니다.


2

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

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

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


따라서 문제를 일으키는 부분은 API를 배포하는 것입니다. 일반적으로 귀하의 경우 주요 경로없이 배포됩니다 /assets/*. 배포를 삭제하고 /assets/*경로를 마우스 오른쪽 버튼으로 클릭 하고 배포 하십시오 .
Costa

1
커맨드 라인 도구를 파고 API 및 람다를 만들고 편집하는 방법을 배워야합니다.
Costa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.