実現したいこと
/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 コメント