Journey to Security/클라우드

[AWS] 웹 애플리케이션 배포를 위한 EC2 인스턴스 생성

Cordilog 2026. 7. 6. 19:33

이번에는 지난 실습에서 구성한 VPC 위에 실제 애플리케이션이 올라갈 EC2 인스턴스를 생성한다.

1. AMI 선택 — 개발 환경과 동일한 OS 이미지 확보

EC2 인스턴스의 OS 이미지(AMI)를 고를 때 가장 중요한 기준은 앱이 실제로 검증된 환경과 동일한 이미지를 사용하는 것이다.

이번에 배포할 IntraPortal 앱의 개발·테스트 환경은 Ubuntu 26.04 LTS (Resolute Raccoon)에서 구동 중이며, setup.sh와 OS 하드닝 스크립트도 모두 26.04에서 검증된 상태이다.

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 26.04 LTS"
VERSION="26.04 LTS (Resolute Raccoon)"

 

개발 환경이 Ubuntu인데 EC2를 Amazon Linux로 생성하면, 패키지 매니저(apt vs yum/dnf)부터 디렉터리 구조, 기본 사용자(ubuntu vs ec2-user)까지 달라진다.

이런 차이는 배포 스크립트 실행 시점에서 예상치 못한 오류로 이어질 수 있으므로, 개발·테스트 환경과 동일한 AMI를 선택하는 것이 원칙이다.

2. EC2 인스턴스 생성

1️⃣ 콘솔

  1. EC2 대시보드 → 인스턴스 → "인스턴스 시작" 클릭
  2. 이름 및 태그: securedeploy-ec2 입력
  3. AMI 선택: Quick Start → Ubuntu → Ubuntu Server 26.04 LTS 선택 ("프리 티어 사용 가능" 확인)
  4. 인스턴스 유형: t3.micro 선택 ("프리 티어 사용 가능" 배지 확인)
  5. 키 페어: securedeploy-key (기존에 생성한 키 페어 선택)
  6. 네트워크 설정:
    • VPC: vpc-088d45110c971b59e (securedeploy-vpc)
    • 서브넷: subnet-0111e6f2c209a6cb3 (securedeploy-public-subnet)
    • 퍼블릭 IP 자동 할당: 활성화
    • 방화벽: 기존 보안 그룹 선택 → Web-SG (sg-06737bff2fa8471fc)
  7. 스토리지: 8 GiB, gp3, 종료 시 삭제: 예
  8. 파일 시스템: 없음 (S3/EFS/FSx 불필요)
  9. 고급 세부 정보: 기본값 유지 (메타데이터 버전 V2, 홉 제한 2)
  10. 요약 확인: 인스턴스 개수 1 확인 → "인스턴스 시작" 클릭

2️⃣ CLI

위와 같은 구성을 AWS CLI로 실행할 수 있다.

콘솔 절차와 1:1로 대응되므로, 어떤 방법으로든 동일한 결과를 얻는다.

aws ec2 run-instances \
  --image-id <AMI_ID> \
  --instance-type t3.micro \
  --key-name securedeploy-key \
  --subnet-id <SUBNET_ID> \
  --security-group-ids <SG_ID> \
  --associate-public-ip-address \
  --block-device-mappings '[{
    "DeviceName": "/dev/sda1",
    "Ebs": {
      "VolumeSize": 8,
      "VolumeType": "gp3",
      "DeleteOnTermination": true
    }
  }]' \
  --metadata-options "HttpTokens=required,HttpEndpoint=enabled,HttpPutResponseHopLimit=2" \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=securedeploy-ec2}]' \
  --count 1 \
  --region ap-northeast-2
콘솔 항목 설정 값 CLI 옵션
이름 securedeploy-ec2 --tag-specifications '...Value=securedeploy-ec2...'
AMI Ubuntu 26.04 LTS --image-id <AMI_ID>
인스턴스 유형 t3.micro --instance-type t3.micro
키 페어 securedeploy-key --key-name securedeploy-key
서브넷 securedeploy-public-subnet --subnet-id <SUBNET_ID>
퍼블릭 IP 자동 할당 활성화 --associate-public-ip-address
보안 그룹 Web-SG --security-group-ids <SG_ID>
스토리지 8 GiB, gp3 --block-device-mappings '[{...}]'
종료 시 삭제 "DeleteOnTermination": true
메타데이터 버전 V2만 (토큰 필수) --metadata-options "HttpTokens=required,..."
응답 홉 제한 2 "HttpPutResponseHopLimit=2"
개수 1 --count 1
리전 서울 --region ap-northeast-2

3. 인스턴스 상태 확인

생성 후 인스턴스 상태를 CLI로 확인한다.

aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=securedeploy-ec2" \
  --query "Reservations[].Instances[].{
    Name: Tags[?Key=='Name']|[0].Value,
    InstanceId: InstanceId,
    State: State.Name,
    Type: InstanceType,
    PublicIP: PublicIpAddress,
    AZ: Placement.AvailabilityZone
  }" \
  --output table \
  --region ap-northeast-2

 

Staterunning이고 PublicIP가 할당된 것을 확인할 수 있다.

이 IP로 SSH 접속이 가능하며, Web-SG(보안 그룹)SSH(22번 포트) 인바운드 룰이 설정되어 있어야 접속할 수 있다.

 

콘솔에서도 인스턴스가 생성되어 실행중인 것을 확인할 수 있다. 

 

4. 크레딧 소모 예측

새 프리 티어(Free Plan) 기준으로, 가입 시 $100 크레딧이 즉시 지급되며, Explore AWS 위젯에서 특정 활동(EC2 생성, Budget 설정 등)을 완료하면 최대 $100이 추가로 지급되어 총 $200까지 확보할 수 있다.

현재 크레딧 $100 기준으로 이 인스턴스를 상시 가동했을 때의 예상 비용은 다음과 같다.

항목 시간당 하루(24H) 2주 상시 가동
EC2 t3.micro $0.013 $0.31 $4.37
EBS 8 GiB gp3 ~$0.00088 $0.02 $0.30
합계 ~$0.014 ~$0.33 ~$4.67

현재 크레딧 $100 대비 2주 최대 ~$4.67이므로 충분한 여유가 있다.

Free Plan에서는 크레딧이 소진되면 서비스가 자동 정지되므로, 의도치 않은 과금은 구조적으로 발생하지 않는다.

 

5. 전체 구조

지난 번 구성한 securedeploy-vpc(10.0.0.0/16) 안의 퍼블릭 서브넷(10.0.1.0/24)에 EC2 인스턴스가 배치된다. 인터넷 게이트웨이를 통해 외부에서 접근 가능하며, Web-SG 보안 그룹이 인바운드·아웃바운드 트래픽을 제어한다.

 

퍼블릭 IP는 자동 할당(Elastic IP가 아님)이므로, 인스턴스를 중지했다가 다시 시작하면 IP가 변경될 수 있다는 점에 유의한다. Elastic IP를 할당하면 고정 IP를 유지할 수 있지만, 인스턴스에 연결되지 않은 상태의 Elastic IP는 시간당 $0.005(월 약 $3.60)가 부과되므로 실습용으로는 자동 할당으로 충분하다.