이전에 쓴 게시글 이후로, 이미지 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 제한시간 초과로 인해 발생한 에러
- 해결내용
요청 처리 시 메모리 및 제한시간 초과 방지를 위해 아래와 같이 메모리 증설 및 제한시간 재설정
'★ 프로젝트 + 트러블 슈팅 ★' 카테고리의 다른 글
[Cache 무효화] CloudFront / S3 트러블 슈팅 (4) (0) | 2024.01.11 |
---|---|
Lambda@Edge / Secret Manager / CloudFront / S3 트러블 슈팅 (3) (0) | 2024.01.10 |
Lambda@Edge / CloudFront / Singed URL / S3 트러블 슈팅 (1) | 2023.12.17 |
쿼리 실행계획 (Query Plan)이란? (2) | 2023.12.06 |
토이 프로젝트 시작 (23.09.10) (0) | 2023.09.10 |
댓글