본문 바로가기

Cloud/Oracle Cloud Infrastructure (OCI)

OCI API Gateway와 Function을 이용한 서버리스 웹 어플리케이션 샘플 - #1 Overview & 사전준비

총 네개의 시리즈로 OCI API Gateway와 Function을 이용한 서버리스 웹 어플리케이션 샘플 구성 방법을 살펴보겠습니다.

 

Reference

아래 사이트 및 도서를 참조하여 작성한 문서입니다.

 

Overview

OCI API Gateway와 Function을 이용해서 서버리스 웹 어플리케이션 샘플을 구성해 보았습니다. Oracle Cloud Infrastructure (OCI)에서 서버리스 API를 사용하면 서버를 프로비저닝하고 관리하는 데 시간을 소비하는 대신 어플리케이션에 집중할 수 있습니다.

OCI 웹 콘솔에서 Function을 만들고, API Gateway를 이용해서 HTTP API를 생성해서 API를 호출합니다. HTTP API를 호출하면 API Gateway는 요청을 OCI Fuction으로 라우팅합니다. 여기에서 OCI Function은 함수를 실행하고 API Gateway에 응답을 반환합니다. 그러고 다시 API Gateway가 응답을 반환하는 방식입니다.

사용한 OCI Function 코드는 Python으로 작성했으며, 두개의 업무 HR과 Finance를 각각 호출하는 함수로 되어있습니다. 그리고 데이터베이스는 MySQL로 구성했습니다. OCI Function을 빌드하면 도커 이미지로 OCI Container Registry에 등록이 되고, OCI Function과 API Gateway의 모니터링과 로깅은 OCI Monitoring, Logging 서비스에 의해 제공됩니다.

 

작업 순서

  1. 사전 준비 - OCI CLI 설치/설정
  2. OCI Function 개발 환경 구성 - OCI 컴퓨트 인스턴스 위에 구성
  3. 데이터베이스 설치/설정 - MySQL
  4. 어플리케이션 코드 준비 및 OCI Function 코드로 전환 - Python
  5. OCI Function 배포 및 테스트
  6. API Gateway 생성/설정/테스트

 

사전 준비

현재 작업 환경 컴퓨트 인스턴스는 스펙은 아래와 같습니다.

  • Image: Oracle-Linux-7.9-2022.04.26-0
  • Shape: VM.Standard.E4.Flex
  • OCPU count: 4
  • Memory (GB): 64

컴퓨트 인스턴스는 별도 컴파트먼트 “demo-compart”를 생성해서 그 아래 위치시켰으며, 또한 별도로 생성한 VCN의 퍼블릭 서브넷에 컴퓨트 인스턴스를 생성했습니다.

 

Python 설치 확인

2022년 5월 현재, 테스트 환경인 Oracle Linux 7.9에는 Python 2.7.6 버전과 3.6.8 버전이 아래와 같이 이미 설치되어 있으며, 디폴트 Python은 2.7.5 버전입니다. 이후 사용할 pymysql 등의 최신 버전 패키지 설치 등을 위해 디폴트 버전을 3.6.8로 변경하겠습니다.

[opc@demo ~]$ which python3.6
/usr/bin/python3.6
[opc@demo ~]$ python --version
Python 2.7.5

 

디폴트 Python 버전을 아래 alternatives 명령을 통해 3.6.8 버전으로 변경했습니다. 디폴트 Python 버전으로 변경된 것과, Python 라이브러리를 관리하는 pip도 설치되어 있는 것을 알 수 있습니다.

[opc@demo ~]$ alternatives --list | grep -i python
[opc@demo ~]$ sudo alternatives --install /usr/bin/python python /usr/bin/python2.7 1
[opc@demo ~]$ sudo alternatives --install /usr/bin/python python /usr/bin/python3.6 2
[opc@demo ~]$ sudo alternatives --config python

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
   1           /usr/bin/python2.7
*+ 2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number:
[opc@demo ~]$ python --version
Python 3.6.8
[opc@demo ~]$ pip3.6 --version
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)

