5.9. AWS 서버 생성

이 장은 AWS에서 제공하는 서버리스 프레임워크인 Lambda를 사용해 클라우드 서버 구현을 진행한다.

AWS 콘솔에서 상단의 검색 영역에 Lambda 입력 후 Lambda를 클릭해 화면을 전환한다.

AWS Lambda 이동 방법

Lambda 콘솔화면으로 이동 후 우측의 함수 생성 버튼을 클릭해 함수를 생성한다.

Lambda 함수 생성

함수 생성 화면에서 상단의 새로 작성을 클릭한다. 기본정보 중 함수 이름을 작성한다. 여기서는 TS100_Function으로 입력한다. 이후 런타임을 Python 3.8 버전으로 선택한다. 모든 정보 입력 후 함수 생성 버튼을 클릭하여 함수 생성을 완료한다.

함수 정보 입력

위 과정을 거친 후 생성된 함수 콘솔 화면은 다음과 같다.

Lambda 함수 콘솔

psycopg2 라이브러리 설치

Lambda 함수와 PostgreSQL을 연결하기 위해 파이썬 라이브러리인 psycopg2를 사용한다. psycopg2는 파이썬 외부 라이브러리이기 때문에 직접 라이브러리를 설치해야 한다.

검색 영역에서 cloud9 입력 후 Cloud9을 클릭하여 화면을 이동한다.

Cloud9 검색 및 이동

Cloud9 콘솔로 이동 후 환경 생성 버튼을 클릭해 환경 생성 화면으로 이동한다.

Cloud9 환경 생성 방법

세부 정보 영역에서 이름을 입력한다. 여기서는 TS100_psycopg2로 입력한다.

Cloud9 환경 생성 세부정보 입력

새로운 EC2 인스턴스 영역은 별도로 수정하지 않고 진행한다.

Cloud9 새로운 EC2 인스턴스 영역

이후 네트워크 설정 영역도 수정 없이 우측 하단의 생성 버튼을 클릭해 새로운 Cloud9 환경을 생성한다.

Cloud9 환경 생성

새로운 Cloud9 환경이 생성되면 콘솔에 생성한 클라우드가 나타난다. 생성했던 TS100_psycopg2를 클릭해 화면을 이동한다.

AWS Cloud9 콘솔

Cloud9 열기 버튼을 클릭하여 클라우드를 실행한다.

Cloud9 실행

Cloud9를 실행하면 다음 화면이 나타난다. 여기서는 하단 영역인 bash 영역을 사용한다.

Cloud9 콘솔

bash 영역에 다음 명령어를 입력해 Python3.8을 설치한다.

sudo amazon-linux-extras install python3.8

파이썬을 설치하던 중 콘솔에 다음과 같은 화면이 나타난다면, 소문자 y 입력 후 엔터를 입력하면 파이썬이 설치된다.

Python 설치 선택 화면

이후 오픈소스 모듈을 간편하게 설치하기 위해 다음 명령어를 차례대로 입력해 pip를 설치한다.

curl -O https://bootstrap.pypa.io/get-pip.py
python3.8 get-pip.py --user

다음 명령어를 입력해 python 폴더를 생성한다.

mkdir python

이후 다음 명령어를 입력해 psycopg2 모듈을 다운로드한다. 모듈이 설치완료되면 다음과 같이 python 폴더 내 3개의 폴더가 생성된것을 확인할 수 있다.

sudo python3.8 -m pip install psycopg2-binary -t python/
psycopg2 설치 후 폴더구조

이후 다음 명령어를 입력해 zip파일을 생성한다.

zip -r layer.zip python
layer.zip 추가 후 폴더구조

생성된 layer.zip 파일을 우클릭해 Download 버튼을 클릭하여 다운로드를 진행한다.

layer.zip 다운로드 방법

다시 AWS Lambda 콘솔로 이동해 TS100_Function을 클릭한다. 좌측에 있는 계층 버튼을 클릭한다.

계층 설정 이동 방법

계층 콘솔에서 우측 상단의 계층 생성 버튼을 클릭한다.

계층 생성 방법

계층 생성 화면에서 계층 구성 영역의 정보를 입력한다. 여기서는 psycopg2Layer 이름을 입력한다. 이후 이전에 다운로드 받았던 layer.zip 파일을 업로드한다. 호환 런타임을 Python3.8로 설정 후 생성 버튼을 클릭해 새로운 레이어를 생성한다.

AWS Lambda 계층 생성

다시 TS100_Function 콘솔로 이동해 화면을 아래로 이동하면 계층 영역이 나타나는것을 확인할 수 있다. [Add a layer] 버튼을 클릭하여 레이어 추가 화면으로 이동한다.

AWS Lambda Layer 추가 방법

계층 추가 화면에서 계층 소스를 사용자 지정 계층을 선택한다. 사용자 지정 계층을 psycopg2Layer로 설정하고, 버전을 1로 설정 후 우측 하단의 추가 버튼을 클릭해 계층을 추가한다.

계층 선택 방법 및 생성

