この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
本エントリはクラスメソッド インフォマティカ Advent Calendar 2020のエントリです。
- クラスメソッド インフォマティカ Advent Calendar 2020 - Qiita
- クラスメソッド インフォマティカ Advent Calendar 2020 | 特集カテゴリー | Developers.IO
データアナリティクス事業本部、池田です。
アドベントカレンダー9日目です!
以前のブログ
で、Informatica Intelligent Cloud Services(以下IICS)
のSecure Agentの起動や停止の話を書きました。
今回は、
Informatica Intelligent Cloud Services REST API
というものを使って、Secure Agentが動いているかステータスを確認してみます。
APIのバージョンについて
Informatica Intelligent Cloud Services REST APIには、執筆時点で version 2 と version 3 が存在します。 version 3の方のagentservice によると、
After you send a POST request to start or stop a Secure Agent service, you can check the status of the service using the REST API V2 agent resource.
とのことなので、GUIのコンソールでできるような操作を全てするには、 少なくとも両方のバージョンを使用する必要がありそうです。 (バージョンによってログインやセッションID周りが変わってくるようで、 注意が必要そうでした。→ REST API versions )
今回やりたいのは、version 2でできるSecure Agentのステータスの確認なので、 他のリソースもversion 2に寄せて作業をしていきます。
実装コード(AWS Lambda上のPython)
特に意味はありませんがなんとなくPythonで書きたかったので、
Pythonを AWS Lambda 上で動かすことにしました。
バージョンは Python 3.7
です。
↓コード全体はこんな感じ。
クリックでコードを表示する/折りたたむ
import os
import traceback
import json
import boto3
from urllib import request
def lambda_handler(event, context):
# login
LOGIN_URL = os.environ["IICS_LOGIN_SERVER"] + "/ma/api/v2/user/login"
LOGIN_USER = os.environ["IICS_LOGIN_USER"]
LOGIN_PW = os.environ["IICS_LOGIN_PW"]
LOGIN_HEADER = {"Content-Type": "application/json",
"Accept": "application/json"}
LOGIN_PAYLOAD = {"@type": "login",
"username": LOGIN_USER, "password": LOGIN_PW}
req_login = request.Request(LOGIN_URL, method="POST", headers=LOGIN_HEADER,
data=json.dumps(LOGIN_PAYLOAD).encode())
with request.urlopen(req_login) as res:
body = json.loads(res.read())
SERVER_URL = body["serverUrl"]
SESSION_ID = body["icSessionId"]
try:
# agent
AGENT_ID = os.environ["IICS_AGENT_ID"]
AGENT_URL = SERVER_URL + "/api/v2/agent/details/" + AGENT_ID
AGENT_HEADER = {"Accept": "application/json",
"icSessionId": SESSION_ID}
req_agent = request.Request(AGENT_URL, method="GET",
headers=AGENT_HEADER)
with request.urlopen(req_agent) as res:
details = json.loads(res.read())
except Exception:
print(traceback.format_exc())
raise
finally:
# logout
LOGOUT_URL = SERVER_URL + "/api/v2/user/logout"
LOGOUT_HEADER = {"Content-Type": "application/json",
"Accept": "application/json",
"icSessionId": SESSION_ID}
req_logout = request.Request(LOGOUT_URL, method="POST",
headers=LOGOUT_HEADER)
try:
with request.urlopen(req_logout):
pass
except Exception:
print(traceback.format_exc())
# status
result = {details["name"] + " active": details["active"]}
for engine in details["agentEngines"]:
result[engine["agentEngineStatus"]["appDisplayName"]] = \
engine["agentEngineStatus"]["status"]
print(result)
# SNS publish
TOPIC_ARN = os.environ["SNS_TOPIC_ARN"]
subject = "[STATUS] " + details["name"]
sns = boto3.client("sns")
sns.publish(TopicArn=TOPIC_ARN,
Subject=subject,
Message=json.dumps(result, indent=4))
Lambdaの環境変数として、↓を登録しています。
IICS_LOGIN_SERVER
:https://dm-ap.informaticacloud.com
やhttps://dm-us.informaticacloud.com
などログインURL冒頭部分IICS_LOGIN_USER
: IICSにログインするユーザIICS_LOGIN_PW
: IICSにログインするパスワードIICS_AGENT_ID
: Secure AgentのIDSNS_TOPIC_ARN
: 結果の送付先のSNSのARN
Secure AgentのIDは、コンソールで当該Agentを開いた状態のURLなどから取得できます。
(→ 参考 )
簡略化のため環境変数にしましたが、ログイン情報は
AWS Systems Manager パラメータストア
管理などが良いかもしれません。
urllib
ライブラリでREST APIへ繋ぎ、
Amazon SNS に結果を通知しています。
完全に余談ですが…
始めにローカルでPython標準でない requests
ライブラリで実装してしまって、
Lambda上ですぐには動かずにurllibの方に書き換えました…
個人的にはrequestsの方が書きやすい気がしました。どうでも良い話ですが。
ログイン
ログイン
は、https://dm-us.informaticacloud.com/ma/api/v2/user/login
(※使用する環境により異なる)
というリソースに対して、IICSのユーザとパスワードを含めたPOSTリクエストを実行します。
LOGIN_HEADER = {"Content-Type": "application/json",
"Accept": "application/json"}
LOGIN_PAYLOAD = {"@type": "login",
"username": LOGIN_USER, "password": LOGIN_PW}
req_login = request.Request(LOGIN_URL, method="POST", headers=LOGIN_HEADER,
data=json.dumps(LOGIN_PAYLOAD).encode())
with request.urlopen(req_login) as res:
body = json.loads(res.read())
SERVER_URL = body["serverUrl"]
SESSION_ID = body["icSessionId"]
レスポンスにはログイン後の各操作で必要になる icSessionId
(セッションID)と
serverUrl
(組織のURL)が含まれます。
セッションIDについては、 こちら 。
The session ID expires after 30 minutes of inactivity.
30分使わないと切れるそうです。
Secure Agentの詳細の取得
今回のメインの部分です。
Secure Agentの詳細情報
を取得します。
{serverUrl}/api/v2/agent/details/{agent ID}
というリソースに対して、
ヘッダに前節で取得したicSessionIdを含めてGETしてやります。
# agent
AGENT_ID = os.environ["IICS_AGENT_ID"]
AGENT_URL = SERVER_URL + "/api/v2/agent/details/" + AGENT_ID
AGENT_HEADER = {"Accept": "application/json",
"icSessionId": SESSION_ID}
req_agent = request.Request(AGENT_URL, method="GET",
headers=AGENT_HEADER)
with request.urlopen(req_agent) as res:
details = json.loads(res.read())
このレスポンスからSecure Agentの状態( active
)や、
各サービスの状態( status
)を取得します。
ログアウト
ガイドライン によると、 ちゃんと ログアウト までするのがベストプラクティスのようなので、ログアウトします。
However, best practice is to log out before the session ends.
ヘッダにicSessionId含めて、
{serverUrl}/api/v2/user/logout
にPOSTします。
# logout
LOGOUT_URL = SERVER_URL + "/api/v2/user/logout"
LOGOUT_HEADER = {"Content-Type": "application/json",
"Accept": "application/json",
"icSessionId": SESSION_ID}
req_logout = request.Request(LOGOUT_URL, method="POST",
headers=LOGOUT_HEADER)
try:
with request.urlopen(req_logout):
pass
except Exception:
print(traceback.format_exc())
(ひとまずステータスが取得できれば良いので、エラーは握り潰しています。)
動かす
Lambdaを動かしてみます。
(通知先のSNSトピックはメールアドレスでサブスクライブしています。)
↓稼働している時
↓停止している時
ステータスがメールで確認できました!
おわりに
普段GUIのコンソールでやっているような操作をAPIから行うことができました。
今回はPythonで実装しましたが、 AWS EC2 上に
Secure Agentを導入しているような場合は、EC2上で動かすbashなどで実装しても良いかもしれません。
APIは他にもいろいろあるので、触っていきたいと思います。たぶん。
参考文献
- REST API Reference ※version 2
- HOW TO: Monitor the secure agent status and the status of seperate services in Informatica cloud using API?
- FAQ: icSessionId expiration policy | REST api
- HOW TO: find agent id for a specific secure agent in IICS?
- HOW TO: Run jobs on ICS using Rest API V2
- urllibだけである程度HTTPリクエストを頑張る
- Python, RequestsでWeb APIを呼び出し(データ取得・操作)