# 5.9. AWS 서버 생성

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

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

<figure><img src="https://lh7-us.googleusercontent.com/mxgYRDNVqwmMhrRvtFdiQ0y_talOU6YYOdHih3XKgUD8Veagn7ZB774y8ZS4N14eFT5QA4iVcgI7tzhj2K4w1ikdeySwr4XMthYvfSRKQl2J2zMYVFkp4imRA1vAijV4iK00i35QwLC29ThLDfWfoBM" alt=""><figcaption><p>AWS Lambda 이동 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/SpbkfzhByb6-vn9GpzNfbCz6jC9nQWjxluFU4m9aVn7-gjn26tGC6ckiX2rag2MsE4FeT8_dWBPHb_JQD8JSGaLa-nRjn3X2hXiCYjjtxrPjQTbvkKx111gGNiGJwDbCbTDuxWZ9SDIeMzCSkWn6e9U" alt=""><figcaption><p>Lambda 함수 생성</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/IPfolYPYXXiXNiLQShshMdrwD7b67hvSwbz8aHa2MPO5sArtGm7uAnW9unkkf14GJWqrP1QL1DeIw821X9CWVzkT8uKxyfBeCnzXRgU5k8LbJJavRafzvweDM_U3ZXkjjau1N5RcyTt2F36oU3d5kTk" alt=""><figcaption><p>함수 정보 입력</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/FeV3clo2QM-mo8rg6QhBdx5GxW0cdymHyzbYWoUylIoBceK5JUIInyrERmdgLp_pnP7isarfgfFuJkYR7vF0t0iruWGQbGp_17zsoX3QcLKw_Zc4BuJMZIOLn3qQAP7AzVioyehjzD47ItWQfXJM9_4" alt=""><figcaption><p>Lambda 함수 콘솔</p></figcaption></figure>

## psycopg2 라이브러리 설치

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

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

<figure><img src="https://lh7-us.googleusercontent.com/Ika5aNBkpA_SgEq2i7lUSPqPFeEFHDjuvYoQ6nnoxQAuhGRCtHpkWU54-zC4O4NPX2RUjjzocBlhNSBrTBbOzud3ECdfL70gzOHKWqtimwZmitli4elRsy3t9Cbc6ehVbEJZUm8Hkcx9MJSsj6EOVqw" alt=""><figcaption><p>Cloud9 검색 및 이동</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/PUsSrtn55Ft1qAUEwL4-1U7LzlSBDiTdUPYt1CfcorurDme2o98xoloM6Dx46w0nIEieu6AnumEucK64RfbeuI7VJ71tp-AMR6Hdb6aHe5THcCBu6kY8lJvA2IWmwyG_ftxbIsVj_h8FcmBVH48L5cw" alt=""><figcaption><p>Cloud9 환경 생성 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/cKM55iGCfrOfLaGGZbedM00gubT-n6ZRpGfvxhM8vwTx1HbCgQnS---DkgmAwy04qJVUnrBYU4ObwitR2e-RdcD7fNKHScNhO4AnBqdm9EdwOEuRZh0Lgj23fwq94x9curGIzammuFY6AN2VTfuSzhM" alt=""><figcaption><p>Cloud9 환경 생성 세부정보 입력</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/U7yYDL2PkAlTVLneiabZcRnvk_3fmizwn4aNLPjoYmO4KA-3R9dDfthrwy7GU3R-YngqQRN1G-mfM2E_GcgSDeFkYCfLpgKgrHdrYacQ09nCb4S-_KDbqtEVzWj9JrNiANR8yN2cSZpBz75pFSqPZnc" alt=""><figcaption><p>Cloud9 새로운 EC2 인스턴스 영역</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/XQuHIfBJmypTP8amI35kB-MSsvtfYX-gJACRxfRVmI2ad3QaWLSF4GgYRChViUSl8uTZWfYTvHeUztU93j3T5V1ZGxQnYrL8XA19083xcFe2rBB73NztR0j5pcbG0-zXXlI4rRFbAhkyCIB2VvKSuS0" alt=""><figcaption><p>Cloud9 환경 생성</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/FxdZGLXK7Xcr5So-lmKnAc_lrLJwgjuyEM9AOvbKLWiMlgC_ZSHC9HhBXXsckObyHt4MD4FCt7PuTsEJ9ct_ML6wuHHaHf5Jmhd0pBRwOAdqVZEIxiIcvZjS0xqt2TfrQtGmkyyR5QelRyXBLl6Ov3M" alt=""><figcaption><p>AWS Cloud9 콘솔</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/DNjS724iYXiQUqMvV_Z-BnZbrQFnptgzaN4sdubmPvc6f3VodiCCCqLNiun_O2Poy3NpAdE05tFRSEYTUmOQWheNuXez2AP0dS5ZPd-DzpICifePIEDEhiDAmUEeeZoh8AV-NVWJGCLQus5XOsvDnrc" alt=""><figcaption><p>Cloud9 실행</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/YwysDGvVGr2TbfZ2_sedqb2z7OQUlDQbdWOToCwr_CT3lVj_CAPNN2SwtkjqQ-bQPeUgytHgGxCXWun4cD8A0BsyKsbRnlMukRxtkRZln2TeHvdA-pqrQPlA5IHoUhfFK9p8iieo4Z4yYi78VetQB1c" alt=""><figcaption><p>Cloud9 콘솔</p></figcaption></figure>

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

