AWS 프리티어 퍼블릭 IP 과금 $0.005 per In-use public IPv4 해결법 - EC2 Instance Connect



이 글은 EC2 Instance Connect Endpoint를 이용하여 public IPv4 없이, private IPv4만 이용하여 EC2 instance에 접속하는 방법을 다룬 글이다. AWS 프리티어 EC2를 이용하고 있으며, EC2 Instance의 운영체제는 ubuntu이다.
 
(수정 예정 - AWS 프리티어 EC2의 경우 EC2 public IPv4는 무료인 것으로 알고 있는데 과금이 되는 부분에 대해서 문의는 남겨두었다. 문의 답변을 기다리는 와중에 추가적인 검색을 하다보니 EC2 public IPv4가 문제가 아닌 것 같다는 것을 알게 되었다. 어쨌든 답변까지 오면 확인 후에 최종 수정 예정
24.02.22 추가 → https://ology.tistory.com/390
RDS의 IPv4가 문제였음)

AWS 프리티어 Public IPv4 (퍼블릭 IP) 과금 해결법

얼마전에 AWS 프리티어 과금 문제를 해결하기 위해 EC2 Instance Connect Endpoint 설정법을 알아보았다. https://ology.tistory.com/388 AWS 프리티어 과금 $0.005 per In-use public IPv4 address per hour 해결법 - EC2 Instance Con

ology.tistory.com


 
 
AWS 프리티어 이용 중에 특별히 EC2나 RDS 사용량을 초과하지도 않았는데도 과금이 되는 현상을 발견하였다.
 

 
뭐 별로 대단한 것도 하고 있지 않은데도 과금이 되고 있어서 해결책이 필요하다.
 
IPv4에 대해 과금을 하는 정책은 올해 2월부터 생긴 것이다보니 이것에 대한 해결책이 잘 나오지가 않는다.
 
현 시점에서 Public IPv4는 2가지 용도로만 쓰이고 있다.
1. EC2 Instance에 내 파이썬 파일을 업로드하는 것.
2. EC2 Instance에 접속해서 docker를 돌리는 것.
 
그 외에 외부에서 내 Instance로 접근할 필요성은 없어서 public IPv4가 사실 많이 필요한 것은 아니다.
 
아직 100% 해결 되진 않았지만, 일단 public IPv4 없이 private IPv4를 이용하여 Instance에 접근하는 방법까지는 해결하였다.
 
이에 대해 알아보도록 하자.
 


 
 
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html

Connect to your instances without requiring a public IPv4 address using EC2 Instance Connect Endpoint - Amazon Elastic Compute C

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

 
영어로 참고할 수 있는 가이드가 있다.
이 문서와 ChatGPT를 이용하여 좌충우돌하며 해결하였다
 
EC2 Instance Connect Endpoint는 public IPv4 address 없이도 SSH나 RDP를 이용하여 instance에 연결할 수 있게 해주는 서비스이다.
 

Instance에 Instance Connect Endpoint 설치 유무 확인

참고로 EC2 Instance Connect Endpoint는 AWS Linux 2 이상이거나, ubuntu 20.04 버전 이상이면 기본적으로 설치되어 있는 것으로 알고 있다. 프리티어로 ubuntu를 선택하면 ubuntu 20.04 버전이 설치되므로 이미 설치 되어있을 가능성이 높다. 하지만 과정이 복잡하다보니 중간 중간 문제가 생기는 경우가 많아서 미리 설치는 제대로 되어있는지 확인해보는 것도 나쁘지 않을 것 같다.
 
기존의 방식대로 public IPv4를 이용하든 어떻게든 Instance에 접속한 뒤

$ dpkg -l | grep ec2-instance-connect

 
로 설치 유무를 체크한다.
 

ii  ec2-instance-connect    1.1.14-0ubuntu1.1    all    Configures ssh daemon to accept EC2 Instance Connect ssh keys

 
이런 식으로 나오면 된다.
 
설치가 안되어있으면 설치를 해야한다
다음 코드를 이용하면 된다.

$ sudo apt-get update
$ sudo apt-get install ec2-instance-connect

 
확인이 끝났으면 본격적으로 시작하자.
 

EC2 Instance Connect Endpoint 생성

