CampusMeet

[AWS] VPC EndPoint + CodeCommit을 활용한 Private EC2

dong_seok 2024. 10. 9. 11:25
1. VPC EndPoint
2. CodeCommit
3. VPC EndPoint + CodeCommit

 

이전에 프라이빗 서브넷에 배포된 인스턴스에 연결하는 과정을 경험했고, ALB를 생성해 가비아 도메인과 연결하는 단계까지 완료했습니다. 현재 프라이빗 서브넷의 인스턴스에는 접근이 가능하지만, 내부가 비어 있어 기존 소스코드를 가져와 실행하거나 Docker Hub 또는 ECR에서 이미지를 받아 컨테이너를 실행해야 합니다. 하지만, 프라이빗 서브넷에서는 외부 인터넷에 접근할 수 없기 때문에 git clone 명령어를 통해 외부 레포지토리에서 소스코드를 가져오는 것이 불가능했습니다. 이는 NAT 게이트웨이가 없어 인터넷 접근이 차단되어 있기 때문인데, NAT 게이트웨이는 서울 리전 기준으로 시간당 0.059달러가 발생하여 월 약 5만 원의 비용이 들기 때문에 부담스러웠습니다.

 

추가로, ECR에서 이미지를 가져오기 위해 docker 명령어를 사용하려고 했지만, EC2 인스턴스에 Docker가 설치되어 있지 않아 설치를 시도했으나, 이 역시 외부와의 통신이 필요해 설치할 수 없었습니다.

 

비용 절감을 위해 NAT 게이트웨이 대신 CodeCommit에 소스코드를 저장하고, 이를 VPC 엔드포인트를 통해 가져오는 방법을 시도해보기로 했습니다.

 

1. VPC EndPoint

먼저 이전에 생성해보긴했지만 자세한 설명은 없었던거 같아 Vpc EndPoint에 대해 간단하게 설명하고 넘어가도록 하겠습니다.

 

1) VPC EndPoint 란?

 

VPC 엔드포인트는 VPC 내 Resource들이 VPC 외부의 서비스(S3, Dynamo DB, Cloudwatch) 등에 접근할 때 Internet Gateway, NAT Gateway 등의 외부 인터넷 전송 서비스를 타지 않고 내부 네트워크를 통해 접근할 수 있도록 지원하는 서비스입니다. 

 

다시 말하면, VPC Endpoint는 AWS 여러 서비스들과 VPC를 연결시켜주는 중간 매개체로서, AWS에서 VPC 바깥으로 트래픽이 나가지않고 AWS의 여러 서비스들을 사용할수있게 만들어주는 서비스라 할 수있습니다.

 

 

이러한 VPC 엔드포인트를 사용하면 외부 인터넷을 사용하지않기 때문에 비용 절감이 되고 외부에 트래픽이 노출되지 않기 때문에 보안 측면 강화의 이점도 지니게 됩니다.

 

2) VPC EndPoint 종류

 

(1) Interface EndPoint

  • 서브넷마다 ENI를 생성하여 IP가 할당되고 해당 IP로 Access를 하는 방식
  • Private IP를 만들어서 서비스로 연결
    (SQS, SNS, Kinesis 등 많은 서비스 지원)
  • Private Subnet 내부에 위치

 

(2) Gateway EndPoint

 

  • Route Table을 이용하여 EndPoint에 Access 하는 방식
  • 라우팅 테이블에서 경로의 대상으로 지정하여 사용
    (S3, DynamoDB 등 일부 서비스만 지원)
  • VPC 내부에 위치

 

이제 뒤에서 설명할 CodeCommit 과 같이 연결해서 사용할 VPC EndPoint를 만들어보도록 하겠습니다.

VPC 콘솔 -> 엔드포인트 -> 엔드포인트 생성 을 클릭해서 들어가줍니다. 그리고 서비스는 com.amazonaws.ap-northeast-2.codecommit 을 클릭해줍니다. 서브넷은 EC2 인스턴스가 위치한 서브넷을 클릭해줍니다. 보안 그룹은 인바운드 트래픽은 같은 서브넷 내부에서 통신 이루어지기때문에 없어도 되고 CodeCommit에 접근해야하기 때문에 아웃 바운드 트래픽으로 HTTPS 프로토콜을 가진 보안그룹을 새로 생성해서 적용시켜줍니다.

 

 

