코딩뚠뚠

[AWS] Lambda@Edge 이용한 리디렉션 본문

공부/AWS

[AWS] Lambda@Edge 이용한 리디렉션

로디네로 2024. 7. 10. 00:11
반응형

 

https://cloudacademy.com/blog/lambda-edge-network-latency/

 

 

 

본 포스팅은 아래 포스팅에서 이어집니다.

 

[AWS] 서브도메인 구축/운영하기

서론 :  웹 개발시 개발/검증/배포 서버를 따로 두어야 된다는 말을 들어보았을 것이다.혹시 있을 수 있는 에러를 정규 배포 전 개발/검증 간 파악하고 수정하기 위해서이다. AWS S3를 이용한정

dbstndi6316.tistory.com

 

 

문제 정의 :

아래 구성으로 정적웹사이트를 호스팅 운영하고 있는중 문제가 발생함.

-> 주소창에 data101.io 입력 시 https://www.data101.io 로 접속 O

-> 주소창에 http://data101.io 입력 시 https://www.data101.io 로 접속 O

-> 주소창에 https://data101.io 입력 시 https://www.data101.io 가 아닌 https://data101.io 로 접속됨

 

 


 

 

Lambda@Edge 원리 : 

Lambda@Edge는 Cloudfront(CDN) 서비스를 이용한다.

Cloudfront 엣지 로케이션에서 실행되는 Lambda 함수를 통해 요청과 응답을 원하는대로 커스터마이징 하는것

 

트리거 이벤트 : 

- Lambda@Edge 함수는 특정 이벤트에 의해 트리거되며 주요 이벤트는 다음과 같다.

  • Viewer Request: 클라이언트가 CloudFront에 요청을 보낼 때.
  • Origin Request: CloudFront가 원본 서버(예: S3, EC2)에 요청을 보낼 때.
  • Origin Response: CloudFront가 원본 서버로부터 응답을 받을 때.
  • Viewer Response: CloudFront가 클라이언트에게 응답을 보낼 때.

 


 

문제 해결 : 

Lambda@Edge를 실제 AWS에서 적용하는 방법을 알아보자.

 

1. S3를 분리 생성 한후 리디렉션 설정

현재 : data101.io

변경 : data101.io , www.data101.io 

 

DATA101 - 노코드 데이터 분석

 

www.data101.io

- data101.io S3 접근하여 속성 - 정적 웹 사이트 호스팅 편집 - 객체에 대한 요청 리디렉션 - www.data101.io  로 설정

- Lambda@Edge 사용 위해 data101.io S3 버킷 정책 편집 필요

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::버킷명/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::계정:role/롤이름"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::버킷명/*"
        }
    ]
}

 

2. Route53에서 두 A태그 삭제 후 S3 A태그를 다시 생성한다.

현재 : data101.io, www.data101.io (CloudFront)

변경 : data101.io, www.data101.io (S3)


3. ACM 삭제 후 다시 생성한다.

현재 : data101.io

변경 : data101.io, www.data101.io


4. 현재 CloudFront의 배포를 삭제 후 다시 생성한다.

현재 : data101.io (data101.io / www.data101.io) 

변경 : data101.io, www.data101.io 


 

5. Route53에서 두 A태그 삭제 후 CloudFront A태그를 다시 생성한다.

현재 : data101.io, www.data101.io (S3)

변경 : data101.io, www.data101.io (CloudFront)

 

 

>>> 여기까지 S3 분리 생성 및 재배포의 과정이다. 이제부터 Lambda@Edge 설정이다.


 

6. Lambda 함수 생성

- Region 은 us-east1로 설정해야 한다.

- 함수명 관계 없음

- 런타임 : Node.js 16버전으로 생성함. (버전별 코드 상이할수 있음)

- 역할생성

- 정책생성 : Lambda@Edge 권한

 

- 역할 - 권한추가 - 인라인정책생성 으로 Role 을 편집해준다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"logs:CreateLogGroup",
				"logs:CreateLogStream",
				"logs:PutLogEvents"
			],
			"Resource": "*"
		},
		{
			"Effect": "Allow",
			"Action": [
				"lambda:GetFunction",
				"lambda:EnableReplication"
			],
			"Resource": "arn:aws:lambda:*:*:function:yourFunction"
		}
	]
}

 

- 코드 작성 (data101.io 접근을 https://www.data101.io 로 리디렉션)

'use strict';

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

    const host = headers.host[0].value;

    if (host === 'data101.io') {
        const response = {
            status: '301',
            statusDescription: 'Moved Permanently',
            headers: {
                location: [{
                    key: 'Location',
                    value: `https://www.data101.io${request.uri}`
                }]
            }
        };
        return response;
    } else {
        return request;
    }
};

 

- 구성 - 일반구성 - 제한시간은 5초 미만이여야 한다.

- Deploy

- 아래 사진 작업 - 새 버전 발행 - 함수 ARN을 복사해 놓는다.

 

 


 

7. CloudFront 연동

- 리디렉션 하고자 하는 CloudFront에 접근

 

 

- 동작 - 편집에 접근해서 맨 아래 함수 연결 부분을 아래와 같이 설정한다.

* 좀전에 Lambda에서 복사해놨던 ARN을 붙여넣기 한다.

 

 


 

* 조치 중 에러 발생

1. 503 에러

- 내 코드는 Node.js 20 버전에 맞지 않는 코드였음. 버전을 잘 확인하자.

 

2. Lambda@Edge 의 리전을 ' 서울 ' 로 놔서 동작하지 않았던 에러 -> us-east-1로 변경

3. data101.io 의 S3버킷 정책에 LambdaEdgeAccess 내용이 있어야 됨

 

 

 

- 끝 -

 

 

 

도움 :

https://www.youtube.com/watch?v=RRQ5-M6-8Wc

https://dev.dwer.kr/2020/03/aws-lambdaedge-http-redirection.html

 

 

 

반응형