ADX(Azure Data Explorer, 이하 ADX)에서 SQL DB로 접근해 데이터를 SELECT/INSERT 검토.
ADX에서 SQLDB를 접근할때는 여러 방법이 가능할 것이다.
- ADX에서 제공하는 sql_request plugin
- ADF(Azure Data Factory, 이하 ADF)를 이용한 ETL 수행
- Azure Function 을 이용해 직접 개발
우선 검토 대상으로 ADX의 sql_request plugin을 진행했다.
관련문서 : sql_request plugin - Azure Data Explorer | Microsoft Docs
간단히, ADX에서 쿼리할때 SQL로 하면 된다.
ADX의 sql_request plugin 검토
다음 절차로 진행한다.
- SQL Database 및 sample DB 배포
- ADX에서 쿼리 수행해 SELECT/INSERT 등 테스트
- 오류 확인
SQL Database 배포 및 sample database 생성
여러 방법이 있는데, sample database 만드는 문서 참조해 DB를 바로 만들었다.
Create a single database - Azure SQL Database | Microsoft Docs
DB 크기는 개발/테스트 목적이라 basic tier로 가장 작은 DB, 1G로 생성했다. 기본 월 6천원 정도.
Service tiers - DTU-based purchase model - Azure SQL Database | Microsoft Docs
SSMS와 같은 쿼리툴에서 데이터가 잘 조회되는 것을 확인했다. 로컬 SSMS에서 테스트할때 firewall 이슈가 있었다.
IP firewall rules - Azure SQL Database and Azure Synapse Analytics | Microsoft Docs 내용 참조해 firewall 예외 추가 후 접속.
ADX에서 쿼리 수행해 SELECT/INSERT 등 테스트
ADX에서 수행한다. sql_request plugin - Azure Data Explorer | Microsoft Docs 내용을 참조해 진행했다.
evaluate sql_request( 'Server=tcp:<서버주소>.database.windows.net,1433;' 'Initial Catalog=<DB이름>;' h'User ID=<아이디>;' h'Password=<비번>;', 'select top 10 * from SalesLT.Customer')
오류 발생
"error": {
"code": "General_BadRequest",
"message": "Request is invalid and cannot be executed.",
"@type": "Kusto.Data.Exceptions.KustoBadRequestException",
"@message": "SqlRequestPlugin.Open: Failed to open connection or ExecuteReader: Cannot open server '서버명' requested by the login. Client with IP address '20.196.222.XXX' is not allowed to access the server. To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range. It may take up to five minutes for this change to take effect.",
저 20.196.222.XXX는 아마 ADX Cluster의 IP 주소인 듯 한데, 정확한 range를 알지 못한다.
아래처럼, firewall 옵션에서 "Allow Azure services and resources to access this server"를 yes로 변경하고 재실행.
결과가 잘 나온다.
ADX에서 SQL로 INSERT 처리
evaluate sql_request( 'Server=tcp:<DB서버>.database.windows.net,1433;' 'Initial Catalog=<DB명>;' h'User ID=<사용자ID>;' h'Password=<사용자비번>;', 'INSERT INTO Test(product_id, product_name) VALUES(20, \'proudct2\')')
에러 발생
evaluate sql_request(): the following error(s) occurred while evaluating the output schema: sql_request: SQL query result schema table lacks a DataType column.
sql_request plugin은 아마도 반드시 1개의 result set이 와야 하는데 오지 않아서 발생한 듯 하다.
마지막 라인을 아래 처럼 dummy return을 추가하면 결과는 나온다.
... 'INSERT INTO Test(product_id, product_name) VALUES(20, \'proudct2\') select @@ROWCOUNT')
하지만, 제한이 많고 적절하지 않다.
우선 방화벽 부분과 인증 부분에서 몇가지 검토가 필요해 보인다.
또한, 소량의 데이터 조회에는 적절할 것으로 보이나, 대규모 데이터 조회나 INSERT 처리 등에는 적절하지 않아 보인다.
Result set 처리 제한
최초 검토는 ADX 테이블에서 조회해 SQLDB로 INSERT SELECT나 SELECT INTO를 생각했으나, parameter 방식으로 pass 시키는 처리라 result set을 넘길 수 없었다.
이후에 ADX의 sql_request plugin에 좀더 result set을 다루는 처리와 확장이 이루어지면 다시 검토 예정.
참고링크 :
sql_request plugin - Azure Data Explorer | Microsoft Docs
IP firewall rules - Azure SQL Database and Azure Synapse Analytics | Microsoft Docs