{% code overflow="wrap" %}

```
sudo amazon-linux-extras install python3.8
```

{% endcode %}

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

<figure><img src="https://lh7-us.googleusercontent.com/yzwSH0eGFhylq9Zku3yy8MJSFw9nnniLrJwhNIIVXrcZGo_hfFlMF0diQgFttpQKkGjeDl8mg0L4k_IZWqzyzJEtLU1FLPjRbkMP33PcfhyJnfn4EsyuJofc2MU5Hfj-QAV60bWFwSRrF-mAnD5vqSA" alt="" width="375"><figcaption><p>Python 설치 선택 화면</p></figcaption></figure>

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

{% code overflow="wrap" %}

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

{% endcode %}

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

{% code overflow="wrap" %}

```
mkdir python
```

{% endcode %}

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

{% code overflow="wrap" %}

```
sudo python3.8 -m pip install psycopg2-binary -t python/
```

{% endcode %}

<figure><img src="https://lh7-us.googleusercontent.com/MUSk8F3hXe3EQtLz603BmhbyNj4-ntFfJaEozCu5nGGhf9vhk3HDIjzMNsL9ZrDM_Zs9k-TT6YmTQytaDK_kaz2nHQ7n_fDW8gWJL1BKdOvVjXIPMkVY5aiv7HwRlinKV8-mQfWeqSIIJpzFksTHoZA" alt="" width="375"><figcaption><p>psycopg2 설치 후 폴더구조</p></figcaption></figure>

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

{% code overflow="wrap" %}

```
zip -r layer.zip python
```

{% endcode %}

