ノート:

OCI通知でのメッセージの公開、関数のトリガーおよびOCIオブジェクト・ストレージ・バケットでのファイルの作成

イントロダクション

Oracle Cloud Infrastructure (OCI) Notificationsなどのパブリッシュ・サブスクライブ・サービスを構成して、アラートを送信できるエンドポイントにメッセージをプッシュし、構成されたサブスクリプションを介してアクションを実行できます。Oracle Cloud Infrastructure MonitoringまたはOCI Connector Hubのサポートだけでなく、イベントは、顧客アプリケーションから生成することもできます。これは、イベントによってOCI通知がトリガーされたときにアプリケーションがメッセージを送信したときに実行される即時アクションを表すAPIメッセージです。

アーキテクチャは多かれ少なかれ複雑になる可能性がありますが、このユースケースでは、クライアントはHTTP POSTリクエストを作成し、本文に特定の属性を持つJSONを送信します。ファイル名、OCI Object Storageでファイルを作成するバケットの名前、およびファイル内のメッセージなどのファイルを作成します。

その後、Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)にデプロイされ、Node.jsで開発されたAPI RESTアプリケーションは、リクエスト本文からJSONを取得し、このアプリケーションではOCIライブラリを使用してJSONパラメータを送信してOCIオブジェクト・ストレージ内の特定のバケットにテキスト・ファイルを作成するためにすでにサブスクライブおよび開発されたNode.js関数を持つメッセージをOCI通知で公開します。

OCIアーキテクチャ

OCIアーキテクチャ

ユースケース・アーキテクチャ

ユースケース・アーキテクチャ

このチュートリアルでは、Oracle Cloud Infrastructure (OCI)の最初のサービスに到達するまで、最後のサービスから構成を開始します:

目的

前提条件

タスク1: OCIオブジェクト・ストレージでのバケットの作成

  1. OCIコンソールにログインし、「ストレージ」「オブジェクト・ストレージおよびアーカイブ・ストレージ」「バケット」に移動して、プリファレンスの「コンパートメント」を選択します。

  2. 「バケットの作成」をクリックし、次の情報を入力します。

    • バケット名:バケットの名前を入力します。たとえば、dataなどの名前です。
    • デフォルト・ストレージ層:このチュートリアルでは、「標準」を選択します。
    • 暗号化: 「Oracle管理キーを使用した暗号化」を選択します。
    • リソース・ロギング:バケットで何が起こっているかを監視できるようにするには、「リソース・ロギングの有効化」を選択します。

    バケットを作成します

タスク2: OCI関数の構成および作成

  1. OCIコンソールに移動し、「開発者サービス」「ファンクション」「アプリケーション」に移動して、「コンパートメント」を選択します。

  2. 「アプリケーションの作成」をクリックし、次の情報を入力します。

    • 名前:ファンクション・アプリケーションの名前を入力します。
    • VCN:前提条件で作成されたVCNを選択します。
    • サブネット:前提条件で作成されたサブネットを選択します。このチュートリアルでは、パブリック・サブネットを構成しました。
    • シェイプ:このアプリケーションでサポートされているプロセッサに関連するシェイプを選択します。このチュートリアルでは、GENERIC_X86です。

    ファンクション・アプリケーションの作成

  3. ログを有効にして実行を追跡し、OCI Functionsアプリケーションのエラーを確認するため、ファンクション・アプリケーションの詳細の「リソース」で、「ログ」をクリックし、コンパートメントの構成、「ログ・グループ」「ログ名」および「ログ保持」の時間を構成する「ログの有効化」を選択します。

    ログ機能アプリケーションの有効化

タスク3: FDK Node.jsを使用したOCI関数の構成、開発およびプッシュによる新しいテキスト・ファイルの作成

FDK Node.jsを使用してOCI関数を構成、開発およびプッシュし、JSONパラメータから特定のバケットに新しいテキスト・ファイルを作成します。

ノート: OCI Functionsで作成、読取り、更新および削除操作を実行するために、OCI FunctionsはFn Projectのオープン・ソース・エンジンを搭載しているため、デスクトップ、PC、ラップトップまたは仮想マシン(VM)などのクライアントと、Fn Projectを使用するファンクションのコンテキストを構成します。

