AWS

Session Manager를 통해 EC2 인스턴스 접속하기(feat. CentOS)

JAEJUNG 2022. 9. 14. 12:23

Private Subnet에 위치한 EC2 서버에 접속하는 방법은 크게 두 가지가 있습니다.

1. Public Subnet에 Bastion을 두고 SSH 터널링으로 접속하는 법

2. AWS Session Manager를 활용하는 법

 

Bastion host를 두면 아래와 같은 장점이 있습니다.

1. AWS 웹 콘솔 접속 없이 cli로 프라이빗 서버 액세스 가능

2. 방화벽 설계를 단순화할 수 있음

 

그러나, Bastion 서버를 직접 구성해야 하고, 서버 비용과 key 파일을 관리해야 한다는 수고로움이 발생합니다.

 

Session Manager를 사용하면 위와 같은 작업이 불필요하게 됩니다.

Session Manager(이하 SSM)는 AWS 웹 콘솔 내 브라우저 기반의 Shell, CLI를 제공하여 Private Subnet에 위치한 서버에 액세스할 수 있는 완전관리형 서비스입니다.

 

SSM Agent가 이미 설치돼있는 서버는 아래와 같습니다.(자세한 링크는 여기)

  • Amazon Linux Base AMIs dated 2017.09 and later
  • Amazon Linux 2
  • Amazon Linux 2 ECS-Optimized Base AMIs
  • macOS 10.14.x (Mojave), 10.15.x (Catalina), and 11.x (Big Sur)
  • SUSE Linux Enterprise Server (SLES) 12 and 15
  • Ubuntu Server 16.04, 18.04, and 20.04
  • Windows Server 2008-2012 R2 AMIs published in November 2016 or later
  • Windows Server 2016, 2019, and 2022

 

타 AMI를 이용해 서버를 구성하면 수동으로 SSM Agent를 설치해주어야 합니다.

(공식 문서는 여기)

 

본 포스팅에선 CentOS 8을 기준으로 작성되었으며, 기본적인 인프라 구성이 완료되었다는 가정 하에 진행됩니다.

 

VPC 내 DNS 설정 변경

사용 중인 VPC를 클릭한 후 [Edit DNS hostnames]를 클릭해줍니다.

 

아래와 같이 [Enable]을 클릭한 후 변경사항을 저장해줍니다.

해당 옵션은 인스턴스의 public 혹은 private IP에 해당하는 DNS 주소를 제공해줍니다.

 

IAM Role 부여

Session Manger를 통해 접속할 인스턴스에는 SSM 서비스에 대한 액세스 권한이 존재해야 합니다.

먼저 "AmazonEC2RoleforSSM" 권한이 부여된 Role을 하나 생성해줍니다.

 

인스턴스에 IAM Role을 부여해줍니다.

 

[Connect]를 클릭하면 아래와 같이 4가지 방법을 통해 EC2 인스턴스에 접속이 가능합니다.

그 중 Session Manager를 클릭하면 아래와 같이 Connect 버튼이 비활성화되어 있는 것을 볼 수 있습니다.

 

SSM을 통한 접속이 불가능할 때 체크해야할 것은 크게 세 가지가 있습니다.

1. VPC의 DNS hostnames가 활성화되어 있는지

2. 적절한 권한이 할당된 IAM Role이 부여돼있는지

3. SSM Agent가 설치돼있는지

 

SSM Agent 동작 확인

1, 2번 항목은 조금 전에 설정을 완료했으므로 직접 서버에 접속해서 ssm agent가 동작 중인지 확인해보겠습니다.

(인스턴스에 eip 할당, rt에서 igw 추가)

 

확인 명령어는 아래와 같으며, ssm agent가 preinstalled 되지 않은 AMI이기 때문에 현재 동작 중인 서비스가 없다고 표시됨을 알 수 있습니다.

[centos@ip-10-0-10-155 ~]$ sudo systemctl status amazon-ssm-agent
Unit amazon-ssm-agent.service could not be found.

 

SSM Agent 설치

해당 인스턴스는 CentOS 8 버전이므로 AWS docs에서 제공하는 방법을 통해 agent 설치를 진행해줍니다.

[centos@ip-10-0-10-155 ~]$ sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
CentOS-8 - AppStream                            105  B/s |  38  B     00:00
Error: Failed to download metadata for repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

*CentOS 7은 아래 명령어로 설치 진행

sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

 

명령어를 입력하면 위와 같이 Failed to download 에러가 발생합니다.

에러 로그를 확인해보면 No URLs in mirrorlist ~라고 표시되는 것을 확인할 수 있으며, 본 포스팅을 작성하게 된 이유이기도 합니다.

 

CentOS 8이 2021.12.31부로 EOS됨에 따라 CentOS Mirror site가 vault로 전환되었습니다.

mirror site는 네트워크 트래픽을 줄이기 위해 다른 서버로 파일을 복사해놓은 웹사이트 즉 파일 서버이며, mirror list는 이러한 mirror site를 모아놓은 list라고 보면 됩니다.

패키지를 다운로드 받을 서버를 찾지 못해서 발생하는 오류로, 아래 명령어를 통해 mirror site를 valut로 전환하면 이를 해결할 수 있습니다.

sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sudo sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*

 

다시 명령어를 입력하여 설치를 완료해줍니다.

[centos@ip-10-0-10-155 ~]$ sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
CentOS-8 - AppStream                                            16 MB/s | 8.4 MB     00:00
...
...
Installed:
  amazon-ssm-agent-3.1.1767.0-1.x86_64

Complete!

 

ssm agent 서비스를 확인해보면 정상적으로 active 상태인 것을 확인할 수 있습니다.

[centos@ip-10-0-10-155 ~]$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
   Loaded: loaded (/etc/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: disab>
   Active: active (running) since Wed 2022-09-14 02:19:45 UTC; 20s ago

 

모든 설정을 마쳤으며, Session Manager 접속이 활성화된 것을 확인할 수 있습니다.

 

이상으로 설명을 마치며, 틀린 부분이 있다면 언제든지 피드백 부탁드립니다.

감사합니다.