본문 바로가기

Cloud/Oracle Cloud Infrastructure (OCI)

처음 사용자를 위한 Oracle Cloud Infrastructure Function 기본 사용법

REFERENCE

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

 

Oracle Cloud 서버리스 Overview

Oracle Cloud Infrastructure (OCI)에서는 AWS와 같은 다른 클라우드 벤더와 마찬가지로 컴퓨트 인스턴스를 사용하지 않고도 웹 시스템을 구축할 수 있습니다. 그 중심에 OCI Function과 API 게이트웨이가 있습니다.

먼저 OCI Function의 근간인 서버리스(Serverless)라는 용어는 살펴보면, 이는 어플리케이션을 실행하는 데 서버가 포함되지 않는다는 의미로 해석될 수 있습니다. 사실 실제로는 백엔드에 서버가 있기 때문에 이 용어가 실제로 강조하는 것은 서버리스 애플리케이션을 운영하면 백엔드 관련 측면을 무시할 수 있다는 것입니다. 서버리스 런타임 및 어플리케이션 라이프사이클은 서버리스 프레임워크 또는 관리되는 서버리스 서비스에 의해 완전히 관리됩니다.

또 하나 연관된 용어는 Function as a Service (FaaS) 입니다. FaaS 플랫폼은 서버리스 아키텍처의 핵심입니다. Function은 한 가지 작업을 잘 수행하는 간단한 코드 조각으로, 짧게 실행되는 단일 상태 비저장 작업에 집중하도록 설계되는 것이 좋습니다. 서버리스 프레임워크 또는 관리형 클라우드 기반 서버리스 서비스는 일반적으로 요청이 수신되거나 일부 기능 트리거가 활성화된 경우에만 특정 Function 인스턴스를 인스턴스화합니다. 인스턴스는 일반적으로 컴퓨팅 리소스를 해제하기 위해 유휴 시간 간격이 경과하자마자 종료됩니다.

OCI Function도 마찬가지로 상태를 저장하지 않고 한번, 짧게 수행되도록 의도된 서비스입니다. 지원되는 프로그래밍 언어는 Java, Golang, Python, Java script, Ruby, C# 이며 이러한 언어를 위한 개발 툴 설치가 필요하지 않습니다. 코드는 Function 별로 도커 컨테이너에서 실행됩니다.

 

OCI Function이 작동하는 방식을 보면, 프라이빗 도커 이미지 저장소인 레지스트리 (Oracle Cloud Infrastructure Registry)에 Fuction 이미지를 Push하고, Function이 트리거되는 상황을 설정해서, 트리거 되었을 때만 코드가 실행되도록 되어 있습니다. 또한 OCI Function은 OCI의 다른 기능, 서비스들과 연결되어 있습니다.

 

끝으로 OCI Function은 컨테이너 기반 서버리스 플랫폼인 Fn Project 기술을 기반으로 하고 있기 때문에 Fn Project CLI를 사용하여 Oracle Function에서 생성, 읽기, 업데이트 및 삭제 작업을 수행할 수 있습니다.

 

Function 실행 환경 구성 방법

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

  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, 동적 그룹 및 이러한 동적 그룹에 권한을 부여하는 정책을 사용하여 인증 및 권한 부여를 수행할 수 있습니다. 이 방식을 사용하면 사용자가 개인 키를 관리할 필요가 없습니다.

 

Oracle Function 샘플 - Python Hello World

지금부터 진행할 테스트에서는 Oracle Function 개발 환경으로 위에서 언급한 방식 중, 첫번째 OCI Cloud Shell을 세팅하는 방식으로 진행하겠습니다. 그리고 Python 환경으로 테스트를 진행했습니다.

 

Function 어플리케이션 생성

먼저 OCI Function 어플리케이션을 생성합니다. OCI 웹 콘솔에서 Developer Services > Functions > Applications 화면으로 이동합니다.

 

Create Application를 클릭하여 새로운 어플리케이션을 생성합니다. Name에는 “hellopython-app”을 입력했고, VCN과 Subnet을 선택했습니다. 그리고 Create을 클릭하여 어플리케이션을 생성합니다.

 

