PythonにてAPIの結果をDataframeに入れて、csvファイルとMergeして列を追加したいが、できない

実現したいこと

/dataservice/deviceで返る「deviceId」をもとに

/dataservice/device結果

API_result

1deviceId, system-ip, host-name, device-model, ・・・ 210.11.11.11 10.11.11.11 ABC-host ABC-device ・・・ 310.12.12.12 10.12.12.12 DEF-host DEF-device ・・・ 410.12.12.12 10.13.13.13 GHI-host GHI-device ・・・

device_info.csvの中身
(device-modelに対する、NatSessionMax値の一覧)

device_info.csv

1device-model ,NatSessionMax 2ABC-device 11111 3DEF-device 22222 4GHI-device 33333

現在の出力結果
※NatSessionが出力されていない

Result_failed

1deviceId, system-ip, host-name, device-model, ・・・, dt, ,NatCount 210.11.11.11 10.11.11.11 ABC-host ABC-device ・・・ 2023/1/1 01:01:01 123 310.12.12.12 10.12.12.12 DEF-host DEF-device ・・・ 2023/1/1 01:01:01 456 410.12.12.12 10.13.13.13 GHI-host GHI-device ・・・ 2023/1/1 01:01:01 789

想定・出力したい結果
datetime(dt)、NatCount、NatSessionMax列が追加されている

Result_failed

1deviceId, system-ip, host-name, device-model, ・・・, dt, ,NatCount ,NatSessionMax 210.11.11.11 10.11.11.11 ABC-host ABC-device ・・・ 2023/1/1 01:01:01 123 11111 310.12.12.12 10.12.12.12 DEF-host DEF-device ・・・ 2023/1/1 01:01:01 456 22222 410.12.12.12 10.13.13.13 GHI-host GHI-device ・・・ 2023/1/1 01:01:01 789 33333

発生している問題・

ここに質問の内容を詳しく書いてください。
/dataservice/device/ip/nat/translationを実行し返ったJsonの[data]数をカウント結果の列と
datetime(dt)列を追加できているが、更に次の列を追加したい、ロジックは入っているが

「NatSessionMax」が追加されていない、追加箇所も問題なのかロジックの問題なのかご指摘・支援をお願いしたく。

該当のソースコード

Python

1import json 2import boto3 3import csv 4import numpy as np 5import pandas as pd 6import requests 7import os 8import urllib3 9import pandas as pd 10from io import StringIO 11from datetime import datetime 12 13urllib3.disable_warnings(urlib3.exceptions.InsecureRequests.InsecureRequestWarning)14 15def lambda_handler(event, context):16 s3 = boto3.resource(`s3`)17 bucket_name = os.environ.get(`S3_BUCKET`)18 19 vmanage_info = "tmp/vmanage_info.csv"20 bucket.download_file(os.environ.get(`CSV_VMANAGE_INFO`), vmanage_info)21 vmanage_info_df = pd.read.csv(vmanage_info)22 23 device_info = "/tmp/device_info.csv"24 bucket.download_file(os.environ.get(`CSV_DEVICE_INFO`), device_info)25 device_info_df = pd.read.csv(device_info)26 27 ipsec_tunnel_df = get_request(vmanage_info_df)28 29 merge_key = ['device-model']30 df = pd.merge(ipsec_tunnel_df, device_info_df, how='right', on=merge_key)31 32 tmp_csv = "/tmp/NatSession.csv"33 ipsec_tunnel_df.to_csv(tmp_csv, encoding='utf-8', index=False)34 35 s3 = boto3.resource('s3')36 s3.meta.client.upload_file(tmp_csv 'utlink-vmanage-bucket', 'csv/NatSession.csv')37 38 39def get_request(vmanage_info_df):40 api_datalist = []41 for row in vmanage_info_df.itertuples():42 vmanage_host = row[1]43 vmanage_port = row[2]44 vmanage_username = row[3]45 vmanage_password = row[4]46 47 base_url = `https://%s:%s`%(vmanage_host, vmanage_port)48 49 login_action = `/j_security_check` 50 51 login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password}52 53 login_url = base_url + login_action 54 55 session = requests.session()56 57 login_response = session.post(url=login_url, data=login_data, verify=False)58 if b`<html>` in login_response.content:59 print("Login token Failed")60 exit(1)61 62 xsrf_token_url = base_url + '/dataservice/client/token'63 64 login_token = session.get(url=xsrf_token_url, verify=False)65 if login_token.status_code = 200:66 if b`<html>` in login_token.content:67 print("Login token Failed")68 exit(1)69 70 session.headers[`X-XSRF-TOKEN`] = login_token.content 71 72 73 device_url = base_url + `/dataservice/device` 74 75 device_list = session.get(url=device_url, verify=False)76 if device_list.status_code = 200:77 json_data = vdevice_list.json()78 else:79 print (device_list.status_code)80 81 df = pd.json_normalize(json_data["data"]82 df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")]83 84 df = df[["deviceId", "system-ip", "host-name", "device-model"]]85 86 #時刻列の追加87 df['df'] = datetime.now(),strftime('%Y%m%d% %H:%M:%S')88 c = df.pop('dt')89 df.insert(df.shape[1], c.name, c)90 91 #nat/translationのdataをカウントし、列の追加92 lens = []93 for data in df.intretuples():94 deviceid = data[1]95 nat_translation_url = base_url + '/dataservice/device/ip/nat/translation?deviceId=' + deviceid 96 nat_translation_list = session.get(url=nat_translation_url, verify=False)97 if nat_translation_list.status_code == 200:98 json_data = nat_translation_list.json()99 else:100 print (nat_translation_list.status_code)101 102 df_len = pd.json_normalize(json_data["data"])103 104 len_df = len(df_len)105 lens.append(len_df)106 107 df['Tunnel_Count'] = lens 108 print()df 109 110 return df

試したこと

merge_keyの位置を変更したりしていますが
結果は変わらず(「NatSessionMax」列が表示さない)
別途、1からソースを書き直すかどうかも並行して検討中。

merge_key = ['device-model'] df = pd.merge(ipsec_tunnel_df, device_info_df, how='right', on=merge_key)

補足情報(FW/ツールのバージョンなど)

Python3.9

ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント