NIFI - InvokeHTTP를 활용한 OpenAPI 연결
개요
OpenApi를 사용하여 데이터들을 추출하고 추출한 데이터를 파싱 및 데이터베이스에 삽입해야 할 일이 생겼다.
Nifi에서 OpenApi를 어떤식으로 사용해야 데이터를 추출할수 있는지 등을 알아보고 그 내용들을 기록하고자 한다.
참고한 링크
Apache Nifi HTTP/HTTPS 연결.
SSL 연결하기 | Apache Nifi로 작업을 하다보면 웹 사이트에서 컨텐츠를 가져 오거나 다양한 REST API를 통해서 JSON, XML, TXT 형태로 데이터를 가져와야 하는 일이 있다. 이러한 방법에 대해서 알아 보며
brunch.co.kr
Nifi에서 OpenApi를 활용하는 방법들을 설명한 위 링크를 참고했다.
Nifi에서 Api 호출하여 데이터 불러오기
- 사전준비
호출하고자 하는 OpenApi의 Request URL 을 찾아야 한다.
이때 URL의 시작이 http인지 https 인지에 따라 호출하는 방법이 다르다.
또한 보통 호출하는 API URL에 파라미터로 키를 삽입하지만 어떤 경우에는
URL Header 부분에 키를 삽입해야 하는 경우도 있으므로 확실하게 파악해야 한다.
여기에는 두 API를 사용할 예정이다.
https URL : WTO API, http URL : 관세청 API
- InvokeHTTP Processer 생성
InvokeHTTP 프로세서를 생성한다.
InvokeHTTP 프로세서는 상위에 다른 프로세서가 없어도 작동한다.
여기서는 InvokeHTTP 프로세서에 전달할 값들이 있어서 상위 프로세서를 생성했다.
InvokeHTTP 프로세서의 Configure 내용은 위와 같다. (API URL 이 http로 시작하는 경우)
- HTTP Method : 호출하고자하는 REST API 입력 ( 여기서는 단순 호출이기 때문에 GET 사용 )
- Remote URL : API URL 입력
* 다른 값들은 바꾸지 않음
- 추출 데이터 파싱 및 데이터베이스 삽입
InvokeHTTP 프로셋서 동작후에는 API 동작 결과가 하나의 FlowFile로 출력되기 때문에
필요한 방식으로 파싱을 거쳐 데이터 베이스에 삽입했다.
- SplitXml : 추출한 데이터의 형태가 Xml 이므로 하나로 합쳐져 있는 데이터들을 하나씩 나누는 과정
- EvaluateXPath : Xml 표현식으로 해당하는 값들을 Attribute로 변환
- Check Data(RouteOnAttribute) : Attribute 값에 대한 조건에 따라 흐름 분기 발생
- PutSQL : 데이터베이스에 쿼리문을 직접 전달하여 실행
- InvokeHTTP Processer 생성 (HTTPS)
위와 마찬가지로 InvokeHTTP 프로세서를 사용할 것이다.
여기서 주의해야 할 점은 URL이 https로 시작하는 점이다.
https의 경우는 인증과정까지 포함되어 있기 때문에 사용하는데 있어서 많이 까다로웠다.
HTTP Method, Remote URL 은 위와 같은 방식으로 한다.
- SSL Context Serviece : StandardSSLContextService를 생성하고 설정한다.
StandardSSLContextService Configure 를 설정한다.
설정하기 전에 먼저 keystore 파일과 Truststore 파일이 필요하다. (위에서 참고한 링크에 관련된 설명이 잘 되어 있다.)
Keystore 파일생성
keytool -genkey -v -keystore keystore-file -alias nifi-key -keyalg RSA -keysize 2048 -validity 10000
위 명령어를 통해 keystore 파일을 생성한다. 생성할때 여러가지를 입력받지만 가장 중요한것은 keystore 비밀번호이다.
생성이 완료된 다음에는 StandardSSLContextService Configure에서
Keystore Filename부분에 keystore 경로를 입력하고, Key Password에 keystore 비밀번호를 입력한다.
Truststore 파일 생성
keytool -export -alias nifi-key -keystore keystore-file -rfc -file trustnifi.cer
keytool -import -alias nifi-key -file trustnifi.cer -keystore cacerts -storepass [비밀번호]
위의 두 명령어를 통해 Truststore 파일을 생성할수 있다. 여기서는 cacerts라는 파일을 생성했다.
두번째 명령어에서 생성한 파일이 Truststore 파일이다. 이 파일의 경로와 비밀번호를
StandardSSLContextService Configure에 입력한다.
이렇게 StandardSSLContextService 설정이 끝나면 실행시킬수 있지만 실제 API를 호출하는데에 한가지가 더 필요한데
위 Truststore에 API 사이트의 인증서 지문을 등록해줘야 호출할 수 있다.
인증서 지문을 쉽게 등록할수 있는 방법이 소개된 링크를 같이 참고했다.
JAVA 에서 SSL 통신시 "PKIX path building failed" 오류
JAVA 애플리케이션에서 JSSE (Java Secure Socket Extension)를 통해 사설 인증서를 사용하는 ...
blog.naver.com
해당 링크에서 다운로드 받을수 있는 java 파일을 컴파일하여 나오는 Jar 파일의 경로는
앞에서 생성한 Truststore 파일의 경로와 같은 위치에 생성한다.
또한 위 링크에서 사용되는 Truststore 파일의 파일명은 jssecacert 인데
앞에서 생성했던 Truststore 파일명은 cacert이기 때문에 java 코드를 수정하거나 Truststore 파일을 다시 생성한다.
- Truststore 파일 다시 생성하기
keytool -import -alias nifi-key -file trustnifi.cer -keystore jssecacerts -storepass [비밀번호]
(해당 부분 또한 참고한 링크에 설명이 잘 되어 있다.)
- jar 실행시 포트 입력부분 : https의 포트는 443 이므로 해당 포트번호 입력
java InstallCert [API도메인]:[포트]
StandardSSLContextService Configure에서 새로 생성한 TrustStore 파일로 변경하고 실행한다.
- NIFI API 호출시 header 값 전달 방법
API 호출시에는 값을 전달할때 도메인에 같이 입력하여 API를 실행하는 경우가 있다.
ex) api.wto.org/timeseries/v1/indicators?i=all&t=all&pc=all&tp=all&frq=all&lang=1
위와 같은 경우 NIFI에서 해당 API호출하는 데에는 그냥 그 도메인을 복사해서 입력하면 된다.
반면에 도메인으로 전달하는 파라미터 외에 header 를 통해 값을 전달해야 하는 API도 있다.
header는 도메인에 포함되어 있지 않기 때문에 도메인으로는 값전달이 어렵기 때문에 위와 같이 API도메인 을 입력한다음 한가지를 더 수행해야 한다.
API를 호출하는 InvokeHTTP 프로세서에 프로퍼티로 header를 추가하면 header를 통해 값 전달이 가능하다.
+ 버튼을 통해 프로퍼티를 추가하고 프로퍼티 이름으로는 전달할 header의 이름과 동일하게 입력
값은 해당값을 입력해주면 된다.