[AWS] APIGateway에서 Express의 공개 라우팅을 통과하고 싶었습니다.

소개



신졸 유루유루 어드벤트 캘린더 21일 담당입니다!
요즘 AWS를 만질 수있는 기회가 있고 그것에 대해 조금.

배경



「별로 액세스 없는 사이트이고, Serverless로 Web 서비스 만들면 저비용의 운용을 할 수 있는 것은!?」라고 하는 흐름으로, AWS, Lambda로 움직이는 Web 서버의 구축을 Node.js&Express를 사용해 실시했습니다.
Express의 스켈레톤 코드를 준비해, 평소와 같이 public하하에 클라이언트 JS나 CSS의 자원을 넣어, 아래의 example.html와 같이 자신의 URL을 지정해 자원을 읽어들였습니다.
하지만 Serverless.yml에서 특정 라우팅을 LambdaFunction에 연결하여 정의했기 때문에 example.html과 같은 리소스 URL을 요청하더라도 해당 LambdaFunction이 없으면 화가 났습니다. (이 문제의 해명에 3일 정도 지출했습니다)

sample.html
<head>
<link rel="stylesheet" type="text/css" href="/public/css/example.css">
</head>

( 이전에 쓴 기사에서 Express 스켈레톤 코드로 서버 구축 수법도 쓰고 있으므로 꼭 봐 주세요 )

대응 방법 검토



클라이언트로부터의 자원의 요구는 「/public/」로 시작되는 것으로부터, 이하의 3개를 검토했습니다.
  • /public/에서 액세스 할 수있는 LambdaFunction을 정의하고 실제/public/폴더에서 검색하고 반환
  • /public/에서 액세스 할 수있는 LambdaFunction을 정의하고 S3 버킷에서 지정된 리소스를 당겨 반환
  • CloudFront를 사용하여/public/에서 오는 요청을 APIGateway가 아닌 직접 S3 버킷으로 향합니다.

    순수한 APIGateway와 Lambda의 동작, Express의 동작을 보증하면서, 가용성을 요구한 결과 3을 선택했습니다. CloundFront는 cdn으로 원래 도입 예정이며 S3의 운영 비용이 낮기 때문에이 선택이 최선이라고 판단했습니다.

    대응



    AWSConsole에서 CloudFront를 설정합니다.
    새로운 Distribution을 만들고 Origin에는 APIGateway의 ARN을, CustumOrigin에는 S3의 ARN을 설정합니다. Origin의 설정 예를 그림 1에, Behhaviours의 설정 예를 그림 2에 나타냅니다.

    그림 1 (Origin 설정 예)

    그림 2 (Behaviors 설정 예)

    결론



    어드벤트 캘린더의 타이틀에 맞지 않는 내용이었을지도 모릅니다만, 만약 Serverless로 Web서버를 만드는 사람의 참고가 되면 다행입니다.
    실제로는 AWSConsole에서 직접 Distribution을 괴롭히는 것이 아니라 Terraform을 사용하여 문서화를 실시하고 있습니다. 어쨌든 그것을 기사로 생각합니다.
    또한 s3에 대한 리소스 배포도 shell로 자동화했기 때문에 언젠가 기사로 할지도 모릅니다.
    흥미가 있는 분은 꼭 봐 주세요.
    끝까지 읽어 주셔서 감사합니다.
  • 좋은 웹페이지 즐겨찾기