[환경설정] 아마존 EC2 이용해 리눅스 서버 환경 구축하기

2017.04.20 12:02

이 글에서는 아마존 EC2 기반으로 리눅스 서버 환경을 구축하는 내용을 안내합니다.

RAD 스튜디오 10.2 도쿄 버전부터 리눅스 개발을 지원합니다. WebBroker, 데이테스냅, EMS 서버, 소켓 서버 용 테스트 및 서비스에 사용할 수 있습니다.


아마존 EC2

아마존 EC2란?

아마존 EC2는 클라우드 기반으로 서버 인프라를 제공합니다. 웹 페이지를 이용해 필요한 플랫폼과 용량을 선택해 서버 인스턴스를 실행하고 접속해 테스트 및 서비스 할 수 있습니 - 아마존 EC2 자세히보기


아마존 EC2를 사용하는 이유

AWS 프리 티어를 이용해 12개월 동안 무료로 체험할 수 있습니다. - AWS 프리 티어 자세히보기



이 글에서 다루는 내용은 아래와 같습니다.

  • Ubuntu Server 16.04 LTS 인스턴스 생성
  • 보안설정(필요한 포트번호 오픈)
  • 터미널로 연결
  • 리눅스 개발환경 설정

준비

AWS 가입(게정생성)

EC2를 사용하기 위해서는 AWS 계정이 필요합니다.

이미 많은 글들에서 가입 절차를 소개하고 있으니 아래 링크를 참조해 가입하시기 바랍니다.

(참고로 가입 시 마스터 또는 비자 카드가 필요합니다.)

인스턴스 생성

리눅스 서버 인스턴스를 추가하는 과정을 설명합니다.


아마존 웹서비스 로그인


EC2 서비스 선택

  • 필터에 ec2 입력 후 선택


인스턴스 목록 표시

  • 왼쪽 메뉴 중 Instances 항목 선택


가까운 지역 선택

  • 상단 우측의 지역을 누르고, 가까운 지역 선택
    (저는 Asia Pacific(Seoul)을 선택했습니다.)


새로운 인스턴스 추가

  • [Launch Instance] 버튼 클릭


인스턴스 이미지 선택

  • 적합한 항목의 [Select] 버튼 클릭
    (저는 "Ubuntu Server 16.04 LTS (HVM), SSD Volume Type"(64 - bit)를 선택 했습니다.)



인스턴스 유형 선택

  • 적합한 인스턴스 유형 선택
  • [Review and Launch] 버튼 클릭


내용 확인

  • 내용 확인 후 [Launch] 버튼 클릭
  • 주의 문구는 무시합니다.(보안설정은 뒤에서 다시 진행합니다.)


Key Pair 생성 및 다운로드

중요: 해당 키페어 파일(*.pem)은 터미널 접속 시 개인키(*.ppk) 생성에 사용합니다. 해당 파일을 분실하지 않도록 주의하시기 바랍니다.
  • "Create a new key pair" 항목 선택
  • Key pair name 입력
  • [Download key Pair] 버튼 클릭 해 다운로드(*.pem 파일이 다운로드 됩니다.)


보안설정

애플리케이션 서버에서 사용할 포트번호를 Inbound 규칙에 추가하는 절차를 설명합니다.

인스턴스의 Security Group 확인

  • 인스턴스 목록 항목 중 가장 오른쪽 항목에서 Security Group을 확인합니다.
    (저는 launch-wizard-2 입니다.)

 Security Groups 메뉴 선택

  • 왼쪽 메뉴에서 Network & Security > Security Groups 메뉴 클릭


Security Group 선택

  • 인스턴스에 설정된 Security Group을 선택합니다.
    (저는 launch-wizard-2을 선택)



Inbound 탭에서 Inbound 규칙 수정

  • 아래 탭 중 Inbound 탭 선택
  • [Edit] 버튼 클릭


Inbound 규칙 편집

  • [Add Rule] 버튼 클릭
  • 필요한 규칙을 추가합니다.

    • EMS 서버, 데이터스냅 HTTP, WebBroker의 경우 "Custom TCP Rule / TCP / 8080" 규칙 추가

    • PAServer(Platform Assistance Server: 원격 디버깅 및 SDK 취득) 포트번호 "64211" 규칙 추가
    • 데이터스냅 TCP/IP의 경우 "Custom TCP Rule / TCP / 211" 규칙 추가
    • 리눅스 상에서 FTP 서비스 이용 시 "1024 - 1048", "20 - 22")" 규칙 추가
    • 기타 서버에서 사용할 포트번호를 추가합니다.
  • [Save] 버튼을 눌러 저장


