어제의 작업으로 VPC와 그 안의 서브넷들을 설정해 주었다. 현재 이해한 그림은 다음과 같다. 

그렇다면 이제 이 서브넷들 안에다 AWS 리소스를 배치해 주어야 하겠다. 저번 포스팅에서 GPT의 조언을 참고한 것처럼, AWS lambda와 서버리스 구조를 따르려고 한다. 그런데 헷갈리는 점이 있다. 

 

기존에 ALB와 웹 서버, DB를 배치할 때에는 ALB는 퍼블릭 서브넷에, 나머지 리소스는 프라이빗 서브넷에 배치해주면 되었다. 그런데 AWS lambda라는 친구는 처음이라 여러 의문이 들었다. 

  1. 서버리스인데 어떻게 요청을 받는가(서버리스를 한 번도 안 써본 사람으로써 갖게 되는 의문)
  2. 각 AZ마다 1개의 lambda 리소스가 있는 것인가?
  3. 그렇다면 퍼블릭과 프라이빗 중 어느 서브넷에 배치되어야 하는가

 

나는 위와 같은 그림만 그리고 있기에 잘 상상이 되지 않았다. 

기존에는 ECS와 EC2 fargate 옵션을 사용하고 있었는데, 이 옵션 대신 AWS lambda와 서버리스 구조로 바꾸려고 해. 그런데 이 과정에서 드는 [의문점]이 있어. 이 [의문점]들에 대해 답변해줘

[의문점]
1. AWS lambda는 서버리스라고 이해했다. 그러면 서버리스인데 어떻게 요청을 받는 게 가능할까?
2. 각 AZ마다 1개의 lambda 리소스가 있는 걸까?
3. 그렇다면 퍼블릭과 프라이빗 중 어느 서브넷에 배치되어야 할까?

 

우선 1번 의문에 대한 답변으로는, AWS lambda가 동작하기 위해서는 '트리거(trigger)'가 필요하다고 한다. lambda에 실행 함수를 등록해두고, 트리거가 발생하면 이 함수가 실행되는 것이라고 이해했다. 그리고 서버리스라고 해서 아예 서버 자체가 없는 게 아니라, AWS에서 서버의 관리를 도맡아서 해 주는 것이었다. 

 

서버리스면 AWS 등 타 서비스가 관리를 전담해 주는 것이라서 무조건 비싸다고 생각했는데 그것은 또 아닌 것 같았다. 왜냐하면 트리거의 호출 횟수에 따라 lambda 함수가 실행되는 것이기 때문에 사용량에 따라 요금이 달라지는 것이라고 이해했다. 

 

그리고 앞서 언급한 것처럼 이 람다(lambda) 함수는 트리거에 의해 동작한다. 그 말은 보통의 서버는 항상 요청에 대해 응답을 하지만, 이 트리거는 꼭 우리가 아는 일반적인 요청의 형태가 아닐 수도 있다는 것이다. 실제로 GPT가 든 다양한 예시 중에서는 HTTP 요청뿐만 아니라 SQS 등 AWS의 타 서비스의 이벤트 발생이나 스케줄 기반의 호출도 포함되었다. 즉 사용자가 원하는 트리거의 조건을 설정할 수 있었다. 

 

2번 의문에 대한 답변으로는, 람다 리소스는 각 AZ마다가 아니라 전체 리전에 걸쳐 있는 글로벌 서비스라고 한다. 그래서 특정 AZ에 묶여있지 않는다. 사실 이 부분이 잘 이해되지 않았다. 어떤 리소스(서비스)는 AZ에 종속되어 존재하고, 또 람다와 같은 다른 리소스는 AZ와 독립적으로 전 리전에 걸쳐서 존재한다면, 그런 서비스의 데이터는 어떻게 관리되는지는 아직 잘 이해하지 못했다. 일단 넘어가 보자. 

 

3번 의문에 대한 답변으로는, AWS 람다는 VPC 외부에서 VPC와 독립적으로 실행되는 것이 기본값이라고 한다. 그러나 설정에 따라서 이 람다를 프라이빗 서브넷에 위치시키는 것도 가능하다고 한다. 그러면 어떻게 하는 것이 맞을까? 몇 번의 추가 질의를 통해 모호하지만 나름의 답을 찾아보았다. 

 

