본문 바로가기
카테고리 없음

[AWS/Streamlit] (4/6) AWS EC2 및 Let's Encrypt 활용 Streamlit 앱 https 활성화

by WHDA 2025. 3. 28.

글 목차:

1. AWS EC2 인스턴스 생성 및 접속

2. AWS EC2 서버 환경 구성 및 Streamlit 앱 배포

3. AWS EC2 CI/CD 구축

4. AWS EC2 및 Let's Encrypt 활용 Streamlit 앱 https 활성화

5. AWS EC2 활용 Streamlit 앱에 GA4 연결

6. AWS EC2 활용 Streamlit SEO 설정

 

실습 사전 준비

 

Let's Encrypt란?

Let's Encrypt는 무료 SSL/TLS 인증서를 제공하는 비영리 인증 기관(CA, Certificate Authority)입니다.
웹사이트에 HTTPS(보안 연결)를 적용할 수 있도록 자동화된, 오픈, 무료 인증서 발급 서비스를 제공합니다.

 

Nginx 설치

Nginx란?

Nginx는 고성능 웹 서버이자 리버스 프록시 서버로, 정적 콘텐츠 제공, 로드 밸런싱, 보안 강화(SSL/TLS) 등의 기능을 수행해 대규모 트래픽을 효율적으로 처리할 수 있습니다. Apache보다 가볍고 빠르며, 주로 웹 서비스 배포 및 API 서버 프록시로 사용됩니다.

sudo apt update && sudo apt install nginx

위 코드로 패키지 목록을 최신 상태로 업데이트 하면서 Nginx 웹 서버를 설치합니다.

 

'Y'를 입력합니다.

 

핑크색 화면이 나오면 'Enter'를 입력합니다.

 

Nginx 설치가 완료되었습니다.

 

systemctl status nginx

Nginx의 현재 상태를 확인합니다.

 

'active'라는 표시가 있다면 서버가 정상적으로 작동되고 있다는 의미입니다.

 

IP주소 뒤에 포트 번호가 8501일 때의 상태입니다.

 

포트 번호를 지웠을 때의 상태입니다. 

http 즉 80번 포트로는 현재 설정이 되어 있지 않아 nginx 안내 화면이 나와있습니다.

 

HTTP로 리디렉션하도록 라우팅 설정

cd /etc/nginx/

 Nginx 설정 파일을 확인하기 위해 해당 디렉토리로 이동합니다.

 

ls -lha

현재 폴더 내 파일과 폴더의 자세한 정보를 확인합니다.

 

sudo vi /etc/nginx/nginx.conf

'nginx.conf' 파일을 수정하기 위해 vi 편집기를 실행합니다.

 

Vi(Vim) 이란?

Vi(Vim)는 리눅스에서 기본적으로 제공하는 텍스트 편집기입니다.

 

vi 편집기의 3가지 모드:

1. 명령 모드 (Command Mode): Vi 실행 시 기본 모드

2. 입력 모드 (Insert Mode): 텍스트 입력 가능

3. 명령 입력 모드 (Last Line Mode): ':' 입력 후 명령 실행

 

프로세스 흐름:

Vi 편집기 실행 -> 명령 모드 -> 입력 모드 -> 명령 모드 -> 명령 입력 모드 -> 종료

 

모드 전환 방법:

모드 전환 방법
명령 모드 Vi 실행 시 기본 모드
입력 모드 i, a, o 중 하나 입력
명령 입력 모드 : 입력

 

입력 모드:

입력 모드로 가는 방법 중 가장 직관적인 방법은 'i'를 입력하는 것으로 현재 커서 위치에서 입력을 시작합니다.

복사한 텍스트를 붙여넣기 위해서는 마우스 우클릭을 하면 됩니다.

모든 입력을 종료한 후에는 'ESC' 키를 눌러 명령 모드로 돌아갈 수 있습니다.

 

명령 입력 모드:

