AWS Session Manager로 Private EC2 접속하기
이 문서는 Production Level에서 AWS Session Manager를 사용하는 사례에 관련된 문서입니다. 글의 가독성을 개선하기 위해서 경어체를 사용하지 않고 ‘~다’로 끝나게 작성하였습니다.
개요
Bastion Host 방식의 단점 (비용)
AWS Session Manager (비용)
Bastion Host 방식의 단점 (비용)
VPC 3-Tier Architecture를 채택하면, 아래와 같은 문제가 발생한다.
Public Internet Access가 되지 않는 Private Subnet에는 어떻게 접속하나?
앞서 Unchaptered (Blog) | AWS Bastion Host로 Private EC2 접속하기에서 그 방법을 찾았지만, “Bastion Host 비용 발생” 이라는 치명적인 결함이 존재한다.
고작 Bastion Host에 고가용성, 고확장성 설계 및 구현을 할 노동력이 없다.
따라서 Bastion Host가 죽지 않도록 인스턴스를 오버프로비저닝 해야 한다.
작업자의 숫자에 따라 다르지만 최소한 t2/3.small~ t2/3.medium이 필요하다.
인스턴스 규격에 따라 다르겠지만 25~50만₩/1y 정도의 비용이 지불된다.
이 비용은 서비스의 수 & 운영망의 수와 비례하여 증가한다.
즉, 서비스 3개와 망 3개를 운영하는 순간 한달에 228~457만₩/1y 정도의 비용이 지불됩니다. 만약 팀이 더 세분화되어있다면 세분화된 갯수만큼 증가할 것이다.
개발자 한 명의 몸값을 단순한 “유지 비용”으로 지불하는 것은 합리적이지 않다.
따라서 이 금액을 절감할 수 있는 솔루션이 필요하고 그 중에 가장 효과적인 선택지가 Session Manager이다.
AWS Session Manager (비용)
AWS Session Manager는 AWS Systems Manager 하위의 서비스 중 하나이다.
이 친구의 주요 특징은 다음과 같습니다.
Bastion Host | AWS Session Manager | |
Price | Free | |
사용량 | EC2 관련된 사용량 제한를 따르지만, |
Amazon Linux 2023 기반 표준 AMI 제작
Session Manager로 EC2 Instance에 접속하기 위해서는 해당 EC2 Instance에 맞는 SSM Agent를 설치해야 합니다.
이를 하기 위해서는 크게 2가지 방식이 있습니다.
EC2 Instance 시작 시에 실행되는 메타데이터(metadata)에 설치 구문 포함하기
SSM Agent가 미리 설치되어 있는 표준 AMI 이미지 준비하기
이 중에서는 효율 및 관리 측면에서 2번이 더 좋은 선택이라고 생각합니다.
하지만 해당 과정을 수동으로 진행하면 별도의 문서를 남겨야하고 변경 추적이 되지 않습니다.
따라서 HashiCorp 사의 Packer를 이용해서 표준 AMI를 준비할 수 있습니다.
Packer 준비하기
brew install packer
ami.pkr.hcl 파일 생성하기
공식 Amazon Linux 2023을 이용해서 SSM Agent를 설치하는 구문이 포함된 코드입니다.packer { required_plugins { amazon = { source = "github.com/hashicorp/amazon" version = "~> 1" } } } source "amazon-ebs" "spec" { region = "ap-northeast-2" profile = "standard_iam_user" ami_name = "standard_ami" ssh_username = "ec2-user" instance_type = "t2.micro" tags = { Name = "standard_iam_user" } source_ami_filter { filters = { image-id = "ami-00ff737803101edd1" root-device-type = "ebs" virtualization-type = "hvn" } owners = ["137112412989"] most_recent = true } } build { name = "standard_ami" sources = ["source.amazon-ebs.spec"] # https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/agent-install-al2.html provisioner "shell" { "sudo yum update", "sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm", "sudo systemctl status amazon-ssm-agent | grep -e 'inactive (dead)' || sudo systemctl start amazon-ssm-agent" } }
Packer 모듈 다운로드하기
packer init .
Packer Validate 하기
packer validate .
Packer Build 하기
packer build .
Session Manager 사용을 위한 IAM User 생성하기
아래와 같은 IAM User Inline Policy를 가지고 있는 IAM User를 생성해주세요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession",
"ssm:DescribeSessions",
"ssm:GetSession",
"ssm:TerminateSession"
],
"Resource": "arn:aws:ssm:*:*:session/*"
},
{
"Effect": "Allow",
"Action": [
"ssm:SendCommand",
"ssm:ListCommands",
"ssm:ListCommandInvocations",
"ssm:CancelCommand"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "*"
}
]
}
그리고 해당 IAM User의 CLI Credentials을 발급받아주세요.
이후 아래 명령어를 통해서 CLI Credentials의 ACCESS_KEY, SECRET_ACCESS_KEY를 등록해주세요.
aws configure # default profile
aws configure --profile <profile-name> # custom profile
Session Manager로 EC2 접속하기
Packer로 AMI를 생성하였다면,
해당 AMI id를 베이스 이미지로 하는 EC2 Instance를 실행해주세요.
이후, EC2 Instance Id가 할당되면 아래의 명령어로 접속할 수 있습니다.
aws ssm start-session --target <EC2-Instance-Id>