방금 생성한 “hellopython-app” 어플리케이션 상세 화면에서 왼쪽 하단의 Resource 탭 아래에 있는 Getting started를 클릭합니다. 여기에서 Cloud Shell setup을 클릭합니다. Getting started 페이지에서는 사용자 환경에 맞게 수행할 명령어를 제공합니다. 해당 명령을 차례대로 복사해서 붙여넣으면 Function 개발을 위한 Cloud Shell 환경을 설정할 수 있습니다.

 

OCI 웹 콘솔 오른쪽 상단의 아이콘을 클릭하여 Cloud Shell을 기동합니다.

 

Fn Project CLI 컨텍스트 설정

OCI 테넌시에 연결하도록 Fn Project CLI를 구성하려면 새 컨텍스트를 생성하고 이를 사용하도록 설정해야 합니다. 설정 시 하는 일은 사용할 컨텍스트에 Function이 속할 compartment의 OCID와 이미지를 Push 및 Pull하게 될 도커 레지스트리 주소를 지정하게됩니다. 그런데 Cloud Shell 환경에서는 컨텍스트가 이미 만들어져 있으니, 만들어진 컨텍스트를 사용하도록 설정만 하면 됩니다.

현재 생성된 컨텍스트 목록을 확인합니다. “us-ashburn-1” 이라는 컨텍스트가 만들어져 있고, 이미 Fn Project CLI가 이를 사용하도록 설정되어 있습니다. “fn use context us-ashburn-1” 명령을 수행하면 현재 사용중이라는 메시지가 나옵니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ fn list context
CURRENT NAME            PROVIDER        API URL                                         REGISTRY
        default         oracle-cs
        test-fn         oracle          <https://functions.us-ashburn-1.oraclecloud.com>  iad.ocir.io/apackrsct01/youngkyunfunctionrepo
*       us-ashburn-1    oracle-cs       <https://functions.us-ashburn-1.oraclecloud.com>
young_kyun@cloudshell:~ (us-ashburn-1)$ fn use context us-ashburn-1

Fn: Context us-ashburn-1 currently in use

See 'fn  --help' for more information. Client version: 0.6.17
young_kyun@cloudshell:~ (us-ashburn-1)$

 

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

young_kyun@cloudshell:~ (us-ashburn-1)$ fn update context oracle.compartment-id ocid1.compartment.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Current context updated oracle.compartment-id with ocid1.compartment.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

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

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

young_kyun@cloudshell:~ (us-ashburn-1)$ fn update context registry iad.ocir.io/apackrsct01/demo-repo
Current context updated registry with iad.ocir.io/apackrsct01/demo-repo

 

인증 토큰 생성

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 'tenancynamespace/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

 

fn list apps 명령을 실행하면 앞서 생성한 compartment 내 어플리케이션을 확인할 수 있습니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ fn list apps
NAME            ID
hellopython-app ocid1.fnapp.oc1.iad.aaaaaaaan57ei6mmpc6m42r4ljofrx6puj35ajzivly3c6i3eth27hfrotdq

 

샘플 Function 배포, 실행

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

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

young_kyun@cloudshell:~ (us-ashburn-1)$ 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: 설치된 패키지 목록 관리
young_kyun@cloudshell:~ (us-ashburn-1)$ cd hello-python/
young_kyun@cloudshell:hello-python (us-ashburn-1)$ ls
func.py  func.yaml  requirements.txt

 

func.py 파일에는 실제 Python 소스를 포함하고 있습니다. 아래 소스 Funtion에서는 {"name":"Bob"} 과 같은 형태의 JSON 입력값을 찾아서 {"message": "Hello Bob"} 처럼 반환합니다. JSON 입력값을 못찾은 경우 {"message": "Hello World"}을 반환하게 됩니다. 그리고 함수 수행 내용에 대한 로깅을 수행합니다.

young_kyun@cloudshell:hello-python (us-ashburn-1)$ cat func.py
import io
import json
import logging

from fdk import response