이러면 VPC EndPoint는 생성이 완료되었습니다. 이제 EC2 인스턴스가 CodeCommit에 접근할 수 있도록 IAM 역할이 필요합니다. 이를 위해 인스턴스에 연결되 IAM 역할에 "AWSCodeCommitReadOnly" 또는 "AWSCodeCommitFullAccess" 권한을 추가해줍니다.

 

 

정책을 추가했으니 안전하게 EC2 인스턴스를 재부팅 해 줍니다.

 

2. CodeCommit

CodeCommit 콘솔에 접속해서 리포지토리를 생성하고 연결해 보겠습니다.

 

 

자유롭게 리포지토리 이름을 정해줍니다.

 

 

리포지토리가 잘 생성된 모습을 볼 수 있습니다.

 

 

이제 hoseo-meet-repo 에 git hub 에서 형상 관리할때 사용하던 소스코드를 push 해보도록 하겠습니다. 가장 먼저, AWS CodeCommit 을 사용하려면 Git 클라이언트가 AWS 자격 증명을 사용해야 합니다. 자격 증명을 위해서는 다음 명령어를 이용하면 됩니다. (aws 가 없는 경우 "brew install awscli" 로 선행 설치)

 

aws configure

 

 

aws 가 없는 경우 하단 명령어로 aws 를 선행 설치해줍니다. (mac os 기준)

 

brew install awscli //aws 설치
aws --version //aws 설치 확인

 

이제 다시 aws configure 명령어를 입력해줍니다. 그러면 입력해야하는 항목들이 나타나는데, 이 항목들은 AWS 서비스를 사용할 수 있도록 하는 자격 증명환경 설정과 관련된 정보들입니다. 항목들을 채우기위해 Access Key 를 먼저 발급해주겠습니다. IAM 콘솔 -> 사용자 -> 사용자 생성을 클릭합니다.

 

 

이름은 자유롭게 작성하고 "AWSCodeCommitPowerUser" 정책만 추가해 줍니다.

 

 

사용자 생성을 완료하면 "액세스 키 ID" 부분에 발급 받을 수 있게 버튼이 나옵니다. 이를 클릭하고 액세스 키를 발급 받아줍니다. 

(해당 Access Key ID(접근 키 ID) , Secret Access Key (비밀 접근 키) 는 다시 볼 수 없으니 안전한 곳 에 보관해야합니다!)

 

 

이제 다시 터미널로 돌아와서 "aws configure" 을 입력하고 위에서 발급받은 Access Key 정보를 입력합니다.

 

 

CodeCommit에서 HTTPS를 사용할 때, Git이 AWS CLI 자격 증명을 통해 인증할 수 있도록 Git 자격 증명 관리 도구를 설정해야 합니다. 아래 명령어를 실행하여 설정을 추가할 수 있습니다.

 

git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true

 

이 명령어는 Git이 AWS CLI의 자격 증명 관리자를 사용하여 인증하도록 설정합니다. 이외에도 IAM 콘솔 -> 사용자 -> 보안 자격 증명 -> AWS CodeCommit에 대한 HTTPS Git 자격 증명 을 통해 Git 클라이언트에서 사용 가능합니다.

 

 

이제 git 과 codecommit 관련 설정을 마쳤으니 server 브랜치에 있는 내용을 codecommit의 레파지토리에 push 해보도록 하겠습니다. 방법은 간단합니다. 현재 브랜치는 git hub 의 origin 원격 저장소와 연결되어있는 상태입니다. 여기에 하단 명령어를 통해 새로운 원격 저장소를 추가해주면 됩니다.

 

git remote add codecommit <codecommit 레파지토리 url>

 

이러면 codecommit 이라는 이름의 원격 저장소가 생깁니다. 그리고 하단 명령어로 코드를 AWS CodeCommit으로 push 합니다.

 

