앞서 긴 주소를 입력했을 때 키 생성(축약 주소)하여 반환하는 기능을 구현해보았다.
이번 포스팅에서는 축약 주소를 요청했을 때 원본 주소로 포워딩하는 기능을 구현해본다.
참고. https://dev-ljw1126.tistory.com/463
포워딩 Lambda Function
마찬가지로 Lambda Function을 신규 생성하고, VSCode에 연동하도록 한다.
스크립트 절차는 아주 심플하다
① path parameter에 {key} 값을 조회한다
② S3 Bucket에 "url/${key}" 객체 조회 후 원본 주소 값을 꺼낸다
③ 원본 주소와 함께 301 moved permanently 응답한다
import AWS from 'aws-sdk';
const s3 = new AWS.S3({
region : 'ap-northeast-2'
});
const S3_BUCKET = process.env.S3_BUCKET;
const HOST = process.env.HOST;
export const handler = async (event) => {
let redirectUrl = HOST;
try {
const {key} = event.pathParameters;
const response = await s3.headObject({'Bucket' : S3_BUCKET, 'Key' : `url/${key}`}).promise();
if(response.WebsiteRedirectLocation) {
redirectUrl = response.WebsiteRedirectLocation;
}
} catch(error) {
console.error(error);
}
return {
"statusCode": 301,
"headers": {
"Location": redirectUrl
},
"isBase64Encoded": false
}
};
로컬 디렉토리로 이동 후 아래 명령어 실행한 다음 업로드 한다. (node v20.11.0)
$ npm init -y
$ npm install aws-sdk
람다 함수 실행시 S3 읽기 권한이 필요하므로 권한 탭에서 바로가기 링크로 이동한다
"AmazonS3ReadOnlyAccess" 정책을 찾아 체크 박스 선택 후 권한 추가한다.
API Gateway
API Gateway 생성시 "프록시 리소스"와 "오리진 간 리소스 공유(CORS)"를 활성화한다. 참고로 "프록시 리소스" 활성화하지 않는 경우 람다 함수 실행시 event가 빈 값으로 전달되어서 path parameters를 확인할 수 없었다.
불필요한 API Gateway 리소스는 삭제하고, GET /{key} 리소스 테스트를 실행한다. 앞서 S3에 저장된 임의 값을 key로 넣고 테스트시 정상적으로 301 상태 코드와 Location 정보를 응답하는 것을 확인할 수 있다.
참고. 16Cluc8 키 값에 대한 s3 객체 메타 정보
콘솔로 람다 함수에 event와 s3.headObject(..) 응답 출력해보았는데, CloudWatch 로그에도 잘 확인이 되었다.
API 배포
API 배포 버튼을 누른다
스테이지는 default 선택
생성된 엔드포인트 url로 직접 호출을 할 수 있다.
s3 bucket에 저장된 임의 key값으로 호출시 정상적으로 이동되는 것을 확인할 수 있었다.
'공부 > DevOps' 카테고리의 다른 글
[AWS] 서버리스 기반 URL 주소 단축 서비스 구현 - (3) 도메인 연결, S3 정적 웹 호스팅 (1) | 2024.09.24 |
---|---|
[AWS] 서버리스 기반 URL 주소 단축 서비스 구현 - (1) 키 생성 람다 구현 (0) | 2024.09.24 |
[AWS] VPC, Subnet, EC2 개발 인프라 구성 (선착순 쿠폰 발급 시스템) (0) | 2024.09.20 |
[NHN Cloud] 컨테이너 기반 Prometheus, Grafana 모니터링 환경 구성(by 오픈 소스 툴) (0) | 2024.09.02 |
[NHN Cloud] 기본적인 웹 서버, DB 인프라 구축 (vpc, subnet, floating ip, ..) (5) | 2024.08.30 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!