イベントリレーの開発と展開
ブロックチェーン・イベントを消費し、Oracle Streaming ServiceにリレーするOracle Functionsアプリケーションを作成します。
イベント・リレー・アプリケーションには、ストリーミング・サービスに接続するための資格証明が必要です。資格証明はOracle Cloud Infrastructure Vaultに保持されます。資格証明は、Terraformコードの実行時にボールトに格納されます。資格証明は、OCI環境の初期構成を行うときに生成されます。
この関数には次のサービスがあります。
- Vaultからストリーミング・サービス資格証明を取得します。
- 資格証明を復号化します(Vaultでは暗号化された値が格納されます)。
- base64エンコード文字列からデコードします。
- 暗号化された資格証明を使用して、Kafka互換APIを使用してストリーミング・サービスに接続します。
- JSONイベント・メッセージからeventというJavaオブジェクトを作成して移入します。
- Kafka APIを使用してイベント・メッセージを送信します。
イベントリレーの作成
リレーは任意のプログラミング言語で作成できますが、Kafka APIはJavaに文書化されているため、Javaを使用することをお薦めします。
EventProducerクラスには次のメソッドがあります。
@FnConfiguration
public void config(RuntimeContext ctx) { ... }
private String decryptData(String cipherText) { ... }
public String handleRequest(Event event) { ... }
pom.xml
ファイルには、次の依存性も必要です。
<dependencies>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-keymanagement</artifactId>
<version>1.12.5</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>com.fnproject.fn</groupId>
<artifactId>api</artifactId>
<version>${fdk.version}</version>
</dependency>
.
.
.
fn CLIツールがインストールされていることを確認します。詳細は、https://github.com/fnproject/fn#quickstartを参照してください。
イベントリレーの作成
イメージをプッシュする前に、最初にdocker tag
コマンドを使用して、ローカル・ソース・イメージのコピーを新規イメージとして作成する必要があります(新規イメージは実際には既存のソース・イメージへの参照です)。新しいイメージの名前として、イメージをプッシュするOracle Cloud Infrastructure Registry内のターゲットの場所の完全修飾パスを指定します。
タグには、次の情報が必要です。
- リージョンのDockerレジストリ・エンドポイント
- オブジェクト・ストレージのネームスペース
リージョンのエンドポイントを取得するには、リージョン別の可用性の表でリージョンを検索します。たとえば、米国東部(アッシュバーン)のレジストリ・エンドポイントはhttps://iad.ocir.io
です。
オブジェクト・ストレージ・ネームスペースを検索するには:
- ナビゲーション・メニューで、「管理」、「テナンシ詳細」の順にクリックします。
- 「オブベクト・ストレージ・ネームスペース」は「オブジェクト・ストレージ設定」セクションにあります
レジストリへのイベントリレーのプッシュ
イベント・リレーが作成され、適切なタグが付いていたら、それをOracle Cloud Infrastructure Registryにプッシュできます。
- リージョンのAPIエンドポイント:たとえば、
iad.ocir.io
です。これは、Dockerイメージをタグ付けするために以前に使用した値と同じです。 - テナンシ・ネームスペース:テナンシの自動生成されたオブジェクト・ストレージ・ネームスペース文字列(「テナンシ情報」ページに表示)。
- ユーザー名: Oracle Cloud Infrastructureでのユーザー名。
- Auth Token:「Plan(プラン)」セクションで前に作成したトークン。
APIキーの作成
キー・ペアを生成し、公開キーをOracle Cloud Infrastructureユーザー・プロファイルにアップロードします。
これはいくつかの方法で行うことができますが、ここでは、生成されたキーをアカウントに直接アップロードできるため、クラウド・シェルを使用します。
Terraform構成の適用
GitHubリポジトリからTerraform構成をダウンロードし、Terraform変数ファイルを更新してから、構成を適用します。
terraform.tvars
ファイルには情報が必須です。
- リージョン -リージョンのリージョン識別子。これは、Oracle Cloud InfrastructureコンソールのURLから抽出できます。たとえば、URLが
https://console.us-ashburn-1.oraclecloud.com/compute/instances
の場合、リージョン識別子はus-ashburn-1です。URLがhttps://cloud.oracle.com/compute/instances
の場合、https://docs.oracle.com/iaas/Content/General/Concepts/regions.htmでリージョン識別子を検索する必要があります - コンパートメントOCID -プロジェクトのリソースを含むコンパートメントのOCID。「プラン」セクションの指示に従った場合、OBP_EventsコンパートメントのOCIDが必要です。
- フィンガープリント -以前に生成してプロファイルにアップロードしたパブリックAPIキーのフィンガープリント。
- 秘密キー -以前に生成したプライベートAPIキーのフルパスとファイル名。たとえば、
/home/opc/oci_api_key.pem
です。パスに~
を使用しないでください。 - ユーザーOCID -これは、「ユーザー詳細」ページから取得できます。コンソール・メニューを開き、「アイデンティティ」に移動して「ユーザー」をクリックします。リストでユーザー名をクリックします。
- テナンシOCID -これは、「テナンシ詳細」ページから取得できます。コンソール・メニューを開き、「管理」に移動して「テナンシ詳細」をクリックします。
情報がある場合は、Terraform構成をダウンロードして適用します。
ブロックチェーン・イベントのサブスクライブ
APIゲートウェイがブロックチェーン・イベントを受信できるようにコールバックURLを登録します。
https://joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com/obpevents/callback
の形式です。また、Terraformプロセスの完了時にuse_to_extract_ssl_certificateとして表示されるAPIゲートウェイ・デプロイメント・エンドポイントも必要です。joh5rb...fuxy.apigateway.us-ashburn-1.oci.customer-oci.com:443
の形式ですチェーンコード・イベントをサブスクライブするには、Oracle Blockchain Platform REST APIエンドポイントも必要です。形式:
https://<rest_server_url:port/restproxy#>/bcsgw/rest/v1/event/subscribe
<rest_server_url:port/restproxy#>
は、Oracle Blockchain PlatformコンソールにリストされるRESTプロキシのURLです。コンソールで、ノード・ページを開いてRESTプロキシ・ノードを探します。ルート列に、ポート番号とRESTプロキシ番号を含むURLがリストされます。
ブロックチェーン・イベントをサブスクライブするには:
イベント・コンシューマの作成およびテスト
イベント・コンシューマはKafka APIを使用して、Oracle Cloud Infrastructureストリーミングからブロックチェーン・メッセージを認証および取得します。
コンシューマを作成するには、次の文字列の情報が必要です。
- USER-NAME:ユーザー名。
- AUTH-TOKEN:以前に生成およびコピーしたトークンです。
- TENANCY-NAME:この値はOCIコンソールのテナンシ詳細ページに表示されます。テナンシ詳細ページを開くには、コンソール・ナビゲーション・メニューで「管理」を選択し、「テナンシ詳細」をクリックします。
- STREAM-POOL-OCID: Terraformスクリプトの実行時に作成されたストリーム・プールのOCIDです。この値を確認するには、コンソールのナビゲーション・メニューを開き、「管理」に移動して「ストリーミング」をクリックします。ストリーム・プールを選択し、それを開くページでOCIDをコピーします。
- REGION: "us-ashburn-1"。リージョンが異なる場合があります。
- EVENT-NAME:これは、ブロックチェーン・イベントを受信するためにコールバックURLを登録したときに以前に使用したイベント名と同じです。
次の例を使用して、システムが期待どおりに動作していることをテストし、検証します。
import java.util.Properties;
import java.util.Arrays;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
public class Consumer {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put("bootstrap.servers", "streaming.REGION.oci.oraclecloud.com:9092");
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "PLAIN");
props.put("sasl.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"TENANCY-NAME/USER-NAME/STREAM-POOL-OCID\" password=\"AUTH-TOKEN\";");
props.put("group.id", "group-0");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// Create a consumer and subscribe to it
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("EVENT-NAME"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
}
}
コンシューマを起動すると、ストリームにすでにプッシュされている既存のイベントがすべて消費されます。
例が機能し、ソリューションが機能することを示した後、1つ以上の本番レベルのコンシューマ・アプリケーションを作成できます。アプリケーションは、JavaScript、Pythonまたはその他の言語で記述できます。