주:

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 아키텍처

OCI 아키텍처

사용 사례 구조

사용 사례 구조

이 사용지침서에서는 Oracle Cloud Infrastructure(OCI)의 첫 번째 서비스에 도달할 때까지 마지막 서비스에서 구성을 시작할 것입니다.

목표

필요 조건

작업 1: OCI 오브젝트 스토리지에 버킷 생성

  1. OCI 콘솔에 로그인한 후 스토리지, 오브젝트 스토리지 및 아카이브 스토리지, 버킷으로 이동하여 환경설정의 구획을 선택합니다.

  2. 버킷 생성을 누르고 다음 정보를 입력합니다.

    • 버킷 이름: 버킷의 이름을 입력합니다. data 또는 기타 이름을 예로 들 수 있습니다.
    • 기본 스토리지 계층: 이 자습서에 대해 표준을 선택합니다.
    • 암호화: Oracle 관리 키를 사용하여 암호화를 선택합니다.
    • 리소스 로깅: 버킷에서 발생하는 상황을 관찰하려면 리소스 로깅 사용을 선택합니다.

    버킷 생성

작업 2: OCI 함수 구성 및 생성

  1. OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동하고 구획을 선택합니다.

  2. 애플리케이션 생성을 누르고 다음 정보를 입력합니다.

    • 이름: 함수 애플리케이션의 이름을 입력합니다.
    • VCN: 필요 조건에 따라 생성된 VCN을 선택합니다.
    • 서브넷: 필요 조건에 따라 생성된 서브넷을 선택합니다. 이 자습서에서는 공용 서브넷을 구성했습니다.
    • 구성: 이 응용 프로그램에서 지원하는 프로세서와 관련된 구성을 선택합니다. 이 자습서에서는 GENERIC_X86입니다.

    함수 애플리케이션 생성

  3. 로그를 사용으로 설정하여 실행을 추적하고 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(관리 호스트)을 사용합니다.

  1. OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동하고 함수 애플리케이션을 누릅니다.

  2. 리소스 섹션에서 시작하기를 누르고 로컬 설정을 선택하여 외부 Oracle Linux VM을 사용합니다.

    로컬 설정

    주: 다음 구성요소가 설치되어 있어야 합니다.

    • OCI 명령행 인터페이스(CLI).

    • Oracle Linux의 Node.js

      sudo yum update
      sudo yum install -y nodejs
      node --version
      

      Node.js 버전은 OCI FDK 함수에서 지원되어야 합니다.

      OCI 함수에서 지원되는 버전 - node.js

      버전이 지원되지 않는 경우 다음 명령을 실행해야 합니다.

      예제:

      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를 참조하십시오.

  3. 원하는 프로그래밍 언어로 프로젝트를 생성합니다. 이 자습서에서는 Node.js를 사용합니다. 새 프로젝트를 생성하려면 다음 명령을 실행합니다.

    fn init --runtime node "Name_Of_Your_Project"
    

    예제:

    fn init --runtime node app_mess_createFile_os_function
    
  4. 프로젝트 폴더에 액세스하려면 다음 명령을 실행합니다.

    cd "Name_Of_Your_Project"/
    

    예제:

    cd app_mess_createFile_os_function/
    
  5. 시작하기에 지정된 해당 지역의 구획 및 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
    
  6. 애플리케이션 이미지가 푸시될 Oracle Cloud Infrastructure 컨테이너 레지스트리의 경로를 입력합니다.

    참고: Oracle Cloud Infrastructure Container Registry가 없는 경우, 함수 이미지를 푸시하려면 이 저장소를 생성해야 합니다.

    1. 개발자 서비스, 컨테이너 및 아티팩트, 컨테이너 레지스트리로 이동하고 저장소 생성을 누릅니다.

    2. 다음 정보를 입력하고 생성을 누릅니다.

      • 구획에 생성: 자신의 구획을 선택하고,
      • 액세스: 공용을 선택합니다.
      • 저장소 이름: 저장소 이름을 입력합니다.

      Oracle Cloud Infrastructure 컨테이너 레지스트리 생성

    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
    
  7. Oracle Cloud Infrastructure 컨테이너 레지스트리에 로그인합니다.

    주: 로그인하려면 이미지를 빌드, 풀링 및 저장소로 푸시하려면 다음이 있어야 합니다.

    다음 명령을 실행하여 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
    

    로그인

  8. OCI 함수를 구성한 후에는 Node.js 프로그램을 개발하여 특정 버킷에 텍스트 파일을 생성합니다.

    작업 3.3에서 함수 프로젝트를 작성했습니다. 프로젝트 폴더에 다음 파일이 작성됩니다.

    • func.js(이 파일에서는 node.js 프로젝트 논리를 작성합니다.)
    • func.yaml(함수 구성 파일)
    • package.json(이 파일은 프로젝트 논리에 필요한 Node.js 종속성을 지정합니다.)

    이 프로젝트에서는 Node.js OCI SDK 종속성 oci-objectstorageoci-common을 추가해야 합니다. 종속성을 설치하려면 다음 명령을 실행하십시오.

    npm install oci-common
    

    종속성 oci-common 추가

    npm install oci-objectstorage
    

    종속성 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를 다운로드하십시오.

  9. 프로젝트가 생성되었습니다. Oracle Cloud Infrastructure Container Registry에 계속 로그인되어 있는지 확인하십시오. Oracle Cloud Infrastructure Container Registry에서 이미지를 빌드 및 푸시하고 이 기능을 OCI Functions 애플리케이션에 배치하겠습니다.

    1. OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동하고 함수 애플리케이션을 누릅니다.

      로컬 시스템에서는 OCI Functions 프로젝트 폴더에 있어야 합니다.

      fn deploy --app name_of_your_function_application
      

      예제:

      fn deploy --app fn-demo-apgw
      

      Oracle Cloud Infrastructure 컨테이너 레지스트리에 함수 배치

    2. 이미지가 Oracle Cloud Infrastructure Container Registry에 배포되었는지 검증하려면 OCI 콘솔로 이동하여 개발자 서비스, 컨테이너 및 아티팩트컨테이너 레지스트리로 이동하십시오.

      Oracle Cloud Infrastructure Container Registry에 푸시된 OCI 콘솔 이미지 체크인

      함수가 OCI Functions 애플리케이션에 배치되었는지 확인하려면 OCI 콘솔로 이동하여 개발자 서비스, 함수, 애플리케이션으로 이동한 후 함수 애플리케이션을 누르고 Oracle Cloud Infrastructure Container Registry 경로와 함께 이미지가 참조되는지 확인합니다.

      OCI 함수에 배치된 OCI 콘솔 이미지 체크인

  10. 로컬 시스템에서 테스트를 실행하고 다음 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 함수를 끝점으로 연관시키는 가입 생성

  1. OCI Notifications 생성 및 활용 메시지가 이 서비스 내의 토픽에 게시되면 끝점에 대한 트리거가 생성됩니다. 이 끝점은 작업 3에서 생성된 함수입니다.

    OCI 콘솔로 이동하여 개발자 서비스, 애플리케이션 통합통지로 이동합니다. 항목 생성을 누르고 이 항목의 이름을 입력합니다.

    OCI 통지에서 항목 생성

    OCI 통지에서 생성된 항목

  2. 이 토픽에 대한 구독을 생성하려면 토픽 및 구독 생성을 누릅니다. 이 자습서에서는 Functions를 끝점으로 선택합니다. 전자메일, Slack, SMS, PagerDuty 또는 HTTPS URL과 같은 끝점을 선택하고 함수 구획, Oracle Functions 애플리케이션함수를 선택할 수 있습니다.

    가입 생성

    가입이 생성됨

    참고: OCI Notification에서는 필요한 경우 다른 엔드포인트로 여러 구독을 생성할 수 있습니다.

  3. OCI Notification에서 필수 변수를 사용하여 OCI Functions용 작업 3에서 수행한 것과 유사한 JSON 형식 메시지를 게시할 수 있습니다.

    OCI 콘솔로 이동하여 개발자 서비스, 애플리케이션 통합통지로 이동합니다. 항목을 누르고 다음 이미지에 표시된 대로 메시지를 입력합니다.

    OCI 통지 실행 중

    버킷에서 확인하려면 스토리지, 오브젝트 스토리지 및 아카이브 스토리지버킷으로 이동하십시오. 버킷을 누르고 파일이 있는지 검증합니다.

    OCI 통지에서 테스트

    OCI 통지에서 생성된 테스트 파일 검토

