소개
이 문서에서는 보안 SSL 구성으로 포트 443에서 실행되도록 보장하면서 AWS Lightsail 인스턴스에 Spring Boot 애플리케이션을 배포하는 방법을 살펴봅니다. 이 가이드는 보안이 강화된 Java 기반 애플리케이션 호스팅을 위해 AWS 인프라를 활용하고자 하는 개발자 및 DevOps 엔지니어에게 적합합니다.
전제 조건
- JAR 파일로 패키징된 Spring Boot 애플리케이션.
- AWS Lightsail 계정과 AWS 서비스에 대한 기본적인 이해.
- AWS 라이트세일 인스턴스를 가리키는 도메인 이름.
- Linux 명령 및 터미널에 대한 기본 지식.
1단계: AWS 라이트세일 인스턴스 설정하기
- 라이트세일 인스턴스를 생성합니다: Linux OS와 적절한 요금제를 선택합니다.
- SSH 액세스: SSH를 사용하여 인스턴스에 안전하게 연결합니다.
- 패키지 업데이트:
sudo apt-get update
를 사용하여 모든 패키지가 최신 상태인지 확인합니다.
2단계: Java 설치
- 기존 Java 설치를 확인합니다:
java -version
를 사용하여 Java가 설치되어 있는지 확인합니다. - Java 17 설치: 설치되어 있지 않은 경우
sudo apt install openjdk-17-jdk
를 사용하여 Java 17을 설치합니다. - 설치를 확인합니다:
java -version
를 다시 실행하여 설치를 확인합니다.
3단계: AWS S3 버킷에 JAR 파일 업로드하기
이 단계에서는 Spring Boot 애플리케이션의 JAR 파일을 AWS S3 버킷에 업로드한 다음 AWS CLI를 사용하여 AWS Lightsail 인스턴스에 다운로드하는 방법을 다룹니다.
- JAR 파일 준비:
– Spring Boot 애플리케이션이 JAR 파일로 패키징되어 배포할 준비가 되었는지 확인합니다. - AWS 관리 콘솔에 액세스:
– 웹 브라우저에서 AWS 관리 콘솔로 이동합니다.
– S3 서비스로 이동합니다. - 새 S3 버킷 만들기(필요한 경우):
– “버킷 만들기”를 클릭합니다.
– 버킷의 고유 이름을 입력하고 적절한 지역을 선택합니다.
– 페이지 하단에서 “만들기”를 클릭합니다. - JAR 파일 업로드:
– 새로 만든 버킷을 엽니다.
– “업로드”를 클릭합니다.
– JAR 파일을 선택하고 버킷에 업로드합니다.
– 버킷 이름과 JAR 파일 이름/키를 메모해 두세요.
AWS 라이트세일 인스턴스에서 AWS CLI 구성
- SSH를 통해 라이트세일 인스턴스에 연결합니다.
- Install AWS CLI:
– 패키지 목록을 업데이트합니다:sudo apt-get update
.
– AWS CLI 설치:sudo apt-get install awscli
- AWS CLI 구성하기:
–aws configure
실행.
– 메시지가 표시되면 AWS 액세스 키 ID와 비밀 액세스 키를 입력합니다.
– S3 리전 이름을 지정합니다(예:ap-northeast-2
– 서울).
– 기본 출력 형식을json
로 설정합니다(선택 사항).
라이트세일 인스턴스에 JAR 파일 다운로드
- 원하는 디렉토리로 이동:
– JAR 파일을 다운로드할 디렉토리로 변경합니다(예:/home/ubuntu/
). - 다음 명령을 실행합니다:
– 다음 명령을 실행합니다:
aws s3 cp s3://[your-bucket-name]/[your-jar-file].jar .
–[your-bucket-name]
를 S3 버킷의 이름으로 바꿉니다.
–[your-jar-file].jar
를 JAR 파일의 이름으로 바꿉니다. - 다운로드 확인:
– 디렉터리에 있는 파일을 나열하여 JAR 파일이 다운로드되었는지 확인합니다:ls -l
.
이 단계를 수행하면 Spring Boot 애플리케이션의 JAR 파일을 S3 버킷에 성공적으로 업로드한 다음 AWS Lightsail 인스턴스에 다운로드한 것입니다. 이 프로세스는 JAR 파일이 AWS S3에 안전하게 저장되도록 할 뿐만 아니라 Lightsail의 배포 프로세스를 간소화합니다.
4단계: Systemd 서비스 생성
시스템 서비스를 사용하면 시스템 부팅 시 Spring Boot 애플리케이션이 자동으로 시작되고 애플리케이션을 시작, 중지 및 다시 시작할 수 있는 명령을 제공할 수 있습니다.
서비스 파일 만들기
- systemd 디렉터리로 이동합니다:
cd /etc/systemd/system/ - 애플리케이션에 대한 새 서비스 파일을 만듭니다:
sudo nano myapp.servicemyapp
를 애플리케이션을 나타내는 이름으로 바꿉니다.
서비스 구성
myapp.service
파일에 다음 구성을 추가합니다:
[Unit] Description=My Spring Boot Application After=syslog.target [Service] User=ubuntu # Ensure the path below points to the location of your JAR file ExecStart=/usr/bin/java -jar /path/to/your/app.jar SuccessExitStatus=143 TimeoutStopSec=10 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
- Description: 서비스에 대한 간략한 설명입니다.
- After: syslog 시스템이 가동된 후에 서비스를 시작하도록 지정합니다.
- User: 서비스가 실행될 사용자입니다. 이 예에서는 기본
ubuntu
사용자를 사용합니다. 필요한 경우 변경하세요. - ExecStart: 애플리케이션을 시작하는 명령입니다.
/path/to/your/app.jar
를 실제 JAR 파일의 경로로 바꿉니다. - SuccessExitStatus: 서비스가 성공적으로 종료된 것으로 간주되는 종료 상태입니다.
- TimeoutStopSec: Time to wait for the service to stop gracefully before killing it.
- Restart: When to restart the service.
on-failure
means the service will restart if it exits with a non-zero exit code. - RestartSec: Time to wait before restarting the service.
Enable and Start the Service
- systemd 데몬을 다시 로드하여 새 서비스 파일을 인식합니다:
sudo systemctl daemon-reload
. - 부팅 시 서비스 시작 활성화:
sudo systemctl enable myapp.service
- 서비스 시작:
sudo systemctl start myapp.service
- 서비스 상태 확인:
sudo systemctl status myapp.service
이 구성은 Spring Boot 애플리케이션이 서비스로서 관리되도록 하여 안정성과 사용 편의성을 제공합니다. 이제 표준 시스템 명령을 사용하여 애플리케이션을 시작, 중지 및 재시작할 수 있습니다.
5단계: Nginx 설치 및 구성하기
포트 80(표준 HTTP 포트)에서 Spring Boot 애플리케이션을 제공하는 것은 포트 443(HTTPS)에서 수행하는 방식과 유사하게 역방향 프록시를 설정하여 수행할 수 있지만 SSL 구성은 하지 않아도 됩니다. 이를 위해 Nginx 또는 Apache를 사용할 수 있습니다. 여기서는 Nginx를 사용한 가이드를 제공하겠습니다:
Nginx 설치
다음 명령을 사용하여 Nginx를 설치해 보겠습니다:
- 패키지 목록 업데이트:
sudo apt-get update
- Nginx 설치:
sudo apt-get install nginx
- Nginx 시작 및 활성화:
sudo systemctl start nginx
sudo systemctl enable nginx
Nginx를 리버스 프록시로 구성
/etc/nginx/sites-available/
에서 애플리케이션에 대한 새 구성 파일을 만듭니다.myapp
라고 부르겠습니다.
sudo nano /etc/nginx/sites-available/myapp- 파일에 다음 구성을 추가합니다. 이 설정은 포트 80에서 수신 대기하고 포트 8083에서 실행 중인 애플리케이션에 요청을 전달하도록 Nginx를 구성합니다:
server { listen 80; server_name your_domain.com; # Replace with your domain or IP location / { proxy_pass http://localhost:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
3. sites-enabled
디렉토리에 대한 심볼릭 링크를 생성하여 구성을 활성화합니다:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
4. 구문 오류가 있는지 Nginx 구성을 테스트합니다:sudo nginx -t
5. 변경 사항을 적용하려면 Nginx를 재로드합니다:sudo systemctl 재로드 nginx
방화벽 설정 조정(해당되는 경우)
서버에 방화벽이 활성화되어 있는 경우 포트 80이 열려 있는지 확인하세요:
sudo ufw allow 'Nginx HTTP'
sudo ufw reload
DNS 구성
도메인의 DNS 설정이 AWS Lightsail 인스턴스의 IP 주소를 가리키는지 확인합니다.
최종 단계 및 테스트
– 이 단계를 완료하면 포트 80의 HTTP를 통해 Spring Boot 애플리케이션에 액세스할 수 있어야 합니다.
– 웹 브라우저에서 http://your_domain.com
에 액세스하여 이를 테스트하세요.
이 설정을 사용하면 애플리케이션이 포트 80에서 HTTP를 통해 트래픽을 전송할 수 있으며, Nginx는 포트 8083에서 실행되는 애플리케이션의 역방향 프록시 역할을 합니다. 특히 민감한 데이터가 포함된 경우 HTTP를 통한 서비스는 HTTPS에 비해 안전하지 않다는 점을 기억하세요. 일반적으로 프로덕션 애플리케이션에는 HTTPS를 사용하는 것이 좋습니다.
6단계: SSL로 애플리케이션 보호
무료 SSL 인증서를 설치하고 AWS Lightsail 인스턴스에서 실행되는 Spring Boot 애플리케이션에 포트 443에서 HTTPS 요청을 사용하도록 설정하려면 무료 SSL 인증서를 제공하는 널리 사용되는 인증 기관인 Let’s Encrypt를 사용할 수 있습니다. 전자 프론티어 재단에서 개발한 Certbot 도구는 Let’s Encrypt 인증서를 획득하고 설치하는 프로세스를 간소화합니다. 방법은 다음과 같습니다:
Certbot 및 Nginx 플러그인 설치
- 패키지 목록 업데이트:
sudo apt-get 업데이트
- Certbot 및 Nginx 플러그인 설치:
sudo apt-get install certbot python3-certbot-nginx
합시다 SSL 인증서 받기
- Certbot을 실행합니다:
sudo certbot --nginx
– 이메일 주소 등의 정보를 요청하고 서비스 약관에 동의합니다.
– 그러면 어떤 도메인에 HTTPS를 활성화할 것인지 묻습니다. 도메인이 AWS 라이트세일 인스턴스의 IP 주소를 가리키는지 확인합니다. - 자동 구성:
– Certbot은 자동으로 Nginx에 대한 SSL을 구성하고 변경 사항을 적용하기 위해 서버를 다시 로드합니다.
자동 갱신 테스트
자신의 암호화 인증서는 90일 동안 유효하지만 Certbot은 자동으로 갱신할 수 있습니다:
- 갱신 절차 테스트:
sudo certbot renew --dry-run
– 이 명령은 현재 인증서를 실제로 교체하지 않고 인증서 갱신을 시뮬레이션합니다. - 갱신 자동화:
– Certbot은 만료가 임박한 인증서를 자동으로 갱신하기 위해 cron 작업 또는 시스템 타이머를 만듭니다.
Nginx 구성 조정(필요한 경우)
Certbot은 보통 Nginx를 자동으로 구성하지만 설정을 확인하거나 조정할 수 있습니다:
- Nginx 구성 편집:
sudo nano /etc/nginx/sites-available/your-config-file
–your-config-file
를 적절한 파일 이름으로 바꾸기. - SSL 설정이 올바른지 확인합니다:
– Certbot에listen 443 ssl;
,ssl_certificate
,ssl_certificate_key
지시어를 포함한 SSL 처리 라인 추가해야 합니다. - 변경 사항을 적용하려면 Nginx를 다시 로드합니다:
sudo systemctl 재로드 nginx
HTTPS 리디렉션 구성(선택 사항)
보안을 위해 모든 HTTP 트래픽을 HTTPS로 리디렉션할 수 있습니다:
- Nginx 구성 편집:
sudo nano /etc/nginx/sites-available/your-config-file
- 리디렉션을 처리할 서버 블록을 추가합니다:
server {
listen 80;
server_name your_domain.com;
return 301 https://$server_name$request_uri;
}
3. Nginx 재로드:sudo systemctl 재로드 nginx
7단계: 방화벽 조정 및 테스트
- 방화벽 구성: 방화벽에서 포트 80과 443이 열려 있는지 확인합니다.
- 테스트:
https://your_domain.com
를 통해 애플리케이션에 액세스하여 설정을 확인합니다.
결론
AWS Lightsail에 Spring Boot 애플리케이션을 배포하고 SSL로 보호하는 것은 애플리케이션의 보안과 안정성을 강화하는 간단한 프로세스입니다. 다음 단계를 따르면 클라우드에서 Java 기반 애플리케이션을 성공적으로 호스팅하고 보호할 수 있습니다.
참고 :