「はじめに」のアーキテクチャに示されているように、OCIでOracle Linux 8 VM (管理ホスト)を使用します。

  1. OCIコンソールに移動し、「開発者サービス」「ファンクション」「アプリケーション」に移動して、ファンクション・アプリケーションをクリックします。

  2. 「リソース」セクションで、「スタート・ガイド」をクリックし、「ローカル設定」を選択して外部Oracle Linux VMを使用します。

    ローカル設定

    ノート:次のコンポーネントがインストールされている必要があります。

    • OCI Command Line Interface (CLI)。

    • Oracle LinuxのNode.js。

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

      Node.jsのバージョンは、OCI FDK Functionsでサポートされている必要があります。

      OCI関数でサポートされるバージョン- node.js

      バージョンがサポートされていない場合は、次のコマンドを実行する必要があります。

      次に例を示します:

      sudo yum module reset nodejs
      sudo yum module enable nodejs:18
      sudo yum module install nodejs
      
    • VMにインストールされているFn Project CLI。詳細は、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 Container Registryへのログイン

    ノート:イメージをリポジトリにログイン、構築、プルおよびプッシュするには、次が必要です:

    次のコマンドを実行して、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
    

    Log in

  8. OCI Functionsを構成したら、Node.jsプログラムを開発し、特定のバケットにテキスト・ファイルを作成します。

    タスク3.3でファンクション・プロジェクトを作成し、プロジェクト・フォルダに次のファイルを作成します。

    • func.js (このファイルでは、node.jsプロジェクト・ロジックを記述します)。
    • func.yaml (これはファンクション構成ファイルです)。
    • package.json (このファイルは、プロジェクト・ロジックに必要なNode.js依存関係を指定します)。

    このプロジェクトでは、oci-objectstorageおよびoci-commonというNode.js OCI SDK依存関係を追加する必要があります。依存関係をインストールするには、次のコマンドを実行します。

    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;
      }
      

    ノート: OCI Functions Projectapp_mess_createFile_os_function.zipからダウンロードします。

  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 Container Registryへのファンクションのデプロイ

    2. Oracle Cloud Infrastructure Container Registryにデプロイされたイメージを検証するには、OCIコンソールに移動し、「開発者サービス」「コンテナとアーティファクト」および「コンテナ・レジストリ」に移動します。

      Oracle Cloud Infrastructure Container RegistryでプッシュされたOCIコンソール・イメージのチェックイン

      ファンクションがOCI Functionsアプリケーションにデプロイされているかどうかを確認するには、OCIコンソールに移動し、「開発者サービス」「ファンクション」「アプリケーション」に移動し、ファンクション・アプリケーションをクリックして、イメージがOracle Cloud Infrastructure Container Registryパスで参照されていることを確認します。

      OCI Functionsにデプロイされた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通知を作成して利用します。このサービス内のトピックでメッセージがパブリッシュされると、エンドポイントに対するトリガーが生成されます。このエンドポイントは、タスク3で作成されるファンクションです。

    OCIコンソールに移動し、「開発者サービス」「アプリケーション統合」および「通知」に移動します。「トピックの作成」をクリックし、このトピックの名前を入力します。

    OCI通知でのトピックの作成

    OCI通知で作成されたトピック

  2. このトピックのサブスクリプションを作成するには、トピックをクリックして「サブスクリプションの作成」をクリックします。このチュートリアルでは、エンドポイントとしてFunctionsを選択します。電子メール、Slack、SMS、PagerDutyまたはHTTPS URLなどのエンドポイントを選択し、「ファンクション・コンパートメント」「Oracle Functionsアプリケーション」および「ファンクション」を選択できます。

    登録を作成しています

    サブスクリプション作成

    ノート: OCI Notificationsでは、必要に応じて、異なるエンドポイントを持つ複数のサブスクリプションを作成できます。

  3. OCI Notificationsから、OCI Functionsのタスク3で行ったのと同様の必須変数を含むJSON形式のメッセージを公開できます。

    OCIコンソールに移動し、「開発者サービス」「アプリケーション統合」および「通知」に移動します。次のイメージに示すように、トピックをクリックし、「メッセージ」を入力します。

    OCI通知の実行

    バケットで確認するには、「ストレージ」「オブジェクト・ストレージおよびアーカイブ・ストレージ」および「バケット」に移動します。バケットをクリックし、ファイルが存在するかどうかを検証します。

    OCI通知からのテスト

    OCI通知から作成されたテスト・ファイルの確認

タスク5: Oracle Cloud Infrastructure Container Engine for KubernetesでのKubernetesクラスタの作成と構成