작업 5: Oracle Cloud Infrastructure Container Engine for Kubernetes에서 Kubernetes 클러스터 생성 및 구성

이 작업에서는 간단한 Kubernetes 클러스터를 생성합니다. 자세한 내용은 Creation of OKE Cluster을 참조하십시오.

  1. OCI 콘솔로 이동하여 개발자 서비스, 컨테이너 및 아티팩트로 이동하고 OKE(Kubernetes 클러스터)를 누릅니다.

  2. 클러스터 페이지에서 클러스터 생성을 누릅니다.

  3. 클러스터를 만들기 위한 두 가지 워크플로우가 있습니다. 사용자정의 생성제출을 누릅니다.

    • 빠른 생성: 이 작업은 쉽고 빠르며 OKE가 작업에 필요한 모든 요소를 자동으로 배치합니다. 예를 들면 다음과 같습니다.

      • VCN(가상 클라우드 네트워크)
      • 인터넷 게이트웨이(IG)
      • NAT 게이트웨이(NAT)
      • 서비스 게이트웨이(SGW)
      • Kubernetes 클러스터
      • Kubernetes worker nodes(s) and node pool
    • 사용자 정의 만들기: 이미 고객에게 서비스, 네트워크, 기반구조가 있는 엔터프라이즈 환경의 경우 OKE 배치를 사용자 정의하여 준수하고 클라이언트 아키텍처, 리소스에 맞게 조정하고 모범 사례를 따르는 것이 중요합니다.

      이 자습서에서는 사용자정의 생성을 선택하여 위에 표시된 구조를 보존합니다.

    OKE 클러스터 생성을 위한 옵션

  4. 클러스터 이름, 구획, Kubernetes 버전을 입력하고 다음을 누릅니다.

    클러스터 생성

  5. 네트워크 설정 페이지에서 다음 정보를 입력하고 다음을 누릅니다.

    • 네트워크 유형: VCN-고유 포드 네트워킹을 선택합니다. 자세한 내용은 POD 네트워킹을 참조하십시오.
    • VCN: VCN을 선택합니다.
    • 서브넷: 전용 및 공용 서브넷을 선택합니다. 이 자습서에서는 로드 밸런서용 공용 서브넷과 API 엔드포인트용 전용 서브넷을 사용합니다.

    네트워크 설정

  6. 노드 풀 페이지에서 다음 정보를 입력합니다.

    • 이름: 노드 풀의 이름을 입력합니다.
    • 컴파트먼트: 해당 구획을 선택합니다.
    • 노드 유형: 관리됨 노드 유형을 선택합니다. 자세한 내용은 가상 노드와 관리 노드 비교를 참조하십시오.
    • 버전: 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: 개인 서브넷을 선택합니다.

    노드 풀 1

    노드 풀 2

  7. Kubernetes 클러스터 구성을 검토하고 클러스터 생성을 누릅니다.

    주: 클러스터 생성을 누르기 전에 로드 밸런서, API 끝점 및 작업자 노드에 대한 각 OKE 네트워크 서브넷에 모든 수신 및 송신 보안 목록 규칙이 구성되었는지 확인하십시오. 자세한 내용은 Network Resource Configuration for Cluster Creation and Deployment을 참조하십시오.

    OKE 검토

    Kubernetes 클러스터를 확인하려면 개발자 서비스, 컨테이너 및 아티팩트OKE(Kubernetes 클러스터)로 이동합니다.

    OKE 클러스터 생성됨

  8. Kubernetes 클러스터에 액세스하려면 Kubernetes 클러스터 이름 및 클러스터 액세스를 누릅니다.

    Cloud Shell 액세스가 사용 안함으로 설정되었고 로컬 액세스가 사용으로 설정되었음을 알 수 있습니다. API 끝점 서브넷을 선택할 때 전용 서브넷을 선택했기 때문입니다. 더 안전하고 Kubernetes 클러스터에 액세스하는 유일한 방법은 로컬 시스템을 사용하는 것이므로 이 자습서에서 관리 호스트 Oracle Linux VM과 함께 사용하는 구성입니다. Local Access를 선택합니다.

    클러스터에 액세스

    주: OCI CLI, Docker 및 kubectl이 설치되어 있어야 합니다. 자세한 내용은 Installing kubectl를 참조하십시오.

  9. 관리 호스트가 준비되면 다음 명령을 실행하여 로컬 시스템에서 Kubernetes 클러스터로 액세스합니다.

    1. OCI CLI 버전을 확인합니다.

      oci -v
      
    2. 홈에 kubeconfig 디렉토리를 생성합니다.

      mkdir -p $HOME/.kube
      
    3. 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
      
    4. kubeconfig 환경 변수를 설정합니다.

      export KUBECONFIG=$HOME/.kube/config
      
  10. Kubernetes 클러스터의 액세스를 확인하려면 kubectl 명령을 실행합니다.

    • OKE 작업자 노드를 가져옵니다.

      kubectl get nodes
      

      kubectl 노드 가져오기

    • OKE Pod를 가져옵니다.

      kubectl get pods -A
      

      kubectl POD 가져오기

