본문 바로가기

Cloud/Oracle Cloud Infrastructure (OCI)

OCI API Gateway와 Function을 이용한 서버리스 웹 어플리케이션 샘플 - #2 OCI Function 개발 환경 구성

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

이전 글:

2022.05.23 - [Cloud/Oracle Cloud Infrastructure (OCI)] - OCI API Gateway와 Function을 이용한 서버리스 웹 어플리케이션 샘플 - #1 Overview & 사전준비

 

OCI Function 개발 환경 구성

Oracle Function 개발 환경을 세팅하는 방법은 아래 세가지로 할 수 있습니다.

여기에서는 OCI 컴퓨트 인스턴스에서 환경을 설정했습니다.

  1. Cloud Shell 설정: 처음 사용자를 위한 오라클 권고 방식입니다. function을 생성, 배포하고 호출하는 일련의 과정을 빠르게 해 볼 수 있게 합니다. 아래 로컬 머신 또는 OCI 컴퓨트 인스턴스 환경에서 수행해야 하는 Docker나 Fn Project CLI 설치, 컨텍스트(context) 생성, 동적 그룹(Dynamic Group) 생성 및 설정(OCI 컴퓨트 인스턴스 환경의 경우) 과정을 하지 않아도 됩니다.
  2. 로컬 머신 설정: Function 사용을 위해 로컬 머신을 세팅할 경우, Fn Project CLI 컨텍스트를 생성할 때 --provider oracle을 명시해 주어야 합니다. 이 옵션을 사용하면 Oracle Function이 OCI 요청 서명, 개인 키, 사용자 그룹 및 해당 사용자 그룹에 권한을 부여하는 정책을 이용하여 인증(authentication) 및 권한 부여(authorization)를 수행할 수 있습니다.
  3. OCI 컴퓨트 인스턴스 설정: OCI 컴퓨트 인스턴스를 세팅할 경우, Fn Project CLI 컨텍스트를 생성할 때 --provider oracle-ip를 명시해 주어야 합니다. 이 옵션을 사용하면 Oracle Function이 인스턴스 OCID, 동적 그룹 및 이러한 동적 그룹에 권한을 부여하는 정책을 사용하여 인증 및 권한 부여를 수행할 수 있습니다. 이 방식을 사용하면 사용자가 개인 키를 관리할 필요가 없습니다.

 

OCI Function 개발 환경 구성

Oracle Function 개발 환경을 세팅하는 방법은 아래 세가지로 할 수 있습니다.

여기에서는 OCI 컴퓨트 인스턴스에서 환경을 설정했습니다.

  1. Cloud Shell 설정: 처음 사용자를 위한 오라클 권고 방식입니다. function을 생성, 배포하고 호출하는 일련의 과정을 빠르게 해 볼 수 있게 합니다. 아래 로컬 머신 또는 OCI 컴퓨트 인스턴스 환경에서 수행해야 하는 Docker나 Fn Project CLI 설치, 컨텍스트(context) 생성, 동적 그룹(Dynamic Group) 생성 및 설정(OCI 컴퓨트 인스턴스 환경의 경우) 과정을 하지 않아도 됩니다.
  2. 로컬 머신 설정: Function 사용을 위해 로컬 머신을 세팅할 경우, Fn Project CLI 컨텍스트를 생성할 때 --provider oracle을 명시해 주어야 합니다. 이 옵션을 사용하면 Oracle Function이 OCI 요청 서명, 개인 키, 사용자 그룹 및 해당 사용자 그룹에 권한을 부여하는 정책을 이용하여 인증(authentication) 및 권한 부여(authorization)를 수행할 수 있습니다.
  3. OCI 컴퓨트 인스턴스 설정: OCI 컴퓨트 인스턴스를 세팅할 경우, Fn Project CLI 컨텍스트를 생성할 때 --provider oracle-ip를 명시해 주어야 합니다. 이 옵션을 사용하면 Oracle Function이 인스턴스 OCID, 동적 그룹 및 이러한 동적 그룹에 권한을 부여하는 정책을 사용하여 인증 및 권한 부여를 수행할 수 있습니다. 이 방식을 사용하면 사용자가 개인 키를 관리할 필요가 없습니다.

OCI Function 사용을 위한 정책 생성