터미널로 연결

리눅스 서버 인스턴스에 터미널을 이용해 연결하는 절차를 안내합니다.

다음 내용은 아마존 웹서비스 도움말을 참고해 작성되었습니다.

인스턴스 선택 후 연결(연결 방법 확인)

  • 인스턴스 목록에서 인스턴스 선택
  • [Connect] 버튼 클릭
  • Connect To Your Instance 팝업창 표시


접속 주소(Public DNS) 확인

  • 4번 단계의 접속 주소(Public DNS) 확인


접속에 필요한 소프트웨어 설치

리눅스에 터미널에 접속할 SSH Client와 파일 전송을 위한 SCP(Secure Copy) 프로그램을 아래 링크에서 다운로드 후  설치합니다.


개인 키 변환

PuTTY는 위에서 다운로드 받은 키페어 파일(*.pem)을 지원하지 않습니다. PuTTYgen을 통해 PuTTY에서 지원하는 개인 키(*.ppk)로 변환합니다.

  • PuTTYgen을 시작합니다.(시작 > 모든 프로그램 > PuTTY > PuTTYgen 선택)
  • Type of key to generate 에서 RSA를 선택
  • [Load] 버튼을 눌러 키페어파일을 선택(파일 필터를 All Files로 변경 후 선택)
  • [Save private key] 버튼을 누르고 개인 키(*.ppk)를 저장합니다.


터미널 접속

PuTTY를 이용해 리눅스 서버 터미널로 접속합니다.

  • PuTTY를 시작합니다.(시작 > 모든 프로그램 > PuTTY > PuTTY 선택)
  • Host Name에 "ubuntu@{접속주소}"를 입력합니다.
    • 기본 계정명은 "ubuntu" 입니다.
    • 포트 번호는 22 입력
    • 연결 타입은 "SSH" 선택
  • [Category] 탭에서 Connection > SSH > Auth 메뉴를 선택합니다.
  • private key file for authentication 항목에서 [Browse...] 버튼을 눌러 개인 키(*.ppk)를 선택합니다.
  • [Open] 버튼을 눌러 접속을 시도합니다.
    (최초 1회 신뢰할 수 있는지 묻는 보안 알림 대화상자가 표시되면 [Yes]를 선택 합니다.)


파일 전송을 위한 SCP 연결

WinSCP를 이용해 SCP 연결해 파일을 전송할 수 있는 환경을 확인합니다.

  • WinSCP를 실행합니다.
  • 로그인 창에서 접속 정보를 입력합니다.
    • 호스트 이름에 (접속주소)를 입력합니다.
    • 사용자 이름에 "ubuntu"를 입력합니다.
  • [고급] 버튼을 눌러 개인 키를 설정합니다.
    • 개인 키 파일 항목에서 [...] 버튼을 눌러 개인 키 파일을 선택합니다.
    • [확인] 버튼을 눌러 적용합니다.
  • 로그인 화면에서 [저장] 버튼을 누르고 세션 이름을 지정해 저장합니다.
  • [로그인] 버튼을 눌러 접속합니다.

리눅스 개발환경 설정

RAD 스튜디오에서 리눅스 애플리케이션 개발하기 위한 환경을 설정합니다.


자세한 내용은 다음 링크를 통해 설명합니다.


관련링크



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder AWS, 델파이, 리눅스

[10.2 도쿄] 델파이로 리눅스 기반 웹서비스 제작하기(WebBroker 이용)

2017.03.29 15:19



이 글에서는 델파이를 이용해 리눅스 서버에서 구동되는 아파치 모듈을 웹브로커 기술을 이용해 만드는 방법을 소개합니다.

(이 글에서는 리눅스 서버 설정과 MySQL 설정 등에 대해서는 자세히 다루지 않습니다.)


델파이로 리눅스 기반 웹서비스 제작하기(WebBroker 이용)


RAD 스튜디오 10.2 도쿄버전에서 리눅스 개발을 지원합니다. 이제 델파이로 리눅스 서버용 프로그램을 개발 및 배포, 디버깅 할 수 있습니다. 


이 글은 RAD 스튜디오 10.2 도쿄 버전 기준으로 작성되었으며, 리눅스는 Ubuntu 16.04.1(가상머신)에서 동작합니다.