git push codecommit server

 

codecommit 레파지토리를 확인해보면 아래처럼 server 브랜치 소스가 정상적으로 반영 된 모습을 볼 수 있습니다.

 

(번외)

현재 위에서 git config 로 자격증명을 진행했는데 이로인해 기존 Git repository 로 push를 할때 자격증명 관련 충돌이 일어나는 것으로 확인됐다. 따라서 자격 증명을 분리 시키거나 아래 하단 코드를 사용해 글로벌 Git 설정에서 CodeCommit 자격 증명 설정을 삭제해야 기존 Git repository 로 push가 가능하다

 

git config --global --unset credential.helper
git config --global --unset credential.UseHttpPath

 

3. VPC EndPoint + CodeCommit

이제 EC2 인스턴스 내부에서 VPC 엔드포인트를 통해 CodeCommit에 저장된 소스를 가져오려고 합니다. 이를 위해 git 명령어를 사용해야 하지만, 현재 인스턴스는 외부와의 접근이 불가능하기 때문에 S3 버킷을 이용해 Git 패키지를 업로드하는 방법을 시도하려 했습니다. 그러나 S3 버킷도 결국 aws 명령어를 사용해 접근해야 하는데, 현재 EC2 인스턴스에는 아무런 도구도 설치되어 있지 않아 이 역시 불가능했습니다.

 

여러 가지 우회 방법을 시도하려 했지만, 결국 임시로 NAT 게이트웨이를 생성한 후 인스턴스에 필요한 필수 라이브러리들만 설치하고, 설치가 완료되면 NAT 게이트웨이를 삭제하는 방법을 선택하기로 했습니다.

 

VPC 콘솔 -> NAT 게이트웨이 -> NAT 게이트웨이 생성을 클릭합니다. 그리고 접근하려는 인스턴스가 위치한 가용영역의 public subnet을 지정하고 생성해줍니다. EIP 도 임시로 만들어주고 나중에 같이 삭제하도록 하겠습니다.

 

 

NAT 게이트웨이가 생성되었으니 Private Subnet의 라우팅 테이블에 들어가서 라우팅 편집으로 모든 트래픽에 대해서 방금 생성한 NAT  게이트웨이를 지정해줘서 인터넷 접근이 가능하도록 해줍니다.

 

 

그리고 하단의 패키지들 설치 명령어를 입력합니다.

 

Git

# 패키지 리스트 업데이트
sudo apt-get update

# Git 설치
sudo apt-get install git -y

# 설치 확인
git --version

 

Docker

# Docker 패키지 업데이트 및 설치
sudo apt-get update
sudo apt-get install docker.io -y

# Docker 서비스 활성화 및 시작
sudo systemctl enable docker
sudo systemctl start docker

# Docker 설치 확인
docker --version

 

AWS CLI

sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "/usr/local/awscliv2.zip"

sudo apt-get install unzip -y //unzip 설치 선행

unzip /usr/local/awscliv2.zip

sudo /usr/local/aws/install //pwd 활용해서 aws 파일 위치 찾아서 install 실행

aws --version

 

드디어 인스턴스 내에 관련 패키지들을 모두 설치하였습니다.

 

 

이제 CodeCommit 에 만들어둔 레파지토리의 소스코드를 가져오면 됩니다!

 

 

 

참고자료

https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-VPC-End-Point-%EA%B0%9C%EB%85%90-%EC%9B%90%EB%A6%AC-%EA%B5%AC%EC%B6%95-%EC%84%B8%ED%8C%85

 

https://minjii-ya.tistory.com/47

 

https://kimjingo.tistory.com/180

 

 

'CampusMeet' 카테고리의 다른 글

[AWS] ECR 을 활용한 Docker Image 저장  (4) 2024.10.10
[AWS] ALB 생성 및 연결  (0) 2024.10.07
[AWS] Private 인스턴스 연결  (2) 2024.10.06
[AWS] EC2 생성 및 실행  (4) 2024.09.30
[AutoScaling] 다양한 AutoScaling 전략  (0) 2024.09.19