작업 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가 이미 설치되어 있습니다.

  1. 다음 명령을 실행하여 로컬 시스템 홈에 프로젝트 이름이 있는 폴더를 생성하고 디렉토리를 프로젝트 폴더로 변경합니다.

    mkdir api_rest_application_oke
    
    cd api_rest_application_oke
    
  2. 프로젝트를 초기화하려면 다음 명령을 실행하고 다음 이미지에 표시된 대로 package.json 파일을 구성합니다.

    npm init
    

    nodejs 프로젝트

  3. Node.js 코드를 개발하기 전에 프로젝트에 필요한 라이브러리를 설치해야 합니다.

    • API REST 애플리케이션은 웹 애플리케이션처럼 작동해야 하므로 express 라이브러리가 필요합니다.

      npm install express
      

      Express Library 설치

    • HTTP POST 요청에서 JSON 본문을 가져와야 하므로 body-parser 라이브러리가 필요합니다.

      npm install body-parser
      

      본문 구문 분석기 라이브러리 설치

    • 해당 서비스에 액세스하려면 애플리케이션이 OCI로 인증되어야 하므로 OCI-common 라이브러리가 필요합니다.

      npm install oci-common
      

      oci-common 라이브러리 설치

    • 요청 본문의 메시지를 OCI Notifications에 게시하려면 oci-ons 라이브러리가 필요합니다.

      npm install oci-ons
      

      oci-ons 라이브러리 설치

    package.json에는 다음과 같은 종속성이 있습니다.

    package.json 파일

  4. Node.js 프로젝트가 구성되면 index.js 파일에 코드를 생성할 수 있습니다. 다음은 소스 코드입니다.

    OCI CLI 구성 방식과 유사하게 구성 파일을 사용하여 코드를 통해 OCI에서 인증하려고 합니다. 두 경우 모두 다음 이미지에 표시된 것처럼 키와 구성 파일이 API REST 애플리케이션 프로젝트 폴더에 배치됩니다.

    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}`);
      });
      
  5. 동일한 폴더에서 컨테이너 이미지를 생성할 수 있는 Dockerfile를 생성합니다.

    FROM node:14
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 8080
    CMD [ "node", "index.js" ]
    
  6. 로컬 Docker 저장소에서 프로젝트 이미지를 빌드하고 푸시합니다.

    docker build . -t apirestapp:latest
    

    빌드 도커 이미지

    로컬 Docker 저장소에서 이미지를 확인합니다.

    docker images
    

    도커 이미지 확인

    참고:

    • Oracle Cloud Infrastructure 컨테이너 레지스트리가 있어야 합니다. 작업 3.6을 참조하십시오.

      OKE 응용 프로그램 저장소 생성

    • Oracle Cloud Infrastructure Container Registry에 로그인해야 하는 것과 동일한 로컬 시스템 관리 호스트를 사용하고 있으므로 로그인해야 합니다. 작업 3.7을 참조하십시오.

  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
    

    OKE 애플리케이션 태그 지정

    Oracle Cloud Infrastructure 컨테이너 레지스트리에 이미지를 푸시합니다.

    docker push vcp.ocir.io/idccixxxxx/oke_application/oke_apirest_application_repository:latest
    

    OKE 애플리케이션 푸시

    Oracle Cloud Infrastructure Container Registry에서 OKE 이미지 애플리케이션을 검토하려면 개발자 서비스, 컨테이너 및 아티팩트컨테이너 레지스트리로 이동하십시오.

    OKE Containe Registry 이미지

  8. 이미지가 Oracle Cloud Infrastructure 컨테이너 레지스트리에 있으면 로컬 Oracle Linux VM 관리 호스트로 이동하여 이 이미지를 OKE에 배치할 수 있습니다. 이 자습서에서는 다음 명령을 실행하여 OKE에 대한 이름 공간 및 암호를 만듭니다.

    1. 프로젝트 폴더에 액세스합니다.

      cd api_rest_application_oke/
      
    2. OKE에 대한 이름 공간을 만듭니다.

      kubectl create namespace ns-tutorial
      

      이름 공간 oke 생성

    3. 네임스페이스를 확인합니다.

      kubectl get namespace ns-tutorial
      

      네임스페이스 확인

    4. OKE에 대한 암호를 만듭니다.

      kubectl create secret -n ns-tutorial generic ocir --from-file=.dockerconfigjson=../.docker/config.json --type=kubernetes.io/dockerconfigjson
      

      이산 OKE 생성

    5. 암호를 확인합니다.

      kubectl get secrets -A
      

      암호 확인

  9. 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에서 매니페스트 적용

    • OKE에서 생성된 Pod 및 서비스를 검증하려면 다음 명령을 실행합니다.

      kubectl get pods -A
      

      OKE PODS

      kubectl get svc -A
      

      OKE 서비스

    참고: api_rest_application_oke.zip에서 API REST 애플리케이션 프로젝트를 다운로드하십시오.

작업 7: API REST 애플리케이션의 로드 밸런서에 노출된 URL에 대해 JSON 본문이 있는 HTTP POST 요청

이 작업에서는 버킷에 파일을 만들 수 있는 기본 데이터가 포함된 Postman 클라이언트의 JSON 메시지 본문이 포함된 HTTP POST 요청을 생성합니다. 이 요청은 OKE의 API REST 애플리케이션으로 전송되고 OCI 통지 토픽의 메시지를 푸시하면 [소개]의 아키텍처에 설명된 대로 특정 버킷에 텍스트 파일을 생성하는 논리가 포함된 함수가 트리거됩니다.

  1. Postman을 설치하려면 Postman Installation을 참조하십시오.

  2. Postman 응용 프로그램을 엽니다.

    1. 햄버거 메뉴 파일을 누르고 새로 만들기를 선택합니다.

      Postman 메뉴

    2. HTTP를 선택합니다.

      HTTP 옵션

    3. OKE: http://"IP ADDRESS LOAD BALANCER"/api/receive-json에 배치된 API REST 애플리케이션에 의해 노출된 URL을 입력하고 POST 메소드를 선택합니다. 본문 태그에서 원시를 선택하고 빈 필드에 JSON 메시지를 입력합니다.

      Postman 요청

  3. Send를 눌러 요청을 보냅니다.

    답변 요청 사후 관리자

    OCI Object Storage의 특정 버킷에 생성된 파일을 확인하려면 스토리지, 오브젝트 스토리지 및 아카이브 스토리지, 버킷으로 이동하여 버킷을 누릅니다.

    이 자습서의 특정 버킷에서 생성된 마지막 파일

    최종 텍스트 파일

이 사용지침서에서는 OKE, OCI Functions 및 OCI Object Storage에 배포된 API, OCI SDK, Kubernetes 애플리케이션과 같은 여러 서비스를 통합하는 새로운 사용 사례와 함께 OCI Notifications를 사용했습니다.

확인

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.