AWS에서 EC2 인스턴스를 처음 생성할 때,
항상 따라오는 개념이 바로 보안그룹(Security Group) 입니다.
하지만 많은 사람들이 헷갈리는 부분이 있죠.
“default 보안그룹이 있는데, 왜 내가 건드린 launch-wizard-1만 적용될까?”
그리고 AWS에서 EC2를 처음 배포할 때 가장 많이 겪는 문제가 바로 이겁니다.
“Nginx까지 설치했는데 http://<EC2 퍼블릭 IP> 접속이 안 돼요!”
저도 이번에 웹서버 구축 프로젝트를 EC2에 직접 배포하면서
이 문제를 정확히 겪었고, 결국 원인과 구조를 이해하게 됐습니다.
이 글에서는
✅ 보안그룹의 기본 원리
✅ default vs launch-wizard 차이
✅ 제가 겪은 실제 트러블슈팅 과정
위 3가지를 정리해보겠습니다.
AWS의 보안그룹은 EC2 인스턴스 단위의 방화벽입니다.
즉, “이 인스턴스가 어떤 트래픽을 주고받을 수 있는가?”를 결정합니다.
인바운드(Inbound) → 외부 → EC2 (예: 브라우저 접근, SSH 연결)
아웃바운드(Outbound) → EC2 → 외부 (예: apt install, API 요청 등)
보안그룹이 허용하지 않은 트래픽은,
서버에서 Nginx가 잘 돌아가도 외부에서 절대 접근할 수 없습니다.
AWS는 EC2를 생성할 때 자동으로 하나의 보안그룹을 연결합니다.
이때 어떤 그룹이 연결되는지는 EC2 생성 시 옵션에 따라 달라집니다.
| 생성 시 선택 옵션 | 결과 | 설명 |
|---|---|---|
| “새 보안 그룹 생성(Create new security group)” | launch-wizard-1 자동 생성 | EC2 마법사에서 새 그룹이 자동 생성되어 연결됨 |
“기존 보안 그룹 선택(Select existing security group)” → default 선택 | default 그룹 사용 | 기존 default 그룹을 그대로 재사용 |
| AMI 복제 | 원본의 보안그룹 그대로 유지 | launch-wizard 또는 custom 그룹 그대로 복사 |
| 구분 | default 보안그룹 | launch-wizard 보안그룹 |
|---|---|---|
| 생성 시점 | VPC 생성 시 자동 생성 | EC2 생성 시 자동 생성 |
| 기본 규칙 | 내부 통신만 허용, 외부 차단 | 생성 시 선택한 포트(22, 80 등) 허용 |
| 인스턴스 연결 여부 | ❌ 기본적으로 연결 안 됨 | ✅ EC2 생성 시 자동 연결 |
| 주요 용도 | 내부 DB 통신, 내부 테스트용 | 실제 서비스용 (웹서버, API 서버 등) |
| 이름 변경 | 불가능 | 가능 (예: web-prod-sg) |
| 흔한 실수 | default에 포트 열었는데 인스턴스는 launch-wizard에 연결됨 | ※ 가장 흔한 문제! |
AWS EC2 인스턴스에 Nginx를 설치하고
sudo systemctl status nginx로 확인해보면 active (running) 상태.
포트도 0.0.0.0:80으로 잘 열려 있음.
그런데도 브라우저에서 http://<퍼블릭 IP> 접속 시 아무 응답이 없음.
ssh -i "gangwonfocus-key.pem" ubuntu@<Public IP>
curl http://localhost # 정상 동작
즉, 서버 내부에서는 잘 뜨는데 외부에서는 접속 불가 상태였습니다.
AWS 보안그룹 인바운드 규칙을 확인했는데,
HTTP(80), HTTPS(443), SSH(22)가 모두 허용돼 있었음.
그래서 처음엔 "보안그룹 문제는 아니다"라고 착각.
하지만 인스턴스 상세 탭을 다시 보니,
실제로 적용된 보안그룹 이름이 launch-wizard-1 이었습니다.
그런데 내가 설정했던 규칙은 default 보안그룹이었습니다.
즉, 규칙은 default에 추가했지만,
EC2는 launch-wizard-1을 사용 중이라서
실제로는 아무 트래픽도 허용되지 않았던 것!
EC2 → 보안 탭 → launch-wizard-1 클릭

인바운드 규칙에 다음 항목 추가
| 유형(Type) | 프로토콜 | 포트 | 소스(Source) |
|---|---|---|---|
| HTTP | TCP | 80 | 0.0.0.0/0 |
| HTTPS | TCP | 443 | 0.0.0.0/0 |
| SSH | TCP | 22 | 0.0.0.0/0 |


EC2 인스턴스가 어떤 보안그룹에 연결되어 있는지 항상 확인할 것.
규칙을 잘못된 그룹(default 등)에 추가해봤자 아무 효과 없음.
보안그룹 이름이 launch-wizard-1, launch-wizard-2 처럼 자동 생성될 수 있으니 의미 있는 이름으로 바꿔두면 헷갈리지 않는다.
보안그룹 이름은 서비스별로 명확하게 바꿔주자!
예시:
| 이전 이름 | 새 이름 | 용도 |
|---|---|---|
| launch-wizard-1 | webserver-sg | React + Nginx 서버용 |
| launch-wizard-2 | springboot-api-sg | Spring Boot API 서버용 |
| launch-wizard-3 | rds-db-sg | MySQL 접근 전용 |
이름만 봐도 역할이 드러나게 하면,
나중에 CI/CD, RDS 연결, HTTPS 설정할 때 훨씬 깔끔하게 관리됩니다.
결론
AWS EC2 생성 시 자동 연결되는 보안그룹은 대부분 launch-wizard-#
default는 내부 통신용이며 외부 접근 불가
포트(80, 22, 443 등) 허용은 EC2가 실제로 연결된 보안그룹에 해야 함
보안그룹을 잘못 설정해도 AWS는 별다른 에러를 주지 않기 때문에,
접속 불가 문제 발생 시 항상 “인스턴스 → 보안 탭 → 실제 그룹 이름”부터 확인!