만일 OCI Funtion 사용자가 테넌시 관리자가 아니라면, 별도 정책를 생성하고 필요한 권한을 부여해야 합니다. Identity & Security > Identity > Policies 화면에서 정책를 생성하게 되는데, 이때 Policy Builder를 이용해서 Policy use cases는 “Functions”를, Common policy template은 “Let users create, deploy, and manage functions and applications”를 선택해서 정책을 생성하면 됩니다.

다만 여기에서는 테넌스 관리자로 로그인을 했기 때문에 방금 언급한 정책을 따로 생성하지는 않았습니다.

이제 할 일은 컴퓨트 인스턴스를 포함하는 다이나믹 그룹을 만들고, 해당 다이나믹 그룹이 Function, 네트웍, Oracle Cloud Infrastructure Registry 자원에 접근할 수 있도록 정책을 생성하는 일입니다.

먼저 컴퓨트 인스턴스를 포함하는 다이나믹 그룹을 만듭니다. 컴퓨트 인스턴스의 OCID를 미리 준비합니다. 컴퓨트 인스턴스 상세화면에서 확인할 수 있습니다.

Identity & Security > Identity > Dynamic Groups 화면에서 Create Dynamic Group을 클릭해서 다이나믹 그룹을 만듭니다. Matching Rules에서는 아래와 같이 컴퓨트 인스턴스 OCID를 포함하는 규칙을 추가하고, Create을 클릭합니다.

ANY {instance.id = 'ocid1.instance.oc1.iad.anuwcljrvsea7yicxtzklecjgubfm62thj2xohu4wnexzrt72l6nq7vcfzia'}

 

다이나믹 그룹을 생성한 다음, Identity & Security > Identity > Policies 화면으로 이동해서 해당 다이나믹 그룹이 Function, 네트웍, Oracle Cloud Infrastructure Registry 자원에 접근할 수 있도록 정책을 생성합니다. show manual editor를 클릭해서 아래와 같은 정책을 추가합니다. 여기에서는 root 컴파트먼트에서 정책을 생성했습니다.

Allow dynamic-group demo-dyn-group to manage functions-family in compartment demo-compart
Allow dynamic-group demo-dyn-group to use virtual-network-family in compartment demo-compart
Allow dynamic-group demo-dyn-group to manage repos in tenancy

도커, Fn Project CLI 설치

OCI Function의 기반인 이제 도커와 Fn Project CLI를 설치합니다.

yum 명령을 이용해서 root 유저로 도커를 설치합니다.

[root@demo opc]# yum install docker-engine -y
Loaded plugins: langpacks, ulninfo
...
Installed:
  docker-engine.x86_64 0:19.03.11.ol-13.el7

Dependency Installed:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8       containerd.x86_64 0:1.4.8-1.el7       criu.x86_64 0:3.12-2.el7
  docker-cli.x86_64 0:19.03.11.ol-13.el7                   libnet.x86_64 0:1.1.6-7.el7           protobuf-c.x86_64 0:1.0.2-3.el7
  runc.x86_64 3:1.0.2-1.el7

Complete!

 

도커를 서버 부팅 시 시작하도록 설정하고, Start합니다.

[root@demo opc]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@demo opc]# systemctl start docker
[root@demo opc]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-05-14 11:53:42 GMT; 5s ago
     Docs: <https://docs.docker.com>
 Main PID: 30586 (dockerd)
    Tasks: 12
   Memory: 37.9M
   CGroup: /system.slice/docker.service
           └─30586 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
...

 

도커 클라이언트, 서버가 정상적으로 설치되었는지 확인합니다.

[root@demo opc]# docker version
Client: Docker Engine - Community
 Version:           19.03.11-ol
 API version:       1.40
 Go version:        go1.16.2
 Git commit:        9bb540d
 Built:             Fri Jul 23 01:33:55 2021
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11-ol
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.16.2
  Git commit:       9bb540d
  Built:            Fri Jul 23 01:32:08 2021
  OS/Arch:          linux/amd64
  Experimental:     false
  Default Registry: docker.io
 containerd:
  Version:          v1.4.8
  GitCommit:        7eba5930496d9bbe375fdf71603e610ad737d2b2
 runc:
  Version:          1.0.2
  GitCommit:        2856f01
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

 