def handler(ctx, data: io.BytesIO = None):
    name = "World"
    try:
        body = json.loads(data.getvalue())
        name = body.get("name")
    except (Exception, ValueError) as ex:
        logging.getLogger().info('error parsing json payload: ' + str(ex))

    logging.getLogger().info("Inside Python Hello World function")
    return response.Response(
        ctx, response_data=json.dumps(
            {"message": "Hello {0}".format(name)}),
        headers={"Content-Type": "application/json"}

 

func.yaml 파일에는 Function에 대한 메타정보를 포함하고 있고, 몇가지 속성들을 정의하고 있습니다.

young_kyun@cloudshell:hello-python (us-ashburn-1)$ cat func.yaml 
schema_version: 20180708
name: hello-python
version: 0.0.1
runtime: python
build_image: fnproject/python:3.9-dev
run_image: fnproject/python:3.9
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256
  • schema_version: Function 파일의 스키마 버전으로 func.yaml에 어떤 필드가 있어야 할 지 결정합니다.
  • name: Function의 이름으로 디렉토리 이름과 같습니다.
  • version: 자동으로 0.0.1 부터 시작합니다.
  • runtime: 런타임/언어 이름으로 -- runtime 옵션에서 설정된 값에 따라값니다.
  • memory: 메가바이트 단위의 Function의 최대 메모리 사이즈입니다.
  • entrypoint: Funtion이 호출될 때 소환할 실행 프로그램의 이름입니다.

 

requirements.txt 파일에는 Python Function의 모든 디펜던시(dependency)가 명시되어 있습니다.

young_kyun@cloudshell:hello-python (us-ashburn-1)$ cat requirements.txt 
fdk>=0.1.45

 

이제 Function을 배포할 차례입니다. 이를 통해 Function이 다른 사용자와 시스템에서 접근할 수 있게 됩니다. 아래 fn -v deploy 과정을 살펴보면 도커 파일로 “docker build”를 실행하는 것과 같다는 것을 알 수 있습니다. 즉, Function을 배포하게 되면 Function을 위한 도커 파일을 동적으로 생성해서 컨테이너를 빌드하고 실행을 위해 이를 로딩하게 됩니다.

처음 Function을 빌드 할 때는 필요한 도커 이미지를 다운로드 받아야 하기 때문에 시간이 좀 더 걸립니다. 아래에서 사용한 -- v 옵션은 -- verbose 으로 배포시 상세정보를 확인하기 위한 옵션입니다.

hello-python 디렉토리로 이동하여 Function을 배포합니다. 배포 과정을 보면 “Updating function hello-python using image iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2...” 메시지에서 Function이 iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2 이미지로 패키징되어 있다는 것을 알 수 있습니다.

young_kyun@cloudshell:hello-python (us-ashburn-1)$ pwd
/home/young_kyun/hello-python
young_kyun@cloudshell:hello-python (us-ashburn-1)$ fn -v deploy --app hellopython-app
Deploying hello-python to app: hellopython-app
...
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

 

Function 배포 후 Developer Services > Container Registry 화면으로 이동해 보면, root compartment에 새로운 레포지토리와 이미지가 생성되어 있음을 확인할 수 있습니다.

 

hellopython-app 어플리케이션 상세화면 왼쪽 하단의 Resources > Functions을 클릭해 보면 hello-python Function이 생성되어 있는 것도 확인할 수 있습니다.

 

Function은 도커 위해 배포되기 때문에 아래와 같이 도커 명령으로도 생성된 컨테이너 이미지를 볼 수 있습니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ docker images | grep hello-python
iad.ocir.io/apackrsct01/demo-repo/hello-python   0.0.2               5bd4e40d2f39        2 hours ago         176MB

 

또한 아래 명령으로 생성된 어플리케이션과 Function 정보를 볼 수 있습니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ fn list apps
NAME            ID
hellopython-app ocid1.fnapp.oc1.iad.aaaaaaaan57ei6mmpc6m42r4ljofrx6puj35ajzivly3c6i3eth27hfrotdq
young_kyun@cloudshell:~ (us-ashburn-1)$ fn list functions hellopython-app
NAME            IMAGE                                                   ID
hello-python    iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2    ocid1.fnfunc.oc1.iad.aaaaaaaaol3de3og3efxlalpsoohj35w5em26dufs5scdqbxdg5w6bf2vo4q

 

hello-python Function은 아래와 같이 호출합니다. 파라미터를 추가하여 호출할 수도 있습니다.

young_kyun@cloudshell:hello-python (us-ashburn-1)$ fn invoke hellopython-app hello-python
{"message": "Hello World"}
young_kyun@cloudshell:hello-python (us-ashburn-1)$ echo -n '{"name":"Bob"}' | fn invoke hellopython-app hello-python
{"message": "Hello Bob"}

 

Function을 호출할 때 위와 같이 Fn invoke 명령으로도 할 수 있지만, URL을 이용해서 Function을 호출할 수도 있습니다. 이를 위해서는 Function의 호출 엔드포인트를 알아야하는데, 아래 명령으로 엔드포인트를 확인할 수 있습니다.

fn inspect function <appname> <function-name>

young_kyun@cloudshell:~ (us-ashburn-1)$ fn inspect function hellopython-app hello-python
{
        "annotations": {
                "fnproject.io/fn/invokeEndpoint": "<https://th27hfrotdq.us-ashburn-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.iad.aaaaaaaaol3de3og3efxlalpsoohj35w5em26dufs5scdqbxdg5w6bf2vo4q/actions/invoke>",
                "oracle.com/oci/compartmentId": "ocid1.compartment.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                "oracle.com/oci/imageDigest": "sha256:7fa616304c175c791000a51817fa522796c3037990510be20a1d348f625eac43"
        },
        "app_id": "ocid1.fnapp.oc1.iad.aaaaaaaan57ei6mmpc6m42r4ljofrx6puj35ajzivly3c6i3eth27hfrotdq",
        "created_at": "2022-05-03T08:54:17.892Z",
        "id": "ocid1.fnfunc.oc1.iad.aaaaaaaaol3de3og3efxlalpsoohj35w5em26dufs5scdqbxdg5w6bf2vo4q",
        "image": "iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2",
        "memory": 256,
        "name": "hello-python",
        "timeout": 30,
        "updated_at": "2022-05-06T02:15:16.214Z"
}

 

Oracle Function 샘플 - 인스턴스 목록 조회

이번에는 Compartment 내 OCI 인스턴스 목록을 조회하는 Function을 만들어서 실행해 보겠습니다.

OCI Python SDK를 이용해서 OCI 서비스에 대해 API 호출을 하기 위해서는 사용하고자하는 Function에 대해 인증이 필요합니다. 이때 Resource Principal을 이용하게 됩니다. 아래 Python 소스 코드에서는 아래 OCI Python 클래스를 호출하고 있습니다.

 

Python 소스코드와는 별도로 Function이 OCI 서비스를 사용할 수 있게 Function을 다이나믹 그룹 (Dynamic Group)에 넣고, Policy를 통해 이 다이나믹 그룹이 OCI 인스턴스를 조회할 수 있게 해야 합니다.

먼저 Identity & Security > Identity > Dynamic Groups 화면으로 이동합니다.

 

Create Dynamic Group을 클릭하여 다이나믹 그룹을 생성합니다. 사용중인 Compartment에 Function 자원을 포함하는 다이나믹 그룹을 생성합니다. 이름은 “demo-func-dyn-group”으로 했고, Rule에 아래와 같이 추가했습니다.

ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}

 