이후 코드 영역을 다음과 같이 작성 후 중앙의 Deploy 버튼 클릭해 함수를 업데이트한다. 함수가 업데이트되면 Test 버튼을 클릭한다.

import psycopg2 # 추가된 부분
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

처음 Test 버튼을 클릭하면 팝업화면이 나타난다. 다음과 같이 입력 후 저장 버튼을 클릭한다.

테스트 이벤트 구성 팝업

오류가 발생하지 않고 psycopg 라이브러리를 import 할 수 있는것을 확인할 수 있다.

psycopg2 라이브러리 import 성공

데이터베이스 연결

여기서는 psycopg2 라이브러리를 이용해 AWS에 업로드되어있는 PostgreSQL을 연결한다.

우선 PostgreSQL을 연결하기 위해 호스트, 데이터베이스, 유저, 비밀번호 정보가 필요하다.

호스트 정보는 RDS 콘솔 → 생성한 데이터베이스 → 연결 & 보안 → 엔드포인트 부분을 확인한다.

Host 정보 위치 확인

데이터베이스, 테이블 정보는 pgAdmin 화면에서 확인할 수 있다.

데이터베이스, 테이블 정보 확인

비밀번호 정보는 AWS내 RDS 생성 시 입력했던 마스터 비밀번호를 사용한다.

다시 Lambda 함수 콘솔화면으로 돌아와 코드를 다음과 같이 수정한다.

import psycopg2
import json

def lambda_handler(event, context):
    try:
        conn = psycopg2.connect(
            host = "호스트 주소",
            database = "데이터베이스 이름",
            user = "유저 이름",
            password = "마스터 비밀번호"
        )
    except:
        print("no database")

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

이후 중앙의 Deploy 버튼을 클릭해 코드를 배포한다. 코드가 반영된다면 상단에 “함수가 업데이트 되어있습니다"라는 알림이 나타난다.

Lambda 함수 배포

함수 배포 후 Test 버튼을 클릭하면 함수실행이 성공한것을 확인할 수 있다.

Lambda 데이터베이스 연결 성공

데이터베이스 저장

Lambda를 통해 연결된 데이터베이스 온도정보를 저장하는 방법을 설명한다. 다음은 PostgreSQL의 데이터베이스 내용이다.

name: text(텍스트)

temperature: double percision(정수)

date: timestamp without timezone(년-월-일 시:분:초)

PostgreSQL에 온도정보를 저장하기 위해 SQL문을 작성한다.

INSERT into "TemperatureInformation" (name, temperature, date) values ('TS100-12345', 34.5, '2023-09-07 09:00:00');

Lambda 함수 콘솔 화면으로 이동해 lamdba_function코드를 수정한다. TemperatureInformation 데이터베이스에 이름 TS100-12345온도 34.5, 타임스탬프 2023-09-07 09:00:00 데이터를 삽입하는 코드이다.

import psycopg2
import json

def lambda_handler(event, context):
    try:
        conn = psycopg2.connect(
            host = "호스트 주소",
            database = "데이터베이스 이름",
            user = "유저 이름",
            password = "마스터 비밀번호"
        )
       
        # 추가된 부분
        with conn.cursor() as curs:
            try:
                curs.execute("INSERT into \"TemperatureInformation\" (name, temperature, date) values ('TS100-12345', 34.5, '2023-09-07 09:00:00');") # 온도정보 저장
                curs.execute("commit") # 트랜잭션 테이블에 반영
               
                print("데이터 삽입 성공")
            except:
                print("Query Errorr")

    except:
        print("no database")

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

이후 화면 중앙의 Deploy 버튼 클릭 후 함수 배포가 완료되면 Test 버튼을 클릭해 데이터베이스에 온도정보가 저장된다.

데이터베이스 정보 추가

클라우드 데이터베이스 온도 확인

데이터베이스에 저장된 온도정보를 확인하는 방법에 대해 설명한다.

pgAdmin으로 온도정보 확인을 위해 pgAdmin 실행 후 Tables 우클릭 → Query Tool을 클릭해 Query 실행 화면으로 전환한다.

Query Tool 화면 이동방법

이후 Query 영역에 SQL문 작성 후 실행버튼을 클릭하면 데이터베이스에 정보가 추가되어있는것을 확인할 수 있다.

-- 데이터베이스 내 전체 정보 검색
select * from "TemperatureInformation";
클라우드 데이터베이스 내 온도정보 추가 확인

Lambda 함수에서 저장된 온도정보를 수신하는 코드를 작성한다. Lambda 함수 수정 후 Deploy → Test 버튼을 클릭하면 다음과 같이 클라우드 데이터베이스에 저장된 정보를 확인할 수 있다.

import psycopg2
import json

def lambda_handler(event, context):
    try:
        conn = psycopg2.connect(
            host = "호스트 주소",
            database = "데이터베이스 이름",
            user = "유저 이름",
            password = "마스터 비밀번호"
        )
       
        # 추가된 부분
        with conn.cursor() as curs:
            try:
                # 데이터베이스 내 온도정보 검색
                curs.execute("select * from \"TemperatureInformation\"")
                # 쿼리 결과를 data 변수에 반환
                data = curs.fetchall()
                # 온도정보 출력
                print(f"{data}")
            except:
                print("Query Errorr")

    except:
        print("no database")

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
Lambda 함수로 온도 정보확인