root 외 다른 유저 (여기에서는 opc)가 도커를 사용할 수 있게 하려면, 아래와 같이 docker 그룹에 해당 유저를 추가해야 합니다. 로그 아웃 후 다시 로그인을 하면 opc 유저로도 도커 명령이 수행되는 것을 확인할 수 있습니다.

[root@demo opc]# usermod -aG docker opc
[root@demo opc]# systemctl restart docker
[root@demo opc]# exit
exit
[opc@demo ~]$ exit
logout
...
[opc@demo ~]$ docker --version
Docker version 19.03.11-ol, build 9bb540d

 

도커 설치가 끝났습니다. 이제 아래 명령을 실행하여 Fn Project CLI를 설치하고, 이를 확인합니다.

[opc@demo ~]$ curl -LSs <https://raw.githubusercontent.com/fnproject/cli/master/install> | sh
fn version 0.6.18

        ______
       / ____/___
      / /_  / __ \\
     / __/ / / / /
    /_/   /_/ /_/`

[opc@demo ~]$ fn --version
fn version 0.6.18

 

Fn Project CLI 컨텍스트 설정

OCI 테넌시에 연결하도록 Fn Project CLI를 구성하려면 새 컨텍스트를 생성하고 이를 사용하도록 설정해야 합니다. 설정 시 하는 일은 사용할 컨텍스트에 Function이 속할 컴파트먼트의 OCID와 이미지를 Push 및 Pull하게 될 도커 레지스트리 주소를 지정하게됩니다.

“mycontet”라는 이름으로 컨텍스트를 생성합니다. “--provider oracle-ip”로 지정하는 것은 인스턴스 OCID와 다이나믹 그룹, 그리고 해당 다이나믹 그룹에 권한을 부여하는 정책을 이용해서 인증(authentication)과 인가(authorization)을 하겠다는 의미입니다.

[opc@demo ~]$ fn create context mycontext --provider oracle-ip
Successfully created context: mycontext

 

Fn Project CLO가 새로 생성된 컨텍스트를 사용하도록 설정하고, 이를 확인합니다.

[opc@demo ~]$ fn use context mycontext
Now using context: mycontext
[opc@demo ~]$ fn list context
CURRENT NAME            PROVIDER        API URL                 REGISTRY
        default         default         <http://localhost:8080>
*       mycontext       oracle-ip

 

배포된 Function을 소유할 컴파트먼트 OCID로 Fn Project CLI 컨텍스트를 설정합니다.

[opc@demo ~]$ fn update context oracle.compartment-id ocid1.compartment.oc1..aaaaaaaaj6i7rqd4rornviojw4uyn5uoprkesc4hhsibpz3bjxbu3e43ciiq
Current context updated oracle.compartment-id with ocid1.compartment.oc1..aaaaaaaaj6i7rqd4rornviojw4uyn5uoprkesc4hhsibpz3bjxbu3e43ciiq
[opc@demo ~]$

 

아래와 같은 포맷으로 설정합니다.

fn update context api-url <api-endpoint>

[opc@demo ~]$ fn update context api-url <https://functions.us-ashburn-1.oci.oraclecloud.com>
Current context updated api-url with <https://functions.us-ashburn-1.oci.oraclecloud.com>

 

OCI Function을 사용할 현재 Region과 테넌시에 있는 OCI 레지스트리 주소로 Fn Project CL 컨텍스트를 설정합니다. 아래와 같은 포맷으로 설정합니다.

fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>

[opc@demo ~]$ fn update context registry iad.ocir.io/apackrsct01/demo-repo
Current context updated registry with iad.ocir.io/apackrsct01/demo-repo

 

OCI Function이 함수 이미지를 push/pull 할 리포지토리의 컴파트먼트 OCID로 Fn Project CLI 컨텍스트를 설정합니다. 아래와 같은 포맷으로 설정합니다.

fn update context oracle.image-compartment-id <compartment-ocid>

[opc@demo ~]$ fn update context oracle.image-compartment-id ocid1.compartment.oc1..aaaaaaaaj6i7rqd4rornviojw4uyn5uoprkesc4hhsibpz3bjxbu3e43ciiq
Current context updated oracle.image-compartment-id with ocid1.compartment.oc1..aaaaaaaaj6i7rqd4rornviojw4uyn5uoprkesc4hhsibpz3bjxbu3e43ciiq

 

인증 토큰 생성

Fn Project CLI로 OCI 레지스트리에 접근하려면 OCI 레지스트리 접속 패스워드 기능을 하는 인증 토큰 (Auth Token)이 필요합니다. 인증 토큰은 OCI 웹 콘솔에서 생성할 수 있습니다. OCI 웹 콘솔 오른쪽 상단의 사용자 메뉴를 클릭하면 나오는 User Settings 화면으로 이동합니다.

 

Auth Tokens 화면에서 Generate Token을 클릭하면 나오는 팝업창에서 인증 토큰에 대한 설명을 입력하고 Generate Token을 클릭합니다. 여기서는 “demo auth token”이라고 입력했습니다.

 

인증 토큰 값은 OCI 웹 콘솔에서 다시 조회가 되지 않기 때문에 생성된 인증 토큰을 즉시 복사해서 따로 저장해 둡니다.이는 이후 OCI 레지스트리에 접속할 때 사용됩니다. 인증 토큰을 복사 한 다음, Close를 클릭하여 팝업창을 닫습니다.

 

OCI 레지스트리에 로그인

이제 OCI 레지스트리에 로그인을 테스트합니다. 아래 포맷으로 접속합니다.

docker login -u '<tenancy-namespace>/<user-name>' <region-key>.ocir.io

만일 사용 중인 테넌시가 Oracle Identity Cloud Service와 federation되어 있다면 아래 포맷으로 접속합니다.

docker login -u '<tenancy-namespace>/oracleidentitycloudservice/<username>' <region-key>.ocir.io

패스워드 입력 프롬프트에는 앞서 생성한 OCI 인증 토큰 값을 입력합니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ **docker login -u 'apackrsct01/oracleidentitycloudservice/username' iad.ocir.io**
Password: 
WARNING! Your password will be stored unencrypted in /home/young_kyun/.docker/config.json.
Configure a credential helper to remove this warning. See
<https://docs.docker.com/engine/reference/commandline/login/#credentials-store>

Login Succeeded

 

Function 어플리케이션 생성

OCI Function 어플리케이션을 생성합니다.

Developer Services > Functions > Applications 화면으로 이동한 후, Create Application을 클릭합니다. 어플리케이션 이름을 입력하고, (여기에서는 demo-app으로 입력했습니다) 어플리케이션을 배포함 VCN과 서브넷을 선택합니다. 여기에서는 컴퓨트 인스턴스와 같은 서브넷에 배포했습니다. Create을 클릭하여 어플리케이션을 생성합니다.

 

Function 어플리케이션이 생성되었습니다.

 

터미널로 돌아와서 fn list apps 명령을 실행해 보면 현재 배포된 어플리케이션을 볼 수 있습니다.

[opc@demo ~]$ fn list apps
NAME            ID
demo-app        ocid1.fnapp.oc1.iad.aaaaaaaab6xmjao7kxktoj65itpx4f7vfnrp2m24gtznmelbczrqe6tm2uvq

 

샘플 Function 배포, 실행

OCI 컴퓨트 인스턴스 위에 Function 개발 환경 구성을 하는 것이 끝났습니다. 이제 Python 샘플 Function 테스트를 진행하겠습니다.

아래와 같이 hello-python Function을 생성합니다. -- runtime 옵션은 앞으로 개발할 Function이 Python으로 쓰여질 것임을 명시하는 것입니다. 아래 명령을 실행하면 hello-python 라는 디렉토리가 생성됩니다.

[opc@demo ~]$ fn init --runtime python hello-python
Creating function at: ./hello-python
Function boilerplate generated.
func.yaml created.

 

생성된 디렉토리로 이동해 보면 세개의 파일이 생성되어 있습니다. 디렉토리에 포함된 내용은 다음과 같습니다.

  • func.py: hello-python Function의 소스 파일과 디렉토리
  • func.yaml: Function에 대한 정의 기술
  • requirements.txt: 설치된 패키지 목록 관리
[opc@demo ~]$ cd hello-python/
[opc@demo hello-python]$ ls
func.py  func.yaml  requirements.txt

 

아래 Fn Project 배포 명령으로 함수와 관련 depenency 내용들을 ① “hello-python” 이라는 이름으로 도커 이미지를 빌드하고, ② 지정된 도커 레지스트리에 이미지를 push한 다음, ③ 앞서 생성한 “demo-app” Function 어플리케이션에 함수를 배포합니다.

[opc@demo hello-python]$ fn -v deploy --app demo-app
Deploying hello-python to app: demo-app
Bumped to version 0.0.2
Using Container engine docker
Building image iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2
Dockerfile content
-----------------------------------
FROM fnproject/python:3.9-dev as build-stage
WORKDIR /function
ADD requirements.txt /function/

                        RUN pip3 install --target /python/  --no-cache --no-cache-dir -r requirements.txt &&\\
                            rm -fr ~/.cache/pip /tmp* requirements.txt func.yaml Dockerfile .venv &&\\
                            chmod -R o+r /python
ADD . /function/
RUN rm -fr /function/.pip_cache
FROM fnproject/python:3.9
WORKDIR /function
COPY --from=build-stage /python /python
COPY --from=build-stage /function /function
RUN chmod -R o+r /function
ENV PYTHONPATH=/function:/python
ENTRYPOINT ["/python/bin/fdk", "/function/func.py", "handler"]
-----------------------------------
FN_REGISTRY:  iad.ocir.io/apackrsct01/demo-repo
Current Context:  mycontext
Sending build context to Docker daemon  6.144kB
Step 1/13 : FROM fnproject/python:3.9-dev as build-stage
Trying to pull repository docker.io/fnproject/python ...
3.9-dev: Pulling from docker.io/fnproject/python
e4430e06691f: Pull complete
6f3963a5493c: Pull complete
Digest: sha256:5ffab30998db545904a8444b8cc67b075af28adc62ac77f318db9c3ba682b7a4
Status: Downloaded newer image for fnproject/python:3.9-dev
 ---> 7681128b7f84
Step 2/13 : WORKDIR /function
 ---> Running in 99ecb3f644f2
Removing intermediate container 99ecb3f644f2
 ---> 4767986eb25c
Step 3/13 : ADD requirements.txt /function/
 ---> 170039273d8b
Step 4/13 : RUN pip3 install --target /python/  --no-cache --no-cache-dir -r requirements.txt &&                            rm -fr ~/.cache/pip /tmp* requirements.txt func.yaml Dockerfile .venv &&              chmod -R o+r /python
 ---> Running in f384a6417ff0
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting fdk>=0.1.45
  Downloading fdk-0.1.45-py3-none-any.whl (78 kB)
Collecting pytest==5.4.3
  Downloading pytest-5.4.3-py3-none-any.whl (248 kB)
Collecting httptools>=0.1.1
  Downloading httptools-0.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (433 kB)
Collecting pytest-asyncio==0.12.0
  Downloading pytest-asyncio-0.12.0.tar.gz (13 kB)
Collecting iso8601==0.1.12
  Downloading iso8601-0.1.12-py2.py3-none-any.whl (12 kB)
Collecting pbr==5.4.5
  Downloading pbr-5.4.5-py2.py3-none-any.whl (110 kB)
Collecting wcwidth
  Downloading wcwidth-0.2.5-py2.py3-none-any.whl (30 kB)
Collecting attrs>=17.4.0
  Downloading attrs-21.4.0-py2.py3-none-any.whl (60 kB)
Collecting py>=1.5.0
  Downloading py-1.11.0-py2.py3-none-any.whl (98 kB)
Collecting pluggy<1.0,>=0.12
  Downloading pluggy-0.13.1-py2.py3-none-any.whl (18 kB)
Collecting packaging
  Downloading packaging-21.3-py3-none-any.whl (40 kB)
Collecting more-itertools>=4.0.0
  Downloading more_itertools-8.13.0-py3-none-any.whl (51 kB)
Collecting pyparsing!=3.0.5,>=2.0.2
  Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB)
Building wheels for collected packages: pytest-asyncio
  Building wheel for pytest-asyncio (setup.py): started
  Building wheel for pytest-asyncio (setup.py): finished with status 'done'
  Created wheel for pytest-asyncio: filename=pytest_asyncio-0.12.0-py3-none-any.whl size=11650 sha256=bedaeb4a2f687740b3eb308908d008f794d3a8fa9cc640b98f2146aa3a10e23f
  Stored in directory: /tmp/pip-ephem-wheel-cache-ouqugdts/wheels/46/ab/c0/b681d7c199e94c39f60f563c6787324254dc594f4832c540d4
Successfully built pytest-asyncio
Installing collected packages: wcwidth, attrs, py, pluggy, pyparsing, packaging, more-itertools, pytest, httptools, pytest-asyncio, iso8601, pbr, fdk
Successfully installed attrs-21.4.0 fdk-0.1.45 httptools-0.4.0 iso8601-0.1.12 more-itertools-8.13.0 packaging-21.3 pbr-5.4.5 pluggy-0.13.1 py-1.11.0 pyparsing-3.0.9 pytest-5.4.3 pytest-asyncio-0.12.0 wcwidth-0.2.5
Removing intermediate container f384a6417ff0
 ---> fe840d2730db
Step 5/13 : ADD . /function/
 ---> 9dc341c4fbe5
Step 6/13 : RUN rm -fr /function/.pip_cache
 ---> Running in 70a62c63c6c2
Removing intermediate container 70a62c63c6c2
 ---> 3cdf75a5e4b7
Step 7/13 : FROM fnproject/python:3.9
Trying to pull repository docker.io/fnproject/python ...
3.9: Pulling from docker.io/fnproject/python
e4430e06691f: Already exists
84ede0a13af1: Pull complete
1b67b30fb051: Pull complete
Digest: sha256:a21e0b77c2efc5161fb2613b58a4496fae8db1a25937cd356d851bcead6bf497
Status: Downloaded newer image for fnproject/python:3.9
 ---> cf976e384ac2
Step 8/13 : WORKDIR /function
 ---> Running in 2705fdfa172c
Removing intermediate container 2705fdfa172c
 ---> bfddd3d79ff2
Step 9/13 : COPY --from=build-stage /python /python
 ---> f02ac2e8bb98
Step 10/13 : COPY --from=build-stage /function /function
 ---> 2fe9f202abb1
Step 11/13 : RUN chmod -R o+r /function
 ---> Running in 50ee45610ee6
Removing intermediate container 50ee45610ee6
 ---> e226a4dca7a2
Step 12/13 : ENV PYTHONPATH=/function:/python
 ---> Running in 6ba2b5e66c04
Removing intermediate container 6ba2b5e66c04
 ---> d44bfb820515
Step 13/13 : ENTRYPOINT ["/python/bin/fdk", "/function/func.py", "handler"]
 ---> Running in 3e617fc7ef4d
Removing intermediate container 3e617fc7ef4d
 ---> 516cb0ff9174
Successfully built 516cb0ff9174
Successfully tagged iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2

Parts:  [iad.ocir.io apackrsct01 demo-repo hello-python:0.0.2]
Using Container engine docker to push
Pushing iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2 to docker registry...The push refers to repository [iad.ocir.io/apackrsct01/demo-repo/hello-python]
476a02ce52e6: Pushed
b9438cbc4552: Pushed
2bab03aae7ca: Pushed
dbb7a2be6e82: Pushed
4ad3625fcc0c: Pushed
d63f3a582a8b: Pushed
d2db75568ee6: Pushed
0.0.2: digest: sha256:f4677bb6be77d957b227bbf3d73f67404a6e796987ae1236fff493114e137df6 size: 1779
Updating function hello-python using image iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2...
Successfully created function: hello-python with iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2

 

OCI Container Registry로 이동해 보면, 지정한 컴파트먼트에 push된 이미지가 생성되어 있는 것을 확인할 수 있습니다.

 

배포된 함수의 호출은 아래와 같이 invoke 명령으로 수행합니다.

[opc@demo hello-python]$ fn invoke demo-app hello-python
{"message": "Hello World"}

 

다음 글:

2022.05.23 - [Cloud/Oracle Cloud Infrastructure (OCI)] - OCI API Gateway와 Function을 이용한 서버리스 웹 어플리케이션 샘플 - #3 DB 구성 및 Function 코드 준비

<END>