생성한 다이나믹 그룹이 현재 사용 중인 compartment에서 인스턴스를 조회할 수 있도록 허용하는 Policy를 생성합니다. Policy 이름은 “demo-func-policy”로 했습니다.

Policy Builder에서는 Show manual editor를 활성화하고 아래 정책을 추가합니다.

Allow dynamic-group demo-func-dyn-group to inspect instances in compartment mycompartment

 

Python 런타임으로 Function을 시작합니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ fn init --runtime python oci-list-instances-python
Creating function at: ./oci-list-instances-python
Function boilerplate generated.
func.yaml created.

 

fn init 명령으로 생성된 디렉토리로 이동하면 앞서 살펴본 바와 같이 세개의 파일이 생성되어 있습니다.

young_kyun@cloudshell:~ (us-ashburn-1)$ cd oci-list-instances-python/
young_kyun@cloudshell:oci-list-instances-python (us-ashburn-1)$ ls
func.py  func.yaml  requirements.txt

 

func.py 파일의 내용을 아래와 같이 변경합니다.

young_kyun@cloudshell:objectlist (us-ashburn-1)$ cat func.py
#
# oci-list-instances-python version 1.0.
#
# Copyright (c) 2020 Oracle, Inc.
# Licensed under the Universal Permissive License v 1.0 as shown at <https://oss.oracle.com/licenses/upl>.
#

