Oracle Enterprise ManagerのREST APIを利用してDBにSQLを実行する

## 概要

EMCC には RESTAPI が用意されており、登録されている target db に対して SQL を実行することが可能です。
本記事では最低限の設定と実行サンプルを説明します。


## 環境
```
Oracle Enterprise Manager Cloud Control 13c Release 5
```
なお、前提として EM 上で DBターゲット(oracle_database、cluster_database) は登録済みとします。

## 設定サンプル
#### OMS 側の oracle.sysman.db.restfulapi.executesql.target.query.enable プロパティを enable に変更
```
[oracle@***]$ emctl get property -name oracle.sysman.db.restfulapi.executesql.target.query.enable
Oracle Enterprise Manager Cloud Control 13c Release 5
Copyright (c) 1996, 2021 Oracle Corporation.  All rights reserved.
SYSMAN password:
Value for property oracle.sysman.db.restfulapi.executesql.target.query.enable for oms All Management Servers is null

[oracle@***]$ emctl set property -name oracle.sysman.db.restfulapi.executesql.target.query.enable -value true
Oracle Enterprise Manager Cloud Control 13c Release 5
Copyright (c) 1996, 2021 Oracle Corporation.  All rights reserved.
SYSMAN password:
Property oracle.sysman.db.restfulapi.executesql.target.query.enable has been set to value true for all Management Servers
OMS restart is not required to reflect the new property value
```

#### target db への名前付き資格証明の作成と EMUSER への紐づけ
target DB ログインする名前付き資格証明を作成し、
使用する EMUSER に紐づけます(CLI でも可)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2598644/c9b2b29c-1015-0d58-a4c9-c1846ca4de04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2598644/8fbbb5de-8bce-c3c3-a928-fae12c0221df.png)

#### POST
OMS の HTTPS console port にリクエストできる適当なサーバで POST します。(curl で試しています)
各パラメータは以下を参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2598644/2bd12fcb-f3d6-8690-70cc-15fee150a508.png)
```
/usr/bin/curl -k \
-u <EM_USER>:<EM_USER_PASS> \
-X POST https://***:7803/em/websvcs/restful/emws/oracle.sysman.db/executesql/target/query/v1 \
-H "Content-Type: application/json" \
-d @- <<'EOF'
{"targetName":"<TARGET_NAME>", "targetType": "<TARGET_TYPE>", "sqlStatement": "<sqlStatement>", "credential": {"DBCredsMonitoring":"<NAMED_CREDS>"}}
EOF
```

実行サンプル
```
[oracle@*** ~]$ /usr/bin/curl -k \
> -u SYSMAN:*** \
> -X POST https://***:7803/em/websvcs/restful/emws/oracle.sysman.db/executesql/target/query/v1 \
> -H "Content-Type: application/json" \
> -d @- <<'EOF'
> {"targetName":"orcl", "targetType": "rac_database", "sqlStatement": "SELECT * from v$database", "credential": {"DBCredsMonitoring":"ORCL_DBSNMP"}}
> EOF
{"Result":[{"DBID":***,"NAME":"ORCL","CREATED":1629102482000,"RESETLOGS_CHANGE#":8979227,"RESETLOGS_TIME":1631259190000,"PRIOR_RESETLOGS_CHANGE#":1,"PRIOR_RESETLOGS_TIME":1629102482000,"LOG_MODE":"ARCHIVELOG","CHECKPOINT_CHANGE#":118998869,"ARCHIVE_CHANGE#":118998855,"CONTROLFILE_TYPE":"CURRENT","CONTROLFILE_CREATED":1629102486000,"CONTROLFILE_SEQUENCE#":730912,"CONTROLFILE_CHANGE#":119001521,"CONTROLFILE_TIME":1646906901000,"OPEN_RESETLOGS":"NOT ALLOWED","VERSION_TIME":1631258284000,"OPEN_MODE":"READ WRITE","PROTECTION_MODE":"MAXIMUM PERFORMANCE","PROTECTION_LEVEL":"MAXIMUM PERFORMANCE"}]}
```
json 形式で返ってくるので後は parse なりして利用が可能です。
複数 DB に同時に投げたり、update や pl/sql の実行も可能です。(こちらは別プロパティを設定する必要があります)

以下のようなケースで利用価値があるのではないかと思います。

・EMCC、agent の deploy は OK
・EM 経由の target への sql 発行は可能
・client への認証情報の保存(walletなど)、remote からの sqlplus などの直接接続は NG

# ドキュメント
https://docs.oracle.com/cd/F33143_01/emadm/executing-sql-rest-api.html