유니티에서 AWS를 사용해 파이썬 프로그램 실행하기

굥지·2025년 12월 19일

Unity

목록 보기
6/8

1단계 : AWS EC2 인스턴스 생성 (서버 만들기)

일단 로긘을 해야겠지?

난 아이디도 없어서 회원가입부터함

쭉 진행하다 보면 카드 정보 입력하고 어디사는지 입력하라고 뜨는데 그거까지 다 해주고 로그인 ㄱㄱ

https://aws.amazon.com/ko/

다음에 이 사이트를 들어가서 EC2를 검색(로그인 돼있으면 사진처럼)

인스턴스를 누르고

오른쪽 위 인스턴스 시작 ㄱㄱ

  • 이름 : 프로젝트 이름으로 암거나하고
  • OS 이미지(AMI): Ubuntu Server 22.04 LTS (프리 티어 사용 가능 확인)

첫번째 프리티어 사용 가능이니까 그거 선택

  • 인스턴스 유형: t2.micro 또는 t3.micro (지역에 따라 '프리 티어 사용 가능'이라고 표시된 것 선택)
  • 키 페어: '새 키 페어 생성'을 눌러 .pem 파일을 다운로드
    (중요: 이 파일은 서버 접속 시 꼭 필요하며 다시 받을 수 없으니 안전한 곳에 보관해야댐)

키 페어 이름도 프로젝트 이름으로 해줬음
여기서 ppk로 하는게 좋을듯 어차피 나중에 ppk도 필요해서(근데 난 pem으로 함)

인스턴스 시작하면 만들어집니당

2단계: 서버 보안 설정 (포트 5000 열기)

다시 대시보드로 돌아와서 인스턴스ID를 클릭하면(사진에서 가려놔서 안 보이는거지 클릭할 수 있게 돼있음)

가릴거 참 많다,, 여기서 보안 들어가면

보안 그룹이라는게 보이는데 이걸 누르삼

  • 인바운드 규칙 편집을 클릭

  • 원래 있던 두가지 유형을 이렇게 편집하면 됨
    • 유형: 사용자 지정 TCP
    • 포트 범위: 5000
    • 소스: Anywhere-IPv4 (0.0.0.0/0) — 테스트용
  • 규칙 저장을 누르면 됨

3단계: 서버에 파일 업로드 및 환경 구축

얘가 귀찮음

https://winscp.net/eng/download.php

여기서 얘 다운 받고 키면 로그인하라는 창이 뜨는데 여기다 파이썬 모듈을 옮겨줄거임

  • 호스트 이름(Host Name): 아까 확인한 AWS의 퍼블릭 IPv4 주소 (예: 3.34.xxx.xxx)

아까 그 대시보드에서 이 부분을 복사해오면 됨

  • 사용자 이름(User Name): ubuntu (반드시 소문자)
  • 비밀번호: 입력X


여기서 냅다 로그인하면 안되고 고급에서

  • 로그인 창의 [고급(D)] 버튼을 클릭
  • 왼쪽 목록에서 SSH → 인증을 클릭
  • 개인 키 파일(Private key file) 칸의 ... 버튼을 눌러 내 컴퓨터에 있는 .pem 파일을 선택
    • 파일 탐색기 창이 뜨면 오른쪽 하단 파일 형식을 모든 파일 (.)로 바꿔야 .pem 파일이 보임

만약에 ppk로 했으면 그거 넣고 pem으로 했으면 이렇게 넣어줌

그럼 이런 창이 뜨면서 확인 누르면 됨

만약 안 뜬다!! 하면 공개 키 표시 버튼을 눌러보세요(난 이렇게 해결함 왜인진 모름)

이제 내 컴퓨터에 있는 아래 4개 파일을 마우스로 잡아서 오른쪽 칸으로 드래그하면 끝

4단계: 서버 실행