참고로 Python 3 버전으로 디폴트 Python 변경 후, yum 실행 시 아래와 같은 에러가 발생할 수 있습니다.

 

[Error #1] File "/bin/yum", line 30 except KeyboardInterrupt, e:

[Error #2] File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax

 

위와 같은 에러 발생 시, “/usr/bin/yum” 파일과 “/usr/libexec/urlgrabber-ext-down” 파일 맨위 #!/usr/bin/python 를 #!/usr/bin/python2.7 과 같이 변경해 주면 정상적으로 yum이 실행됩니다.

 

OCI CLI 설치/설정

이번 테스트에서는 OCI Function 호출 시 OCI 자원에 대한 인증을 VM 인스턴스의 .oci/config 파일을 참조하도록 했습니다. OCI CLI를 설치하고, “oci setup config”를 수행했습니다.

먼저 설치 스크립트를 실행해서 OCI CLI 최신 버전을 설치합니다. opc 유저로 설치했으며, 설치 과정에 나오는 옵션들에 대해서는 모드 엔터를 쳐서 디폴트로 설치했습니다.

[opc@demo ~]$ whoami
opc
[opc@demo ~]$ bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
...
===> Modify profile to update your $PATH and enable shell/tab completion now? (Y/n): Y

===> Enter a path to an rc file to update (file will be created if it does not exist) (leave blank to use '/home/opc/.bashrc'):
-- Backed up '/home/opc/.bashrc' to '/home/opc/.bashrc.backup'
-- Tab completion set up complete.
-- If tab completion is not activated, verify thYat '/home/opc/.bashrc' is sourced by your shell.
--
-- ** Run `exec -l $SHELL` to restart your shell. **
--
-- Installation successful.
-- Run the CLI with /home/opc/bin/oci --help
[opc@demo ~]$

 

OCI CLI 설치를 확인합니다.

[opc@demo ~]$ oci --version
3.9.1

 

CLI를 사용하기 전에 OCI 작업에 필요한 자격 증명이 포함된 구성 파일을 생성해야 합니다. 아래와 같이 대화식 "oci setup config” 명령을 사용하거나 텍스트 편집기를 사용하여 수동으로 이 파일을 만들 수 있습니다.

CLI 구성 파일을 생성하기 위해서 사전에 User OCID, Tenancy OCID, Region 식별자를 확인해야 합니다.

  • User OCID는 OCI 웹콘솔 오른쪽 상단의 User Profile > User Settings 에서 가져올 수 있습니다.
  • Tenancy OCID는 OCI 웹콘솔 오른쪽 상단의 User Profile > Tenancy 화면에서 가져올 수 있습니다.
  • Region 식별자: Regions and Availability Domains를 참조합니다.

그리고 OCI CLI 설정 과정에서 API Signing RSA key pair를 신규 생성했습니다.

[opc@demo ~]$ oci setup config
    This command provides a walkthrough of creating a valid CLI config file.

    The following links explain where to find the information required by this
    script:

    User API Signing Key, OCID and Tenancy OCID:

        <https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#Other>

    Region:

        <https://docs.cloud.oracle.com/Content/General/Concepts/regions.htm>

    General config documentation:

        <https://docs.cloud.oracle.com/Content/API/Concepts/sdkconfig.htm>

Enter a location for your config [/home/opc/.oci/config]:
Enter a user OCID: ocid1.user.oc1..aaaaaaaa____________________________________________________
Enter a tenancy OCID: ocid1.tenancy.oc1..aaaaaaaa____________________________________________________
Enter a region by index or name(e.g.
1: af-johannesburg-1, 2: ap-chiyoda-1, 3: ap-chuncheon-1, 4: ap-dcc-canberra-1, 5: ap-hyderabad-1,
6: ap-ibaraki-1, 7: ap-melbourne-1, 8: ap-mumbai-1, 9: ap-osaka-1, 10: ap-seoul-1,
11: ap-singapore-1, 12: ap-sydney-1, 13: ap-tokyo-1, 14: ca-montreal-1, 15: ca-toronto-1,
16: eu-amsterdam-1, 17: eu-frankfurt-1, 18: eu-marseille-1, 19: eu-milan-1, 20: eu-stockholm-1,
21: eu-zurich-1, 22: il-jerusalem-1, 23: me-abudhabi-1, 24: me-dcc-muscat-1, 25: me-dubai-1,
26: me-jeddah-1, 27: sa-santiago-1, 28: sa-saopaulo-1, 29: sa-vinhedo-1, 30: uk-cardiff-1,
31: uk-gov-cardiff-1, 32: uk-gov-london-1, 33: uk-london-1, 34: us-ashburn-1, 35: us-gov-ashburn-1,
36: us-gov-chicago-1, 37: us-gov-phoenix-1, 38: us-langley-1, 39: us-luke-1, 40: us-phoenix-1,
41: us-sanjose-1): us-ashburn-1
Do you want to generate a new API Signing RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y
Enter a directory for your keys to be created [/home/opc/.oci]:
Enter a name for your key [oci_api_key]:
Public key written to: /home/opc/.oci/oci_api_key_public.pem
Enter a passphrase for your private key (empty for no passphrase):
Private key written to: /home/opc/.oci/oci_api_key.pem
Fingerprint: 18:b6:ce:60:47:95:e1:e1:79:59:f1:8a:32:10:c1:77
Config written to /home/opc/.oci/config

    If you haven't already uploaded your API Signing public key through the
    console, follow the instructions on the page linked below in the section
    'How to upload the public key':

        <https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#How2>

 

이제 API 키 중에서 public 키 내용을 OCI 웹콘솔의 사용자 정보에 등록해야 합니다. public API 키 내용을 복사합니다.

[opc@demo ~]$ cat .oci/oci_api_key_public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArjGTCD3jcU5sQw2OKz8v
NTZCUvd+wlZlcyCmUDR+XoYeTYyoMW6rF2dk9Pgxkc3Aa+gCQoA3kwRdqay8f3Da
JVWnPdz8K84hCq+qdx3Uj5d6/4THOubjisvcZSmJoABufTemCknxO+jkZC8qVxgt
zeRMoK/XzGPR0oLpiMNpWrfXlFD770eOtBGuNjg1xCdbBuRxtoK5lPx0b7ClTYaj
Nj5wayA59nZt/HzG7xWCdGzJ0mP8A+z9Ptla5V8rcDGzl2gCxtpOgcYGRlXl7g0d
bngpKXZh9yMF/LHTuc1u+PAb5yg2mCp3PxLCXwitDgKTpFsHj9dGnHX5lzbryYuS
mwIDAQAB
-----END PUBLIC KEY-----

 

복사한 API public 키를 OCI 웹콘솔의 오른쪽 상단 User Profile > User Settings 의 API Keys 화면에서 등록합니다. Add API Key를 클릭해서 나타난 팝업창에서 Paste Public Key를 선택하고, public API 키를 붙여넣고 Add를 클릭합니다.

 

이제 터미널에서 oci 명령을 수행해서 OCI CLI가 정상적으로 수행되는지 확인합니다. 아래 명령은 오브젝트 스토리지 네임스페이스를 출력하는 명령입니다.

[opc@demo ~]$ **oci os ns get**
{
  "data": "apackrsct01"
}

 

VCN 설정

이후 OCI Function과 API Gateway가 컴퓨트 인스턴스에 MySQL과 HTTPS 통신을 할 수 있도록 3306포트와 443 포트를 개방합니다.

[opc@demo ~]$ sudo -s
[root@demo opc]# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@demo opc]# firewall-cmd --permanent --zone=public --add-port=443/tcp
success
[root@demo opc]# firewall-cmd --reload
success
[root@demo opc]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports: 3306/tcp 443/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 

컴퓨트 인스턴스가 사용하는 서브넷의 시큐리티 리스트에도 아래와 같이 해당 포트에 대한 개방 규칙을 추가합니다.

다음 글:

2022.05.23 - [Cloud/Oracle Cloud Infrastructure (OCI)] - OCI API Gateway와 Function을 이용한 서버리스 웹 어플리케이션 샘플 - #2 OCI Function 개발 환경 구성

<END>