API Gateway 연결

스마트폰에서 측정된 온도정보를 서버에 전달하기 위해서 Lambda와 API Gateway를 연결한다. API Gateway란 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링을 제공하는 서비스이다.

API Gateway 서버 연결

AWS 콘솔에서 검색영역에 API Gateway 입력 후 API Gateway를 클릭한다.

API Gateway 이동 방법

API Gateway 콘솔에서 화면을 아래로 이동하여 REST API 영역의 구축 버튼을 클릭한다.

REST API 생성

REST API 생성화면에서 프로토콜은 REST, 새 API를 차례대로 선택 후 API 이름을 입력한다. API 이름 입력을 완료했다면, 우측 하단의 API 생성 버튼을 클릭해 API를 생성한다.

REST API 생성 방법

API Gateway 콘솔에서 상단의 작업 → 리소스 생성 버튼을 차례대로 클릭해 리소스를 생성한다.

리소스 생성 방법

새 하위 리소스 영역이 나타나면 리소스 이름 입력 후 우측 하단의 리소스 생성 버튼을 클릭해 리소스를 생성한다.

새 리소스 생성 방법

ts100_resource 리소스가 생긴것 확인 후 작업 → 메서드 생성 버튼을 차례대로 클릭해 메서드를 생성한다.

리소스 내 메서드 생성

ts100_resource 아래영역에 나와있는 메서드를 GET으로 설정하고 우측의 체크버튼을 클릭한다.

메서드 타입 설정

우측에 나타난 설정 영역을 다음과 같이 설정 후 저장 버튼을 클릭해 메서드를 생성한다. 이때, API Gateway와 Lambda 함수가 연결된다.

메서드 속성 설정 방법

Lambda 함수에 대한 권한 추가 팝업이 발생하면 확인 버튼을 클릭한다.

Lambda 함수 권한 추가 팝업

함수 생성을 완료하면 다음 화면이 나타난다. 메서드 요청 버튼을 클릭해 메서드 속성 관련 설정 화면으로 이동한다.

메서드 설정 이동 방법

메서드 콘솔 설정 화면으로 이동 후 하단의 쿼리 문자열 추가버튼 클릭 후 아래 표와 같이 파라미터를 추가한다.

이름필수캐싱

name

YES

NO

temperature

YES

NO

date

YES

NO

메서드 문자열 파라미터 추가

다시 Lambda 콘솔로 돌아오면 TS100_Function 함수와 API Gateway가 연결된것을 확인할 수 있다.

API Gateway 연결 후 Lambda 함수 콘솔

이후 코드영역을 다음과 같이 수정한다. 파라미터를 올바르게 수신했다면 바나나 체온계의 기기 이름, 온도, 날짜정보를 리턴한다.

import psycopg2
import json

def lambda_handler(event, context):
    # 추가된 부분
    query_parameters = event.get('queryStringParameters', {})
   
    # 바나나 체온계 이름, 온도, 날짜정보 수신
    name = query_parameters.get('name', None)
    temperature = query_parameters.get('temperature', None)
    date = query_parameters.get('date', None)
    
    # 파라미터가 올바르게 수신되었다면
    if name is not None and temperature is not None and date is not None:
        return {
            'statusCode': 200,
            'body': json.dumps([name, temperature, date])
        }
    else:
        return {
            'statusCode': 400,
            'body': json.dumps('Parameter Error')
      }

Lambda 함수가 온도정보를 올바르게 수신하는지 확인하기 위해 API Gateway 콘솔로 이동 후 테스트 버튼을 클릭해 테스트 화면으로 이동한다.

API 테스트 영역으로 이동

쿼리 문자열을 다음과 같이 입력 후 테스트 버튼을 클릭하면 응답 본문에 온도, 날짜정보가 출력되는것을 확인할 수 있다.

name=TS100-12345&temperature=36.5&date=2011-11-11 11:11:11

API 메서드 테스트

API 배포

API 메서드 테스트를 진행했으니, API를 배포해 직접 URL로 API를 호출을 수행한다. API 리소스 콘솔에서 작업 → API 배포 버튼을 클릭한다.

API 배포

API 배포 팝업이 나타나면, 배포 스테이지를 [새 스테이지]로 설정하고, 스테이지 이름 입력 후 배포 버튼을 클릭해 API를 배포한다.

API 배포 팝업

API배포를 수행하게 되면 API 스테이지 화면으로 이동되고, 화면 상단에 API URL이 나타난다.

API 스테이지

API URL 호출

이제 API를 생성했으니, URL로 API를 호출해 보겠습니다. 웹 화면에서 다음과 같이 URL작성 후 접속하면 API에 작성했던 온도 정보가 화면에 출력되는것을 확인할 수 있습니다.

API 스테이지 URL + /ts100_resource?name=TS100-12345&temperature=36.5&date=2011-11-11 11:11:11

API 호출 테스트

Last updated