Amazon CloudFront & Lambda@Edge응답 바디 변경

9052 단어 Lambda@EdgeAWS
Amazon CloudFront의Lambda@EdgeHTTP 요청/응답에 임의의 시간에 Lambda를 추가하는 기능입니다.
그럼 이번에는 반응하는 HTML을 살짝 가공하려고 조사를 해봤어요.
예시적으로 실현된 문서는 여기에 있다.
  • HTTP 응답 트리거 요청 생성 - Amazon CloudFront
  • origin-response 트리거의 HTTP 응답 업데이트 - Amazon CloudFront
  • 추기: 이미 바디한테 맞았어.다음은 outdated
    이에 따라 다음과 같은 제한이 있다.
    HTTP 응답 사용 시Lambda@Edge오리지널-response 트리거에게는 원래 서버에서 반환된 HTML 본문이 공개되지 않습니다.
    바디한테 하면 안 돼!오리진으로부터의 응답에 대한 일반적인 이용 범위 내에서 바디는 모두 덮어쓸 수 있습니다.
    내용을 조금 변경해서 보내려고 하는 경우에 대비해서...?
    여기서 힌트는 이거예요.
  • Amazon CloudFront & Lambda@Edge이미지 업데이트 | Amazon 웹 서비스 블로그
  • 사실은 그 완전한 해결책이야.이것을 방침을 조금 바꾸어 텍스트 처리로 만들면 된다.

    방침.

  • 바꾸고 싶은 건 HTML
  • 뿐이야
  • 올리브유는 아마존 S3
  • How to

  • origin-response에서 Lambda가 호출
  • 여기서 다시 쓰면 캐시로 넘어갈 수 있음
  • 판정
  • STATUS=200 및 .html 요청
  • 제목 반복 사용
  • Body에 S3에서 직접 대상을 취득한 후 변경된 내용을 삽입
  • IAM Role에 할당된 Policy에서 getobject
  • 라이센스

    코드


    그리고 이렇게 오리진-response 활동에서 실행되는 람바다 스크립트를 만들었습니다.
    아마 콘텐츠-length를 다시 계산한 것 같은데, 이 행사 때 콘텐츠-length 헤더가 없어서 마지막 단계에서 답장을 해주실 거예요.
    샘플에서 Body의 WordPress라는 단어를 getShifter로 대체합니다.
    origin_response.js
    'use strict';
    const util = require('util');
    const AWS = require('aws-sdk');
    const S3 = new AWS.S3({
      signatureVersion: 'v4',
    });
    
    exports.handler = (event, context, callback) => {
      console.log(util.inspect(event.Records[0].cf));
      let response = event.Records[0].cf.response;
    
      if (response.status == 200) {
        let request = event.Records[0].cf.request;
        let bucket = request.origin.s3.domainName.split('.')[0];
        let path = request.uri;
    
        if (path.endsWith('\.html')) {
          let key = path.substring(1);
          S3.getObject({ Bucket: bucket, Key: key }).promise()
            // perform the replace operation
            .then(data => data.Body.toString()
              .replace(/WordPress/g, 'getShifter')
            )
            .then(buffer => {
              // console.log(buffer);
              response.body = buffer;
              callback(null, response);
              return;
            })
            .catch( err => {
              console.log("Exception while reading source :%j",err);
            });
        } else {
          callback(null, response);
        }
      } else {
        callback(null, response);
      }
    };
    
    Edge의 엄격한 제한 시간(5s) 범위 내에서 대체된 내용을 얻었습니다.
    분필용 콜백을else 바깥에 두면 왜 잘 안 되지...

    사용 전/사용 후



    ↓ 변했다.

    처음에는 좀 늦었지만 현금으로 바꾸고 타도 될까요?

    좋은 웹페이지 즐겨찾기