그러면 3번 질문의 경우, 만약 lambda 함수가 프라이빗 서브넷에 있는 RDS에 접근해야 한다면 이 경우 lambda를 프라이빗 서브넷에 위치시키는 것이 나을까?

 

GPT 피셜 그렇다고 한다. 람다를 VPC 외부가 아닌 VPC 내부의 서브넷에 위치시켜야 할 때, 보통 퍼블릭 서브넷에는 배치되지 않는다고 한다. 왜냐하면 퍼블릭 서브넷은 프라이빗 서브넷과의 차이점이 IGW(인터넷 게이트웨이)를 통해 인터넷 접근이 가능하다는 차이점이 있는 건데, 람다는 기본적으로 실행 환경에서 인터넷 연결을 처리하기 때문에 그럴 필요가 없다. 그렇다면 프라이빗 서브넷에 위치시켜야 VPC 내부 통신을 통해 프라이빗 서브넷 안에 있는 RDS와 통신할 수 있겠다. 

 

그러면 lambda를 프라이빗 서브넷에 연결하면 외부에서 lambda 함수는 어떻게 호출할 수 있어?

 

AWS 람다는 프라이빗 서브넷에 위치해도 무관하다고 한다. 왜냐하면 API Gateway라는 또 다른 서비스를 통해 호출될 수 있기 때문이다. API 게이트웨이(Gateway)는 특정 VPC나 서브넷에 속하지 않은, AWS 글로벌 네트워크에 속하는 서비스라고 한다. 그래서 퍼블릭 엔드포인트를 가지고 외부에서 접근할 수 있다. 

 

그러면 API 게이트웨이에서는 어떻게 프라이빗 서브넷에 있는 AWS 람다를 호출한다는 걸까? 현재까지는 VPC 밖에 있는 리소스에서 VPC 안의 프라이빗 서브넷에 위치한 리소스를 호출하는 것이 불가능하다고 알고 있기에 의아했다. 역시 질의를 해 보았는데, 알고보니 새로운 'AWS 내부 네트워크'를 통해 API 게이트웨이가 람다를 호출하는 것이 가능하다고 한다. 

 

그려보면 이런 그림이 되겠다. 

 

그리고 이렇게 AWS 람다를 프라이빗 서브넷에 위치시켰을 때, 현재 우리 서비스에서는 외부로 chatGPT API를 호출하는 API가 있다. 이 경우는 NAT 게이트웨이를 이용해서 처리할 수 있다고 한다. 그러므로 이 경우도 문제 없겠다. 그렇다면 이제 AWS 람다를 만들고 프라이빗 서브넷에 위치시켜 보자. 


'lambda'를 검색하니 함수를 실행할 수 있는 페이지가 보였다. 그런데 나는 아예 Django 웹 서버 코드의 실행을 람다로 대신하고 싶은 거였어서, 단순한 함수 하나를 실행하려는 것이 아니었다. 이 경우에는 어떻게 하면 좋을지 모호했다. 

[의문점]에 대해 해결책을 제시해줘

[의문점]
나는 아예 Django 웹 서버 코드의 실행을 AWS lambda로 대신하고 싶은 거였어서, 단순한 함수 하나를 실행하려는 것이 아니었다. 이 경우에는 어떻게 하면 좋을까?

 

이 경우에는 추가 작업이 필요하다고 한다. Django처럼 실행 시간이 비교적 긴 프레임워크를 람다에서 실행하려면 'AWS 람다용 호환 Wrapper'를 사용해야 하고, Django의 경우 대표적으로 Zappa를 사용한다고 한다. Zappa를 검색해 보니 'serverless python' 이라는 문구가 눈에 띄었다. 일단은 서버 없이 파이썬을 실행하게 해 주는 도구라고 이해해봤다. 그러면 뭘 어떻게 하면 된다는 걸까? 이 부분은 내일 알아보자. 

 

궁금한 점

  1. AWS lambda의 설정을 기본값으로는 VPC 외부에 위치시키고, 필요에 따라 프라이빗 서브넷 안으로 들어갈 수 있도록 해 놓은 이유가 궁금하다. 왜 VPC 외부에 위치시키는 것을 기본 설정으로 했을까?
  2. AWS 내부 네트워크 통신은 왜 존재할까? 왜 VPC 밖의 글로벌 네트워크에 있는 리소스와 VPC 안의 프라이빗 서브넷에 있는 리소스가 통신할 수 있도록 해 두었을까?

 

+ Recent posts