명령 입력 모드에서는 저장 및 종료를 할 수 있습니다.

':'를 입력하면 화면 하단에 입력창이 생깁니다.

이때 아래의 각 명령어를 입력하면 됩니다.

명령어 설명
:w 저장
:q 종료
:wq 또는 :x 저장 후 종료
:q! 저장 없이 강제 종료
:wq! 저장 후 강제 종료

이 중에서는 ':wq' 저장 후 종료 명령어를 주로 사용합니다.

'nginx.conf' 파일의 시작 화면입니다.

 

server {
    listen       80;
    listen       [::]:80;
    server_name  _;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    location / {
    }
    error_page 404 /404.html;
        location = /40x.html {
    }
}

화살표 아래키를 눌러 위 화면의 위치에 코드를 입력합니다.

이 코드는 80번 포트에서 HTTP 요청을 수신하고 기본 서버 이름과 기본 문서의 위치를 지정합니다.

 

cat /etc/nginx/nginx.conf

'cat <파일명>' 명령어를 통해 해당 파일의 내용을 확인할 수 있습니다.

설정 파일이 정상적으로 수정되었는지 확인합니다.

 

잘 수정된 것을 확인했습니다.

 

sudo chmod 777 /etc/nginx/sites-available
sudo chmod 777 /etc/nginx/sites-enabled

위 코드를 통해 Nginx 설정 파일이 위치한 폴더에 읽기, 쓰기, 실행 권한을 부여합니다.

 

sudo vi /etc/nginx/sites-available/streamlit-webservice

'streamlit-webservice' 설정 파일을 생성 및 편집합니다.

 

'streamlit-webservice' 설정 파일의 최초 화면입니다.

 

