본문 바로가기
★ 프로젝트 + 트러블 슈팅 ★

Lambda@Edge / CloudFront / Singed URL / S3 트러블 슈팅 (2)

by 리승우 2023. 12. 21.

이전에 쓴 게시글 이후로, 이미지 get서빙할 때 암호화된 path (URI상 Path, 전체URI를 말하는 것이 아님!)

를 CloudFront가 전달되면 그것이 트리거가되어 해당 path를 복호화하는 Lambda@Edge에 대한 내용을 적고자 한다.

 

왜 path를 암호화했나요?
> s3를 퍼블릭 제한을 걸어두어 함부로 접근은 할 수 없겠으나, 사용자에게 이미지 원본의 s3 경로를 노출하는 것은 보안상 좋지않다 판단하여 이렇게 진행함

 

Path 복호화 Lambda@Edge 작성과정


1. 현재 유지보수중인 php 애플리케이션 내, 기존에 활용하던 AES 암호화가 있음. 하여 해당 메서드를 그대로 활용하여 Path 암호화를 진행하였음

 

 

2. 위 메서드를 통하여 path가 암호화되어, viewer request단에 연결되어 있는 Lambda@Edge로 데이터 전달됨

* 암호화된 uri 내용

uri: '/MIeQIEQ5cdrrU6btgOC7sw=='

 

 

3. uri에 있는 암호화된 Path, 복호화 하는 node.js 작성

* 이전 거는 Python으로 했으면서, 왜 node.js를 했는지?

 

Python으로 작업한 뒤 복호화를 위해 cryptography 모듈을 추가한 결과, 총 용량이 1.6MB가 나왔음.
헌데 Lambda@Edge는 배포가능한 용량이 1MB로 한정되어 있었음.
이를 위해 쓰지 않는 의존성을 제거하면서 맞춤에도 불구하고 맞추기 까다로워 node.js로 변경하여 진행함

const crypto = require('crypto');

exports.handler = async (event) => {
    const request = event.Records[0].cf.request;

    const encryptedToken = request.uri.slice(request.uri.indexOf('/') + 1);

    const decryptedToken = aesDecrypt(encryptedToken);

    const newUrl = `https://${request.headers.host[0].value}/${decryptedToken}`;

    request.uri = '/' + decryptedToken;

    return request;
};

function aesDecrypt(encryptedText) {
    const iv = Buffer.from({비밀 IV});
    const key = Buffer.from({비밀 KEY});

    const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    
    decipher.setAutoPadding(true); // PKCS#7 자동 패딩 설정

    let decryptedText = decipher.update(Buffer.from(encryptedText, 'base64'), 'binary', 'utf-8');

    decryptedText += decipher.final('utf-8');

    return decryptedText;
}

 

이렇게 하면 아주~ 잘 작동한다.

 

뜻밖의 이슈


1. 이슈발생. 정상작동하던 이전에 만든 resize&convert Lambda@Edge에서 특정 파라미터로 호출하였을 때 아래 오류 발생함

503 ERROR 발생하였음

RequestId: 32fce8c7-7eca-4091-9cef-eeee51a6d5bf Error: Runtime exited with error: signal: killed
Runtime.ExitError

 

뭘까... 찾아보던 와중, 
Lambda@Edge의 메모리가 작아, 처리가 되지 않기 때문인 것으로 확인되었다 (stackoverflow 고마워요)
기존 메모리 128 → 256MB로 변경하고 다시 시도하니, 정상작동하였다.
(이미지 화질이 좋지않은 것 같아, q쿼리 스트링을 이용하여 동적으로 화질 조정 가능하게 추가 세팅해놓음)

 

(정보추가)

추후에 더 자세히 찾아보니, 이유는 아래와 같았다. 공식문서에 나와있다.

- 확인결과

요청 이미지 용량이 커,Lambda 할당 메모리 초과 OR 제한시간 초과로 인해 발생한 에러

 

- 해결내용

요청 처리 시 메모리 및 제한시간 초과 방지를 위해 아래와 같이 메모리 증설 및 제한시간 재설정

댓글