jetalog.net

최근 AWS Lambda(이하 Lambda)를 활용해 API Backend를 개발하고 있습니다.
처음하는 일은 늘 어려운 법이지만 이틀 내내 어두운 터널에서 벽을 짚으며 걷는 느낌을 줬던 이슈를 정리해봅니다.

 

만약 왜 이런 설정을 하는지 이해가 필요하다면 이전 글을 참고해주세요.

만약 지금 바로 10분 만에 구성해야 한다면 다음 글을 참고해주세요.

 

설정을 생각해보자

지난 글에서 구성도를 현실에 빗대어 생각해봤습니다.

만약 새 건물을 짓고 PC에 인터넷을 연결한다면 아래 과정이 필요할겁니다.

  1. 땅 사고 건물 허가 받기: VPC 생성
  2. 건물 (층) 올리기: Private Subnet 생성
  3. 전산실 만들기: Public Subnet 생성
  4. 인터넷 계약하고 모뎀 임대하기: Internet Gateway 생성
  5. 공유기 구매 후 모뎀과 연결: Public Routing Table 생성
  6. 공유기 켜기: NAT Gateway 생성
  7. 공유기에 LAN 케이블 연결: Private Routing Table 생성
  8. PC에 LAN 케이블 연결: AWS Lambda 설정 변경

 

진짜 설정해보자

VPC 생성하기

일단 VPC부터 생성합니다.
만약 기존 VPC가 있다면 해당 VPC를 그대로 사용해도 됩니다.

빨간색으로 표시한 VPN 생성을 누릅니다.
적절한 IPv4 CIDR 블록을 입력한 후 생성을 누릅니다.

땅을 사고, 건축 허가를 받았습니다.

 

Subnet 생성하기

높은 가용성을 위해 Private, Public 각 2개 이상을 권장합니다.
큰 건물에 더 많은 직원을 두고 더 많은 일을 할 수 있는 것과 비슷한 개념입니다.

 

지금은 이름만 Private, Public으로 지정 후 생성합니다.

VPC는 앞에서 지정한 이름으로 자동완성됩니다.
이런식으로 생성합니다.

 

Internet Gateway 생성하기

실제로 인터넷 계약을 할 땐 복잡하지만, AWS에선 간단합니다.
이름 지정 후 생성합니다.

이름만 입력하면 간단히 생성됩니다.
생성된 후에는 VPC에 연결합니다.

 

Public Routing Table 생성하기

이제 모뎀에 공유기를 연결하듯 Routing Table을 생성합니다.

먼저 전산실이 있는 층, 즉, Public Subnet을 지정합니다.

이름도 구분할 수 있도록 public을 붙여줍니다.


생성된 라우팅 테이블의 라우팅 메뉴에서 라우팅 편집을 선택합니다.

 

VPC 내부 IP를 제외한 모든 IP(0.0.0.0/0)에 대해 모뎀, IGW를 향하도록 설정합니다.

마찬가지로 igw를 입력하면 Internet GateWay가 자동으로 선택됩니다.

 

생성된 라우팅 테이블의 서브넷 연결 메뉴에서 서브넷 연결 편집을 선택합니다.

라우팅 바로 옆에 있습니다.

 

Public 서브넷을 지정하고 저장합니다.

검색어로 Public을 지정하면 선택하기 편합니다.

 

NAT Gateway 생성하기

공유기를 켜는 과정입니다.
공유기는 외부와 연결이 되어있어야 하기 때문에, 전산실에 배치합니다.

 

생성 화면에서 Public 서브넷 중 하나를 선택하고,

Elastic IP를 생성하여 연결합니다.

 

이 예제에서는 15.164.69.29가 연결되었습니다.

만약 남는 EIP가 있다면 연결해줘도 됩니다.

 

Private Routing Table 생성하기

이번엔 Private Routing Table을 생성합니다.

앞서 Public Routing Table을 생성할 때처럼, Private Subnet을 지정합니다.

앞서 설정했던 것과 동일합니다.


VPC 내부 IP를 제외한 모든 IP(0.0.0.0/0)에 대해 NAT를 향하도록 설정합니다.

nat를 입력하면 자동완성됩니다.

 

Private 서브넷을 지정하고 저장합니다.

이번에도 Private로 검색하면 바로 선택할 수 있습니다.

 

VPC 구성이 완료되었습니다!

 

AWS Lambda 설정 변경

현재 내 IP를 확인할 수 있는 함수를 생성하여 정상적으로 작동되는지 확인해보겠습니다.

테스트를 위한 Node.js 코드는 아래와 같습니다.

const http = require('https');

exports.handler = (event, context, callback) => {
    const options = {
        method: 'GET',
        hostname: 'jsonip.com',
    };

    const req = http.request(options, (res) => {
        const chunks = [];

        res.on('data', (chunk) => chunks.push(chunk));

        res.on('end', () => {
            const body = Buffer.concat(chunks);
            const results = body.toString();
            
            console.log(results);
            
            callback(null, {
                statusCode: 200,
                body: results,
            });
        });
    });

    req.end();
};

실행해보면 AWS에서 자동으로 지정된 IP가 출력됩니다.

 

권한 추가

VPC와 연결을 위해서는 먼저 함수에 권한을 추가해줘야합니다.

 

관리 화면 하단 실행 역할 박스의 역할 편집 링크를 선택합니다.

"~ 역할을 확인"에 링크가 걸려있습니다.

 

하단에 정책 연결을 선택합니다.

 

표시되는 정책 중 'AWSLambdaVPCAccessExecutionRole' 권한을 선택하고 정책 연결을 선택합니다.

타이핑하기 귀찮을까봐 제가 해놓았습니다.

 

VPC 설정 변경

이제 함수를 VPC와 연결합니다.

함수 관리 화면 하단의 네트워크 박스로 이동해서 아래와 같이 설정합니다.

 

* VPC는 앞서 생성한 VPC로 지정합니다.

* 서브넷은 반드시 Private 서브넷을 선택합니다.

* 보안 그룹은 외부 연결이 허용되도록 합니다.

 

최종 테스트

다시 테스트를 돌려보면 아래와 같이 발급 받은 EIP가 표시되는 것을 확인할 수 있습니다.

우리가 원했던 그 결과입니다.

 

그런데 말입니다...

이렇게 번거롭게 하나하나 생성할 필요 없이 훨씬 간단하게 시작할 수 있는 '마법사'가 있다는 것을 뒤늦게 알았습니다.

마법사를 이용해서 설정하는 방법은 바로 다음 글에서 확인할 수 있습니다.

 

*

이 글은 총 3편에 걸쳐 작성할 예정입니다.
지난 1편에서는 AWS Lambda에 고정 IP를 연결하기 위한 배경 지식을 정리했습니다.
이번 글은 VPC 구성을 실제로 진행하는 단계를 정리했습니다.
다음 3편에서는 글 작성 중 발견한 '마법사' 기능을 이용해 구성하는 과정을 정리했습니다.

 

참고 문서