첫 번째로, EC2 Instance Connect Endpoint를 만들어야 한다.
VPC 콘솔 > 엔드포인트 > 엔드포인트 생성으로 들어가자.
 
서비스 범주에서 EC2 인스턴스 연결 엔드포인트를 클릭하고, 엔드포인트를 생성할 VPC를 선택한다.
이후 보안그룹을 선택하는 창이 나오면, 인바운드 규칙 중 SSH 포트 22가 열려있는 보안그룹을 선택한다.
(EC2 콘솔 > 보안 그룹 > 보안 그룹 각각 클릭 후 > 인바운드 규칙에서 확인. launch-wizard-1 따위의 이름을 갖고 있다)
 
그 다음에 서브넷을 확인해야하는데,
이는 EC2 콘솔 > 인스턴스 > 해당 인스턴스 클릭 후 인스턴스 정보가 나오면 거기 적혀있는 서브넷 ID를 찾아서 선택하면 된다.
 
이 과정을 거치면 엔드포인트를 생성할 수 있다.
생성후에 VPC 엔드포인트 ID를 기억하도록 하자. eice-adf98sad7f9df 이런 식의 포맷일 것이다.
 
설명서에는 IAM 콘솔 > 역할에 들어가 역할을 만들어줘야한다고 쓰여져있는데
실제로는 엔드포인트를 만드니 AWSServiceRoleForEc2InstanceConnect 라는 역할이 이미 만들어져있었다.
혹시 제대로 만들어졌는지 한번 확인은 해보자.
 
 
 

IAM 사용자 만들기

IAM 사용자를 만들어야 AWS CLI라는 것을 이용하여 접속이 가능하다고 한다.
IAM 콘솔 > 사용자 > 사용자 생성으로 들어간다.
사용자를 만든 뒤, 그 사용자를 클릭하자.
요약에서 액세스 키라는 항목을 클릭하고 AWS CLI 용으로 만드는 것을 클릭하면 액세스 키와 해당하는 비밀 키가 제공된다. 잘 적어두도록 하자.
 
이 사용자에게 권한 정책을 몇 가지 부여해야 접속할 수 있다.
 

정책 만들기

필요한 정책에 대해서는 다음 문서를 참고했다.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/permissions-for-ec2-instance-connect-endpoint.html

Grant IAM permissions to use EC2 Instance Connect Endpoint - Amazon Elastic Compute Cloud

Grant IAM permissions to use EC2 Instance Connect Endpoint To create or use an EC2 Instance Connect Endpoint, you must create an IAM policy that grants your users permissions for the following: Create, describe, and delete EC2 Instance Connect Endpoints Us

docs.aws.amazon.com

총 3가지 정책을 만들 것이다.
- Allow users to create, describe, and delete EC2 Instance Connect Endpoints
- Allow users to use EC2 Instance Connect Endpoint to connect to instances
- Allow users to connect only from a specified source IP address range
 
IAM 콘솔 > 정책 > 정책 생성을 누르자.
정책 편집기라는 것을 보면 '시각적'이라는 것으로 표시되어있을텐데 JSON으로 바꿔주자.
 
복사 붙여넣기 하니 양식이 달라져서 이미지로 업로드한다.
복붙이 필요하신 분은 위에 문서 링크로 들어가시길..
 
Allow users to create, describe, and delete EC2 Instance Connect Endpoints

 
 
굳이굳이 이미지로라도 업로드하는 이유는 저기 붉은색으로 색칠된 것에 대한 부연 설명이 필요하기 때문이다.
region에 EC2가 위치한 지역을 넣어준다. 대개 국내라면 ap-northeast-2
account-id는 우측 상단, 나의 계정 이름을 클릭하면 나오는 창에 적힌 12자리 숫자를 넣으면 된다.
 

계정 ID

 
 
 
Allow users to use EC2 Instance Connect Endpoint to connect to instances

 
region, account-id는 위 항목과 동일하다.
eice-어쩌구저쩌구는 위에 EC2 Instance Connect Endpoint를 생성하면서 나왔던 VPC 엔드포인트 ID를 입력해준다.
 
