주:
- 이 사용지침서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마칠 때는 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
OCI Notification에서 메시지 게시, 함수 트리거, OCI Object Storage 버킷에서 파일 생성
소개
Oracle Cloud Infrastructure Monitoring 또는 OCI Connector Hub 사용을 지원하는 것뿐만 아니라 경보를 보낼 수 있는 엔드포인트로 메시지를 푸시하는 OCI(Oracle Cloud Infrastructure) 통지와 같은 게시 구독 서비스를 구성할 수 있습니다. 또한 이벤트가 OCI Notification을 트리거할 때 애플리케이션이 메시지를 보낼 때 즉시 실행해야 하는 API 메시지인 고객 애플리케이션에서 이벤트를 생성할 수도 있습니다.
아키텍처는 더 복잡하거나 덜 복잡할 수 있지만, 이 사용 사례에서는 클라이언트가 HTTP POST 요청을 만들어 본문에 특정 속성이 있는 JSON을 파일 이름, OCI Object Storage에서 파일을 생성할 버킷의 이름 및 파일 안에 포함될 메시지와 같은 파일 생성
그런 다음 Oracle Cloud Infrastructure Container Engine for Kubernetes(OKE)에 배포되고 Node.js
에서 개발된 API REST 애플리케이션은 요청 본문에서 JSON을 가져오고 이 애플리케이션에서도 OCI 라이브러리를 사용하여 JSON 매개변수가 전송된 OCI Object Storage의 특정 버킷에 텍스트 파일을 생성하기 위해 이미 가입 및 개발된 Node.js
함수가 있는 메시지를 OCI Notifications에 게시합니다.
OCI 아키텍처
사용 사례 구조
이 사용지침서에서는 Oracle Cloud Infrastructure(OCI)의 첫 번째 서비스에 도달할 때까지 마지막 서비스에서 구성을 시작할 것입니다.
-
OCI Object Storage
-
OCI Functions
-
OCI 통지
-
Oracle Cloud Infrastructure Container Engine for Kubernetes
목표
-
새 OCI 오브젝트 스토리지 버킷을 생성합니다.
-
OCI 함수를 구성하고 생성합니다.
-
FDK(Function Development Kit) Node.js를 사용하여 OCI Functions를 구성, 개발 및 푸시하여 JSON 매개변수의 특정 버킷에 새 텍스트 파일을 생성합니다.
-
OCI 통지에서 새 토픽을 생성하고 OCI 함수를 끝점으로 연관시키는 구독을 생성합니다.
-
OKE에서 Kubernetes 클러스터를 생성 및 구성합니다.
-
Node.js에서 API REST 애플리케이션을 개발 및 배포하여 HTTP POST 요청 본문에서 JSON을 가져오고 이 JSON 본문을 OCI Notifications에 메시지로 게시합니다.
-
JSON 본문으로 HTTP POST를 요청하여 API REST 애플리케이션의 로드 밸런서에 노출된 URL입니다.
필요 조건
-
OCI 테넌트에 액세스합니다. 무료 Oracle Cloud 계정을 생성하려면 무료 Oracle Cloud 계정 생성을 참조하십시오.
-
OCI 명령행 인터페이스(CLI)를 설치합니다. 자세한 내용은 OCI CLI 설치를 참고하세요.
-
인터넷 게이트웨이를 통한 인터넷 액세스 트래픽에 대한 경로 테이블을 생성합니다. 자세한 내용은 VCN 라우트 테이블 및 인터넷 게이트웨이를 참조하십시오.
-
OCI 서비스를 그룹화할 수 있는 구획을 생성합니다. 자세한 내용은 구획 생성을 참조하십시오.
작업 1: OCI 오브젝트 스토리지에 버킷 생성
-
OCI 콘솔에 로그인한 후 스토리지, 오브젝트 스토리지 및 아카이브 스토리지, 버킷으로 이동하여 환경설정의 구획을 선택합니다.
-
버킷 생성을 누르고 다음 정보를 입력합니다.
- 버킷 이름: 버킷의 이름을 입력합니다.
data
또는 기타 이름을 예로 들 수 있습니다. - 기본 스토리지 계층: 이 자습서에 대해 표준을 선택합니다.
- 암호화: Oracle 관리 키를 사용하여 암호화를 선택합니다.
- 리소스 로깅: 버킷에서 발생하는 상황을 관찰하려면 리소스 로깅 사용을 선택합니다.
- 버킷 이름: 버킷의 이름을 입력합니다.
작업 2: OCI 함수 구성 및 생성
-
OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동하고 구획을 선택합니다.
-
애플리케이션 생성을 누르고 다음 정보를 입력합니다.
- 이름: 함수 애플리케이션의 이름을 입력합니다.
- VCN: 필요 조건에 따라 생성된 VCN을 선택합니다.
- 서브넷: 필요 조건에 따라 생성된 서브넷을 선택합니다. 이 자습서에서는 공용 서브넷을 구성했습니다.
- 구성: 이 응용 프로그램에서 지원하는 프로세서와 관련된 구성을 선택합니다. 이 자습서에서는
GENERIC_X86
입니다.
-
로그를 사용으로 설정하여 실행을 추적하고 OCI 함수 애플리케이션의 오류를 확인하십시오. 따라서 함수 애플리케이션의 세부정보에서 리소스 아래에 있는 로그를 누르고 로그 사용을 선택하여 구획 구성, 로그 그룹, 로그 이름 및 로그 보존 시간을 선택합니다.
작업 3: FDK Node.js를 사용하여 OCI 함수 구성, 개발 및 푸시를 통해 새 텍스트 파일 생성
FDK Node.js를 사용하여 OCI Functions를 구성, 개발 및 푸시하여 JSON 매개변수의 특정 버킷에 새 텍스트 파일을 생성합니다.
주: OCI Functions는 OCI Functions에서 생성, 읽기, 업데이트 및 삭제 작업을 수행하기 위해 Fn Project 오픈 소스 엔진에 의해 구동되므로 데스크톱, PC, 랩톱 또는 VM(가상 머신) 및 Fn Project로 작업할 함수의 컨텍스트와 같은 클라이언트를 구성합니다.
Introduction의 아키텍처에 표시된 대로 OCI에서 Oracle Linux 8 VM(관리 호스트)을 사용합니다.
-
OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동하고 함수 애플리케이션을 누릅니다.
-
리소스 섹션에서 시작하기를 누르고 로컬 설정을 선택하여 외부 Oracle Linux VM을 사용합니다.
주: 다음 구성요소가 설치되어 있어야 합니다.
-
OCI 명령행 인터페이스(CLI).
-
Oracle Linux의 Node.js
sudo yum update sudo yum install -y nodejs node --version
Node.js 버전은 OCI FDK 함수에서 지원되어야 합니다.
버전이 지원되지 않는 경우 다음 명령을 실행해야 합니다.
예제:
sudo yum module reset nodejs sudo yum module enable nodejs:18 sudo yum module install nodejs
-
VM에 설치된 Fn Project CLI입니다. 자세한 내용은 Installing the Fn Project CLI를 참조하십시오.
-
-
원하는 프로그래밍 언어로 프로젝트를 생성합니다. 이 자습서에서는 Node.js를 사용합니다. 새 프로젝트를 생성하려면 다음 명령을 실행합니다.
fn init --runtime node "Name_Of_Your_Project"
예제:
fn init --runtime node app_mess_createFile_os_function
-
프로젝트 폴더에 액세스하려면 다음 명령을 실행합니다.
cd "Name_Of_Your_Project"/
예제:
cd app_mess_createFile_os_function/
-
시작하기에 지정된 해당 지역의 구획 및 Oracle Functions API URL에 대한 특정 컨텍스트를 생성하고 업데이트합니다.
fn create context "specific_context" --provider oracle
fn use context "specific_context"
fn update context "your_compartment_id"
fn update context api-url "your_api_url"
예제:
fn create context Developer_OCI --provider oracle
fn use context Developer_OCI
fn update context oracle.compartment-id ocid1.compartment.oc1..aaaaaaaa4ixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fn update context api-url https://functions.sa-vinhedo-1.oraclecloud.com
-
애플리케이션 이미지가 푸시될 Oracle Cloud Infrastructure 컨테이너 레지스트리의 경로를 입력합니다.
참고: Oracle Cloud Infrastructure Container Registry가 없는 경우, 함수 이미지를 푸시하려면 이 저장소를 생성해야 합니다.
-
개발자 서비스, 컨테이너 및 아티팩트, 컨테이너 레지스트리로 이동하고 저장소 생성을 누릅니다.
-
다음 정보를 입력하고 생성을 누릅니다.
- 구획에 생성: 자신의 구획을 선택하고,
- 액세스: 공용을 선택합니다.
- 저장소 이름: 저장소 이름을 입력합니다.
Oracle Cloud Infrastructure Container Registry를 생성했으면 컨텍스트에서 접두어가 올 때까지 이 저장소의 경로를 설정하십시오.
fn update context registry "regionID.ocir.io/tenancy_namespace/[repo-name-prefix]"
예제:
fn update context registry vcp.ocir.io/idccixxxxx/apigwrepo
-
-
Oracle Cloud Infrastructure 컨테이너 레지스트리에 로그인합니다.
주: 로그인하려면 이미지를 빌드, 풀링 및 저장소로 푸시하려면 다음이 있어야 합니다.
-
Docker가 설치되었습니다. 자세한 내용은 How to install Docker on Oracle Linux 8/7을 참조하십시오.
-
Oracle Cloud Infrastructure 사용자 이름 및 인증 토큰이 생성되었습니다. 자세한 내용은 Getting an Auth Token을 참조하십시오.
다음 명령을 실행하여 Oracle Cloud Infrastructure Container Registry에 로그인하십시오.
sudo docker login -u 'tenancy_namespace/username' regionID.ocir.io
Password: xxxxxx
예(이 예의 경우 사용자 이름이 Oracle Identity Cloud Service와 통합되므로 포함해야 함):
sudo docker login -u 'idccixxxxx/OracleIdentityCloudService/ivan.v.vasquez@oracle.com' vcp.ocir.io
Password: xxxxxx
-
-
OCI 함수를 구성한 후에는 Node.js 프로그램을 개발하여 특정 버킷에 텍스트 파일을 생성합니다.
작업 3.3에서 함수 프로젝트를 작성했습니다. 프로젝트 폴더에 다음 파일이 작성됩니다.
func.js
(이 파일에서는 node.js 프로젝트 논리를 작성합니다.)func.yaml
(함수 구성 파일)package.json
(이 파일은 프로젝트 논리에 필요한 Node.js 종속성을 지정합니다.)
이 프로젝트에서는 Node.js OCI SDK 종속성 oci-objectstorage 및 oci-common을 추가해야 합니다. 종속성을 설치하려면 다음 명령을 실행하십시오.
npm install oci-common
npm install oci-objectstorage
package.json
파일에 추가된 종속성을 확인할 수 있습니다.키와 구성 파일이 모두 Fn Project 폴더에 있는 OCI CLI 구성 프로세스와 유사하게 구성 파일을 사용하여 OCI에서 인증하려고 합니다.
다음은 Node.js 소스 코드이며 각 코드 부분의 세부 정보는 주석으로 설명됩니다.
-
func.js
.//Dependencies are added const fdk= require('@fnproject/fdk'); const os = require("oci-objectstorage"); const common = require("oci-common"); //method invoked when is triggered the function fdk.handle(async function(input){ try{ //declaration of constants such as tenancy namespace and region const namespace = 'idccixxxxx'; const region = 'sa-vinhedo-1'; //declaration of variables required such as bucket name, file name and text for create the file text in a specific bucket let bucketName = 'data'; let objectName = 'empty.txt'; let fileMessage = 'Empty!' //Getting json values from input variable if (input.objectName) { objectName = input.objectName; } if (input.bucketName){ bucketName = input.bucketName; } if (input.fileMessage){ fileMessage = input.fileMessage; } //Creation of Authentication, using Config File Authentication Object const configurationFilePath = "config"; const configProfile = "DEFAULT"; const provider = new common.ConfigFileAuthenticationDetailsProvider( configurationFilePath, configProfile ); //Creation of Object Storage Client using authentication object const client = new os.ObjectStorageClient({authenticationDetailsProvider: provider}); client.regionId = region; //The object to upload to the object store. const putObjectRequest = { namespaceName: namespace, //namespace of your object storage bucketName: bucketName, //name of the bucket where the file will be placed objectName: objectName, //name of the text file putObjectBody: generateStreamFromString(fileMessage) //The body that will be uploaded in the object stored }; //Put the text file object in the object storage specified const response = await client.putObject(putObjectRequest); return {'message': 'Bucket Name: ' + bucketName+' - FileName: '+objectName+ ' \nMessage: '+fileMessage} }catch (error) { console.error('Error uploading to Object Storage:', error); } }) //return ReadableStream object required by putObjectBody, using the string message that will write in the text file function generateStreamFromString(data) { let Readable = require("stream").Readable; let stream = new Readable(); stream.push(data); // the string you want stream.push(null); return stream; }
참고: app_mess_createFile_os_function.zip에서 OCI Functions Project를 다운로드하십시오.
-
프로젝트가 생성되었습니다. Oracle Cloud Infrastructure Container Registry에 계속 로그인되어 있는지 확인하십시오. Oracle Cloud Infrastructure Container Registry에서 이미지를 빌드 및 푸시하고 이 기능을 OCI Functions 애플리케이션에 배치하겠습니다.
-
OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동하고 함수 애플리케이션을 누릅니다.
로컬 시스템에서는 OCI Functions 프로젝트 폴더에 있어야 합니다.
fn deploy --app name_of_your_function_application
예제:
fn deploy --app fn-demo-apgw
-
이미지가 Oracle Cloud Infrastructure Container Registry에 배포되었는지 검증하려면 OCI 콘솔로 이동하여 개발자 서비스, 컨테이너 및 아티팩트 및 컨테이너 레지스트리로 이동하십시오.
함수가 OCI Functions 애플리케이션에 배치되었는지 확인하려면 OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동한 후 함수 애플리케이션을 누르고 Oracle Cloud Infrastructure Container Registry 경로와 함께 이미지가 참조되는지 확인합니다.
-
-
로컬 시스템에서 테스트를 실행하고 다음 Fn Project 명령을 실행하여 JSON 형식으로 제공되는 매개변수로 입력을 시뮬레이션합니다.
echo -n '{"jsonVariable": "value"}' | fn invoke application_function_name function_name
예제:
echo -n '{"objectName": "tutorialFileText.txt", "bucketName":"data", "fileMessage":"This an example message, for this tutorial in the text file"}' | fn invoke fn-demo-apgw app_mess_createfile_os_function
버킷에 생성된 파일을 검토하려면 스토리지, 오브젝트 스토리지 및 아카이브 스토리지, 버킷으로 이동하여 버킷을 누르고 파일이 있는지 검증합니다.
작업 4: 새 OCI 통지 항목 및 OCI 함수를 끝점으로 연관시키는 가입 생성
-
OCI Notifications 생성 및 활용 메시지가 이 서비스 내의 토픽에 게시되면 끝점에 대한 트리거가 생성됩니다. 이 끝점은 작업 3에서 생성된 함수입니다.
OCI 콘솔로 이동하여 개발자 서비스, 애플리케이션 통합 및 통지로 이동합니다. 항목 생성을 누르고 이 항목의 이름을 입력합니다.
-
이 토픽에 대한 구독을 생성하려면 토픽 및 구독 생성을 누릅니다. 이 자습서에서는
Functions
를 끝점으로 선택합니다. 전자메일, Slack, SMS, PagerDuty 또는 HTTPS URL과 같은 끝점을 선택하고 함수 구획, Oracle Functions 애플리케이션 및 함수를 선택할 수 있습니다.참고: OCI Notification에서는 필요한 경우 다른 엔드포인트로 여러 구독을 생성할 수 있습니다.
-
OCI Notification에서 필수 변수를 사용하여 OCI Functions용 작업 3에서 수행한 것과 유사한 JSON 형식 메시지를 게시할 수 있습니다.
OCI 콘솔로 이동하여 개발자 서비스, 애플리케이션 통합 및 통지로 이동합니다. 항목을 누르고 다음 이미지에 표시된 대로 메시지를 입력합니다.
버킷에서 확인하려면 스토리지, 오브젝트 스토리지 및 아카이브 스토리지 및 버킷으로 이동하십시오. 버킷을 누르고 파일이 있는지 검증합니다.
작업 5: Oracle Cloud Infrastructure Container Engine for Kubernetes에서 Kubernetes 클러스터 생성 및 구성
이 작업에서는 간단한 Kubernetes 클러스터를 생성합니다. 자세한 내용은 Creation of OKE Cluster을 참조하십시오.
-
OCI 콘솔로 이동하여 개발자 서비스, 컨테이너 및 아티팩트로 이동하고 OKE(Kubernetes 클러스터)를 누릅니다.
-
클러스터 페이지에서 클러스터 생성을 누릅니다.
-
클러스터를 만들기 위한 두 가지 워크플로우가 있습니다. 사용자정의 생성 및 제출을 누릅니다.
-
빠른 생성: 이 작업은 쉽고 빠르며 OKE가 작업에 필요한 모든 요소를 자동으로 배치합니다. 예를 들면 다음과 같습니다.
- VCN(가상 클라우드 네트워크)
- 인터넷 게이트웨이(IG)
- NAT 게이트웨이(NAT)
- 서비스 게이트웨이(SGW)
- Kubernetes 클러스터
- Kubernetes worker nodes(s) and node pool
-
사용자 정의 만들기: 이미 고객에게 서비스, 네트워크, 기반구조가 있는 엔터프라이즈 환경의 경우 OKE 배치를 사용자 정의하여 준수하고 클라이언트 아키텍처, 리소스에 맞게 조정하고 모범 사례를 따르는 것이 중요합니다.
이 자습서에서는 사용자정의 생성을 선택하여 위에 표시된 구조를 보존합니다.
-
-
클러스터 이름, 구획, Kubernetes 버전을 입력하고 다음을 누릅니다.
-
네트워크 설정 페이지에서 다음 정보를 입력하고 다음을 누릅니다.
- 네트워크 유형: VCN-고유 포드 네트워킹을 선택합니다. 자세한 내용은 POD 네트워킹을 참조하십시오.
- VCN: VCN을 선택합니다.
- 서브넷: 전용 및 공용 서브넷을 선택합니다. 이 자습서에서는 로드 밸런서용 공용 서브넷과 API 엔드포인트용 전용 서브넷을 사용합니다.
-
노드 풀 페이지에서 다음 정보를 입력합니다.
- 이름: 노드 풀의 이름을 입력합니다.
- 컴파트먼트: 해당 구획을 선택합니다.
- 노드 유형: 관리됨 노드 유형을 선택합니다. 자세한 내용은 가상 노드와 관리 노드 비교를 참조하십시오.
- 버전: Kubernetes 버전을 선택합니다.
- 노드 배치 구성:
- 가용성 도메인: 가용성 도메인을 구성합니다.
- 작업자 노드 서브넷: 이 노드 풀에 만들 노드에 대한 개인 서브넷을 설정합니다.
- 결함 도메인: 노드를 분배할 결함 도메인을 선택합니다.
- 구성 및 이미지: 워커 노드에 대한 구성 및 이미지를 선택합니다.
- 노드 구성:
VM.Standard.E3.Flex Shape (16GB RAM memory and 1 OCPU)
을 선택합니다. - 이미지:
Oracle-Linux-8.9-2024.01.26-0-OKE-1.28.2-679
이미지를 선택합니다.
- 노드 구성:
- 노드 수: 이 자습서에 대해
1
를 입력합니다. 1이면 충분합니다. - 부트 볼륨: 부트 볼륨 매개변수는 수정하지 않습니다.
- Pod communications: 개인 서브넷을 선택합니다.
-
Kubernetes 클러스터 구성을 검토하고 클러스터 생성을 누릅니다.
주: 클러스터 생성을 누르기 전에 로드 밸런서, API 끝점 및 작업자 노드에 대한 각 OKE 네트워크 서브넷에 모든 수신 및 송신 보안 목록 규칙이 구성되었는지 확인하십시오. 자세한 내용은 Network Resource Configuration for Cluster Creation and Deployment을 참조하십시오.
Kubernetes 클러스터를 확인하려면 개발자 서비스, 컨테이너 및 아티팩트 및 OKE(Kubernetes 클러스터)로 이동합니다.
-
Kubernetes 클러스터에 액세스하려면 Kubernetes 클러스터 이름 및 클러스터 액세스를 누릅니다.
Cloud Shell 액세스가 사용 안함으로 설정되었고 로컬 액세스가 사용으로 설정되었음을 알 수 있습니다. API 끝점 서브넷을 선택할 때 전용 서브넷을 선택했기 때문입니다. 더 안전하고 Kubernetes 클러스터에 액세스하는 유일한 방법은 로컬 시스템을 사용하는 것이므로 이 자습서에서 관리 호스트 Oracle Linux VM과 함께 사용하는 구성입니다. Local Access를 선택합니다.
주: OCI CLI, Docker 및 kubectl이 설치되어 있어야 합니다. 자세한 내용은 Installing kubectl를 참조하십시오.
-
관리 호스트가 준비되면 다음 명령을 실행하여 로컬 시스템에서 Kubernetes 클러스터로 액세스합니다.
-
OCI CLI 버전을 확인합니다.
oci -v
-
홈에 kubeconfig 디렉토리를 생성합니다.
mkdir -p $HOME/.kube
-
VCN-Native 전용 끝점으로 kubeconfig 파일을 생성합니다.
oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.sa-vinhedo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --file $HOME/.kube/config --region sa-vinhedo-1 --token-version 2.0.0 --kube-endpoint PRIVATE_ENDPOINT
-
kubeconfig 환경 변수를 설정합니다.
export KUBECONFIG=$HOME/.kube/config
-
-
Kubernetes 클러스터의 액세스를 확인하려면 kubectl 명령을 실행합니다.
-
OKE 작업자 노드를 가져옵니다.
kubectl get nodes
-
OKE Pod를 가져옵니다.
kubectl get pods -A
-
작업 6: Node.js에서 API REST 애플리케이션 개발 및 배치, OCI 통지에서 메시지 게시
이 자습서에서는 Node.js에 API REST 애플리케이션을 개발 및 배포하여 HTTP Post 요청 본문에서 JSON을 가져오고 이 JSON 본문을 OCI Notifications에 메시지로 게시합니다.
Node.js 프로젝트를 생성하고, 프로젝트를 구축하고, Oracle Cloud Infrastructure Container Registry에 푸시하고, OKE에 배포하겠습니다. OCI 함수에 대해 구성된 기존 Oracle Linux 관리 호스트를 사용하므로 Node.js 및 Docker가 이미 설치되어 있습니다.
-
다음 명령을 실행하여 로컬 시스템 홈에 프로젝트 이름이 있는 폴더를 생성하고 디렉토리를 프로젝트 폴더로 변경합니다.
mkdir api_rest_application_oke
cd api_rest_application_oke
-
프로젝트를 초기화하려면 다음 명령을 실행하고 다음 이미지에 표시된 대로
package.json
파일을 구성합니다.npm init
-
Node.js 코드를 개발하기 전에 프로젝트에 필요한 라이브러리를 설치해야 합니다.
-
API REST 애플리케이션은 웹 애플리케이션처럼 작동해야 하므로 express 라이브러리가 필요합니다.
npm install express
-
HTTP POST 요청에서 JSON 본문을 가져와야 하므로 body-parser 라이브러리가 필요합니다.
npm install body-parser
-
해당 서비스에 액세스하려면 애플리케이션이 OCI로 인증되어야 하므로 OCI-common 라이브러리가 필요합니다.
npm install oci-common
-
요청 본문의 메시지를 OCI Notifications에 게시하려면 oci-ons 라이브러리가 필요합니다.
npm install oci-ons
package.json
에는 다음과 같은 종속성이 있습니다. -
-
Node.js 프로젝트가 구성되면
index.js
파일에 코드를 생성할 수 있습니다. 다음은 소스 코드입니다.OCI CLI 구성 방식과 유사하게 구성 파일을 사용하여 코드를 통해 OCI에서 인증하려고 합니다. 두 경우 모두 다음 이미지에 표시된 것처럼 키와 구성 파일이 API REST 애플리케이션 프로젝트 폴더에 배치됩니다.
-
index.js
.//Dependencies are added const ons = require("oci-ons"); //oci notifications library const common = require("oci-common"); //oci authentication library const express = require('express'); //web application framework const bodyParser = require('body-parser');//extract information from an incoming HTTP request //invocation of express framework const app = express(); //definition of port that We will be used to listen the requests from the client side const port = 8080; //Create a default authentication provider that uses the DEFAULT const provider = new common.ConfigFileAuthenticationDetailsProvider( "config", "DEFAULT" ); //Use in the body HTTP POST request json format app.use(bodyParser.json()); //creation of POST endpoint app.post('/api/receive-json', (req, res) => { const jsonData = req.body; //If the Body is empty or not json format return error if (!jsonData) { return res.status(400).json({ error: 'Invalid JSON data in the request body' }); } (async () => { try { // Create OCI Notifications Client with OCI Authentication Object const client = new ons.NotificationDataPlaneClient({ authenticationDetailsProvider: provider }); // Create constant message object required for OCI Notifications const messageDetails = { title: "PUBLISH_MESSAGE", //Message Title body: JSON.stringify(jsonData) //Body Message }; //Create publish Message Request in a specific topic in OCI Notifications const publishMessageRequest = ons.requests.PublishMessageRequest = { topicId: "ocid1.onstopic.oc1.sa-vinhedo-1.amaaaaaan4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", messageDetails: messageDetails }; //Publish Message sending Publish Message Request object previously created const publishMessageResponse = await client.publishMessage(publishMessageRequest); } catch (error) { //error log console.log("publishMessage Failed with error " + error); } })(); res.json({ success: true, message: 'JSON data received successfully' }); }); //listening for a specific port app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); });
-
-
동일한 폴더에서 컨테이너 이미지를 생성할 수 있는
Dockerfile
를 생성합니다.FROM node:14 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 8080 CMD [ "node", "index.js" ]
-
로컬 Docker 저장소에서 프로젝트 이미지를 빌드하고 푸시합니다.
docker build . -t apirestapp:latest
로컬 Docker 저장소에서 이미지를 확인합니다.
docker images
참고:
-
Oracle Cloud Infrastructure 컨테이너 레지스트리가 있어야 합니다. 작업 3.6을 참조하십시오.
-
Oracle Cloud Infrastructure Container Registry에 로그인해야 하는 것과 동일한 로컬 시스템 관리 호스트를 사용하고 있으므로 로그인해야 합니다. 작업 3.7을 참조하십시오.
-
-
Oracle Cloud Infrastructure Container Registry에서 API REST 애플리케이션 이미지에 태그를 지정할 수 있습니다.
docker tag apirestapp:latest vcp.ocir.io/idccixxxxx/oke_application/oke_apirest_application_repository:latest
로컬 Docker 저장소에서 확인합니다.
docker images
Oracle Cloud Infrastructure 컨테이너 레지스트리에 이미지를 푸시합니다.
docker push vcp.ocir.io/idccixxxxx/oke_application/oke_apirest_application_repository:latest
Oracle Cloud Infrastructure Container Registry에서 OKE 이미지 애플리케이션을 검토하려면 개발자 서비스, 컨테이너 및 아티팩트 및 컨테이너 레지스트리로 이동하십시오.
-
이미지가 Oracle Cloud Infrastructure 컨테이너 레지스트리에 있으면 로컬 Oracle Linux VM 관리 호스트로 이동하여 이 이미지를 OKE에 배치할 수 있습니다. 이 자습서에서는 다음 명령을 실행하여 OKE에 대한 이름 공간 및 암호를 만듭니다.
-
프로젝트 폴더에 액세스합니다.
cd api_rest_application_oke/
-
OKE에 대한 이름 공간을 만듭니다.
kubectl create namespace ns-tutorial
-
네임스페이스를 확인합니다.
kubectl get namespace ns-tutorial
-
OKE에 대한 암호를 만듭니다.
kubectl create secret -n ns-tutorial generic ocir --from-file=.dockerconfigjson=../.docker/config.json --type=kubernetes.io/dockerconfigjson
-
암호를 확인합니다.
kubectl get secrets -A
-
-
OKE 환경이 이미 준비되어 있으므로 Oracle Cloud Infrastructure Container Registry에서 OKE로 애플리케이션 이미지를 배포하십시오.
주: 애플리케이션 이미지를 배치하려면 매니페스트 파일이 있어야 합니다. 이 자습서에서는 다음
yaml
파일이 매니페스트 파일이며, 애플리케이션을 배치하고80
포트를 사용하여 수신 중인 OCI 로드 밸런서에 표시되는 수신 서비스를 생성하는 데 사용됩니다.-
apirest_application_manifest.yaml
.apiVersion: apps/v1 kind: Deployment metadata: name: app-restapi namespace: ns-tutorial labels: app: app-restapi spec: replicas: 1 selector: matchLabels: app: app-restapi template: metadata: labels: app: app-restapi spec: containers: - name: app-restapi image: vcp.ocir.io/idccixxxxx/oke_application/oke_apirest_application_repository:latest ports: - containerPort: 8080 imagePullSecrets: - name: ocir apiVersion: v1 kind: Service metadata: name: svc-restapp namespace: ns-tutorial spec: selector: app: app-restapi ports: - port: 80 targetPort: 8080 type: LoadBalancer
-
매니페스트 파일을 저장한 폴더에서 kubectl 명령을 실행합니다.
kubectl apply -f apirest_application_manifest.yaml
이제 응용 프로그램이 배치되고 수신 로드 밸런서 서비스가 OKE에 생성됩니다.
-
OKE에서 생성된 Pod 및 서비스를 검증하려면 다음 명령을 실행합니다.
kubectl get pods -A
kubectl get svc -A
참고: api_rest_application_oke.zip에서 API REST 애플리케이션 프로젝트를 다운로드하십시오.
-
작업 7: API REST 애플리케이션의 로드 밸런서에 노출된 URL에 대해 JSON 본문이 있는 HTTP POST 요청
이 작업에서는 버킷에 파일을 만들 수 있는 기본 데이터가 포함된 Postman 클라이언트의 JSON 메시지 본문이 포함된 HTTP POST 요청을 생성합니다. 이 요청은 OKE의 API REST 애플리케이션으로 전송되고 OCI 통지 토픽의 메시지를 푸시하면 [소개]의 아키텍처에 설명된 대로 특정 버킷에 텍스트 파일을 생성하는 논리가 포함된 함수가 트리거됩니다.
-
Postman을 설치하려면 Postman Installation을 참조하십시오.
-
Postman 응용 프로그램을 엽니다.
-
햄버거 메뉴 파일을 누르고 새로 만들기를 선택합니다.
-
HTTP를 선택합니다.
-
OKE:
http://"IP ADDRESS LOAD BALANCER"/api/receive-json
에 배치된 API REST 애플리케이션에 의해 노출된 URL을 입력하고 POST 메소드를 선택합니다. 본문 태그에서 원시를 선택하고 빈 필드에 JSON 메시지를 입력합니다.
-
-
Send를 눌러 요청을 보냅니다.
OCI Object Storage의 특정 버킷에 생성된 파일을 확인하려면 스토리지, 오브젝트 스토리지 및 아카이브 스토리지, 버킷으로 이동하여 버킷을 누릅니다.
이 사용지침서에서는 OKE, OCI Functions 및 OCI Object Storage에 배포된 API, OCI SDK, Kubernetes 애플리케이션과 같은 여러 서비스를 통합하는 새로운 사용 사례와 함께 OCI Notifications를 사용했습니다.
관련 링크
확인
- 작성자 - Iván Alexander Vásquez Chinome(Oracle LAD A-Team Cloud 솔루션 전문가)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Publish a Message in OCI Notifications, Trigger a Function and Create a File in OCI Object Storage Bucket
F96552-01
April 2024