클라우드 함수 및 External 프로시저 호출
온프레미스 Oracle Database(Enterprise, Standard, Express, Personal Editions)에서는 PL/SQL, Java 또는 C에서 유저 정의 함수를 작성하여 SQL 또는 SQL 내장 함수에서 사용할 수 없는 기능을 제공할 수 있습니다. 표현식이 발생할 수 있는 모든 위치에서 SQL 문에서 이러한 유저 정의 함수를 호출할 수 있습니다. 사용자 정의 함수 정보를 참조하십시오.
Oracle Database 19c 이후부터는 SQL의 내장된 Python 실행 기능을 사용하여 Python 스크립트를 생성, 저장 및 실행할 수 있습니다. OML4Py를 사용하여 내장된 Python 실행을 참조하십시오.
Oracle Autonomous AI Database on Dedicated Exadata Infrastructure는 클라우드에서 서버리스 컴퓨팅 서비스(예: OCI)를 호출하는 SQL Functions를 작성할 수 있도록 함으로써 사용자 정의 기능을 클라우드로 확장합니다. C/C++ 루틴, Shell 또는 Python 스크립트가 포함된 Functions 및 AWS Lambda Functions 또는 External Procedures - Autonomous AI Database 외부의 OCI 컴퓨팅 VM에서 실행됩니다.
관련 항목
클라우드 함수 및 외부 프로시저 정보
유저 정의 함수를 사용하면 데이터베이스 내의 PL/SQL 또는 SQL 코드에서 외부에서 사용 가능한 함수를 호출할 수 있습니다. 유저 정의 함수를 사용하여 다음 외부 함수를 호출할 수 있습니다.
- Oracle Cloud Infrastructure Functions: Oracle Cloud Infrastructure Functions는 완전 관리형, 다중 테넌트, 확장성이 뛰어난 온디맨드 Functions-as-a-Service 플랫폼입니다. Oracle Cloud Infrastructure Functions는 엔터프라이즈급 Oracle Cloud Infrastructure를 기반으로 구축되며 Fn Project 오픈 소스 엔진을 기반으로 합니다. 자세한 내용은 OCI 함수 개요를 참고하세요.
- AWS Lambda 함수: AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 거의 모든 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행할 수 있는 서버리스 이벤트 기반 컴퓨트 서비스입니다. 자세한 내용은 AWS Lambda를 참조하십시오.
- 외부 프로시저: 외부 프로시저는 SQL 함수 또는 PL/SQL 프로시저나 함수로 호출될 수 있는 3세대 언어(예: C) 또는 OS 셸 스크립트나 Python 스크립트로 작성된 함수입니다. 자세한 내용은 외부 프로시저란?을 참조하십시오.
SQL 함수로 OCI 클라우드 함수 호출
전용 Exadata 인프라의 자율운영 AI 데이터베이스에서 OCI 클라우드 함수를 SQL 함수로 호출하는 단계를 보여줍니다.
이 단계를 진행하기 전에 OCI 테넌시 및 컴파트먼트에 OCI 함수를 생성하고 배치했다고 가정합니다. 자세한 내용은 OCI 함수를 참조하십시오.
OCI 함수를 작업한 후에는 DBMS_CLOUD 및 DBMS_CLOUD_FUNCTION PL/SQL API를 사용하여 자율운영 AI 데이터베이스에서 API 엔드포인트를 통해 해당 클라우드 함수를 참조하고 호출하는 SQL 래퍼 함수의 카탈로그를 생성합니다. DBMS_CLOUD_FUNCTION API를 사용하여 데이터베이스 응용 프로그램의 함수를 관리하게 됩니다.
-
DBMS_CLOUD.CREATE_CREDENTIAL 프로시저를 사용하여 인증서를 생성합니다.
OCI 테넌시 사용자의 API 프라이빗 키(API 키를 생성할 때 다운로드한 dot-pem 파일의 콘텐츠)를 인증서 객체, 키의 지문, 테넌시 OCID 및 사용자 OCID로 제공합니다. 필수 키 및 OCID를 참조하십시오.
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OCI_CRED', -- provide a string as the name user_ocid => 'user_ocid', -- provide the OCID string for the user, obtained from OCI Console User Profile tenancy_ocid => 'tenancy_ocid', -- provide the OCID string for the tenancy, obtained from OCI Console User Profile private_key => 'private_key', -- provide the content of the dot-pem file that you downloaded when you created the API Key fingerprint => 'fingerprint' -- provide the fingerprint string for the API key ); END; /그러면 OCI_CRED 인증서 객체가 생성됩니다.
자세한 내용은 CREATE_CREDENTIAL 프로시저를 참조하십시오.
-
DBMS_CLOUD_FUNCTION.CREATE_CATALOG 프로시저를 사용하여 Catalog 객체를 생성합니다.
카탈로그는 API 끝점을 통해 해당 클라우드 함수를 참조하고 호출하는 래퍼 함수 모음입니다. 인증서 객체, 클라우드 서비스 제공자 이름(이 경우 OCI, OCI 리전 ID(이 예제에서는 PHX) 및 OCI 함수가 있는 OCI 컴파트먼트 ID를 제공합니다.
BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', service_provider => 'OCI', cloud_params => '{"region_id":"phx", "compartment_id":"compartment_id"}' ); END; /그러면 OCI_DEMO_CATALOG 카탈로그 객체가 생성됩니다.
자세한 내용은 CREATE_CATALOG 프로시저를 참조하십시오. DBA_CLOUD_FUNCTION_CATALOG 뷰 및 USER_CLOUD_FUNCTION_CATALOG 뷰를 질의하여 데이터베이스의 모든 클라우드 함수 카탈로그 목록을 검색할 수 있습니다.
-
DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS 프로시저를 사용하여 카탈로그의 모든 클라우드 기능을 나열할 수 있습니다.
SET PAGESIZE 1000 VAR function_list CLOB; BEGIN DBMS_CLOUD_FUNCTION.LIST_FUNCTIONS ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_list => :function_list ); END; / PL/SQL procedure successfully completed. SELECT JSON_QUERY (:function_list, '$' RETURNING VARCHAR2(32676) pretty) AS search_results FROM dual; SEARCH_RESULTS ------------------------------------------------------------------------------------------------ [ { "functionName" : "create_par", "functionId" : "ocid.funfc.oc1.phx.aaaa_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "fintech", "functionId" : "ocid.funfc.oc1.phx.bbbb_example" "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud.com_example" }, { "functionName" : "jwt_codec", "functionId" : "ocid.funfc.oc1.phx.jwt_code_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "oci-objectstorage-create-par-python", "functionId" : "ocid.funfc.oc1.phx.aaaaaaaas_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" }, { "functionName" : "run_dbt", "functionId" : "ocid.funfc.oc1.phx.aaaaaaaav_example", "invokeEndpoint" : "https://dw.us.func.oci.oraclecloud_example.com" } ]자세한 내용은 LIST_FUNCTIONS 프로시저를 참조하십시오.
-
SQL 래퍼 함수를 생성합니다. 다음 두 가지 방법 중 하나를 사용하여 카탈로그에서 래퍼 SQL 함수를 생성하고 각 클라우드 함수를 호출할 수 있습니다.
- DBMS_CLOUD_FUNCTION를 사용할 수 있습니다. SYNC_FUNCTIONS 카탈로그 객체에서 SQL 래퍼를 생성하는 프로시저입니다.
- DBMS_CLOUD_FUNCTION를 사용하여 개별 래퍼 함수를 수동으로 생성할 수 있습니다. CREATE_FUNCTION 프로시저입니다.
- SYNC_FUNCTIONS: SYNC_FUNCTIONS는 카탈로그가 생성된 리전, 컴파트먼트 및 테넌시에 정의된 전체 클라우드 기능 목록과 함께 카탈로그의 래퍼 함수를 자동으로 동기화(생성 및/또는 업데이트)합니다.
BEGIN DBMS_CLOUD_FUNCTION.SYNC_FUNCTIONS ( catalog_name => 'OCI_DEMO_CATALOG' ); END; /이렇게 하면 카탈로그에 새 함수를 추가하고 카탈로그에서 삭제된 함수에 대한 래퍼를 제거하기 위한 PL/SQL 래퍼가 생성됩니다.
지정된 현재 사용자에 대해 다음 질의를 사용하여 동기화 결과를 확인할 수 있습니다.
SHOW user TEST_USER SELECT object_name FROM sys.all_objects WHERE owner='TEST_USER' AND object_type='FUNCTION'; OBJECT_NAME -------------------------------------------------------------------------------- CREATE_PAR FINTECH JWT_CODEC OCI-OBJECTSTORAGE-CREATE-PAR-PYTHON RUN_DBT자세한 내용은 SYNC_FUNCTIONS 프로시저를 참조하십시오.
-
CREATE_FUNCTION: DBMS_CLOUD.CREATE_FUNCTION를 사용하여 해당 클라우드 함수를 호출하는 SQL 함수를 카탈로그에 수동으로 생성할 수 있습니다.
VAR function_args CLOB; EXEC :function_args := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}'); BEGIN DBMS_CLOUD_FUNCTION.CREATE_FUNCTION ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_name => 'FINTECH_FUNCTION', function_id => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example', input_args => :function_args ); END; /그러면 FUNCTION_ID 매개변수에서 끝점이 참조되는 각 클라우드 함수에 대한 참조로 OCI_DEMO_CATALOG 카탈로그에 FINTECH_FUN 함수가 생성됩니다. 카탈로그에서 해당 인수와 함께 함수를 호출하면 OCI에서 해당 클라우드 함수가 실행되고 클라우드 함수에서 반환된 출력이 제공됩니다.
주:
OCI 함수의 이름은 FINTECH_FUNCTION와 완전히 다를 수 있습니다. 이 참조를 생성하기 위해 function_id 매개변수에 입력으로 제공한 OCI 함수의 OCID만 고려됩니다. -
사용자 정의 반환 유형 및 응답 처리기가 있는 CREATE_FUNCTION: 함수를 수동으로 생성하면 다음 예와 같이 사용자 정의 반환 유형 및 응답 처리기를 생성할 수 있습니다.
먼저 반환 유형과 함수의 응답 처리기를 생성합니다.
CREATE OR REPLACE TYPE fintech_rt AS OBJECT ( status VARCHAR2(1000), output CLOB ); / Type created. CREATE OR REPLACE FUNCTION fintech_response_handler(function_response IN CLOB) RETURN fintech_rt IS l_comp fintech_rt; l_json_obj JSON_OBJECT_T; status VARCHAR2(1000); output CLOB; BEGIN l_json_obj := JSON_OBJECT_T.parse(function_response); status := l_json_obj.get('STATUS').to_string; output := l_json_obj.get('RESPONSE_BODY').to_string; l_comp := fintech_rt(status,output); RETURN l_comp; END; / Function created.그런 다음 SQL 래퍼 함수를 수동으로 생성하는 동안 이 유형 및 응답 처리기를 사용합니다.
VAR input_param CLOB; VAR l_return_type VARCHAR2(100); VAR l_response_handler VARCHAR2(1000); -- Define function parameters exec :input_param := TO_CLOB('{"command": "VARCHAR2", "value": "VARCHAR2"}'); PL/SQL procedure successfully completed. exec :l_return_type := 'fintech_rt'; PL/SQL procedure successfully completed. exec :l_response_handler := 'fintech_response_handler'; PL/SQL procedure successfully completed. BEGIN DBMS_CLOUD_FUNCTION.CREATE_FUNCTION ( credential_name => 'OCI_CRED', catalog_name => 'OCI_DEMO_CATALOG', function_name => 'FINTECH_FUNCTION', function_id => 'ocid1.fnfunc.oc1.phx.aaabbbcccc_example', input_args => :input_param, return_type => :l_return_type, response_handler => :l_response_handler ); END; /DBA_CLOUD_FUNCTION 뷰 및 USER_CLOUD_FUNCTION 뷰 뷰를 질의하여 데이터베이스의 모든 함수 목록을 검색할 수 있습니다.
자세한 내용은 CREATE_FUNCTION 프로시저를 참조하십시오.
함수가 생성되면 함수를 DESCRIBE하여 반환 세부 정보를 가져올 수 있습니다.
DESC fintech_fun COLUMN STATUS format a30 COLUMN OUTPUT format a30그런 다음 함수를 호출하여 입력 파라미터의 값을 제공할 수 있습니다.
SET SERVEROUTPUT ON DECLARE l_comp fintech_rt; BEGIN l_comp := fintech_fun(command=>'tokenize',value => 'PHI_INFORMATION'); DBMS_OUTPUT.put_line ('Status of the function = '|| l_comp.status); DBMS_OUTPUT.put_line ('Response of the function = '|| l_comp.output); END; /그러면
OCI_DEMO_CATALOG카탈로그에서 함수 참조oocid1.funfn.oci.phx.aaaaaa_example를 호출하여fintech_fun클라우드 함수가 호출됩니다.
-
DROP_FUNCTION 프로시저를 사용하여 기존 함수를 삭제할 수 있습니다.
BEGIN DBMS_CLOUD_FUNCTION.DROP_FUNCTION ( catalog_name => 'OCI_DEMO_CATALOG', function_name => 'fintech_fun'); END; /그러면
OCI_DEMO_CATALOG카탈로그에서FINTECH_FUN함수가 삭제됩니다.자세한 내용은 DROP_FUNCTION 프로시저를 참조하십시오.
-
DROP_CATALOG 프로시저를 사용하여 기존 카탈로그를 삭제할 수 있습니다.
BEGIN DBMS_CLOUD_FUNCTION.DROP_CATALOG ( catalog_name => 'OCI_DEMO_CATALOG' ); END; /그러면 데이터베이스에서
OCI_DEMO_CATALOG가 삭제됩니다.자세한 내용은 DROP_CATALOG 프로시저를 참조하십시오.
SQL 함수로 AWS Lambda 함수 호출
전용 Exadata 인프라의 자율운영 AI 데이터베이스에서 AWS 원격 함수를 SQL 함수로 호출하는 단계를 보여줍니다.
이 단계를 진행하기 전에 AWS 테넌시에 AWS Lambda 함수를 생성하고 배포했다고 가정합니다. 자세한 내용은 AWS Lambda를 참조하십시오.
AWS 람다 기능에 액세스하려면 Oracle Cloud Infrastructure에서 필요한 정책을 구성해야 합니다. 자세한 내용은 Creating an IAM policy to access AWS Lambda resources 및 Using resource-based policies for Lambda을 참조하십시오.
AWS Lambda 함수를 작업한 후에는 DBMS_CLOUD 및 DBMS_CLOUD_FUNCTION PL/SQL API를 사용하여 자율운영 AI 데이터베이스에서 API 엔드포인트를 통해 해당 클라우드 함수를 참조하고 호출하는 SQL 래퍼 함수의 카탈로그를 생성합니다. DBMS_CLOUD_FUNCTION API를 사용하여 데이터베이스 응용 프로그램의 함수를 관리하게 됩니다.
- 인증서 객체로 AWS 보안 키를 사용하여 DBMS_CLOUD.CREATE_CREDENTIAL 프로시저를 사용하여 인증서를 생성합니다.
SET DEFINE OFF BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'AWS_CRED', username => 'access_key_ID', -- ID of Secret Key password => 'secret_access_key' -- Secret Key password ); END; /그러면
AWS_CRED인증서 객체가 생성됩니다.자세한 내용은 CREATE_CREDENTIAL 프로시저를 참조하십시오.
-
DBMS_CLOUD_FUNCTION.CREATE_CATALOG 프로시저를 사용하여 Catalog 객체를 생성합니다.
카탈로그는 API 끝점을 통해 해당 클라우드 함수를 참조하고 호출하는 래퍼 함수 모음입니다. 인증서 객체, 클라우드 서비스 제공자 이름(이 경우 AWS) 및 AWS 람다 함수가 있는 AWS 지역 ID(이 예의 경우
ap-northeast-1)를 제공합니다.BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( credential_name => 'AWS_CRED', catalog_name => 'AWS_DEMO_CATALOG', service_provider => 'AWS', cloud_params => '{"region_id":"ap-northeast-1"}' ); END; /그러면
AWS_DEMO_CATALOG카탈로그 객체가 생성됩니다.자세한 내용은 CREATE_CATALOG 프로시저를 참조하십시오. DBA_CLOUD_FUNCTION_CATALOG 뷰 및 USER_CLOUD_FUNCTION_CATALOG 뷰를 질의하여 데이터베이스의 모든 카탈로그 목록을 검색할 수 있습니다.
나머지 단계/작업(즉, LIST_FUNCTIONS 프로시저, SYNC_FUNCTIONS 프로시저, CREATE_FUNCTION 프로시저, DROP_FUNCTION 프로시저 및 DROP_CATALOG 프로시저)은 OCI 클라우드 기능에 설명된 것과 동일한 사용법을 사용합니다. OCI 클라우드 함수를 SQL 함수로 호출을 참조하십시오.
외부 프로시저 개요
전용 인프라에서 자율운영 AI 데이터베이스 애플리케이션에서 외부 프로시저 및 해당 프로시저의 사용에 대한 개요를 제공합니다.
외부 프로시저는 3세대 언어로 작성되고 SQL 함수나 PL/SQL 프로시저 또는 함수로 호출되는 함수입니다. SQL 및 PL/SQL은 데이터베이스에서 빠르고 효율적인 데이터 및 트랜잭션 처리에 가장 적합합니다. External 프로시저는 전용 외부 VM에서 컴퓨팅 및 메모리 사용량이 많은 작업을 실행하고 그 결과를 데이터베이스에 다시 제공하여 SQL 및 PL/SQL을 보완할 수 있습니다. 이러한 작업의 일반적인 예로는 계산 라이브러리가 Linux OS(데이터 플랫폼으로 쉽게 이식할 수 없음), 오프라인 데이터 분석, 실시간 장치 및 프로세스 제어 등에 존재하는 과학 및 엔지니어링 문제가 있습니다.
자율운영 AI 데이터베이스에서 사용자 정의 함수와 함께 외부 프로시저를 호출하고 사용할 수 있습니다. 데이터베이스 내에서 이러한 프로시저를 실행하는 대신 C 프로그램, Shell 스크립트 및 Python 스크립트를 실행하기 위해 컨테이너 및 런타임이 프로비저닝되는 전용 사용자 정의 OCI Linux VM에 실행 코드를 배치하고 Oracle SQL*Net 라이브러리와 함께 데이터베이스에서 원격 SQL을 실행할 수 있습니다.
주:
외부 프로시저용 원격 호스트는 OCI Marketplace에서 프로비전되고 적합한 OCI VCN(가상 클라우드 네트워크)에 구성된 OCI Linux EXTPROC VM이어야 합니다. 자세한 내용은 외부 프로시저 및 스크립트에 대한 OCI의 시스템 구성을 참조하십시오.
OCI Linux EXTPROC VM에서의 원격 실행은 Oracle Public Cloud의 Autonomous AI Database on Dedicated Exadata Infrastructure(버전 19.30부터) 및 Oracle Database 26ai(버전 23.26.1부터)에서만 지원됩니다. 이 기능은 Exadata Cloud@Customer(ExaCC)의 Autonomous AI Database on Dedicated Exadata Infrastructure 데이터베이스에서 아직 지원되지 않습니다.
외부 프로시저 및 스크립트에 대한 시스템 구성
EXTPROC VM을 프로비전하는 단계와 OCI 네트워크 및 외부 프로시저 실행을 위한 컴퓨트 구성 단계를 보여줍니다.
최소한 아키텍처는 다음 리소스로 구성됩니다.
- OCI 테넌시의 OCI 컴파트먼트에 프로비전된 OCI 가상 클라우드 네트워크입니다.
- Oracle Public Cloud의 Exadata 인프라에 생성되는 자율운영 Exadata VM 클러스터(AVMC)에서 프로비저닝되는 자율운영 컨테이너 데이터베이스(ACD) 아래에 인스턴스로 생성된 자율운영 AI 데이터베이스입니다.
- OCI 마켓플레이스에서 EXTPROC 스택의 일부로 프로비전된 EXTPROC VM입니다.
모범 사례로, AVM 클러스터는 VCN의 전용 서브넷에 배치됩니다. 기본 경로 테이블 및 VCN의 보안 목록은 OCI 테넌시의 자율운영 AI 데이터베이스 요구사항에 따라 구성됩니다. VCN에는 모든 경로 지정 및 보안 규칙을 정의할 수 있는 기본 경로 테이블과 하나의 기본 보안 목록이 있을 수 있습니다. 선택적으로, 자율운영 AI 데이터베이스 애플리케이션 및 프라이빗 서브넷의 다른 리소스에 인터넷에 대한 송신 액세스가 필요한 경우 NAT 게이트웨이로 VCN을 구성할 수 있습니다.
이 토폴로지에 ExtProc VM을 삽입할 때 다음 최소 OCI 네트워킹 구성 단계를 수행합니다.
- ExtProc VM에 로그인하여 C/C++에 구현된 외부 프로시저로 공유 라이브러리(점-so)를 빌드하고, VM 및 컨테이너를 검사 및 구성하고, 기타 해당 작업을 수행할 수 있어야 합니다.
- 일반적인 연습은 VCN의 공용(public) 서브넷에 있도록 EXTPROC VM을 구성하는 것입니다. 이 경우 VCN에 인터넷 게이트웨이를 생성해야 합니다(관리자가 아직 구성하지 않은 경우).
주:
EXTPROC VM은 CIDR 범위가 10.x.x.x인 서브넷에 있으면 안됩니다. EXPROC VM의 IP 주소가 10.x.x.x인 경우 자율운영 AI 데이터베이스와 통신할 수 없습니다.
- 포트 22를 통해 VM에 SSH 로그인 액세스를 허용하려면 VCN 보안 목록에서 수신 규칙을 정의해야 합니다. 또한 ADBD가 대상 포트 16000에 액세스할 수 있도록 허용하거나 일반적으로 모든 대상 포트에 액세스할 수 있도록 VCN의 보안 목록에서 송신 규칙을 정의해야 합니다. OCI 네트워킹 액세스 및 보안을 참조하십시오.
- EXTPROC VM 스택 프로비저닝의 일부로 AVMC의 모든 클라이언트 IP 주소를 제공합니다. 이러한 IPv4 클라이언트 IP 주소는 AVM 클러스터의 OCI 대시보드에서 가져옵니다.
- 그런 다음 프로비저닝 도구는 nsg_acl이라는 네트워크 보안 그룹(NSG)을 자동으로 만듭니다. 이 NSG에는 Autonomous Database Dedicated Client IP 주소를 포트 16000 대상에 액세스할 수 있는 유일한 소스로 허용하는 수신 규칙이 있습니다.
고급 항목
- ExtProc VM 및 자율운영 AI 데이터베이스를 호스트하는 서브넷이 동일한 VCN에 있는 경우 VCN의 라우팅 테이블에 특수 라우팅 규칙을 지정할 필요가 없습니다. If the subnets hosting the ExtProc VM and ADBD are in different VCNs, then you must implement VCN peering. VCN 피어링을 참조하십시오.
- ExtProc VM이 프라이빗 서브넷에 포함되도록 구성하려면 배스천/점프오프 서버를 통해 VM에 로그인하고 ExtProc VM으로만 수신을 사용으로 설정하고 자율운영 AI 데이터베이스와 같은 프라이빗 서브넷의 다른 리소스에 대한 보안 액세스를 사용으로 설정할 수 있어야 합니다. 자세한 내용은 OCI 네트워킹 가이드를 참고하세요.
외부 프로시저를 사용하여 유저 정의 함수 구현
-
OCI에서 EXTPROC VM 프로비저닝 및 구성 MarketPlace
- http://cloud.oracle.com에서 OCI 콘솔에 사인인합니다. 자세한 내용은 Oracle Cloud Infrastructure 콘솔에 사인인을 참조하십시오.
- Oracle Cloud Infrastructure 왼쪽 탐색 메뉴에서 마켓플레이스로 드롭다운한 다음 마켓플레이스에서 모든 애플리케이션을 누릅니다.
- 검색 표시줄에 "EXTPROC"를 입력하고 Search를 누릅니다. 레이블이 Stack이고 레이블이 Image인 두 개의 위젯이 표시됩니다.
- 이름이 스택인 위젯을 선택합니다(중요). 그러면 스택에 대한 스택 버전, 릴리스 날짜 및 릴리스 노트를 제공하는 Oracle Autonomous Database EXTPROC Agent 세부정보 페이지로 이동합니다. 이 페이지에서 스택 실행 단추를 누릅니다. 그러면 다음 Launch Stack 페이지로 이동합니다.
-
Launch Stack 페이지에서 다음을 수행합니다.
- 버전 드롭다운 목록에서 스택의 패키지 버전을 선택합니다.
- 컴파트먼트 드롭다운 목록에서 EXTPROC VM을 프로비전할 컴파트먼트의 이름을 선택합니다. 특정 이유가 없는 경우 ADBD의 구획과 동일한 구획을 선택합니다(최적의 경우 리소스의 루트 구획을 피하십시오). System Configuration for External Procedures and Scripts를 검토하여 컴파트먼트에 적합한 항목을 선택합니다.
- 조항 및 조건에 동의하고 스택 실행을 누릅니다.
그러면 다음 페이지인 Create Stack 마법사가 나타납니다.
- 이 페이지에서 이름, 설명, 컴파트먼트이름, Terraform 버전 및 태그 정보를 제공합니다. 컴파트먼트 이름은 필수이며 가장 중요한 것은 이 페이지의 마법사에 대한 입력입니다. 다음을 누릅니다.
- 그러면 EXTPROC VM(EXTPROC Agent라고도 함)의 구성 변수 페이지가 나타납니다. 이 페이지의 첫번째 부분은 EXTPROC 라이브러리에 대한 정보와 전자 지갑 암호를 수집합니다.
- 외부 라이브러리의 경우 전용 인프라의 자율운영 AI 데이터베이스에서 호출할 수 있도록 허용할 라이브러리 목록을 콤마(,)로 구분하여 제공합니다. 이러한 공유 라이브러리에는 C/C++로 작성된 외부 프로시저가 포함됩니다. 이 프로시저는 아키텍처 및 환경과 일치하도록 VM 자체에서 이상적으로 컴파일되고 구축됩니다.
주:
아직 EXTPROC VM을 만드는 중이라는 점을 감안할 때 여기서 제공하는 공유 라이브러리의 이름을 기록해 두십시오. VM을 사용할 수 있고 C/C++에서 외부 프로시저를 개발할 경우 위에 제공된 정확한 이름으로 라이브러리/라이브러리를 컴파일하고 빌드해야 합니다. - 전자 지갑 비밀번호에 대해 ExtProc VM에 생성될 전자 지갑 파일의 비밀번호를 제공합니다. 전용 인프라의 자율운영 AI 데이터베이스와 EXTPROC 에이전트 VM 간의 상호 TLS 인증을 위해 전자 지갑 및 자체 서명 인증서가 생성됩니다.
- 외부 라이브러리의 경우 전용 인프라의 자율운영 AI 데이터베이스에서 호출할 수 있도록 허용할 라이브러리 목록을 콤마(,)로 구분하여 제공합니다. 이러한 공유 라이브러리에는 C/C++로 작성된 외부 프로시저가 포함됩니다. 이 프로시저는 아키텍처 및 환경과 일치하도록 VM 자체에서 이상적으로 컴파일되고 구축됩니다.
- 구성 변수 페이지의 두번째 부분에는 EXTPROC VM에 대한 네트워크 구성이 포함됩니다.
- 컴파트먼트의 경우 풀다운 메뉴에서 VCN의 컴파트먼트 이름을 선택합니다. 위의 예제에서는 adbd로 표시됩니다. 이상적으로 자율운영 AI 데이터베이스 및 EXTPROC VM은 서로 다른(전용 및 공용) 서브넷에 있더라도 동일한 VCN에 함께 배치됩니다.
- 네트워크 전략의 경우 "기존 VCN 및 서브넷 사용"을 선택합니다. 이전 섹션에서 설명한 대로 ExtProc 개발 노력의 이 단계에서 VCN, AVMC 및 자율운영 AI 데이터베이스를 통해 시스템 아키텍처를 마련할 수 있습니다.
주:
다른 방법은 EXTPROC VM 에이전트에 대한 고유 구성 전략을 사용하여 새 VCN 및 서브넷을 생성하는 것입니다. As stated in the System Configuration for External Procedures and Scripts, if you choose to place the EXTPROC VM in a VCN different than that of the Autonomous AI Database, you must peer the VCNs. - EXTPROC 에이전트 액세스 유형에 대한 다음 항목을 건너뜁니다. 이 필드는 전용 Exadata 인프라의 자율운영 AI 데이터베이스에 적용할 수 없습니다.
- 그런 다음 "Private Endpoint IP Addresses"라는 레이블이 지정된 필드에 데이터베이스가 구성된 AVMC의 클라이언트 IP 주소를 모두 입력합니다. 이러한 클라이언트 IP 주소는 AVMC용 OCI 콘솔 대시보드에서 얻을 수 있습니다.
- 가상 클라우드 네트워크의 경우 EXTPROC VM 에이전트를 생성할 VCN의 이름을 제공합니다. System Configuration for External Procedures and Scripts를 검토하여 VCN에 적합한 항목을 선택합니다.
- EXTPROC 서브넷의 경우 EXTPROC VM 에이전트를 생성할 서브넷의 이름을 제공합니다. System Configuration for External Procedures and Scripts를 검토하여 서브넷에 적합한 항목을 선택합니다.
- 그런 다음 VCN 및 서브넷에 대한 세부정보를 제공합니다.
주:
EXTPROC VM은 CIDR 범위가 10.x.x.x인 서브넷에 있으면 안됩니다. EXPROC VM의 IP 주소가 10.x.x.x인 경우 자율운영 AI 데이터베이스와 통신할 수 없습니다. - 구성 페이지의 마지막 부분에는 EXTPROC VM 에이전트에 대한 컴퓨트 구성이 포함됩니다.
- 컴파트먼트의 경우 풀다운 메뉴에서 컴파트먼트 이름을 선택합니다. 문제 해결을 최소화하려면 전용 인프라의 자율운영 AI 데이터베이스, VCN 및 서브넷과 동일한 컴파트먼트에 VM을 함께 배치하는 것이 좋습니다.
- 구성, OCPU 수 및 메모리 크기(GB)의 경우 외부 프로시저의 작업 로드 특성에 따라 값을 입력합니다.
- SSH 키 추가의 경우 Linux OS, MacOS 또는 Windows 시스템에서 SSH 공개 및 개인 키 파일을 생성합니다. 터미널 창을 열고 다음 명령 중 하나를 실행합니다. ED25519은 최신의 보다 안전한 알고리즘이며 이전 시스템은 RSA 암호화 알고리즘을 지원합니다.
ssh-keygen -t ed25519 -C "your_email@example.com" (OR) ssh-keygen -t rsa -b 4096 -C "your_email@example.com"이렇게 하면 전용 키 파일 ssh-key-<date-time-id>.key 및 공용 키 파일 ssh-key-<date-time-id>.key.pub가 생성됩니다. SSH 퍼블릭 키의 내용을 창에 복사-붙여넣거나 .pub 파일을 창에 끌어 놓습니다.
- 다음을 누르십시오.
-
그러면 Review 페이지가 나타납니다. 모든 입력을 검토한 다음 적용 실행 체크박스를 선택하고 생성을 누릅니다.
그러면 OCI Resource Manager가 실행되어 EXTPROC VM 스택이 생성됩니다. ORM 작업이 성공적으로 완료되면 EXTPROC VM이 생성되어 실행됩니다.
- DBMS_CLOUD_FUNCTION API 입력에 대한 EXTPROC VM 시스템 정보 수집
데이터베이스에서 외부 프로시저를 호출할 수 있도록 하려면 EXTPROC VM 시스템 정보를 Autonomous AI Database의 DBMS_CLOUD_FUNCTION API에 대한 입력으로 제공해야 합니다.
- Oracle Cloud Infrastructure 왼쪽 탐색 메뉴에서 컴퓨트로 드롭다운하고, EXTPROC VM 프로비전에 대해 지정한 구획을 선택하고, 컴파트먼트의 모든 VM이 나열된 대시보드를 검토합니다. ORM 작업은 정규 이름이 EXTPROC-agent 또는 EXTPROC-agent-<setofnumbers>인 EXTPROC VM을 생성합니다. EXTPROC VM 인스턴스의 호스트 이름이 됩니다. 이 항목을 누르면 시스템 세부정보(IPV4 공용 및 개인 주소(IPv4 및 IPv6), 서브넷 및 이미지 세부정보)가 표시된 페이지로 이동합니다.
- ExtProc 스택 만들기 중 제공한 SSH 키 및 IP 주소를 사용하여 ExtProc VM에 로그인합니다. VM의 기본 유저는 opc. sudo에서 유저 oracle을 사용합니다.
➜ ~ ssh -i ssh-key-<date-time-id>.key opc@<Public-IP-Address> Wed Nov 19 10:46:25 GMT 2025: EXTPROC Agent intialization completed. Activate the web console with: systemctl enable --now cockpit.socket Last login: Thu Nov 20 20:10:54 2025 from <client-IP-address> [opc@extproc-agent-170798 ~]$ whoami opc [opc@extproc-agent-170798 ~]$ sudo su - oracle Last login: Wed Nov 19 19:07:24 GMT 2025 on pts/0EXTPROC VM에는 Oracle SQL*Net 리스너가 있는 실행 중인 Podman 컨테이너가 있습니다. 컨테이너 내에서 필요한 구성 파일(예: sqlnet.ora, listener.ora)이 있는 Oracle 클라이언트 환경과 자율운영 AI 데이터베이스와의 보안 통신을 위한 전자 지갑 파일이 함께 제공됩니다.
- PL/SQL API에 필요한 시스템 정보(OS 레벨 및 VM에 구성된 Podman 컨테이너)를 수집합니다. 컨테이너는 Oracle Listener를 실행하여 자율운영 AI 데이터베이스의 SQL 및 PL/SQL 애플리케이션에서 원격 실행 요청을 수신하고 외부 프로시저의 런타임 실행 엔진입니다.
- Linux OS에서 EXTPROC VM 호스트의 FQDN(정규화된 도메인 이름)입니다.
- Podman 컨테이너에서 리스너 상태부터 데이터베이스가 VM에 연결되는 EXTPROC VM의 포트입니다.
- Podman 컨테이너에서 sqlnet.ora 사양에서 전자 지갑 파일의 위치를 지정합니다.
- orapki 도구를 사용한 전자 지갑 파일 검사에서 전자 지갑 인증서에 대한 DN(식별 이름) 매개변수 값입니다.
[oracle@extproc-agent-170798 ~]$ hostname -f extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com [oracle@extproc-agent-170798 ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 86d81c4df6ff ghcr.io/oracle/adb-extproc:latest 23 hours ago Up 23 hours (healthy) adb-extproc [oracle@extproc-agent-170798 ~]$ podman exec -it 86d81c4df6ff bash (base) [oracle@extproc-agent-170798 admin]$ lsnrctl status LSNRCTL for Linux: Version 23.26.0.0.0 - for Oracle Cloud and Engineered Systems on 20-NOV-2025 09:25:54 Copyright (c) 1991, 2025, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 23.26.0.0.0 - for Oracle Cloud and Engineered Systems Start Date 19-NOV-2025 17:19:58 Uptime 0 days 16 hr. 5 min. 55 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/23.0.0.0/client_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/extproc-agent-170798/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=0.0.0.0)(PORT=16000))) Services Summary... Service "extproccontainer.com" has 1 instance(s). Instance "extproccontainer", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully (base) [oracle@extproc-agent-170798 /]$ cd $ORACLE_HOME/network/admin (base) [oracle@extproc-agent-170798 admin]$ cat sqlnet.ora NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) WALLET_LOCATION =(SOURCE = (METHOD = FILE)(METHOD_DATA = (DIRECTORY = /u01/app/oracle/wallets/extproc_wallet))) tcp.invited_nodes=(20.63.19.141,20.63.19.141,20.63.19.143,20.63.19.144) tcp.validnode_checking=yes (base) [oracle@extproc-agent-170798 admin]$ orapki wallet display -wallet /u01/app/oracle/wallets/extproc_wallet/cwallet.sso Oracle PKI Tool Release 23.0.0.0.0 - Production Version 23.0.0.0.0 Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved. Requested Certificates: User Certificates: Subject: CN=extproc-agent-170798 Trusted Certificates: Subject: CN=extproc-agent-170798 (base) [oracle@extproc-agent-170798 admin]$ exit exit위 예제에서는 DBMS_CLOUD_FUNCTION.CREATE_CATALOG API에 대해 다음 입력을 수집했습니다.- FQDN + 포트 번호로 구성된 문자열은
library_listener_url매개변수에 대한 입력입니다. 이 예에서는 'extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com:16000'입니다. - sqlnet.ora에는 VM에서 전자 지갑 파일의 위치가 포함됩니다. /u01/app/oracle/wallets/extproc_wallet/cwallet.sso.
tcp.invited_nodes에 대한 IP 주소 목록을 확인합니다. EXTPROC VM 스택을 생성하는 동안 네트워크 구성에 대한 입력으로 제공한 클라이언트 IP 주소 목록이 포함되어야 합니다. - 인증서 DN(식별 이름)은
library_ssl_server_cert_dn매개변수 'CN=extproc-agent-170798'에 대한 입력입니다.
- C 라이브러리를 빌드하여 EXTPROC VM 파일 시스템의 지정된 위치에 배치합니다.
C 함수를 코딩하고 빌드한 다음 ExtProc 에이전트 VM의 파일 시스템에 있는 지정된 디렉토리에 라이브러리를 배치합니다.
라이브러리 이름은 ExtProc 스택을 만드는 동안 제공한 이름과 정확히 일치해야 합니다. 잘못 배치한 경우 아래와 같이 ExtProc 컨테이너 initextproccontainer.ora 파일의 EXTPROC_DLLS 항목 또는 ExtProc 스택을 만든 ORM(Oracle Resource Manager) 작업의 "변수" 섹션에서 찾을 수 있습니다. 라이브러리를 EXTPROC 에이전트 VM의/u01/app/oracle/extproc_libs디렉토리로 복사해야 합니다.- 전체 파일 경로 이름(이 예의 경우 "/u01/app/oracle/extproc_libs/helloCextproc.so")은 DBMS_CLOUD_FUNCTION.CREATE_CATALOG()의 library_remote_path 매개변수에 대한 입력입니다.
(base) [oracle@extproc-agent-170798 client_1]$ cat $ORACLE_HOME/hs/admin/initextproccontainer.ora SET TRACE_LEVEL=ON SET _EXTPROC_REMOTE=TRUE SET WHOAMI=FROMDOCKER SET LD_LIBRARY_PATH=/u01/app/oracle/product/23.0.0.0/client_1/lib:/u01/app/oracle/extproc_libs:/opt/conda/lib SET EXTPROC_DLLS=ONLY:/u01/app/oracle/product/extprocutils.so:/u01/app/oracle/product/23.0.0.0/client_1/lib/libgsfextproc.so:/u01/app/oracle/extproc_libs/helloCextproc.so SET PYTHONHOME=/opt/conda SET SCRIPTS_FOLDER_LOC_ENV=/u01/app/oracle/extproc_scripts SET TRACE_FILE_LOC_ENV=/u01/app/oracle/extproc_logs SET PYTHONPATH=/tmp:/u01/app/oracle/extproc_scripts (base) [oracle@extproc-agent-170798 client_1]$ exit [oracle@extproc-agent-170798 ~]$ cat > helloCextproc.c #include <stdio.h> const char* helloCextproc() { return ("\nHello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com\n"); } ^D [oracle@extproc-agent-170798 ~]$ gcc -shared -fPIC -o /u01/app/oracle/extproc_libs/helloCextproc.so helloCextproc.c [oracle@extproc-agent-170798 ~]$ ls -al /u01/app/oracle/extproc_libs/ total 8 drwxr-xr-x. 2 oracle oinstall 30 Nov 19 11:14 . drwxr-xr-x. 6 root root 91 Nov 14 02:19 .. -rwxr-xr-x. 1 oracle oinstall 8184 Nov 19 11:14 helloCextproc.so [oracle@extproc-agent-170798 ~]$이렇게 하면 데이터베이스 응용 프로그램에서 Catalog/Library 객체를 생성하는 데 필요한 모든 파라미터 입력이 완료됩니다.
- ExtProc VM에서 OCI Object Storage로 전자 지갑 파일 업로드
자체 서명된 전자 지갑은 EXTPROC 에이전트 응용 프로그램 생성의 일부로 생성됩니다. 이 전자 지갑을 사용하여
Extproc에이전트 인스턴스에 액세스할 수 있습니다.EXTPROC 에이전트 인스턴스에서 원격 프로시저를 실행하기 위해 자율운영 AI 데이터베이스 및 EXTPROC 에이전트는 mTLS(상호 전송 계층 보안)를 사용하여 접속합니다. mTLS(상호 전송 계층 보안)를 사용하는 경우 클라이언트는 신뢰할 수 있는 CA(클라이언트 인증 기관) 인증서와 함께 표준 TLS 1.2를 사용하여 TCPS(보안 TCP) 데이터베이스 연결을 통해 연결됩니다.주:
CA(인증 기관)에서 발급한 공개 인증서를 획득하여 사용할 수도 있습니다.사전 요구사항으로, EXTPROC이 실행되는 VM의
/u01/app/oracle/extproc_wallet디렉토리에서 OCI Object Storage로 전자 지갑을 익스포트해야 합니다.주:
- 전자 지갑 파일의 보안을 설정합니다. 전자 지갑 파일은 데이터베이스 유저 ID 및 암호와 함께 EXTPROC 에이전트 instance에 대한 액세스를 제공합니다. 전자 지갑 파일을 안전한 위치에 저장하고 권한이 부여된 사용자와만 공유합니다.
- 전자 지갑 파일의 이름을 바꾸지 마십시오. 오브젝트 스토리지의 전자 지갑 파일 이름은
cwallet.sso이어야 합니다.
- 카탈로그를 생성하고, SQL 함수를 정의하고, 외부 프로시저를 SQL 함수로 호출
이전 단계에서는 SQL 또는 PL/SQL 데이터베이스 응용 프로그램에서 원격 프로시저를 실행하는 데 필요한 DBMS_CLOUD_FUNCTION API를 모두 입력했습니다.
다음으로, 자율운영 AI 데이터베이스의 오브젝트 스토리지에서 DIRECTORY로 EXTPROC 에이전트 인스턴스에 대한 인증서가 포함된 전자 지갑
cwallet.sso을 임포트합니다.전자 지갑 파일 cwallet.sso을 저장한 오브젝트 스토리지에 액세스할 수 있는 인증서를 생성합니다. 여러 객체 스토리지 서비스에 대한 사용자 이름 및 비밀번호 매개변수에 대한 자세한 내용은 CREATE_CREDENTIAL 프로시저를 참조하십시오.
데이터베이스에 DIRECTORY 객체를 생성하고 DBMS_CLOUD.GET_OBJECT API를 사용하여 전자 지갑을 디렉토리로 다운로드합니다.
SQL> SET DEFINE OFF SQL> BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OCI_CREDENTIAL', user_ocid => '<oci_user_ocid>', tenancy_ocid => '<oci_tenancy_ocid>', private_key => '<API-key-dot-pem-file-contents>', fingerprint => '<fingerprint-created-with-API-key>'); END; / SQL> CREATE DIRECTORY extprocwalletdir AS 'extprocwalletdir'; Directory created. SQL> SELECT directory_name, directory_path FROM dba_directories WHERE directory_name LIKE '%EXTPROC%'; DIRECTORY_NAME DIRECTORY_PATH ---------------- ------------------------------------------------------------------------- EXTPROCWALLETDIR /u02/data/dbfs/<adbd-name>/42E945D608E16DF9E0630301000AF88D/extprocwalletdir SQL> BEGIN DBMS_CLOUD.GET_OBJECT ( credential_name => 'OCI_CREDENTIAL', object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/p/aN.../n/zr.../b/bucket-name-20260129/o/cwallet.sso', directory_name => 'EXTPROCWALLETDIR' ); END; /그런 다음 데이터베이스에서 ExtProc의 C 라이브러리를 나타내는 라이브러리 객체를 이전 단계에서 수집한 입력 매개변수와 함께 생성합니다.
SQL> BEGIN DBMS_CLOUD_FUNCTION.CREATE_CATALOG ( library_name => 'EXTPROC_LIBRARY', library_listener_url => 'extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com:16000', library_wallet_dir_name => 'EXTPROCWALLETDIR', library_ssl_server_cert_dn => 'CN=extproc-agent-170798', library_remote_path => '/u01/app/oracle/extproc_libs/helloCextproc.so' ); END; / PL/SQL procedure successfully completed. SQL> SELECT catalog_name from DBA_CLOUD_FUNCTION_CATALOG WHERE catalog_name LIKE '%EXTPROC%'; CATALOG_NAME --------------- EXTPROC_LIBRARYExtProc C 함수에 매핑된 SQL 함수를 생성합니다. 위에 작성된 프로그램에서 C 함수의 이름을 확인합니다.
SQL> CREATE OR REPLACE FUNCTION HELLOCEXTPROC RETURN VARCHAR2 AS LANGUAGE C LIBRARY EXTPROC_LIBRARY NAME "helloCextproc"; / Function created. SQL>SQL 함수를 호출합니다. 성공적인 실행입니다(위의 C 루틴에서 C 함수 본문 참조).
SQL> SELECT HELLOCEXTPROC() FROM dual; HELLOCEXTPROC() ---------------------------------------------------------------------------------- Hello C Extproc from FQDN: extproc-agent-170798.subnet-name.vcn-name.oraclevcn.com
For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
오라클 고객지원센터 액세스
오라클 고객의 오라클 지원 서비스 접근 및 이용은 해당 서비스의 오라클 주문서에 명시된 조항들에 따릅니다.