IP address는 EC2 콘솔 > 인스턴스 > 해당 인스턴스 클릭한 뒤 나온 프라이빗 IPv4 주소를 입력한다.
173.15.81.240 이런 식으로 프라이빗 IP 주소가 나와있으면 "173.15.81.240/32" 이런 형식으로 넣어준다.
/31이 아니라 /32인 이유는 저 IP주소 딱 하나를 대상으로 하는 것이기 때문이다.
ami-username에는 인스턴스 운영체제 접속할 때 쓰는 기본 ID를 넣어주면 된다. Linux라면 ec2-user가 아이디라고 한다. Ubuntu의 기본 아이디는 ubuntu이므로 ubuntu라고 적어주자.
 
Allow users to connect only from a specified source IP address range

나머진 동일하고,
IpAddress에 본인 컴퓨터의 IP주소를 적어주면 된다.
예를들어 111.53.248.14/32
 

사용자에게 정책 할당

IAM 콘솔 > 사용자에 들어가서 아까 만든 사용자를 클릭한 뒤
권한 정책 > 권한 추가에서 방금 만든 세 가지 정책을 할당해준다.
 
 
이제 Windows Powershell로 넘어갈 것이다.
 

AWS CLI 설정

Powershell에서 AWS CLI를 이용하려면 AWS CLI를 설치해야한다.

 
설치 후 powershell에 다음 명령어를 입력한다.
 

> aws configure

 
그러면 
 

AWS Access Key ID [None]: YOUR_ACCESS_KEY_ID_HERE
AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY_HERE
Default region name [None]: ap-northeast-2
Default output format [None]: json

 
이렇게 4가지를 입력해야하는데 ACESS_KEY와 SECRET_ACCESS_KEY에 위 IAM 사용자 만들기에서 얻어낸 액세스 키와 해당하는 비밀 키를 입력한다.
 
세팅이 잘 되어있는지 확인하려면 다음 명령어를 입력한다
 

> aws sts get-caller-identity

 

 

PEM key를 PUB key로 변환

SSH 접속을 위해 사용하던 .pem 파일이 있을 것이다. .pem 파일이 있는 폴더로 이동한다.

> Set-Location -Path D:\OneDrive\my_folder

 
이후 다음 명령어를 이용해 PUB key로 바꿔준다

> ssh-keygen -y -f ".\newsCrawler.pem" > ".\newsCrawler.pub"

 
이 PUB key를 instance에 보내준다

> $publicKey = Get-Content -Path ".\newsCrawler.pub" -Raw

> aws ec2-instance-connect send-ssh-public-key --instance-id 인스턴스ID --instance-os-user ubuntu --ssh-public-key $publicKey --availability-zone ap-northeast-2a --region ap-northeast-2

 
인스턴스ID에 인스턴스 id를 넣어주자. 대개 i-ab9fdah8j6k5 이런 식의 형태이다.
 
 

MSSH를 이용한 접속

Powershell에서 다음 명령어로 mssh를 설치한다.

> pip3 install ec2instanceconnectcli

 
이후 mssh로 접속하면 된다. 
인스턴스ID에 인스턴스 id를 넣어주자. 대개 i-ab9fdah8j6k5 이런 식의 형태이다.

> mssh ubuntu@인스턴스ID

 
이렇게 되면 접속이 된다.
 
 
 
진짜 여러가지 문제가 있었지만 겨우겨우 접속할 수 있었다.
해결에 걸린시간: 8시간
 
 

해결해야할 문제

- EC2 Instance Connect Endpoint 혹은 다른 방식을 통해 public IPv4 없이 내 컴퓨터의 파일을 EC2에 업로드 하기
- EC2 Instance의 public IPv4를 제거하기
 
진짜 어마어마하게 힘든 일이다.
사실 가장 큰 문제는 현재 존재하는 EC2 Instance의 public IPv4를 제거하는 것이다.
Public IPv4의 할당과 해제가 자유롭다고하면 사실 이런 복잡한 과정 없이
필요할 때만 할당해서 쓰고 나머지는 해제하고 살면 된다.
 
접속할 일이 잘 없으니 뭐 한달에 끽해야 한두시간 접속할까? 이정도면 시간당 $0.005 정도야 못 낼 일도 아니다.
근데 문제는 Public IPv4 할당과 해제가 전혀 자유롭지 않은 것처럼 보인다.
거의 Instance를 삭제했다가 새로 만들어야하는 듯한데, 잘 돌아가고 있는 걸 중지하고 새로 만드는게 걱정이다..
일단은 이번 주말은 여기까지 해결한 것에 만족.