
aws에서 vpc에서 서비스를 사용하기 위해서는 특정 서비스들은 Public IP를 통해 서비스를 이용하기도 한다.
이렇게 외부 인터넷 트래픽을 이용하여 AWS의 서비스를 이용하면 단점들이 존재하긴한다.
그래서 그러한 점을 보완하기 위해 AWS의 Endpoint 네트워크 서비스를 이용할 수 있다.
AWS VPC Endpoint는 VPC내에서 AWS 서비스 및 기타 엔드포인트 서비스에 안전하고 효율적으로 접근할 수 있게 해주는 중요한 네트워킹 서비스이다. VPC Endpoint는 인터넷 게이트웨이, NAT, VPN 연결, AWS Direct Connect 없이도 VPC에 지원되는 AWS 서비스와 프라이빗하게 연결할 수 있다.
AWS VPC Endpoint에는 총 2가지의 유형이 존재한다.

Interface endpoint 를 사용하면 서비스가 VPC내에서 포함되어 있는 것처럼 VPC를 서비스에 프라이빗하게 연결이 가능하다.

Gateway endpoint는 S3 와 DynamoDB를 위한 endpoint 이다. S3와 DynamoDB에 프라이빗하게 연결하기위한 서비스이므로 비용이 무료라는 점이 가장 큰 특징이다.
AWS 서비스들을 IGW(Internet gateway)를 거치지 않고 AWS 전용 네트워크로 바로 연결되기 때문에 데이터의 안정성이 높음internet gateway를 거치지 않기 때문에 더 빠르게 서비스에 연결이 가능함internet gateway를 거치지 않기 때문에 트래픽에 대한 과금을 줄일 수 있음한번 직접 사용해보겠다.
어떻게 하면 S3에 gateway endpoint를 이용해서 접속 할 수 있을까 생각하다가 다음과 같은 아키텍처가 만들어짐..

단순한 아키텍처이다. 하지만 이 아키텍처에서 표현되지 않은 부분은 private 서브넷은 nat gateway를 사용하지 않는다는 점이다. 이러면 당연히 s3도 확인을 하지못하는게 맞다. 근데 gateway endpoint를 사용해서 프라이빗한 연결을 통해 사용할 수 있는지 확인해보겟다.
해당 기본틀(vpc,ec2 등등)은 terraform 코드를 이용해서 미리 작성하였음.

처음에는 인터넷 게이트웨이와 연결되어있는데 bastion_ec2 인스턴스에 접속
그후에 바로 내부IP를 가지고 private_ec2 인스턴스에 접속

private_ec2 에 대한 내용은 이러하였음
다음으로는 테스트용 S3를 하나 생성해주고 제일 중요한 gateway endpoint를 생성해준다.

이름을 적어준다음 AWS 서비스 유형을 선택함
다음으로 서비스에 우리는 S3에 연결할예정이므로 S3를 입력해서 인터페이스가 아닌 Gateway 유형을 선택해줌

다음으로는 라우팅 테이블을 선택해줘야하는데 이부분에서 잘 몰랐던 점은 라우팅 테이블이 필요했다는점과 해당 라우팅 테이블이 연결될 ec2 서브넷에 포함된 서브넷에 연결되어야한다는점임.

사진에서 보면 vpc-endpoint는 연결된 ID 즉 연결된 서브넷이 없다는 말...어떻게 보면 기초적인 실수를 함...(당연히 vpc endpoint 생성후 해당 라우팅 테이블은 서브넷에 연결해줌)
이제 다시 돌아와서 private_ec2에서 cli를 통해 aws 로그인을 해주고 s3를 확인해주면 됨

ping 명령어를 통해 외부인터넷과 연결되지 않음(nat gateway가 없음)
하지만 gateway endpoint를 통해 aws 전용선으로 안전하게 통신할 수 있음

이제는 인터페이스 엔드포인트를 사용해보겠다.

해당 랩 아키텍처도 생각나는대로 그려봤다. 총 2개의 vpc가 존재하는데 Provider는 서비스 제공자로 웹서버를 제공하게된다.
Consumer는 소비자로 서비스를 이용하게된다.
근데 이때 웹서버는 프라이빗 NLB를 통해서 사용자에게 서비스를 제공하게되는데 사용자는 interface endpoint를 이용해 서비스를 볼 수 있게됨
bastion ec2도 하나씩 생성하는데 별다른 의미는 없고 해당 private subnet에 있는 ec2에 접속하기 위한 인스턴스임
해당 아키텍처도 기본적으로 테라폼으로 구성을 하였다. 단지 web 서버의 아파치 설치를 위해 잠시 nat 게이트웨이를 사용하고 삭제하였다.
일단 먼저 web 서버에 아파치를 설치하고 포트번호를 8000번으로 변경하였다.

또한 NLB의 타겟그룹에 대상을 provider의 private 서브넷에 ec2(웹서버)를 등록하였다.(참고로 NLB는 내부 로드밸런서이다.)

등록을 완료하고 provider의 bastion ec2에서 웹서버를 호출하면 잘 작동하는것을 볼 수 있다.

기본적인 틀은 구축이 되었으니 endpoint를 설정해보겠다.

엔드 포인트 서비스에 들어가 엔드포인트 서비스를 생성해준다.
엔드포인트 서비스이름, provider에 있는 로드밸런서를 선택해준다.

밑부분의 설정은 디폴트 값으로 그냥 넘어간다.

그럼 이제 엔드포인트 서비스가 생성된다. 엔드포인트 서비스는 provider에 상주하며 provider에 있는 서비스를 외부 vpc에 제공해주는 그런 역할을한다.

이제 엔드포인트를 생성해준다.

이때 중요한점은 엔드포인트 서비스의 서비스 이름을 꼭 미리 복사해두자..(서비스 이름 찾느라 10분을 날려먹었다...)

엔드포인트로 마찬가지로 이름을 설정한 다음 유형을 NLB 및 GWLB를 사용하는 엔드포인트 서비스로 설정해준다.

아까 복사해둔 서비스 이름을 적은다음 서비스 확인을 눌러주면 됨 또한 vpc는 당연히 서비스를 사용할 vpc를 선택해주면 된다.

서브넷도 선택해줘야하는데 나는 consumer vpc에 private 서브넷에 있는 ec2로 웹서버를 호출할 예정이기 때문에 해당 서브넷을 선택해줬다.

엔드포인트를 생성하고 나면 수락 대기 중이라고 뜨는데 이부분을 엔드포인트 서비스에서 수동으로 수락을 해주면된다. 만약 이부분이 귀찮다면 엔드포인트 서비스를 생성할 때 엔드포인트 수락 필수를 체크 해제하면 된다.

다시 엔드포인트 서비스로 돌아와 엔드포인트 연결로 들어가면 수락 대기중인 엔트포인트 연결을 확인할 수 있다.

해당 엔드포인트 연결을 선택하고 엔드포인트 연결 요청을 수락해주면 된다.

다시 엔드포인트로 가면 사용 가능이라고 뜬다 이제 웹서버를 호출 해보겠다.

consumer vpc의 private 서브넷에서 호출하면 아주 잘 호출되는 모습을 확인할 수 있다.

아주 당연하게도 다른 ec2나 외부 인스턴스에서 호출을 되지 않는다. 따라서 aws 전용선으로 안전하게 통신을 할 수 있다.