이 글에서 아래의 내용을 진행합니다.

  • 콘솔 기반 WebBroker 프로젝트 제작 및 리눅스에서 실행
  • 아파치 모듈 기반 WebBroker 프로젝트 제작 및 리눅스에 배포, 테스트
  • 리눅스의 MySQL(FireDAC 이용) 데이터 연동해 JSON 데이터 응답하기

다음 순서로 진행합니다.

  • 개발준비
  • 콘솔 기반 WebBroker 프로젝트 만들기
  • 콘솔 애플리케이션 리눅스에서 실행
  • 아파치 모듈 기반 WebBroker 프로젝트 만들기
  • 아파치 모듈 리눅스에 배포
  • MySQL 연결(FireDAC 이용)

개발 준비

리눅스가 설치된 별도의 컴퓨터 또는 가상머신을 준비합니다.

다음 링크를 통해 RAD 스튜디오 리눅스 개발환경을 설정합니다.


콘솔 기반 WebBroker 프로젝트 만들기

WebBroker 프로젝트 생성(Stand-alone console application)

델파이 실행 후 File > New > Other 메뉴를 선택합니다.

Delphi Projects > WebBroker 메뉴 선택 후 Web Server Application 항목 선택 후 [OK] 버튼을 클릭합니다.


마법사 창에서 Linux 플랫폼을 추가 선택 후 [Next >>] 버튼을 클릭합니다.


프로젝트 타입으로 Stand-alone console application 항목을 선택합니다.

  • Apache dynamic link module : 아파치 모듈을 만들어 아파치 웹서버를 이용해 구동합니다.
  • Stand-alone console application : 독립형 콘솔 어플리케이션을 제작합니다.


독립형 콘솔 애플리케이션이 사용할 HTTP 포트번호를 확인 및 변경 후 [Finish] 버튼을 누릅니다.


프로젝트 파일을 저장합니다.(단축키 Ctrl + Shift + S) 프로젝트 명은 LinuxSAConsole로 지정합니다.
(이름을 다르게 지정해도 됩니다.)


윈도우에서 실행

테스트를 위해 윈도우에서 실행(단축키 F9)하면 아래와 같이 콘솔모드로 실행됩니다."start" 커맨드를 입력해 서버를 시작합니다.


웹브라우저에서 "http://localhost:8080" 주소를 열면 아래와 같이 응답데이터가 표시됩니다.
(WebModuleUnit1에 정의된 내용이 출력됩니다.)


콘솔 프로그램을 종료합니다.


프로그램 시작 시 WebBroker 서버를 시작하도록 코드를 수정합니다.

LinuxSAConsole 파일의 RunServer 함수에 "StartServer(LServer);" 라인을 추가합니다.


리눅스에서 실행(콘솔 기반 WebBroker 프로젝트)

RAD 스튜디오는 리눅스에 손쉽게 실행파일을 배포하고 디버깅하기위해 PAServer를 사용합니다. 

PAServer는 별도의 설치프로그램으로, RAD 스튜디오에서 설치파일을 제공합니다.(설치방법은 상단의 개발 준비 과정을 참고하기 바랍니다.)

PAServer 실행

리눅스 터미널에서 PAServer가 설치된 경로로 이동 후 PAServer를 실행합니다.


연결에 사용할 비밀번호 입력 후 엔터, "i" 명령어로 PAServer의 IP주소를 확인합니다.


타겟 플랫폼을 리눅스로 지정

델파이 IDE의 프로젝트 매니저에서 Target Platforms을 "64-bit Linux" 항목을 선택합니다.

만약, "64-bit Linux" 항목이 없다면, Target Platforms 항목의 팝업메뉴에서 "Add Platform..." 메뉴를 선택 후 "64-bit Linux"를 추가합니다. 

(64-bit Linux 플랫폼은 RAD 스튜디오 10.2 도쿄 이후 버전,  엔터프라이즈 에디션 이상에서 사용할 수 있습니다.)


PAServer 연결

PAServer 연결 설정하기 위해 "64-bit Linux" 항목의 팝업 메뉴에서 "Edit Connection..." 메뉴를 선택합니다.


리눅스에서 실행한 PAServer 연결설정을 선택(또는 추가 후 선택) 후 [OK] 버튼을 누릅니다.


리눅스에서 실행

프로젝트를 실행(Run, F9)합니다.


웹브라우저에서 리눅스 서버 IP와 8080포트로 웹페이지를 열면 아래와 같이 표시됩니다.


프로젝트 파일 저장 경로 하위 "\Linux64\Debug\" 경로에 리눅스 실행파일이 생성됩니다.


