개발/cloud, server, network

[aws] 탄력적 ip 없이 ssh 접근시 명령어 고정하기

prpn97 2025. 5. 14. 10:03

발단

토이프로젝트를 진행하면서 aws 예산 임계치를 벗어나는 값을 확인하게 되었다. 


$0.00 per In-use public IPv4 address per hour for EC2 Free Tier
153.497 Hrs
USD 0.00
$0.00 per In-use public IPv4 address per hour for EC2 Free Tier
151.514 Hrs
USD 0.00
$0.005 per Idle public IPv4 address per hour
0.075 Hrs
USD 0.00
$0.005 per In-use public IPv4 address per hour
552.658 Hrs
USD 2.76

 

per In-use public IPv4 address per hour 라는 동일한 항목에서 EC2 Free Tier 에 대해서는 청구되지 않았지만, 그 외에는 청구가 되었다. 내가 알기론 750시간까지가 ec2 프리티어 요금정책으로 알고 있는데, 약 150시간 정도가 측정된 이후에 왜 0.005달러씩 청구되도록 측정된건지.. 

 

확인해보니, 2024년 2월 1일부터 서비스 연결 여부에 관계없이 모든 탄력적 IP 주소(IPv4)에 대해 시간당 $0.005의 요금이 부과된다고 한다. 

 

그런데 탄력적 ip를 통해 접근 주소를 고정하지 않으면 매번 주소가 달라지기 때문에 상당히 번거로움이 생길 것으로 예상된다. 이 부분을 간편하게 해결해보고자 한다.

 

 

과정

쉘스크립트를 통해 ssh에 접근할 때 항상 동일한 명령어를 통해 접근하도록 세팅하려 한다.

방법은 간단하다. 

1. aws 계정 세팅  

- aws iam에서 pem, key id, secret key를 생성해야 한다. 

2. 쉘스크립트를 통해 aws 계정으로 인스턴스 정보 확인

- 인스턴스 정보에 접근할 수 있는 ip주소를 확인하고 ssh접근한다.

 

- 먼저 aws configure 세팅이 되어있어야 한다. 

// 현재 세팅된 정보 확인
cat ~/.aws/credentials

[default]
aws_access_key_id = AKIAxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[내가 별도로 세팅한 AWS_PROFILE]
aws_access_key_id = AKIAyyyyyyyyyyyyyyy
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy


// aws 계정 세팅
nano ~/.aws/credentials

편집기를 통해 []에 내가 바로 이해하기 쉬운 프로필명을 입력하고 key id, secret key를 입력한다. 

 

 

- 준비가 되었다면, 이제 접근하면 된다. 

쉘스크립트는 다음과 같이 작성했다. 

접근할 때에는 작성한 쉘 스크립트의 경로, 인스턴스명, pem파일경로, ssh접근유저이름(처음 default로는 amazon linux라면 ec2-user, ubuntu라면 ubuntu 로 세팅되어있을 것이다. ), credentials에 입력한 aws 프로필명을 알고있어야 한다. 

#!/bin/bash

# 사용법: ./ec2-ssh.sh <INSTANCE_NAME> <KEY_PATH> [SSH_USER] [AWS_PROFILE]
# 예시: ./쉘스크립트경로.sh 인스턴스명 ./pem파일경로.pem ubuntu 프로필명

INSTANCE_NAME=$1
KEY_PATH=$2
SSH_USER=${3:-ec2-user}
AWS_PROFILE=${4:-default}

if [[ -z "$INSTANCE_NAME" || -z "$KEY_PATH" ]]; then
  echo "Usage: $0 <INSTANCE_NAME> <KEY_PATH> [SSH_USER] [AWS_PROFILE]"
  exit 1
fi

echo "🔍 Fetching public IP for instance with tag Name=$INSTANCE_NAME using profile $AWS_PROFILE..."

PUBLIC_IP=$(aws ec2 describe-instances \
  --profile "$AWS_PROFILE" \
  --region ap-northeast-2 \
  --filters "Name=tag:Name,Values=$INSTANCE_NAME" "Name=instance-state-name,Values=running" \
  --query "Reservations[*].Instances[*].PublicIpAddress" \
  --output text)


if [[ -z "$PUBLIC_IP" ]]; then
  echo "❌ 인스턴스가 확인되지 않음"
  exit 1
fi

echo "✅ Found IP: $PUBLIC_IP"
echo "🚀 SSH 접근 시도..."
ssh -i "$KEY_PATH" "$SSH_USER@$PUBLIC_IP"

 

코멘트

당연하다는듯이 탄력적 ip세팅했다가 큰 금액은 아니지만 과금이 되었다. 생각해보면 aws에서 ip를 무료로 제공했던 것 자체가 너무 감사한거지,, 그렇지만 ip고정하지 않아도 불편하지 않도록 미리 잘 세팅해두면 번거로움은 없을 것 같다. (cicd에 대해서는 더 추가해야 할 것들이 생기긴 하겠지만,,)

 

aws에서 제공하는 cli를 통해 무궁무진하게 기능들을 확장할 수 있는 것 같다. 불편한 점이 생긴다면 그대로 불편을 누르기보다 해결하려고 기울여보아야겠다.

728x90