<figure><img src="https://lh7-us.googleusercontent.com/UB0k5QSFw8sjFf-q2Wd7GJGi__8O7hNsZ6VrecUv3kg9AwITX1ymHIgjTIThE9S3xasCiS2g56XZkWNPKIcKJ8-dNsXu4cNLvZXwmsfnBHlEeNiPvBdC5l_JBXSNg3Kw0MDFjsQvZLcU0UdSYcgObgU" alt="" width="375"><figcaption><p>layer.zip 추가 후 폴더구조</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/SHmXBWgOlI16SDVNlT496GYC-SOJiu6wDEDY2XvqtN4o6npAOjgkiwUhd8e7foI0ekJy4w2UzE4AvWmAKGUHNz2ZnCHDyookA42rKWGRkZrFhtAwj9zbd35a1rMCVK5uILdcJ3ytTCeL4TZQUvfJsQE" alt=""><figcaption><p>layer.zip 다운로드 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/TWMZUR2SV6JdRxwMrkd6VV0cHAqaTPJPUALeHAZ3DxLoBj5Avq_dUEBmNphFCmQ-pvkqPr7ZMxCba6tnt8YmgVVrsygt-EH9-T0cV6HleOHVaPZAfKqS2PlhvApHqM0xFi1pVy32fG7hunxsJItYc-w" alt=""><figcaption><p>계층 설정 이동 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/Viu1wtkOdfsAxrzIvHfoqeZlMRx7QAnAaDpRC3_Lyer_kpAeouNTxcrR7XhHy2g97Z6ss5aW_Jd8p9VOsfhcd3jleMvxam1PbDlvJ2kjkOWtwFl5mTE_AB_jQEu5HB-XQyMyXpNzFvgIqIBUqEXkol4" alt=""><figcaption><p>계층 생성 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/6kz7q9GBK4GjLvT9MkZ0G3hvRb26Egct-nTrx6iLCjCzrSCq93oWJaYGO9r81mrHNtO82QYhS2S_p3sFoJcegTn0wN6tRqjudZt2EsmuI8_wjSuJslC9Z2cueYo_9lpmvTVBpDys__LbuD8b_4NG0PQ" alt=""><figcaption><p>AWS Lambda 계층 생성</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/LLaocTlgD-tdNalDm6zdfX7Y5CT_J46MZpniZ_iGfBScVStF6N6iqmy2M7MnmWHOxO7lo1eceGzLuO1fyI7jwgqWFTXzaD-FCST4C2MckWZ8sTvFv5Le0x7ZEBfsudCjvcerA7gJwHyiqNfyNe8kd70" alt=""><figcaption><p>AWS Lambda Layer 추가 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/bvJL_gDRJRjJzNenpUKl9zIOScbviz6VJLPhVQnTfjsRukDuxT8UnyLyR2Yyf08YF9ndT17KbgjRuLTtn_xjRlOZnZknYf-t-i6H8eIlrkQqobfvkEspQFyES2_A-2NPvI9JVi66uQUphbP1KFmT94U" alt=""><figcaption><p>계층 선택 방법 및 생성</p></figcaption></figure>

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

{% code overflow="wrap" %}

```python
import psycopg2 # 추가된 부분
import json

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

{% endcode %}

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

<figure><img src="https://lh7-us.googleusercontent.com/QXknYdwus1YqljtqaP0fv436gREXa-yHm4YOS7vntN0yYhrZjNp0CSaqx78vZycT-62l2gINtqMKq1lKQNwREebK0q31jkdH2Tm3_8ltdc0SOVO-rdOJgTw1cK6-bvF1O8U3fkoNgTWys9Zv6GZPH_4" alt=""><figcaption><p>테스트 이벤트 구성 팝업</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/ubbdEn177nGPfwMOwxAwtgc6FMi2I9Rscb7fUJZxEK-a38UwX1ooLFLzEwoAz_3jE2k2YbBRp-hv934DjOBN_O_aBq4YUMTtPmX00V6DofVEv79SrQn8MZCggh-1dCZPFFXI7l6pTjV04QKZRMlFbYU" alt=""><figcaption><p>psycopg2 라이브러리 import 성공</p></figcaption></figure>

## 데이터베이스 연결

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

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

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

<figure><img src="https://lh7-us.googleusercontent.com/9e2h0bon02GXV9ugpj7PrkiPkotoLYHCSSqWl7aMLwwLb7jpjg8EW46x2Dgvo7omR14SQNFo7aXNtW04x5rwW5XDH8__mX-uhcO2YNlcpaNRXMAuQf9NUDDXyXmJ3K6A7MYbudPWCJubkuinz__HE0w" alt=""><figcaption><p>Host 정보 위치 확인</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/Vr9yC8rbtRu6Aiq4a17lW-J2wMlcpsjhBfoXv4Ig4FKoMz-qP6Ma-1ofWWsL4DzPoR4_mD_gqOLJjOrQlLfI0fBlz9Mqzac7hsd_vu4x2Wvm-1PX1swuN_TAPZ261fyTjtKms4xvwXBp-5ArqChRVAk" alt=""><figcaption><p>데이터베이스, 테이블 정보 확인</p></figcaption></figure>

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

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

{% code overflow="wrap" %}

```python
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!')
    }
