ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を終える際は、これらの値をクラウド環境に固有の値に置き換えてください。
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アーキテクチャ
ユースケース・アーキテクチャ
このチュートリアルでは、Oracle Cloud Infrastructure (OCI)の最初のサービスに到達するまで、最後のサービスから構成を開始します:
-
OCI Object Storage
-
OCI関数
-
OCI通知
-
Oracle Cloud Infrastructure Container Engine for Kubernetes
目的
-
新しいOCI Object Storageバケットを作成します。
-
OCI関数を構成および作成します。
-
関数開発キット(FDK) Node.jsを使用してOCI関数を構成、開発およびプッシュし、JSONパラメータから特定のバケットに新しいテキスト・ファイルを作成します。
-
OCI Notificationsで新しいトピックを作成し、OCI Functionsをエンドポイントに関連付けるサブスクリプションを作成します。
-
OKEでKubernetesクラスタを作成および構成します。
-
API RESTアプリケーションをNode.jsで開発およびデプロイして、HTTP POSTリクエスト本文からJSONを取得し、このJSON本文をOCI通知のメッセージとして公開します。
-
API RESTアプリケーションのロード・バランサで公開されたURLへのJSON本文でHTTP POSTをリクエストします。
前提条件
-
OCIテナントへのアクセス。無料Oracle Cloudアカウントを作成するには、無料Oracle Cloudアカウントを作成を参照してください。
-
OCIコマンドライン・インタフェース(CLI)をインストールします。詳細は、OCI CLIのインストールを参照してください。
-
パブリックおよびプライベート・サブネットを含むVCNを作成します。詳細は、VCNの作成およびサブネットの作成を参照してください。
-
インターネット・ゲートウェイを使用したインターネット・アクセス・トラフィックのルート表を作成します。詳細は、VCNルート表およびインターネット・ゲートウェイを参照してください。
-
OCIサービスをグループ化できるコンパートメントを作成します。詳細は、コンパートメントの作成を参照してください。
タスク1: OCIオブジェクト・ストレージでのバケットの作成
-
OCIコンソールにログインし、「ストレージ」、「オブジェクト・ストレージおよびアーカイブ・ストレージ」、「バケット」に移動して、プリファレンスの「コンパートメント」を選択します。
-
「バケットの作成」をクリックし、次の情報を入力します。
- バケット名:バケットの名前を入力します。たとえば、
data
などの名前です。 - デフォルト・ストレージ層:このチュートリアルでは、「標準」を選択します。
- 暗号化: 「Oracle管理キーを使用した暗号化」を選択します。
- リソース・ロギング:バケットで何が起こっているかを監視できるようにするには、「リソース・ロギングの有効化」を選択します。
- バケット名:バケットの名前を入力します。たとえば、
タスク2: OCI関数の構成および作成
-
OCIコンソールに移動し、「開発者サービス」、「ファンクション」、「アプリケーション」に移動して、「コンパートメント」を選択します。
-
「アプリケーションの作成」をクリックし、次の情報を入力します。
- 名前:ファンクション・アプリケーションの名前を入力します。
- VCN:前提条件で作成されたVCNを選択します。
- サブネット:前提条件で作成されたサブネットを選択します。このチュートリアルでは、パブリック・サブネットを構成しました。
- シェイプ:このアプリケーションでサポートされているプロセッサに関連するシェイプを選択します。このチュートリアルでは、
GENERIC_X86
です。
-
ログを有効にして実行を追跡し、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 (管理ホスト)を使用します。
-
OCIコンソールに移動し、「開発者サービス」、「ファンクション」、「アプリケーション」に移動して、ファンクション・アプリケーションをクリックします。
-
「リソース」セクションで、「スタート・ガイド」をクリックし、「ローカル設定」を選択して外部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でサポートされている必要があります。
バージョンがサポートされていない場合は、次のコマンドを実行する必要があります。
次に例を示します:
sudo yum module reset nodejs sudo yum module enable nodejs:18 sudo yum module install nodejs
-
VMにインストールされているFn Project CLI。詳細は、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 Container Registryへのログイン
ノート:イメージをリポジトリにログイン、構築、プルおよびプッシュするには、次が必要です:
-
Dockerがインストールされました。詳細は、Oracle Linux 8/7にDockerをインストールする方法を参照してください。
-
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
-
-
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
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; }
ノート: OCI Functions Projectをapp_mess_createFile_os_function.zipからダウンロードします。
-
プロジェクトが作成され、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通知を作成して利用します。このサービス内のトピックでメッセージがパブリッシュされると、エンドポイントに対するトリガーが生成されます。このエンドポイントは、タスク3で作成されるファンクションです。
OCIコンソールに移動し、「開発者サービス」、「アプリケーション統合」および「通知」に移動します。「トピックの作成」をクリックし、このトピックの名前を入力します。
-
このトピックのサブスクリプションを作成するには、トピックをクリックして「サブスクリプションの作成」をクリックします。このチュートリアルでは、エンドポイントとして
Functions
を選択します。電子メール、Slack、SMS、PagerDutyまたはHTTPS URLなどのエンドポイントを選択し、「ファンクション・コンパートメント」、「Oracle Functionsアプリケーション」および「ファンクション」を選択できます。ノート: OCI Notificationsでは、必要に応じて、異なるエンドポイントを持つ複数のサブスクリプションを作成できます。
-
OCI Notificationsから、OCI Functionsのタスク3で行ったのと同様の必須変数を含むJSON形式のメッセージを公開できます。
OCIコンソールに移動し、「開発者サービス」、「アプリケーション統合」および「通知」に移動します。次のイメージに示すように、トピックをクリックし、「メッセージ」を入力します。
バケットで確認するには、「ストレージ」、「オブジェクト・ストレージおよびアーカイブ・ストレージ」および「バケット」に移動します。バケットをクリックし、ファイルが存在するかどうかを検証します。
タスク5: Oracle Cloud Infrastructure Container Engine for KubernetesでのKubernetesクラスタの作成と構成
このタスクでは、単純なKubernetesクラスタを作成します。詳細は、OKEクラスタの作成を参照してください
-
OCIコンソールに移動し、開発者サービス、コンテナおよびアーティファクトに移動し、「Kubernetesクラスタ(OKE)」をクリックします。
-
「クラスタ」ページで、「クラスタの作成」をクリックします。
-
クラスタを作成するためのワークフローが2つあります。「カスタム作成」および「発行」をクリックします。
-
クイック作成:これは、次のような操作のためにOKEが必要とするすべての要素を簡単、高速および自動的にデプロイします。
- Virtual Cloud Network(VCN)
- インターネット・ゲートウェイ(IG)
- NAT Gateway(NAT)
- サービス・ゲートウェイ(SGW)
- Kubernetesクラスタ
- Kubernetesワーカー・ノードおよびノード・プール
-
カスタム作成:すでに顧客にサービス、ネットワーク、インフラストラクチャがあるエンタープライズ環境では、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で十分です。 - ブート・ボリューム:ブート・ボリューム・パラメータは変更しません。
- ポッド通信:プライベート・サブネットを選択します。
-
Kubernetesクラスタ構成を確認し、「クラスタの作成」をクリックします。
ノート: 「クラスタの作成」をクリックする前に、ロード・バランサ、APIエンドポイントおよびワーカー・ノードのOKEネットワーク・サブネットごとに、すべてのイングレスおよびエグレス・セキュリティ・リスト・ルールが構成されていることを確認します。詳細は、クラスタの作成とデプロイメントのためのネットワーク・リソース構成を参照してください。
Kubernetesクラスタを確認するには、「開発者サービス」、「コンテナとアーティファクト」および「Kubernetesクラスタ(OKE)」に移動します。
-
Kubernetesクラスタにアクセスするには、Kubernetesクラスタ名およびアクセス・クラスタをクリックします。
「クラウド・シェル・アクセス」が無効で、「ローカル・アクセス」が有効になっていることがわかります。これは、APIエンドポイント・サブネットを選択した場合、プライベート・サブネットを選択したためです。より安全で、Kubernetesクラスタにアクセスする唯一の方法はローカル・マシンを使用することであるため、まさにこのチュートリアルで管理ホストのOracle Linux VMとともに使用している構成です。「ローカル・アクセス」を選択します。
ノート: OCI CLI、Dockerおよびkubectlがインストールされている必要があります。詳細は、kubectlのインストールを参照してください。
-
管理ホストの準備ができたら、次のコマンドを実行して、ローカル・マシンからKubernetesクラスタにアクセスします。
-
OCI CLIバージョンを確認します。
oci -v
-
ホームにkubeconfigディレクトリを作成します。
mkdir -p $HOME/.kube
-
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
-
kubeconfig環境変数を設定します。
export KUBECONFIG=$HOME/.kube/config
-
-
Kubernetesクラスタへのアクセスを確認するには、kubectlコマンドを実行します。
-
OKEワーカー・ノードを取得します。
kubectl get nodes
-
OKEポッドを取得します。
kubectl get pods -A
-
タスク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をすでにインストールします。
-
次のコマンドを実行して、ローカル・マシン・ホームにプロジェクト名のフォルダを作成し、ディレクトリをプロジェクト・フォルダに変更します。
mkdir api_rest_application_oke
cd api_rest_application_oke
-
プロジェクトを初期化するには、次のコマンドを実行し、次の図に示すように
package.json
ファイルを構成します。npm init
-
Node.jsコードを開発する前に、プロジェクトに必要なライブラリをインストールする必要があります。
-
API RESTアプリケーションはWebアプリケーションのように動作する必要があるため、expressライブラリが必要です。
npm install express
-
HTTP POSTリクエストからJSON本文を取得する必要があるため、body-parserライブラリが必要です。
npm install body-parser
-
アプリケーションは、そのサービスにアクセスするためにOCIで認証する必要があるため、OCI-commonライブラリが必要になります。
npm install oci-common
-
リクエスト本文からのメッセージをOCI通知に公開するには、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 Container Registryが必要です。タスク3.6を参照してください。
-
ログインする必要のある同じローカル・マシン管理ホストを使用しているため、Oracle Cloud Infrastructure Container Registryにログインする必要があります。タスク3.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
イメージをOracle Cloud Infrastructure Container Registryにプッシュします。
docker push vcp.ocir.io/idccixxxxx/oke_application/oke_apirest_application_repository:latest
Oracle Cloud Infrastructure Container RegistryでOKEイメージ・アプリケーションを確認するには、「開発者サービス」、「コンテナおよびアーティファクト」および「コンテナ・レジストリ」に移動します。
-
イメージがOracle Cloud Infrastructure Container Registryに入ると、ローカルの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 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で作成されたポッドおよびサービスを検証するには、次のコマンドを実行します。
kubectl get pods -A
kubectl get svc -A
ノート: API RESTアプリケーション・プロジェクトは、api_rest_application_oke.zipからダウンロードしてください。
-
タスク7: API RESTアプリケーションのLoad Balancerで公開されているURLへのJSON本文を使用したHTTP POSTのリクエスト
このタスクでは、バケットにファイルを作成するための基本データを含むPostmanクライアントからのJSONメッセージ本文を使用してHTTP POSTリクエストを行います。このリクエストはOKEのAPI RESTアプリケーションに送信され、OCI通知トピックのメッセージをプッシュすると、「概要」のアーキテクチャに示すように、特定のバケットにテキスト・ファイルを作成するロジックを持つ関数がトリガーされます。
-
Postmanをインストールするには、Postman Installationを参照してください。
-
Postmanアプリケーションを開きます。
-
ハンバーガー・メニューの「ファイル」をクリックし、「新規」を選択します。
-
「HTTP」を選択します。
-
OKEにデプロイされたAPI RESTアプリケーションによって公開されるURL(
http://"IP ADDRESS LOAD BALANCER"/API/receive-json
)を入力し、POSTメソッドを選択します。「本文」タグで、「raw」を選択し、空白フィールドにJSONメッセージを入力します。
-
-
「送信」をクリックしてリクエストを送信します。
OCIオブジェクト・ストレージの特定のバケットに作成されたファイルを確認するには、「ストレージ」、「オブジェクト・ストレージおよびアーカイブ・ストレージ」、「バケット」に移動してバケットをクリックします。
このチュートリアルでは、OCI Notificationsを新しいユースケースで使用して、API、OCI SDK、OKE、OCI Functions、OCI Object StorageにデプロイされたKubernetesアプリケーションなどの複数のサービスを統合しました。
関連リンク
承認
- 著者 -IvánAlexanderVásquezChinome (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
F96551-01
April 2024