AWS는 아키텍처에 따라 HTTPS를 추가하는 여러 가지 방법을 제공합니다. 올바른 접근 방식은 로드 밸런서, CloudFront 또는 독립형 EC2 인스턴스 사용 여부에 따라 달라집니다.
결정 트리
ALB, NLB 또는 CloudFront를 사용 중인가요?
├── 예 → AWS Certificate Manager (ACM) 사용 — 무료, 자동 갱신
└── 아니오 (독립형 EC2)?
├── Certbot 설치 가능? → EC2에 Certbot (자동 갱신)
└── root 권한 없음 / 빠른 설정? → GetHTTPS → EC2에 수동 설치
옵션 1: AWS Certificate Manager (ACM) — 로드 밸런서 및 CloudFront용
ACM은 자동으로 갱신되는 무료 SSL 인증서를 제공합니다. AWS 서비스(ALB, NLB, CloudFront, API Gateway)에서만 작동하며 개인키를 다운로드할 수 없습니다.
인증서 요청
- 콘솔에서 AWS Certificate Manager를 엽니다
- 인증서 요청 → 퍼블릭 인증서 요청을 클릭합니다
- 도메인을 입력합니다:
example.com,*.example.com - 검증 방법 선택: DNS 검증(권장) 또는 이메일
- 요청을 클릭합니다
DNS 검증
ACM이 DNS에 추가할 CNAME 레코드를 제공합니다:
- 이름:
_xxxx.example.com - 값:
_yyyy.acm-validations.aws
DNS가 Route 53에 있다면 **“Route 53에서 레코드 생성”**을 클릭하면 ACM이 자동으로 추가합니다.
ALB에 연결
- EC2 → 로드 밸런서로 이동 → ALB를 선택합니다
- 리스너 탭 → 리스너 추가(또는 기존 리스너 편집)
- 프로토콜: HTTPS, 포트: 443
- 기본 동작: 대상 그룹으로 전달
- 기본 SSL/TLS 인증서: ACM 인증서를 선택합니다
- 저장
CloudFront에 연결
- CloudFront로 이동 → 배포를 선택합니다
- 일반 탭 → 편집
- 사용자 정의 SSL 인증서: ACM 인증서 선택 (
us-east-1에 있어야 함) - 저장
옵션 2: EC2에 Let’s Encrypt (독립형 인스턴스)
로드 밸런서 없이 단일 EC2 인스턴스를 운영하는 경우, 서버에 직접 인증서를 설치합니다.
GetHTTPS 사용 (설치 불필요)
- GetHTTPS에서 인증서를 발급받습니다
- EC2 인스턴스에 파일을 업로드합니다:
scp fullchain.pem privkey.pem ec2-user@your-ec2-ip:/etc/ssl/ - 인스턴스에서 Nginx 또는 Apache를 설정합니다
Certbot 사용 (자동 갱신)
# Amazon Linux 2023
sudo dnf install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com
# Ubuntu on EC2
sudo snap install --classic certbot
sudo certbot --nginx -d example.com
Certbot은 자동 갱신을 자동으로 설정합니다.
ACM vs Let’s Encrypt (AWS 환경)
| ACM | Let’s Encrypt (GetHTTPS/Certbot) | |
|---|---|---|
| 비용 | 무료 | 무료 |
| ALB/CloudFront 호환 | ✅ | ❌ (LE를 ACM에 쉽게 가져올 수 없음) |
| EC2 직접 사용 | ❌ | ✅ |
| 자동 갱신 | ✅ (AWS 관리) | ✅ (Certbot) 또는 수동 (GetHTTPS) |
| 개인키 접근 | ❌ (AWS가 보유) | ✅ (직접 보유) |
| 와일드카드 | ✅ | ✅ |
| AWS 외부 사용 | ❌ | ✅ (이식 가능) |
기본 원칙: ALB나 CloudFront 뒤에 있는 서비스에는 ACM을 사용합니다. 독립형 EC2 인스턴스에는 Let’s Encrypt를 사용합니다.
보안 그룹 설정
EC2 또는 ALB 보안 그룹이 포트 80과 443에서 인바운드 트래픽을 허용하는지 확인합니다:
Type Protocol Port Source
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
포트 80은 HTTP→HTTPS 리다이렉트와 Let’s Encrypt HTTP-01 챌린지에 필요합니다.
자주 묻는 질문
EC2에서 직접 ACM 인증서를 사용할 수 있나요?
아니요. ACM 인증서는 AWS 관리형 서비스(ALB, NLB, CloudFront, API Gateway)에만 연결할 수 있습니다. 개인키를 내보낼 수 없습니다. 독립형 EC2에는 GetHTTPS 또는 Certbot을 사용하세요.
Let’s Encrypt 인증서를 ACM에 가져올 수 있나요?
기술적으로는 가능합니다(aws acm import-certificate). 하지만 ACM을 통한 자동 갱신이 되지 않아 90일마다 다시 가져와야 합니다. AWS 서비스에는 ACM의 네이티브 인증서를, EC2에는 Let’s Encrypt를 사용하는 것이 더 간단합니다.
ACM 인증서는 어떤 AWS 리전에서 발급해야 하나요?
ALB/NLB의 경우: 로드 밸런서와 동일한 리전에서 인증서를 요청합니다. CloudFront의 경우: 오리진 위치와 관계없이 인증서가 반드시 us-east-1(버지니아 북부)에 있어야 합니다.
ACM은 정말 무료인가요?
네. ACM의 퍼블릭 SSL/TLS 인증서는 무료입니다. 인증서별 요금이나 갱신 비용이 없습니다. 인증서를 사용하는 AWS 리소스(ALB, CloudFront 등)에 대해서만 비용을 지불합니다.
ECS/Fargate 서비스에서 SSL을 어떻게 처리하나요?
ECS 서비스 앞에 ALB를 배치하고 ALB 리스너에 ACM 인증서를 연결합니다. ALB가 TLS를 종료하고 컨테이너에 HTTP를 전달합니다. 이것이 ECS의 표준 패턴입니다.
S3 정적 웹사이트에서 SSL을 어떻게 처리하나요?
S3 정적 웹사이트 호스팅은 사용자 정의 SSL 인증서를 직접 지원하지 않습니다. S3 앞에 CloudFront를 배치하고 CloudFront 배포에 ACM 인증서(us-east-1에서 발급)를 연결하세요.
API Gateway는 어떻게 하나요?
AWS API Gateway는 *.execute-api.region.amazonaws.com에 기본적으로 무료 SSL을 포함합니다. 사용자 정의 도메인(예: api.example.com)의 경우 ACM 인증서를 생성하고 API Gateway에서 사용자 정의 도메인 이름을 설정합니다.
AWS에서 ACM과 GetHTTPS 중 어떤 것을 사용해야 하나요?
| 시나리오 | 권장 사항 |
|---|---|
| ALB / NLB / CloudFront | ACM — 무료, 자동 갱신, 네이티브 통합 |
| 독립형 EC2 | GetHTTPS 또는 Certbot — ACM은 EC2로 키를 내보낼 수 없음 |
| ALB 뒤의 EC2 | ACM (ALB에 적용) — EC2는 자체 인증서 불필요 |
| ECS / Fargate | ACM (ALB에 적용) — 표준 패턴 |
| Lightsail | Lightsail 내장 — 무료 Let’s Encrypt 포함 |
로드 밸런서 없이 순수 EC2를 사용하는 경우, GetHTTPS가 인증서를 가장 빠르게 발급받는 방법입니다 — AWS CLI가 필요 없습니다.