import io
import json
from fdk import response

import oci

def handler(ctx, data: io.BytesIO=None):
    signer = oci.auth.signers.get_resource_principals_signer()
    resp = list_instances(signer)
    return response.Response(
        ctx,
        response_data=json.dumps(resp),
        headers={"Content-Type": "application/json"}
    )

# List instances ---------------------------------------------------------------
def list_instances(signer):
    client = oci.core.ComputeClient(config={}, signer=signer)
    # OCI API to manage Compute resources such as compute instances, block storage volumes, etc.
    try:
        # Returns a list of all instances in the current compartment
        inst = client.list_instances(signer.compartment_id)
        # Create a list that holds a list of the instances id and name next to each other
        inst = [[i.id, i.display_name] for i in inst.data]
    except Exception as ex:
        print("ERROR: accessing Compute instances failed", ex, flush=True)
        raise
    resp = { "instances": inst }
    return resp

 

func.yaml 파일의 내용을 아래와 같이 변경합니다.

young_kyun@cloudshell:objectlist (us-ashburn-1)$ cat func.yaml
schema_version: 20180708
name: oci-list-instances-python
version: 0.0.1
runtime: python
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256

 

requirements.txt 파일의 내용을 아래와 같이 변경합니다.

young_kyun@cloudshell:objectlist (us-ashburn-1)$ cat requirements.txt 
fdk
oci>=2.2.18

 

Function을 배포합니다.

young_kyun@cloudshell:oci-list-instances-python (us-ashburn-1)$ fn -v deploy --app hellopython-app
Deploying oci-list-instances-python to app: hellopython-app 
...
Updating function oci-list-instances-python using image iad.ocir.io/apackrsct01/demo-repo/oci-list-instances-python:0.0.2...
Successfully created function: oci-list-instances-python with iad.ocir.io/apackrsct01/demo-repo/oci-list-instances-python:0.0.2

 

Function 목록을 조회해 보면 hellopython-app 아래에 “oci-list-instances-python” 이라는 Function이 생성되어 있는 것을 확인할 수 있습니다.

young_kyun@cloudshell:oci-list-instances-python (us-ashburn-1)$ fn list functions hellopython-app
NAME                            IMAGE                                                                   ID
hello-python                    iad.ocir.io/apackrsct01/demo-repo/hello-python:0.0.2                    ocid1.fnfunc.oc1.iad.aaaaaaaaol3de3og3efxlalpsoohj35w5em26dufs5scdqbxdg5w6bf2vo4q
oci-list-instances-python       iad.ocir.io/apackrsct01/demo-repo/oci-list-instances-python:0.0.2       ocid1.fnfunc.oc1.iad.aaaaaaaagfvlefob2gk3oohtaxfwpdl7rrsbb4sjio7kumenwj24mxdboeea

 

Function을 호출하면 현재 Compartment 내 생성되어 있는 인스턴스 목록을 볼 수 있습니다.

young_kyun@cloudshell:oci-list-instances-python (us-ashburn-1)$ fn invoke hellopython-app oci-list-instances-python
{"instances": [["ocid1.instance.oc1.iad.anuwcljrvsea7yickbejb3ufzjltbb4wxnxojnitdo4swfbe6t6y2oskryhq", null]]}

<END>