일단 내가 만든 서버에 접속해야되니까 이거부터 해줌

  1. 서버 접속 (SSH): 터미널이나 PuTTY를 통해 서버에 접속

    ssh -i "키파일이름.pem" ubuntu@내-EC2-IP주소

    키파일이름은 아까 만든 이름으로 하면 되고

    내 EC2 IP 주소는 아래 사진에 보이는 퍼블릭 IPv4 주소를 쓰면댐

  1. 파이썬 환경 설치

    sudo apt update sudo apt install python3-pip -y pip3 install flask gensim

  • 패키지 목록 업데이트

    sudo apt update

  • 파이썬 설치 확인 및 pip(설치 도구) 설치

    sudo apt install python3-pip -y

  • 필요한 라이브러리 설치

    pip3 install flask gensim

  1. 실행 테스트

    python3 run.py

    (에러 없이 Complety Loading Model이 뜨는지 확인!!)

  2. 백그라운드 실행

    nohup python3 run.py > output.log 2>&1 &

    • 이제 터미널을 종료해도 서버는 계속 작동함
    • 서버를 끄고 싶을 때는 ps -ef | grep run.py로 프로세스 ID를 찾아 kill 명령어를 사용

⚠️ 오류 모음

만약

Loading FastText...

Killed

라는 오류가 떴다면 메모리 부족으로 뜨는 오류로 다음과 같이 순서대로 진행

1. 2GB 크기의 스왑 파일 생성

sudo fallocate -l 2G /swapfile

2. 파일 권한 설정 (보안)

sudo chmod 600 /swapfile

3. 파일을 스왑 공간으로 포맷

sudo mkswap /swapfile

4. 스왑 공간 활성화

sudo swapon /swapfile

5. 설정이 잘 되었는지 확인

free -h

결과 확인: Swap: 부분에 2.0Gi라고 나오면 성공입니다!

이후에 다시 python3 [run.py](http://run.py) 를 입력해서 실행


5단계: 유니티 코드 수정

이제 유니티의 PythonConnectManager.cs 파일에서 URL만 변경하면 끝!

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Text;
using Newtonsoft.Json;
using System.Collections.Generic;
using System;

[System.Serializable]
public class ResultData
{
    public List<string> result;
}

public class ResultData2
{
    public float? result;
}

public class PythonConnectManager : MonoBehaviour
{
    private string serverIP = "본인 퍼블릭 IPv4 주소";
  
    }

    //단어와 몇개의 유사한 단어를 가져올 것인지 입력
    public IEnumerator MostSimilarty(string inputWord, int num, Action<List<string>> callback)
    {
        string url = $"http://{serverIP}:5000/most_similarty";

        var data = new { word = inputWord, num = num };
        string jsonData = JsonConvert.SerializeObject(data);

        using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
            request.uploadHandler = new UploadHandlerRaw(bodyRaw);
            request.downloadHandler = new DownloadHandlerBuffer();
            request.SetRequestHeader("Content-Type", "application/json");

            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.Success)
            {
                string jsonResponse = request.downloadHandler.text;
                Debug.Log("서버 응답: " + jsonResponse);
                ResultData responseData = JsonConvert.DeserializeObject<ResultData>(jsonResponse);

                if (responseData.result != null && responseData.result.Count > 0)
                {
                    callback(responseData.result);
                }
                else
                {
                    callback(new List<string> { "부정확한 단어" });
                }
            }
            else
            {
                Debug.LogError("요청 실패: " + request.error);
                callback(new List<string> { "요청 실패" });
            }
        }
    }

    //두 단어 사이의 유사도
    public IEnumerator SimilartyTwoWord(string inputWord, string inputWord2, Action<float?> callback)
    {
        string url = $"http://{serverIP}:5000/similarity";

        var data = new { word1 = inputWord, word2 = inputWord2 };
        string jsonData = JsonConvert.SerializeObject(data);

        using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
        {
            byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
            request.uploadHandler = new UploadHandlerRaw(bodyRaw);
            request.downloadHandler = new DownloadHandlerBuffer();
            request.SetRequestHeader("Content-Type", "application/json");

            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.Success)
            {
                string jsonResponse = request.downloadHandler.text;
                ResultData2 responseData = JsonConvert.DeserializeObject<ResultData2>(jsonResponse);

                if (responseData != null && responseData.result.HasValue)
                {
                    callback?.Invoke(responseData.result.Value);
                }
                else
                {
                    Debug.Log("부정확한 단어");
                    callback?.Invoke(null);
                }
            }
            else
            {
                Debug.LogError("요청 실패: " + request.error);
                callback?.Invoke(null);
            }
        }
    }
}
    

💡 만약 서버를 끄고 싶다면?

나중에 서버를 업데이트하거나 끄고 싶을 때는 아래 명령어를 터미널에 입력하면 됩니당~

pkill -f run.py

0개의 댓글