このタスクでは、単純なKubernetesクラスタを作成します。詳細は、OKEクラスタの作成を参照してください

  1. OCIコンソールに移動し、開発者サービスコンテナおよびアーティファクトに移動し、「Kubernetesクラスタ(OKE)」をクリックします。

  2. 「クラスタ」ページで、「クラスタの作成」をクリックします。

  3. クラスタを作成するためのワークフローが2つあります。「カスタム作成」および「発行」をクリックします。

    • クイック作成:これは、次のような操作のためにOKEが必要とするすべての要素を簡単、高速および自動的にデプロイします。

      • Virtual Cloud Network(VCN)
      • インターネット・ゲートウェイ(IG)
      • NAT Gateway(NAT)
      • サービス・ゲートウェイ(SGW)
      • Kubernetesクラスタ
      • Kubernetesワーカー・ノードおよびノード・プール
    • カスタム作成:すでに顧客にサービス、ネットワーク、インフラストラクチャがあるエンタープライズ環境では、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で十分です。
    • ブート・ボリューム:ブート・ボリューム・パラメータは変更しません。
    • ポッド通信:プライベート・サブネットを選択します。

    ノード・プール1

    ノード・プール2

  7. Kubernetesクラスタ構成を確認し、「クラスタの作成」をクリックします。

    ノート: 「クラスタの作成」をクリックする前に、ロード・バランサ、APIエンドポイントおよびワーカー・ノードのOKEネットワーク・サブネットごとに、すべてのイングレスおよびエグレス・セキュリティ・リスト・ルールが構成されていることを確認します。詳細は、クラスタの作成とデプロイメントのためのネットワーク・リソース構成を参照してください。

    OKEのレビュー

    Kubernetesクラスタを確認するには、「開発者サービス」「コンテナとアーティファクト」および「Kubernetesクラスタ(OKE)」に移動します。

    OKEクラスタが作成されました

  8. Kubernetesクラスタにアクセスするには、Kubernetesクラスタ名およびアクセス・クラスタをクリックします。

    「クラウド・シェル・アクセス」が無効で、「ローカル・アクセス」が有効になっていることがわかります。これは、APIエンドポイント・サブネットを選択した場合、プライベート・サブネットを選択したためです。より安全で、Kubernetesクラスタにアクセスする唯一の方法はローカル・マシンを使用することであるため、まさにこのチュートリアルで管理ホストのOracle Linux VMとともに使用している構成です。「ローカル・アクセス」を選択します。

    クラスタへのアクセス

    ノート: OCI CLI、Dockerおよびkubectlがインストールされている必要があります。詳細は、kubectlのインストールを参照してください。

  9. 管理ホストの準備ができたら、次のコマンドを実行して、ローカル・マシンからKubernetesクラスタにアクセスします。

    1. OCI CLIバージョンを確認します。

      oci -v
      
    2. ホームにkubeconfigディレクトリを作成します。

      mkdir -p $HOME/.kube
      
    3. VCNネイティブのプライベート・エンドポイントを含む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ポッドを取得します。

      kubectl get pods -A
      

      kubectlによるポッドの取得

タスク6: Node.jsでのAPI RESTアプリケーションの開発とデプロイ、およびOCI通知でのメッセージの公開

このチュートリアルでは、API RESTアプリケーションをNode.jsで開発およびデプロイして、HTTP Postリクエスト本文からJSONを取得し、このJSON本文をOCI通知のメッセージとして公開します。