PAServer를 통해 리눅스에도 실행파일이 배포됩니다.

홈디렉토리 하위 "/PAServer/scratch-dir/(PAServer 연결문자)/(프로젝트명)" 하위에 LinuxSAConsole 파일이 복사됩니다. 리눅스에서 콘솔 프로그램을 직접 실행할 수 있습니다.


아파치 모듈 기반 WebBroker 프로젝트 만들기

WebBroker 프로젝트 생성(Apache dynamic link module)

WebBroker 프로젝트를 생성(File > New > Other > Delphi > WebBroker > Web Server Application)하고, "Apache dynamic link module" 프로젝트 타입을 선택합니다.


Apache module을 수정하고 [Finish] 버튼을 누릅니다.

  • Apache module(아파치 모듈 이름)은 뒤에서 설명하는 "apache2 모듈 활성화에 등록" 시 사용합니다.


생성한 프로젝트를 저장합니다.(Ctrl + Shift + S)


WebBroker 프로젝트 빌드

WebModule 유닛에 필요한 기능을 구현합니다.


리눅스 타겟으로 빌드합니다.


아래와 같이 프로젝트 저장 경로 하위 ".\Linux64\Debug\" 디렉토리에 so 확장자의 아파치 모듈이 생성됩니다.

리눅스에 배포(아파치 모듈 기반 WebBroker 프로젝트)

아파치 모듈 리눅스로 복사

위에서 생성한 아파치 모듈(libmod_webbroker.so)을 리눅스로 복사합니다.(USB 메모리, FTP 클라이언트 프로그램 등을 이용합니다.) 

저는 제 작업디렉토리(/home/humphrey/WorkData/)에 복사했습니다.


아파치 모듈 디렉토리로 복사

아파치 모듈 디렉토리(/usr/lib/apache2/modules)로 아파치 모듈을 복사합니다.

su : root 권한을 가져옵니다.(/usr/lib 하위 경로에 복사하기 위해 root 권한이 필요합니다.)

cp : 파일을 복사합니다.

cd : 디렉토리를 변경합니다.

ls : 현재 디렉토리의 파일목록을 표시합니다.


apache2 모듈 활성화에 등록

/etc/apache2/mods-enabled/ 디렉토리로 이동 합니다.

nano 에디터를 이용(vi 등 다른 에디터를 이용해도 됩니다.) libmod_webbroker.load 파일을 편집(생성) 합니다.(root 권한 필요)

nano libmod_webbroker.load


nano 에디터에서 아래와 같이 입력하고 저장(Ctrl + X > Y > 엔터)합니다.(root 권한 필요)

LoadModule (아파치 모듈 이름) (아파치 모듈 파일경로) 

LoadModule webbroker_module /usr/lib/apache2/modules/libmod_webbroker.so


아파치를 다시 시작합니다.(root 권한 필요)

/etc/init.d/apache2 restart


apache2 사이트 활성화에 등록

/etc/apache2/sites-enabled/ 디렉토리로 이동합니다.

nano 에디터를 이용해 000-default.conf 파일을 편집합니다.(root 권한 필요)

nano 000-default.conf


DocumentRoot 아래에 아래 코드를 입력합니다.


<Location /webbroker>

  SetHandler libmod_webbroker-handler

</Location>


현재서버의 /webbroker 경로로 웹서버 호출 시 libmod_webbroker.load 로드하도록 설정

저장하고 빠져나옵니다.(Ctrl + X > Y > 엔터)


배포가 완료되었습니다. 리눅스 서버의 아이피(또는 도메인)과 webbroker 경로를 웹브라우저에서 입력해 열면 아래와 같은 결과를 볼 수 있습니다.

MySQL 연결(FireDAC 이용)

리눅스에 설치된 MySQL의 데이터를 JSON 포맷으로 출력합니다. 위에서 만든 WebBroker 아파치 모듈에 기능을 추가합니다. 데이터 엑세스 컴포넌트는 FireDAC을 이용합니다.


MySQL 준비

리눅스 서버에 설치된 MySQL과 연결하기 위해 리눅스 서버에 MySQL이 설치되어 있어야 합니다.


델파이가 설치된 원격환경에서 MySQL과 연결하기 위해 MySQL 외부 접속을 허용합니다.

스키마와 계정, 테이블을 생성합니다. 스키마 명과 계정명, 비밀번호는 모두 'test'로 합니다.

스키마 생성

create schema test;

계정 생성

create user 'test'@'%' identified by 'test';

