5. cli 설치
# cli 설치
brew install awsebcli
brew install awscli
# aws configure
aws configure
# accessKeyID 및 secretAccessKey는 IAM 생성시 받은 것
# 리전은 ap-northeast-2
# Default output format: json 입력
# eb cli 초기화
eb init
# 리전은 ap-northeast-2 (10)
# accessKeyID 및 secretAccessKey는 IAM 생성시 받은 것
# CodeCommit no 선택
# eb ssh 연결 셋업
eb ssh --setup
# keypair: new keypair 선택
# 이름 정하고 새로 생성 과정 진행
# 이제 eb ssh 로 접속 가능
eb ssh
6. https 설정
맨 처음 배포 시에는 SSL 인증서를 발급받고 관련 파일(/etc/letsencrypt/live/...
)을 생성하는 과정이 필요합니다. 아래는 이 전체 과정을 처음부터 끝까지 정리한 가이드입니다.
1. 도메인 및 DNS 설정
- GoDaddy에서 도메인 설정:
도메인
에 대해 다음을 설정합니다:- Type:
A
- Name:
api
- Value: Elastic Beanstalk 인스턴스 퍼블릭 IP
- TTL: 기본값(1시간)
- Type:
- DNS 전파 확인:Elastic Beanstalk의 퍼블릭 IP가 반환되어야 합니다.
nslookup 도메인
2. 첫 배포
애플리케이션 배포:
- 애플리케이션 소스 준비:
.ebextensions
폴더를 포함하여 애플리케이션을 준비합니다. 첫 배포 시에는 SSL 관련 설정을 제외합니다. - GitHub Actions를 통해 Elastic Beanstalk에 배포: 기존 GitHub Actions 워크플로를 사용하여 소스를 배포합니다.
3. 서버에서 Let's Encrypt로 SSL 인증서 발급
Elastic Beanstalk에 배포된 애플리케이션에서 SSL 인증서를 발급받습니다.
SSH로 서버 접속:
eb ssh
Certbot 설치:
sudo yum install -y certbot
Nginx에 기본 설정 추가 (임시 설정): /etc/nginx/conf.d/https_custom.conf
파일을 생성하고 아래 내용을 추가합니다:
server {
listen 80;
server_name 도메인;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
}
sudo nano /etc/nginx/conf.d/https_custom.conf
Nginx 재시작:
sudo service nginx restart
SSL 인증서 발급:인증서가 성공적으로 발급되면 /etc/letsencrypt/live/도메인/
경로에 인증서 파일들이 생성됩니다.
sudo certbot certonly --webroot -w /var/www/html -d api.pagebrothers.work
4. HTTPS 적용
Nginx 설정 수정: /etc/nginx/conf.d/https_custom.conf
를 수정하여 HTTPS를 적용합니다:
server {
listen 443 ssl;
server_name 도메인;
ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem; \
location / {
proxy_pass http://127.0.0.1:8080; # 애플리케이션 내부 포트
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sudo nano /etc/nginx/conf.d/https_custom.conf
Nginx 설정 테스트 및 재시작:
sudo nginx -t
sudo service nginx restart
브라우저로 HTTPS 테스트: https://도메인
에 접속하여 HTTPS가 정상적으로 작동하는지 확인합니다.
5. .ebextensions
에 설정 추가
이제 SSL 인증서와 Nginx 설정이 적용되었으므로 배포 시마다 이 설정이 초기화되지 않도록 .ebextensions/https-instance.config
를 설정합니다.
https-instance-security.config
파일 생성: 프로젝트 루트의 .ebextensions/https-instance-security.config
에 다음 내용을 추가합니다:
Resources:
sslSecurityGroupIngress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
IpProtocol: tcp
ToPort: 443
FromPort: 443
CidrIp: 0.0.0.0/0
https-instance-nginx.config
파일 생성: 프로젝트 루트의 .ebextensions/https-instance-nginx.config
에 다음 내용을 추가합니다:
파일 포함하여 GitHub Actions로 배포: 다음 배포부터 .ebextensions
디렉토리가 포함된 프로젝트를 GitHub Actions로 배포하면, 설정이 자동으로 적용됩니다.
files:
"/etc/nginx/conf.d/https_custom.conf":
mode: "000644"
owner: root
group: root
content: |
server {
listen 443 ssl;
server_name 도메인;
ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
container_commands:
01_restart_nginx:
command: "sudo service nginx restart"
6. 자동 인증서 갱신 설정
Certbot의 인증서를 자동 갱신하도록 설정합니다.
- Crontab에 작업 추가:아래 내용을 추가:
0 0 28-31 * * [ "$(date +\%d -d tomorrow)" == "01" ] && certbot renew --quiet && systemctl reload nginx
sudo crontab -e
- 테스트: 인증서 갱신 테스트:
sudo certbot renew --dry-run
요약
- 처음 배포:
.ebextensions
없이 애플리케이션 배포. - SSL 인증서 발급: Certbot으로 인증서 생성 및 Nginx 설정 적용.
- HTTPS 적용:
/etc/nginx/conf.d/https_custom.conf
설정 및 테스트. - 자동 설정 유지:
.ebextensions/https-instance.config
추가. - 자동 인증서 갱신: Crontab에 Certbot 갱신 설정 추가.
위 과정을 순서대로 진행하면 HTTPS를 안정적으로 설정하고 유지할 수 있습니다!
추가
.ebextensions 디렉토리에 여러 설정들을 넣고 배포해도 안될 경우
로컬에서
mkdir -p .platform/hooks/postdeploy
echo "sudo service nginx restart" > .platform/hooks/postdeploy/restart_nginx.sh
chmod +x .platform/hooks/postdeploy/restart_nginx.sh
하고 restart_nginx.sh 아래처럼 수정
#!/bin/bash
cat <<EOF | sudo tee /etc/nginx/conf.d/https_custom.conf
server {
listen 443 ssl;
server_name 도메인;
ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host \$host;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
}
EOF
sudo service nginx restart
'TIL' 카테고리의 다른 글
[241219 TIL] pnpm 장점 (0) | 2024.12.19 |
---|---|
[241219 TIL] Framer-motion 기초 (0) | 2024.12.19 |
[241209 TIL] AWS - RDS, EB 에 nest 배포(2) (0) | 2024.12.09 |
[241208 TIL] AWS - RDS, EB 에 nest 배포(1) (0) | 2024.12.09 |
[241203 TIL] gql apolloClient 기본 사용법 (0) | 2024.12.03 |