```

{% endcode %}

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

<figure><img src="https://lh7-us.googleusercontent.com/76syRLzgFFFYfErmmnr0jXheT0vBOnKjDo1melKVt_kjo8DwMKwdFi3AvNY5gY8O3Vq-56c2dpiSxXRQE6cqjwQB_pUPw7Ctlh9ibvHjIboZBGe0uWFK0oIRvPFK1Z_Ebn_Xvr5qk2h-G38J2hdPz5w" alt=""><figcaption><p>Lambda 함수 배포</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/iigqgCbhv9OFM4R-3_M-m3HWI9UwOSew8zNvGau_j14RrJKhk0eInu2GhNm7M4fn5SdgFYagb4btlPV220pgniKQp1U2HkgcfAwQlyLk6dzOc4VLnwqKyhK86aqd5yoOVCJhkGEOVuY8ia7zv5E8KVE" alt=""><figcaption><p>Lambda 데이터베이스 연결 성공</p></figcaption></figure>

## 데이터베이스 저장

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

> name: text(텍스트)
>
> temperature: double percision(정수)
>
> date: timestamp without timezone(년-월-일 시:분:초)

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

{% code overflow="wrap" %}

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

{% endcode %}

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

{% code overflow="wrap" %}

```python
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!')
    }
```

{% endcode %}

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

<figure><img src="https://lh7-us.googleusercontent.com/xAUExUu2Plrlu8xjsZSulg_6UWLzemyLOIaWgLhfHgoZVPwp_lJG09DO-bCS7gs-Ggs1y45hwVXdne7pN_5LkystjiIK91tFVPFJJa4gCPcTDJYplmyYRpgWcCb-xCO0GfM2-InnMQqZFL9zPJ4xu8o" alt=""><figcaption><p>데이터베이스 정보 추가</p></figcaption></figure>

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

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

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

<figure><img src="https://lh7-us.googleusercontent.com/0i_o5hD7ruxDyssJYKbqoYefZjPCF_5r0vxbl18tCHdiyIEG7Oj7LA5skGreOp2dyXnBI1NM2b-ocwtZGbH8gzRPFCrTc0r7ybeRcC4XUyczdjzlnXQrt-v_sB6op-unb0eXp6qp7woiufQz5m-SGYA" alt=""><figcaption><p>Query Tool 화면 이동방법</p></figcaption></figure>

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

{% code overflow="wrap" %}

```sql
-- 데이터베이스 내 전체 정보 검색
select * from "TemperatureInformation";
```

{% endcode %}

<figure><img src="https://lh7-us.googleusercontent.com/38jL2lU746-VXZSonV0OExRsgbh3SVqOLv8fi02wjWBwBAEzRdMWqZ9s1TKWT08E_0ajtJtPqvHwfRArjsuM07q1N5BAXYTOS45Wb5PGtadY-DI27ptHOCPB17g_HI-m8Tue6CAhC2EWoSXr2uSVazE" alt=""><figcaption><p>클라우드 데이터베이스 내 온도정보 추가 확인</p></figcaption></figure>

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

{% code overflow="wrap" %}

```python
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!')
    }