테이블 생성

CREATE TABLE USER(
  USER_ID int, 
  NAME VARCHAR(255) character set utf8, 
  ADDRESS VARCHAR(255) character set utf8, 
  CITY VARCHAR(255) character set utf8);

테스트 데이터 입력

INSERT INTO USER VALUES(1, '김현수', '내가 사는 우리집', '인천');

INSERT INTO USER VALUES(2, '홍길동', '네가 사는 너희집', '강릉');

FireDAC 컴포넌트를 이용해 MySQL과 연결

FireDAC을 이용해 리눅스 서버의 MySQL과 연결합니다.


DB 연결 컴포넌트 추가

WebModuleUnit1을 열고, TFDConnection, TFDQuery 컴포넌트를 추가합니다.


데이터베이스 연결 설정

TFDConnection 컴포넌트의 연결설정 화면을 열고(컴포넌트 더블클릭) 아래와 같이 입력합니다.

  • Driver ID : MySQL
  • Database : test
  • User_Name : test
  • Password : test
  • Server : 리눅스 서버의 IP 주소(또는 도메인)
  • CharacterSet : UTF8(한글을 표현하기 위해)

[Test] 버튼을 눌러 연결을 확인합니다.(만약 연결되지 않는 경우 서버 IP주소 또는 MySQL 외부연결 설정을 확인합니다.)

LoginPrompt 속성을 False로 변경합니다.


쿼리 설정

쿼리 컴포넌트(TFDQuery)의 Query Editor를 열고(컴포넌트 더블클릭) 쿼리문을 작성합니다.


SELECT * FROM USER 

[Execute] 버튼을 눌러 결과를 확인합니다. 

[OK] 버튼을 눌러 적용합니다.

테이블 내용을 JSON 포맷으로 데이터 작성

JSON 데이터 작성은 TJsonObjectWriter 클래스를 활용합니다.(System.JSON.Writers 유닛 필요)


아래 코드를 참조해 private 영역에 QueryUser 메소드를 작성합니다.

QueryUser 메소드는 쿼리 결과를 JSON 포맷으로 작성 후 JSON 문자열로 반환하는 역할을 합니다.

uses
  System.JSON, System.JSON.Writers;

function TWebModule1.QueryUser: string;
var
  Writer: TJsonObjectWriter;
begin
  Writer := TJsonObjectWriter.Create;
  try
    Writer.WriteStartObject; // start resource
    Writer.WritePropertyName('users');
    Writer.WriteStartArray;

    FDQuery1.Open;
    FDQuery1.First;
    while not FDQuery1.Eof do
    begin
      Writer.WriteStartObject;

      Writer.WritePropertyName('USER_ID');
      Writer.WriteValue(FDQuery1.FieldByName('USER_ID').AsString);

      Writer.WritePropertyName('NAME');
      Writer.WriteValue(FDQuery1.FieldByName('NAME').AsString);

      Writer.WritePropertyName('ADDRESS');
      Writer.WriteValue(FDQuery1.FieldByName('ADDRESS').AsString);

      Writer.WritePropertyName('CITY');
      Writer.WriteValue(FDQuery1.FieldByName('CITY').AsString);

      Writer.WriteEndObject;
      FDQuery1.Next;
    end;
    Writer.WriteEndArray;

    Result := Writer.JSON.ToJSON;
  finally
    Writer.DisposeOf;
  end;
end;


WebModule1DefaultHandlerAction에서 응답 컨텐츠로 QueryUser를 연결합니다.

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := QueryUser;
end;


리눅스로 배포하기

프로젝트를 빌드하고, 생성된 아파치 모듈(libmod_webbroker.so)을 리눅스로 복사합니다.

저는 제 작업디렉토리(/home/humphrey/WorkData/)에 복사했습니다.


아파치 모듈 복사

아파치 모듈 복사하기 전 아파치 서비스를 중단합니다.(root 권한 필요)

아파치 모듈을 복사하고 다시 아파치 서비스를 시작합니다.


결과확인

리눅스 서버의 주소 하위 /webbroker 페이지 호출 시 JSON 포맷 문자열로 출력됩니다.

(한글은 UTF8로 인코딩된것을 확인할 수 있습니다.)


REST Debugger(Tools > REST Debugger)로 확인해 한글이 잘 표현되는 것을 확인할 수 있습니다.


참고자료



저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

험프리.김현수 험프리.김현수 Delphi/C++Builder 10.2 도쿄, 델파이, 리눅스, 웹브로커