AWS Systems Manager에 등록된 관리형 인스턴스는 EC2의 관리를 매우 용이하게 해주고 있습니다. SSH 세션을 관리하는 세션 매니저는 IAM 기반으로 SSH 접근 제어가 가능하고 AWS CLI를 이용하여 로컬 호스트에서도 손쉽게, 안전하게 사용이 가능하다는 장점이 있습니다. 물론 플러그인의 설치가 요구되기는 합니다.

AWS CLI의 한계

AWS CLI는 AWS에서 제공하는 SDK 기능을 단순히 CLI 환경으로 제공할 뿐이라서 기능 자체가 사용자 친화적이지는 않습니다. 예를 들어, 특정한 인스턴스에 신규 세션을 열고자 한다면 다음과 같은 명령을 사용해야 합니다.

aws ssm start-session --target <instance-id>
Code language: Bash (bash)

인스턴스의 아이피를 기억하고 SSH 세션을 여는 것도 어려운 마당에, 인스턴스 아이디를 외우기란 쉽지 않습니다. 그래서 인스턴스의 Name 태그를 이용하는 방법도 고민해보지만, 명령이 너무 장황합니다.

aws ssm start-session --target $(aws ec2 describe-instances --filter "Name=tag:Name,Values=instance-name" | jq -r '.Reservations[].Instances[].InstanceId')
Code language: Bash (bash)

이렇게 직접 기억하고 명령을 입력하는 것은 어렵기 때문에, 시스템적으로 인스턴스의 이름과 아이디를 보여주고 내가 선택할 수 있으면 어떨까? 라는 생각을 하고 있었는데 실제로 그런 보조 프로그램이 존재한다는 것을 알았습니다.

gossm

이 프로그램의 이름은 gossm이라고 합니다. golang으로 개발되었고 session-manager-plugin을 별도 설치할 필요 없이 프로그램에서 자동으로 다운로드하여 제공하기 때문에 의존성 없이 독립적으로 동작합니다. 와챠의 개발자 한 분이 오픈소스로 개발하였는데, 저도 개인적으로 Fork하여 제가 원하는대로 고쳐서 사용하고 있습니다. 이 툴의 제일 큰 장점은 바로 Interactive CLI입니다.

관리형 인스턴스의 목록을 띄워주며, 여기에서 원하는 인스턴스를 검색하여 선택하면 손쉽게 SSH 연결을 제공합니다. 아직 기능 일부에 버그가 있기는 하지만, 점점 고도화 되어가고 있어서, 추후에 개별 사용자별로 로그인이 가능한 계정을 별도로 지정해준다면 EC2에 대한 접근제어 툴로써도 사용이 가능하지 않을까 싶습니다.

부가 기능으로 ssh와 scpcmd 기능을 제공하고 있습니다. 세션 메니저 자체는 Private key를 사용하지 않는데, 부가 기능을 사용하기 위해서는 EC2의 Private Key를 이용해야 합니다. 그리고 세션 메니저는 별도로 22번 SSH 포트를 열어줄 필요가 없습니다. 여러 환경에서 작업을 해야하는 경우에는 AWS의 Credential Profile을 지정해주거나 Credential 자체를 환경 변수로 제공하면 바로 읽어서 동작합니다.

CloudShell

최근에 AWS에서 CloudShell 서비스를 발표하였고 서울 리전에도 도입되기를 기다리고 있는 중입니다. CloudShell은 콘솔 계정의 권한을 그대로 위임받기 때문에 별도로 Credential을 설정할 필요가 없습니다. 여기서 gossm을 사용하는 모습을 상상해보면 너무나 편리할 것 같습니다. 그래서 제가 생각하기에 gossm은 CloudShell에 올려야 할 1순위 프로그램이 아닌가 싶습니다. 👍