Node.jsプロジェクトを作成し、プロジェクトを構築し、Oracle Cloud Infrastructure Container RegistryにプッシュしてOKEにデプロイします。OCI Functions用に構成された既存の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アプリケーションはWebアプリケーションのように動作する必要があるため、expressライブラリが必要です。

      npm install express
      

      Express Libraryのインストール

    • HTTP POSTリクエストからJSON本文を取得する必要があるため、body-parserライブラリが必要です。

      npm install body-parser
      

      body-parserライブラリのインストール

    • アプリケーションは、そのサービスにアクセスするためにOCIで認証する必要があるため、OCI-commonライブラリが必要になります。

      npm install oci-common
      

      oci-commonライブラリのインストール

    • リクエスト本文からのメッセージをOCI通知に公開するには、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リポジトリ内のイメージを確認します。

    docker images
    

    dockerイメージのチェック

    ノート:

    • Oracle Cloud Infrastructure Container Registryが必要です。タスク3.6を参照してください。

      OKEアプリケーション・リポジトリの作成

    • ログインする必要のある同じローカル・マシン管理ホストを使用しているため、Oracle Cloud Infrastructure Container Registryにログインする必要があります。タスク3.7を参照してください。

  7. API RESTアプリケーション・イメージは、Oracle Cloud Infrastructure Container Registryでタグ付けできます。

    docker tag apirestapp:latest vcp.ocir.io/idccixxxxx/oke_application/oke_apirest_application_repository:latest
    

    ローカルDockerリポジトリで確認します。

    docker images
    

    タグOKEアプリケーション

    イメージをOracle Cloud Infrastructure Container Registryにプッシュします。

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

    OKEアプリケーションのプッシュ

    Oracle Cloud Infrastructure Container RegistryでOKEイメージ・アプリケーションを確認するには、「開発者サービス」「コンテナおよびアーティファクト」および「コンテナ・レジストリ」に移動します。

    OKEコンテナ・レジストリのイメージ

  8. イメージがOracle Cloud Infrastructure Container Registryに入ると、ローカルのOracle Linux VM管理ホストに移動し、このイメージをOKEにデプロイできます。このチュートリアルでは、次のコマンドを実行してOKEのネームスペースおよびシークレットを作成します。

    1. プロジェクト・フォルダにアクセスします。

      cd api_rest_application_oke/
      
    2. OKEのネームスペースを作成します。

      kubectl create namespace ns-tutorial
      

      ネームスペースの作成

    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
      

      シークレット・オークの作成

    5. シークレットを確認します。

      kubectl get secrets -A
      

      シークレット・オークの確認

  9. OKE環境はすでに用意されているため、アプリケーション・イメージをOracle Cloud Infrastructure Container RegistryからOKEにデプロイします。

    ノート:アプリケーション・イメージをデプロイするには、マニフェスト・ファイルが必要です。このチュートリアルでは、次のyamlファイルがマニフェスト・ファイルであり、アプリケーションのデプロイと、80ポートを使用してリスニングするOCI Load Balancerで表されるイングレス・サービスの作成に使用されます。

    • 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で作成されたポッドおよびサービスを検証するには、次のコマンドを実行します。

      kubectl get pods -A
      

      OKE PODS

      kubectl get svc -A
      

      OKEサービス

    ノート: API RESTアプリケーション・プロジェクトは、api_rest_application_oke.zipからダウンロードしてください。

タスク7: API RESTアプリケーションのLoad Balancerで公開されているURLへのJSON本文を使用したHTTP POSTのリクエスト

このタスクでは、バケットにファイルを作成するための基本データを含むPostmanクライアントからのJSONメッセージ本文を使用してHTTP POSTリクエストを行います。このリクエストはOKEのAPI RESTアプリケーションに送信され、OCI通知トピックのメッセージをプッシュすると、「概要」のアーキテクチャに示すように、特定のバケットにテキスト・ファイルを作成するロジックを持つ関数がトリガーされます。

  1. Postmanをインストールするには、Postman Installationを参照してください。

  2. Postmanアプリケーションを開きます。

    1. ハンバーガー・メニューの「ファイル」をクリックし、「新規」を選択します。

      ポストマンメニュー

    2. 「HTTP」を選択します。

      「HTTP」オプション

    3. OKEにデプロイされたAPI RESTアプリケーションによって公開されるURL(http://"IP ADDRESS LOAD BALANCER"/API/receive-json)を入力し、POSTメソッドを選択します。「本文」タグで、「raw」を選択し、空白フィールドにJSONメッセージを入力します。

      ポストマンリクエスト

  3. 「送信」をクリックしてリクエストを送信します。

    回答リクエストポストマン

    OCIオブジェクト・ストレージの特定のバケットに作成されたファイルを確認するには、「ストレージ」「オブジェクト・ストレージおよびアーカイブ・ストレージ」「バケット」に移動してバケットをクリックします。

    このチュートリアルの特定のバケットに最後に作成されたファイル

    最終テキスト・ファイル

このチュートリアルでは、OCI Notificationsを新しいユースケースで使用して、API、OCI SDK、OKE、OCI Functions、OCI Object StorageにデプロイされたKubernetesアプリケーションなどの複数のサービスを統合しました。

承認

その他の学習リソース

docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。