server {
    listen       80;
    server_name  <도메인명 혹은 IP 주소>;
    location / {
        proxy_pass http://0.0.0.0:8501/; # Route from HTTP port 80 to Streamlit port 8501
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

'server_name'에 IPv4 주소를 입력합니다.

해당 코드는 Nginx가 8501 포트의 Streamlit 앱으로 요청을 전달하도록 설정하는 것 입니다.

 

cat /etc/nginx/sites-available/streamlit-webservice

설정 파일이 정상적으로 작성되었는지 확인합니다.

 

sudo ln -s /etc/nginx/sites-available/streamlit-webservice /etc/nginx/sites-enabled/streamlit-webservice

위에서 한 설정을 활성화하기 위해 'sites-enabled' 폴더에 심볼릭 링크를 생성합니다.

 

sudo service nginx restart
sudo service nginx status

Nginx를 다시 작하고 상태를 확인합니다.

 

이전과 같이 8501 포트로도 정상적으로 작동합니다.

 

이제는 8501 포트가 없어도 HTTP로도 잘 작동합니다.

 

HTTPS 활성화

sudo apt install certbot python3-certbot-nginx

Certbot(Let's Encrypt)을 설치합니다.

'certbot'은 무료 SSL 인증서를 발급하는 Let's Encrypt 클라이언트입니다.

'python3-certbot-nginx'부분 Nginx와 연동하여 SSL을 자동 설정할 수 있도록 합니다.

 

'Y'를 입력합니다.

 

Certbot이 정상적으로 설치 되었습니다.

 

sudo certbot --nginx -d <도메인명>

Certbot을 이용해 도메인 사전에 준비한 도메인에 SSL 인증서를 발급받습니다.

 

보안 관련 알림을 받은 이메일 주소를 입력합니다.

 

나오는 질문마다 'Y'를 입력하고 위 화면처럼 결과가 나온다면 정상적으로 처리된 것 입니다.

sudo vi /etc/nginx/sites-available/streamlit-webservice

 

가비아 홈페이지 -> 로그인 -> My가비아 클릭 -> DNS 관리툴 클릭 -> 사용하려는 도메인의 '설정' 클릭

 

'레코드 수정'을 클릭합니다.

 

'레코드 추가'를 클릭하고 화면같이 입력한 후 '저장'을 클릭합니다.

 

server {
    listen 443 ssl default_server;
    server_name <도메인명>;

    ssl_certificate /etc/letsencrypt/live/<도메인명>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<도메인명>/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:8501/; # 내부 요청은 localhost로 변경
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

server {
    listen 80;
    server_name <도메인명>;
    return 301 https://$server_name$request_uri; # HTTP -> HTTPS 리디렉션
}

위 코드의 주요한 내용으로는 

1. 'listen 443 ssl default_server': HTTPS 요청을 처리하도록 설정합니다.

2. 'proxy_pass http://localhost:8501/': 내부적으로 Streamlit 앱으로 요청을 전달합니다.

3. 'return 301 https://$server_name$request_uri': HTTP 요청을 HTTPS로 리디렉트합니다.

 

 

sudo nginx -t

이후 배포가 잘 되지 않아 위 코드로 Nginx의 문법을 확인해보니 같은 도메인을 사용하는 중복 설정이 문제였습니다.

 

따라서 /etc/nginx/sites-available/ 폴더 아래에 중복 설정이 있는지 확인 불필요한 파일을 삭제했습니다.

grep -r "server_name" /etc/nginx/sites-available/

위 코드로 확인한 결과 'default'와 'streamlit-webservice' 폴더에서 중복 설정한 것이 확인되었습니다. 

직접한 설정한 'streamlit-webservice' 폴더 외에 'default' 폴더를 삭제하겠습니다. 

 

sudo rm /etc/nginx/sites-enabled/default

'default' 폴더를 삭제했습니다. 

 

sudo vi /etc/nginx/nginx.conf

'nginx.conf' 파일의 SSL 보안 설정을 강화합니다.

 

화살표 아래키로 위치를 찾습니다.

-생략-
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 기존 설정 주석 처리
ssl_protocols  TLSv1.2 TLSv1.3; # 최신 보안 프로토콜만 활성화
ssl_prefer_server_ciphers on;
-생략-

기존 설정은 주석 처리하고 최신 보안 프로토콜만 활성화합니다.

 

 

cat /etc/nginx/nginx.conf

설정 파일이 올바르게 수정되었는지 확인합니다.

 

sudo service nginx restart

변경된 설정을 적용하기 위해 Nginx를 다시 시작합니다.

 

도메인으로 입력하고 접속해도 잘 되는 것을 확인할 수 있습니다.

 

Certbot 자동 갱신 상태 확인

sudo systemctl status certbot.timer

SSL 인증서가 자동으로 갱신되는지 확인합니다.

 

위 화면과 같이 결과가 나오면 자동으로 업데이트가 되고 있는 상태를 의미합니다.

 

sudo certbot renew --dry-run

인증서 자동 갱신이 정상적으로 동작하는지 시뮬레이션 테스트를 진행합니다.

 

이상으로 구매한 도메인을 적용하면서 HTTPS까지 활성하는 방법에 대해 알아봤습니다.

다음 글에서는 Streamlit 앱에 GA4를 연결하는 방법에 대해 알려드겠습니다.

 

 

글 목차:

1. AWS EC2 인스턴스 생성 및 접속

2. AWS EC2 서버 환경 구성 및 Streamlit 앱 배포

3. AWS EC2 CI/CD 구축

4. AWS EC2 및 Let's Encrypt 활용 Streamlit 앱 https 활성화

5. AWS EC2 활용 Streamlit 앱에 GA4 연결

6. AWS EC2 활용 Streamlit SEO 설정

 

참고


https://www.alibabacloud.com/blog/using-lets-encrypt-to-enable-https-for-a-streamlit-web-service_600130

 

Using Let's Encrypt to Enable HTTPS for a Streamlit Web Service

This article describes using Let's Encrypt SSL/TLS certificate on Ubuntu 22.04 for ECS and how to enable HTTPS for a web service using Streamlit.

www.alibabacloud.com