CampusMeet

[AWS] Private 인스턴스 연결

dong_seok 2024. 10. 6. 19:41
1. SSM
2. Bastion Host

 

보안상의 이유로 인스턴스를 프라이빗 서브넷에 배치했기 때문에 외부에서 인스턴스에 쉽게 접근할 수 없습니다. 하지만 서버를 운영하려면 인스턴스에 접속이 필요하므로, 다양한 방법을 통해 프라이빗 서브넷에 위치한 인스턴스에 연결할 수 있는 방안을 살펴보겠습니다.

 

1. SSM

가장 먼저 IAM 콘솔에서 역할을 생성해줘야합니다.

 

 

권한도 추가해줍니다.

 

 

 

역할 생성을 완료했으니 Private subnet에 위치한 Ec2 에서 내가 생성한 역할을 연결 해 줍니다.

 

 

 

IAM 역할을 부여하였으니 다시 인스턴스에 접근해보도록 하겠습니다.

 

 

그런데 "SSM 에이전트가 온라인 상태가 아닙니다" 라는 경고가 나오면서 연결할 수가 없었고, Systems Manager를 사용해서 EC2 인스턴스에 접근하기 위해서는 인스턴스에 SSM Agent가 설치되어있어야합니다. 이는 Amazon Linux 에는 기본적으로 설치되어 있지만, 제가 생성한 인스턴스의 경우 Ubuntu 였기때문에 이런 상황이 발생한 것 이었습니다. 어쩔 수 없이 Bastion Host 를 통한 접속을 해보도록 하겠습니다.

 

2. Bastion Host

Bastion Host는 public subnet에 배치된 EC2 인스턴스로, 이를 통해 private subnet에 위치한 EC2 인스턴스에 접근하는 방법입니다.

저는 비용 절감을 위해 bastion server 인스턴스를 생성후 private subnet에 위치한 ec2 인스턴스에 접근한후 SSM Agent를 설치하고, bastion server 인스턴스는 다시 삭제하도록 하겠습니다.

 

SSM Agent가 설치되어있는 Amazon Linux AMI 를 선택해줍니다.

 

 

public subnet을 선택하고  내 IP 로만 접근 가능하게 새로운 보안 그룹을 생성하고 나머지는 default 로 두고 인스턴스를 생성합니다.

 

 

 

이후 ssh 접속 툴을 활용해 bastion server를 통해 private ec2에 접속하면 됩니다. 저는 mac os 라서 iterm 을 이용해서 접속해주도록 하겠습니다. 먼저 public subnet에 위치한 bastion server에 ssh 로 접속합니다. 인스턴스를 생성할때 만들었던 키 페어가 있는 위치로 가서 하단 명령어를 실행시켜주면됩니다.

 

 

bastion server에 성공적으로 접근했지만 한 가지 문제에 직면했습니다. 이제 private subnet에 위치한 ec2에 접근하기 위한 명령어를 입력해야하는데, 키 페어 정보가 bastion server에 있지 않는다는 것입니다. 그래서 다시 로컬로 빠져나와서 하단 명령어를 통해 ~/.ssh 에 위치한 키페어를 bastion server의 ~/.ssh 로 복제해 주었습니다. bastion-host-public-ip 부분만 public ip 로 변경 후 명령어를 입력해주면 됩니다.

 

scp -i ~/.ssh/ec2-server-kds-keypair.pem ~/.ssh/ec2-server-kds-keypair.pem ec2-user@<bastion-host-public-ip>:/home/ec2-user/.ssh/

 

 

이제 bastion server 에도 키페어가 생겼고 위에서 했던 것처럼 private subnet에 위치한 ec2의 ssh 접속 명령어를 활용해서 서버에 정상적으로 접근 가능한 모습을 볼 수 있었습니다.

 

 

 

이제 인스턴스 내에서 SSM Agent를 설치하고 EC2 콘솔에서 Session Manager를 사용해서 접속해보겠습니다.

 

하단 명령어를 통해 SSM Agent가 실행중인지 확인할 수 있습니다.

 

sudo snap services amazon-ssm-agent

 

 

SSM Agent가 실행중이지만 여전히 SSM 에이전트가 온라인 상태가 아니라고 경고가 나와서 찾아보니, 몇가지 추가적인 설정이 더 필요했습니다.

 

1) IAM Role 추가

기존 권한 외에도 AmazonEC2RoleforSSM 이라는 권한을 추가해줘야했습니다.

 

 

2) SSM을 위한 EndPoint 생성

아래 그림처럼 Private Subnet의 EC2에 SSM 을 통해 접속하기 위해서는 VPC에 대한 SSM EndPoint가 필요합니다.

 

  • com.amazonaws.ap-northeast-2.ssm
  • com.amazonaws.ap-northeast-2.ssmmessages
  • com.amazonaws.ap-northeast-2.ec2messages

위의 3개의 서비스를 대상으로 총 3개의 VPC 엔드포인트를 생성해줘야합니다.  보안 그룹은 VPC의 IPv4 CIDR 에 해당하는 HTTPS 프로토콜로 하나 새롭게 만들어 준후 적용시켜줬습니다.

그리고 iterm에 다시 들어가서 아래 명령어로 SSM Agent를 재시작해주었습니다.

 

sudo snap restart amazon-ssm-agent

 

 

이제 SSM 에이전트 관련 경고가 사라지고 인스턴스에 연결 가능한 모습을 볼 수 있습니다. 

 

 

글이 길어져서 Private subnet에 위치한 인스턴스에 접속하고 서버를 실행시켜보는 구체적인 과정을 다음 글에서 이어서 하도록하겠습니다 : )

 

참고자료

https://realyun99.tistory.com/entry/AWS-private-EC2%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-1

 

https://sharplee7.tistory.com/157