前提
CiscoのvManage APIを実行し、
受け取ったJsonから任意の条件でpandasで表を作り、
手持ちのcsvリストと突き合わせたいと考えております。
API
・http;//{vmanage}/dataservice/device
CSV(Bucketに格納)
・tmp/device_info.csv
<device_info.csv>
device-model, IPsecTunnel
deviceABC, 123
deviceEDF, 456
deviceGHI, 789
環境変数
CSV_DEVICE_INFO : device_info.csv(デバイス名とトンネル数の一覧)
CSV_VMANAGE_INFO : vmanage_info.csv(vmanage接続情報)
S3_BUCKET : s3のバケット名
<API条件>
APIの結果においてreachabilityがreachableのみが対象
reachableのデバイスと、デバイスリストの一覧を突き合わせ
IPsecTunnelを付与した一覧を作成する
【問題】
結合後に、各行へ取得時間(datetime)を付与しようと試みたが、
末尾に追加しようと試みましたが任意の場所に入れられず。
pandasとの結合から見直すべきか、datetimeの修正で完了できるかご助言いただければと思います。
■■な機能を実装中に以下のエラーメッセージが発生しました。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 取得時刻を任意の列に挿入を実現したい
- pandasの利用見直しの可能性も検討
発生している問題・エラーメッセージ
dtを任意の列(先頭、末尾など)に移動したい
結合結果
vmanage-host, system-ip, host-name, device-model, bfdSessionUp, bfdSessions, dt, IPsecTunnel
vmanageXYZ, 1.2.3.4, hostABC, deviceABC, 9, 9, 2022/01/01 00:00:00, 999
vmanageXYZ, 1.2.3.5, hostEDF, deviceEDF, 8, 8, 2022/01/01 00:00:00, 888
vmanageXYZ, 1.2.3.6, hostGHI, deviceGHI, 7, 7, 2022/01/01 00:00:00, 777
該当のソースコード
Lambda(Python)
1import json 2import boto3 3import csv 4import numpy as np 5import pandas as pd 6 7import requests 8import os 9import urllib3 10from datetime import datetime 11urllib3.disable_warnings(urlib3.exceptions.InsecureRequests.InsecureRequestWarning) 12 13def lambda_handler(event, context): 14 s3 = boto3.resource(`s3`) 15 bucket_name _ os.environ.get(`S3_BUCKET`) 16 vmange_info_df = pd.read_csv(vnamage_info) 17 18 device_info = "tmp/device_info.csv" 19 bucket.download_file(os.environ.get(`CSV_DEVICE_INFO`), device_info) 20 device_info_df = pd.read.csv(device_info) 21 22 print(device_info_df) 23 24 ipsec_tunnel_df = get_request(vmanage_info_df) 25 26 merge_key = [`device-model`] 27 df = pd.merge(ipsec_tunnel_df, device_info_df, how=`right`, on=merge_key) 28 temp_csv = "/temp/bfdsession_test.csv" 29 df.to_csv(temp_csv, encoding=`utf-8`, index=False) 30 31 s3 = boto3.resource(`s3`) 32 s3.meta.client.upload_file(tmp_csv, `xxxxxxx-vmanage-bucket`, `bfdsession_test.csv`) 33 34def get_request(vmanage_info_df): 35 api_datalist = [] 36 for row in vmanage_info_df.intertuples(): 37 vmanage_host = row[1] 38 vmanage_port = row[2] 39 vmanage_username = row[3] 40 vmanage_password = row[4] 41 42 base_url = `https://%s:%s`%(vmanage_host, vmanage_port) 43 44 login_action = `/j_security_check` 45 46 login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} 47 48 login_url = base_url + login_action 49 50 session = requests.session() 51 52 login_response = session.post(url=login_url, data=login_data, verify=False) 53 if login_token.status_code = 200: 54 if b`<html>` in login_token.content: 55 print("Login token Failed") 56 exit(1) 57 58 session.headers[`X-XSRF-TOKEN`] = login_token.content 59 60 61 device_url = base_url + `/dataservice/device` 62 63 device_list = session.get(url=device_url, verify=False) 64 if device_list.status_code == 200: 65 json_data = device_list.json() 66 else: 67 print (device_list.status_code) 68 69 df = pd.json_normalize(json_data["data"]) 70 df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")] 71 df = df[["system-ip", "host-name", "device-model", "bfdSessionUp", "bfdSessions"]] 72 df.insert(0, `vmanage_host`, row[1]) 73 74 df[`dt`] = datetime.now()strftime(`%Y/%m/%d %H:%M:%S`) 75 76 print(df) 77 78return df
試したこと
df.insert(1, datetime
, df[dt
])
→追加できず。row[1]とかぶっているため?
df.insert(len(df.colums), datetime
, dt)
→エラーで追加できず。
補足情報(FW/ツールのバージョンなど)
Python3.8
ここにより詳細な情報を記載してください。

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/12/22 02:10
2022/12/22 02:18
2022/12/22 03:05
2022/12/22 05:49