```

{% endcode %}

<figure><img src="https://lh7-us.googleusercontent.com/iv8_T7-YvCCSlRcMsgdKJyUOWNv1D8fvLRBxUxS17QrX0AZrgL404_sZvwASEMdu74NfwNCLPoTzteHOnDh8KLgeGQ7qJU-UW7KVquQC0RrhlHP0PSk0QbU_agbHleSQfHuS52q8dyECXr0nQJIpglk" alt=""><figcaption><p>Lambda 함수로 온도 정보확인</p></figcaption></figure>

## API Gateway 연결

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

### **API Gateway 서버 연결**

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

<figure><img src="https://lh7-us.googleusercontent.com/03rR3j4DZl7wSTXbcEaIVZZTwmbG_0SjtMrAYk5_yFmvqFGu03GGkOrBZ7bSQBLubuMSPMAulpQIegi9nZ9_HfLeGZWDR23nfuaH0tsvseBF83Ctodk1E6Hd4g-Pts0VE_2DoSGwiArkMmQ8KNZ9mPQ" alt=""><figcaption><p>API Gateway 이동 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/HC3V3GLdBd_GLckX8PYkgF3gVz6-NRTcswb-LcpzCf30VwjYd4qbOvo8LNSGXwpYoCSCjjP4pR2NcZ4SJ8lFvKYIwb4b-X6UZ9F8FIrgzYTZxEOETaoxFCoSMySnYWppN-0a4SrB6FAPVo8jNUJuc_I" alt=""><figcaption><p>REST API 생성</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/_XZ1oQBQepLrj2F9vKn3Gikd2OKx3FJkmNGvnlov_cviWSB3dYMBIh1JJisdXAoUsx6s34zq9yPI-LwgPKe-9YP7qoSug0_YRCOPQYxaKr2Z1j-JXQ7JlQ9RfJICpjrEpa1Q8Lfah6ltw96LRA2qAvU" alt=""><figcaption><p>REST API 생성 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/2biy9xJ6bG7k89IRwDiQi1RbMVNc6nRVmdejFzbKbmvdjxaubAZxVfZZM_CeELmeB4YSbIfoQ1ELcHGrPgmbd2ZR_Nbknbv-uOjhn-J_zKbQB4kRpilgNieftub2KPXN0LdFQWKYvKi-eRpxA1RjSEs" alt=""><figcaption><p>리소스 생성 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/JckGFw4n59JUMn5zmVNvBrK_URSxN540clYls3IKzKy-Vi536-UM_50zVobb6iXQWdcF90sLdmxQxDU_99VHhUz_eWQy3s21zVyBKonpa0_JFzeZCZ_Hq86X8NY1pApS5cCwo9vMJ6Rr62GZwdS-k-Y" alt=""><figcaption><p>새 리소스 생성 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/TmbKv47uPKNZmlfAPR_5RMYN35mafia4nX_4Cq-1qgBj5JmMAMjUWM2nIUdR7J-Jm8f3Z-TKrGtMmwSfJ40eJF3InKTRMFMx8y7_jgFQOvzNLW9eaB5SKnsGYPmK9WMPtRo6v5gKgaGW2laf7tU9hhg" alt=""><figcaption><p>리소스 내 메서드 생성</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/MD3voHLiYUnakgRXSApP919M0kJJ81S4Q9dpmHJBKhrNWR5PmJQeMPRtE5AiKi3AGoI4LPA428r0dYB0DTe6aPkPjgcwJZTyz43b9QPr9-v_ESL129GESeYbmf3jQKF6zLBG9HFBRVExBJvbOS45D44" alt=""><figcaption><p>메서드 타입 설정</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/0aGmKPs7GVXpTFfLQkRCmSBVe8NzY1a9G-fuZj0-CPzQ8lmZ1waGavoMqKhCNM9cF7nTOdIj1c2T16zMIVVDjAsW7I6OTAdZHypnl_5HtB7O55pmB7ghxQruWbgJaiR2KNF1DIYiKKxVfx4CsK_Kz2A" alt=""><figcaption><p>메서드 속성 설정 방법</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/wswZ7KwT23eSs3t7lFernmX_nzLLJFODgv3r-IhVMrp0a3VH5FeglKxdD9nCXQZuR6kgGAuks_FK1HIKZcpHyGCnPg41fg9WgnkkU5hkwZeD-w1MH7LFijDCKqp3ci6pNnnShXJP4j6kDRY57g_gUqQ" alt=""><figcaption><p>Lambda 함수 권한 추가 팝업</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/HLJclCnJj0bWE3_J-_R3kdidDl2eAUDW2QuImdHzc0u0B2Cj0HKurpyFo5Jb4LcjIIGyHolDeQosW-bl_ieiKlEhtkVQngmBVYbxb9IKq-4LYsD5HrbwQmhlrQ9aAs5uZ73EsUw2YJSMNOhoVnCCaIc" alt=""><figcaption><p>메서드 설정 이동 방법</p></figcaption></figure>

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

| 이름          | 필수  | 캐싱 |
| ----------- | --- | -- |
| name        | YES | NO |
| temperature | YES | NO |
| date        | YES | NO |

<figure><img src="https://lh7-us.googleusercontent.com/Ch6SznCgrP1bTuZPQLQQq64OyZBeO3JF3rbnG585pN4xI1hXF2-KC-67ca74A9bJ9XzlEAOkrIpJwjj2jeUypoVjuCw7-6yi24rDPWEgqR81pYPqm5EfxCoNpFWfx8HpUxl_k9hd3uThYlejvzPrxDI" alt=""><figcaption><p>메서드 문자열 파라미터 추가</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/ZOcJuW_I0S3ea3uOY4it6j2Qjnv8you4jN9KNZ7vGnF1lYU5yHVTWoscnK1GiHmeKkNw2GLf7Nh8QUeiCDXyWhcOh6qOWQqQTi-lRRp_zXnt5SprMFaWVz-_a2wb2G4gsv4V7sls13AVkIVFrmwKBtA" alt=""><figcaption><p>API Gateway 연결 후 Lambda 함수 콘솔</p></figcaption></figure>

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

{% code overflow="wrap" %}

```python
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')
      }
