이벤트 릴레이 개발 및 배포
블록체인 이벤트를 소비하고 이를 Oracle Streaming Service에 연계하는 Oracle Functions 애플리케이션을 생성합니다.
이벤트 릴레이 응용 프로그램에는 스트리밍 서비스에 연결하기 위한 자격 증명이 필요합니다. 인증서는 Oracle Cloud Infrastructure Vault에 보관됩니다. 이 인증서는 Terraform 코드를 실행할 때 Vault에 저장됩니다. OCI 환경의 초기 구성을 수행하면 인증서가 생성됩니다.
이 기능은 다음 서비스를 제공합니다.
- 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의 사용자 이름입니다.
- 인증 토큰: 계획 섹션에서 이전에 생성한 토큰입니다.
API 키 생성
키 쌍을 생성하고 공용 키를 Oracle Cloud Infrastructure 사용자 프로파일에 업로드합니다.
이 작업은 두 가지 방법으로 수행할 수 있지만 생성된 키를 계정에 직접 안전하게 업로드할 수 있으므로 Cloud Shell을 사용합니다.
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 - 사용자 세부정보 페이지에서 확인할 수 있습니다. [콘솔] 메뉴를 열고 ID로 이동하고 사용자를 누릅니다. 목록에서 사용자 이름을 누릅니다.
- 테넌시 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());
}
}
}소비자를 시작하면 이미 스트림으로 푸시된 기존 이벤트가 소비됩니다.
예제가 작동하고 솔루션 작동에 대해 설명하면 운용 레벨 소비자 앱을 하나 이상 생성할 준비가 된 것입니다. 이 앱은 JavaScript, Python 또는 다른 언어로 작성할 수 있습니다.