EC2 서버에서 파이썬 파일 실행하기

변현섭·2023년 8월 4일
2

Spring 잡학사전

목록 보기
8/10

백엔드 개발자가 파이썬을 알아야하는 이유가 무엇인지 궁금해하는 사람도 있을 겁니다. 제가 생각하는 가장 큰 이유는 서버와 연동되는 여러 가지 편의 기능들을 파이썬으로 구현할 수 있어야하기 때문입니다.

하지만, 파이썬을 열심히 공부하고도 이것을 어떻게 서버에서 실행해야 할지 모른다면 무용지물이겠죠. 그래서 이번 포스팅에서는 실제로 파이썬 파일이 어떻게 EC2 서버와 연동되어 사용될 수 있는지 알아보겠습니다.

1. EC2에 파이썬 설치하기

먼저, 파이썬과 pip를 EC2에 설치해주자.

$ sudo apt update
$ sudo apt install python
$ sudo apt install python3
$ python --version
$ python3 --version
$ sudo apt install python-pip
$ sudo apt install python3-pip
$ pip install {모듈 이름}

2. 번역 프로그램 EC2에서 실행하기

번역 프로그램에 대한 자세한 설명은 아래의 링크를 참조하기 바란다.
>> 번역 프로그램
vi trans.py로 파일을 열고 아래의 내용을 작성하자.

import googletrans

translator = googletrans.Translator()
str1 = "날씨가 참 좋네요!"
result1 = translator.translate(str1, dest="en", src="auto")
print(str1 + f" => {result1.text}")

str2 = "Python is so easy to learn."
result2 = translator.translate(str2, dest="ko", src="en")
print(str2 + f" => {result2.text}")

vi를 빠져나온 후, googletrans 라이브러리를 설치해주자.

$ pip install googletrans==4.0.0-rc1

파이썬 파일을 실행하는 명령은 아래와 같다.

$ python3 trans.py 

3. SQS와 연동된 파이썬 파일 실행하기

파이썬 파일을 SQS에 연동하는 방법에 대해서는 아래의 링크를 참조하기 바란다.
>> SQS와 파이썬 파일 연동하기

또한 메일 전송 코드에 대한 설명은 아래의 링크를 참조하기 바란다.
>> 네이버 메일 전송하기

vi send_mail.py를 입력 후, 아래와 같이 코드를 작성한다. 참고로 중괄호로 쓰여진 부분은 본인이 알맞게 변경해야 할 부분이다.

import smtplib
from email.mime.text import MIMEText
import boto3
import json
import requests

# 이메일 설정
send_email = "{이메일을 발신할 주소}"
send_pwd = "{네이버 비밀번호}"
recv_email = "{이메일을 수신할 주소}"
smtp_name = "smtp.naver.com"
smtp_port = 587

# Boto3 클라이언트 생성
sqs = boto3.client('sqs', region_name='ap-northeast-2', aws_access_key_id='{AWS AccessKey}',
                   aws_secret_access_key='{AWS SecretKey}')
queue_url = "SQS URL"

# 스프링 API 엔드포인트 설정
spring_api_url = "http://localhost:8080/complete"

def receive_message():
    while True:
        response = sqs.receive_message(
            QueueUrl=queue_url,
            MaxNumberOfMessages=1,
            WaitTimeSeconds=10
        )  
    
        # 메시지 수신 및 처리
        messages = response.get('Messages', [])
        for message in messages:
            body = message['Body']
            receipt_handle = message['ReceiptHandle']
            # body 변수에 들어있는 JSON 문자열을 파싱하여 value 값만 추출하여 text 변수에 저장
            body_dict = json.loads(body)
            text = body_dict['message']
            # 메시지 처리 완료 후 SQS에서 메시지 삭제
            sqs.delete_message(
                QueueUrl=queue_url,
               ReceiptHandle=receipt_handle
            )    
        
            # MIMEText 객체 생성을 위해 text 변수가 초기화된 상태를 확인하여 오류 해결
            msg = MIMEText(text)
            msg["Subject"] = "이번에는 새롭게"
            msg["From"] = send_email
            msg["To"] = recv_email
            print(msg.as_string())

            # 이메일 발송
            s = smtplib.SMTP(smtp_name, smtp_port)
            s.starttls()
            s.login(send_email, send_pwd)
            s.sendmail(send_email, recv_email, msg.as_string())
            s.quit()

            # 스프링 API 호출
            response = requests.get(spring_api_url, params={"title": text})
            if response.status_code == 200:
                print(response.json())
            else:
                print("스프링 API 호출에 실패했습니다.")

