동적인 EC2 Instance 접속을 위한 SSH Config

작년까지 Snowflakes Server 패턴을 사용하다가 올해 초 Phoenix Server 패턴으로 변경하게 되었습니다.
작업 후 새로 배포되는 서버들이 매우 안정적으로 생성되는 걸 확인하고 야호를 외쳤으나... 새로 생성된 서버에 SSH 접속때 마다 매번 IP가 다르니 불편함이 이만저만이 아니었습니다.

그 와중에 Bastion 서버도 통해서 접속해야 했기에 매번 만들어둔 긴 SSH Command 수정하기도 매우 번거로운 것..!

그렇다고 SSH Config를 만들어놔도 새 서버를 만들 때마다 SSH 접속 정보를 변경해 줄 수도 없는 노릇이고 말이죠..!

비슷한 문제를 가지고 계신 분들이 분명 있을거라고 생각해 글을 쓰게 되었습니다.

아래와 같거나 비슷한 환경이신 분들을 위한 SSH 접속 팁입니다.

  • Phoenix Server Pattern을 사용한다. (서버 배포마다 IP가 변경된다)
  • 보안을 위해서 SSH 접속 시 Bastion 서버를 사용한다.
  • 여러 AWS Region을 사용한다.

사용 방법

  1. 아래와 같은 ssh-config 파일을 ~/.ssh 폴더가 아닌 별도의 폴더에 생성해 줍니다.
    [Bastion 서버 host name]와 [ssh-config 파일 절대 경로] 값을 자신의 환경에 맞게 대체해 주세요.
Host bastion-canada User ubuntu Hostname [Bastion 서버 host name] IdentityFile ~/.ssh/bastion-canada.key Host *.ca-central-1.compute.amazonaws.com User ubuntu ProxyCommand ssh -F [ssh-config 파일 절대 경로] bastion-canada -W %h:%p StrictHostKeyChecking no Host bastion-us User ec2-user Hostname [Bastion 서버 host name] IdentityFile ~/.ssh/bastion-us.key Host *.compute-1.amazonaws.com User ubuntu ProxyCommand ssh -F [ssh-config 파일 절대 경로] bastion-us -W %h:%p StrictHostKeyChecking no
  1. 아래 Command로 접속 할 수 있습니다.
ssh -F ssh-config -i [pem file name] [ec2hostname].ca-central-1.compute.amazonaws.com

추가 1)
ssh-config 파일이 있는 폴더로 이동 후, ec2 host name만 변경해 주시면 됩니다.
pem file name의 경우 접속할 서비스 종류가 여러 개인 제 입장에서는 필요하지만, 여러 서버의 접속할 필요가 없다면 ssh-config에 pem정보 추가해 주고 사용하시면 더 짧은 Command로 간단하게 ssh 사용하실 수 있습니다.

추가 2)
제 경우 bastion을 사용하지 않는 서버도 고려해서 ssh-config를 별도의 폴더로 옮겨놓았지만, 만약 회사용으로 완전 개발환경을 분리해서 사용하신다면 그럴 필요가 없을 거라고 생각이 듭니다.
그럴 때는 ssh-config 파일을 ~/.ssh/config로 생성해주시면 됩니다.

결국 추가 1, 2를 적용하면 아래와 같은 Command로 Bastion을 통한 ssh 접속이 가능하겠네요.

ssh [ec2hostname]

추가 팁

여러 서버에 접속한 이후, 예를 들면 10개의 서버에 접속 후 로그를 확인한다면 10개 서버 각각 따로 커맨드를 입력해줘야 하지만 더 간단한 방법이 있습니다.
바로 Iterm2를 사용하는 것..!

저도 최근에 안 사실이지만 Iterm2 자체에서 Broad casting input이라는 기능을 제공하고 있습니다.

먼저 원하는 만큼 Split tab을 생성해 줍니다. 단축키는 CMD+D or CMD+SHIFT+D

이후 CMD + OPTION + I를 눌러주시면 열려있는 전체 패널에 대한 Broad Casting Input 기능이 동작합니다.


마치며

제목이 말이죠 이게 참... 동적 관리 서버? 동적 생성 인스턴스? 흠 저걸 뭐라고 명명해야 잘 했다고 소문이 날까요... 애매하네요

동적생성되는 인스턴스에 대한 SSH 접속 방법으로 이보다 더 좋은 방법이 떠오르지 않아 근 6개월 동안 이 방법을 고수해오고 있습니다.
더 좋은 방법이 있다면 알려주시면 감사하겠습니다!

참고

An SSH tip for modern AWS patrons - David Winterbottom