[AWS] Lambda에서 VPC 연결하기

작업 히스토리 기록용 포스트다.

vercel 배포 때문에 VPC 접속용 프록시를 만들 필요가 있었다.

서버 API를 호출해서 서버사이드 빌드를 돌려야 하는데, 서버 API는 인바운드 제한이 AWS 보안그룹으로 막혀있었기 때문이다.
심지어 vercel의 배포 서버 IP는 무작위라서 vercel만 허용해준다거나 하는 식의 처리가 불가능했다!

그래서 인증키가 있으면 API들을 호출할 수 있는 프록시를 만들고, 그 키를 배포할때 쓰는 것으로 해결을 하려 했다.
근데 또 프록시 하나 만들자고 서버 구성하는 건 너무 심한 낭비인지라, 프록시는 AWS 람다를 쓰기로 했다.

결론적으로는 Lambda에서 VPC 내의 API를 호출할 필요가 있었다.
근데 생각보다 설정할게 많고 번거롭다.

Lambda에 VPC를 할당해줘야 하고, 네트워크 관련 설정이 좀 필요하다.





서브넷 만들기

Lambda에 적용할 서브넷을 2개 만든다.
VPC는 접속할 VPC와 동일하게 해야 한다.




Lambda에 VPC 먹이기

애초부터 람다를 생성할때 VPC를 설정해주는게 역할도 자동 생성되고 편리하다.
방금 만든 서브넷 2개를 먹여주고, Lambda 전용 보안그룹을 만들어서 할당해준다.

보안그룹은 그냥 빈 값으로만 만들어도 된다. 인바운드와 아웃바운드의 개념은 Lambda에게 의미있게 동작하지 않는다.




NAT 게이트웨이

public NAT 게이트웨이가 없다면 만든다. 기존에 있었다면 그냥 쓰면 된다.

이건 쉽게 말해서 VPC 안에서 외부 인터넷에 접속을 할 수 있게 해주는 역할을 한다.
밖에선 안에 들어오지 못하고, 안에서는 밖으로 나갈 수 있게 하는 것이다.

떠있는 시간과 사용량만큼 비용이 부과되니 참고하길 바란다.





라우팅 테이블

이런 형태의 라우팅 테이블이 있는지 확인한다.

대충 이런식으로 되어있어야 한다.
0.0.0.0/0은 public NAT 게이트웨이로 라우팅되어야 한다.

그리고 람다용 서브넷을 여기에 연결해준다.

여기까지 했다면 VPC가 적용된 상태에서, 외부 인터넷에 접근하는 것 자체는 가능할 것이다.

이제 서버 API까지 호출할 수 있게 하려면, 해당 서버의 보안그룹에 public NAT 게이트웨이의 IP를 허용해주면 된다.

그럼 이제 될 것이다.

코드는 대충 이런 형태였다.

import axios from 'axios';

export const handler = async(event) => {
    try {
        console.log('event', event);

        const query = event?.queryStringParameters;

        const url = query?.url;
        const key = query?.key;

        if(!['키값'].includes(key)) {
            return {
                statusCode: 401,
            };
        }

        if(!url) {
            return {
                statusCode: 400,
            };
        }

        const response = await axios.get(url);

        const data = response.data;

        return {
            statusCode: 200,
            body: data,
        };
    }
    catch(error) {
        console.error(error);
        return {
            statusCode: 500,
        };
    }
};

이 경우에는 도메인도 쓰고 이래저래 해서 복잡하게 설정을 했는데, 아마 그냥 VPC 내 리소스 액세스만 하는 경우라면 Lambda의 보안그룹을 다른 보안그룹에서 인바운드로 허용하는 정도면 될 것이다.



참조
https://aws.amazon.com/ko/premiumsupport/knowledge-center/internet-access-lambda-function/
https://medium.com/harrythegreat/%EB%B2%88%EC%97%AD-aws-lambda%EB%A5%BC-vpc%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%9D%B8%ED%84%B0%EB%84%B7-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-d227e4262238
https://stackoverflow.com/questions/35468388/aws-security-group-inbound-rule-allow-lambda-function