```

{% endcode %}

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

<figure><img src="https://lh7-us.googleusercontent.com/LihEmM0uv0sjhHU0aUuOCkRd_d2Ww-YdoLUoKvHucrDljHPVVuLkruXVhsBFd3PEEql9RcNGvhQBHRcL5JcFtbUk7CXALitxQFPkqne0lI9dvk_pyEyA_pvk1od2fH2ThETq3C6tS69VO4SevZ4v4Wg" alt=""><figcaption><p>API 테스트 영역으로 이동</p></figcaption></figure>

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

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

<figure><img src="https://lh7-us.googleusercontent.com/aVIYx25hyCrCzRh67YJJLGg3HVvCZzuGDHT5eGo6YrpAwrQJeAJHHQXYnpTGP1ZAeMg6rMUtqx_a43YcFM7XBGXu6Y5W8ynGB41Ybn8BBI7qMQWI9NCDnk4alq2uAJEO3M3GSk5atINOQsEUGwxI-CI" alt=""><figcaption><p>API 메서드 테스트</p></figcaption></figure>

### **API 배포**

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

<figure><img src="https://lh7-us.googleusercontent.com/to_Fwi2MC_zqbEX_WHUHEaXa6X8NVnWeIzpAl56ji7hDAl-6vghxk8RwLVNxOmIXNFybi2MnE2Zzo2-7CrTo7ecE2Oxlk2chKKXsGg6-yjj5BPNOf7O-bqCKaAt_GE3PAlxn1u_CG-e6xKShIm9tk34" alt=""><figcaption><p>API 배포</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/pAW8kqCmkZUawY2PuMr30Od_FgIhlrA3bu_YrRb5PEHUxvPX4vnpvjJoCnj1oWJXH8Ysgq7mEkgaUl5A6V-eOw8m6dyYU8RHtH4IzhkATbCxChyFxKV2w9xyRNKBz0pRXqyQSrRSIRayb9CbD7qcjT8" alt=""><figcaption><p>API 배포 팝업</p></figcaption></figure>

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

<figure><img src="https://lh7-us.googleusercontent.com/yDANVds8OWVUzD6I99iN2a7Z_QA8ZZAOm3DLgcqUo_nlftdwskCstRXdvSApeIS-kreahmuXmWPj2j8jQ20gEo1VwaoNFMvjzIWvRtrQXK0gNH9LEiAvCqfptExJSKk4TeEHLnB4EFh7xLWiVWx65Go" alt=""><figcaption><p>API 스테이지</p></figcaption></figure>

### **API URL 호출**

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

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

<figure><img src="https://lh7-us.googleusercontent.com/EJIbONAjC1HLO6RvNOiSu9qLQGX44KIOY9KVH6BQXtnOsHpGBMqT87LOYjKM7bZoHZZFtu4aM_n0_y3mDQetcPp0l_xlHruYkjxZj7y0coaqJCP7MZu4gB73CMX13Cpm5TVi0LLH6XydKAg1UWU0knM" alt=""><figcaption><p>API 호출 테스트</p></figcaption></figure>