# 메시지 수신 반복
while True:
    receive_message()

vi를 빠져나온 뒤, boto3 라이브러리를 설치하자.

$ pip install boto3

위 코드는 스프링으로 작성된 컨트롤러에서 내용을 입력받아 발신 이메일 주소에서 수신 이메일 주소로 이메일을 전송하는 코드이다. 이메일을 전송한 후, 스프링 API를 호출하는 작업은 나중에 필요한 작업으로 대체하면 된다. 지금은 그냥 전송 완료 메시지만 출력하고 있다.

파일을 실행하기 전에 SQS에 메시지를 올려두어야 한다. 이것은 Spring으로 작성한 컨트롤러에서 해도 되고, 직접 AWS Management Console에서 해도 된다. 여기서는 컨트롤러를 이용한다.

테스트에 앞서 EC2 보안그룹에서 SMTP를 위한 587번 포트를 개방해주어야 한다.

이제 파일을 실행해보자.

$ python3 send_mail.py

파일을 실행하면 어떤 결과가 나올까? 메시지는 잘 전송이 되지만, 에러 로그도 함께 출력된다.


에러가 발생한 이유는 무엇일까? 일단, 이 실행파일은 단순한 번역 프로그램과는 차이가 있다. 바로 서버의 API를 호출할 수 있어야 한다는 것이다. 그러나 서버는 현재 로컬 호스트에서 돌아가고 있기 때문에 EC2에서 서버에 API 요청을 보내지 못하고 있는 것이다.

파이썬 파일은 SQS로 input을 받기 때문에 메일을 전송하는 데에는 무리가 없었지만, 메일 전송 후 API를 호출하는 부분에서 에러가 발생하는 것이다. 따라서 서버 코드도 같이 EC2에 배포해야 제대로 된 실행 결과를 얻을 수 있다.

4. 서버 배포 후 결과 확인하기

서버 코드를 EC2에 배포하는 방법은 아래의 링크에서 확인할 수 있다.
>> EC2 배포
그럼 서버에 배포까지는 완료했다는 가정 하에 실습을 진행하겠다. 서버를 실행시킨 후, 메시지를 SQS로 전송해보자.

정상적으로 메시지가 전송되었다.

이제 파이썬 파일을 실행시키기 위해 Duplicate Session으로 새 창을 열어주자. 정확한 결과 확인을 위해 SQS에 존재하는 메시지는 모두 삭제한 후 진행해야 한다.

send_mail.py의 API endpoint를 아래와 같이 수정하자.

# 스프링 API 엔드포인트 설정
spring_api_url = "http://{EC2 IP주소}:8080/complete"

python3 send_mail.py 명령으로 파이썬 파일을 실행한 후, 포스트맨에서 동일한 API를 다시 호출하였다.

그 결과 아래와 같이 이메일이 잘 작성된 것을 볼 수 있다.

당연히 요청이 올 때마다 메일을 보내야하기 때문에, 여러 번 실행하는 것도 가능하게 해두었다.

이제 EC2 콘솔에서도, 별다른 에러 없이 잘 동작한다.

5. 파이썬 파일 무중단 실행

예전 포스팅에서 EC2 무중단 배포에 대해 다룬 적이 있다.
>> EC2 무중단 배포
당연히 서버 코드를 무중단 배포해야 하니, 파이썬 실행파일도 마찬가지로 무중단 실행될 수 있어야 한다. 파이썬 파일을 무중단 실행하는 법은 서버를 무중단 배포하는 방법과 동일하다. 즉, nohup과 &만 붙여주면 된다.

일단, 위의 링크에서 제시한 방법에 따라 서버를 무중단 배포한 후, Duplicated Session에서 아래의 명령을 입력한다.

nohup python3 send_mail.py &


이번에도 정상적으로 메일이 전송되었다.

정말 무중단 배포가 된 것이 맞는지 putty를 끈 상태에서 테스트해보기로 하겠다. putty를 종료한 후, API를 호출한다.

네이버 메일에 들어가서 결과를 확인해보니, 문제 없이 이메일이 전송되었다.

이제 kill 명령으로 파이썬 프로세스를 종료시키자.

파이썬 프로세스가 종료되었기 때문에 API를 호출해도 SQS에 메시지만 올라갈 뿐, 메일이 전송되지는 않는다. 이제 서버 프로세스도 kill해주자. grep 명령어로 본인의 jar 파일의 pid를 찾아 kill의 인자로 전달하면 된다.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글