목적

정적 API 의 경우에는 응답값을 캐시를 이용하여 서버 리소스를 절감하도록 합니다.

%% API gateway + CloudFront
graph LR
%% __START
    Client --> |1.request| CloudFront
    CloudFront --> |2.create| ApiGateway
    ApiGateway --> |3.query| Lambda
    CloudFront --> |4.response| Client

    CloudFront -.-> |isCache=yes| CloudFront_{Cache} --> |2.response| Client
%% __END
// serverless.yml
resources:
  ...
  Resources:
    CloudFrontDistribution:
      Type: AWS::CloudFront::Distribution
      Properties:
        DistributionConfig:
          CacheBehaviors:
            - PathPattern: "/banner"
              TargetOriginId: ApiGatewayOrigin
              ViewerProtocolPolicy: redirect-to-https
              AllowedMethods:
                - GET
                - HEAD
                - OPTIONS
              CachedMethods:
                - GET
                - HEAD
              ForwardedValues:
                Headers:
                  - Access-Control-Request-Method
                  - Access-Control-Request-Headers
                  - Origin
                QueryString: true
                Cookies:
                  Forward: none
              MinTTL: 0
              DefaultTTL: 2630000

이슈

[간헐적 CORS 발생]

API Server 배포 이후 시점에서 간헐적으로 CORS 이슈가 발생. 응답 헤더에 CORS 에서 설정된 값이 고정되어 내려오는 이유가 원인으로 파악되었음.

DefaultCacheBehavior 에는 응답 헤더 Origin 이 캐시 키로 설정되어있었지만, 캐시를 활용하는 API 를 위한 각 CacheBehavior 에는 응답 헤더 Origin 이 캐시 키로 설정되어있지 않았던 상황. ⇒ 그로 인해, 처음 요청된 Origin 을 기준으로 캐시되어 다른 Origin 에서 오는 요청도 캐시된 응답 헤더로 내려간 것으로 파악.