Pour les projets utilisant AWS, il arrive souvent que vous souhaitiez documenter une liste d'AMI.
Dans un tel cas, il arrive que vous souhaitiez acquérir des données au format JSON avec l'interface de ligne de commande officielle AWS, les convertir en CSV, puis les compiler dans un document. Les données tabulaires, qui sont courantes dans les documents, sont très incompatibles avec JSON, ce qui pose problème.
Dans un tel cas, faites ceci. Par exemple, supposons que vous puissiez obtenir le JSON de la liste AMI comme ceci.
images.json
{
"Images": [
{
"VirtualizationType": "hvm",
"Name": "hogehoge_1",
"Hypervisor": "xen",
"SriovNetSupport": "simple",
"ImageId": "ami-99999991",
"State": "available",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"DeleteOnTermination": true,
"SnapshotId": "snap-9999999d",
"VolumeSize": 100,
"VolumeType": "standard",
"Encrypted": false
}
}
],
"Architecture": "x86_64",
"ImageLocation": "999999999993/hogehoge1",
"RootDeviceType": "ebs",
"OwnerId": "999999999999",
"RootDeviceName": "/dev/xvda",
"CreationDate": "2014-12-17T06:35:39.000Z",
"Public": false,
"ImageType": "machine",
"Description": null
},
{
"VirtualizationType": "hvm",
"Name": "hogehoge_2",
"Hypervisor": "xen",
"SriovNetSupport": "simple",
"ImageId": "ami-99999991",
"State": "available",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"DeleteOnTermination": true,
"SnapshotId": "snap-9999999d",
"VolumeSize": 100,
"VolumeType": "standard",
"Encrypted": false
}
}
],
"Architecture": "x86_64",
"ImageLocation": "999999999993/hogehoge1",
"RootDeviceType": "ebs",
"OwnerId": "999999999999",
"RootDeviceName": "/dev/xvda",
"CreationDate": "2014-12-17T06:35:39.000Z",
"Public": false,
"ImageType": "machine",
"Description": null
},
]
}
Changez ce json en CSV en utilisant python. Je l'ai fait improvisé, donc je pense qu'il y a plusieurs rushes, mais je suis désolé. Je suis vraiment désolé.
sample.py
# coding:UTF-8
import json
import codecs
#Définition variable. Kitto
sourcefilename = "images.json"
outfilename = "outfile.csv"
targetDataName = "Images"
#Définition des fonctions
def list2str(srclist,startStr,endStr):
#Si ce n'est pas une liste, ne la convertissez pas.
if not (isinstance(srclist,list)):
return srclist
#Changer la liste en chaîne
resultStr = ""
resultStr += startStr
for item in srclist:
tmp = ""
if isinstance(item,str):
tmp += item +","
elif isinstance(item,list):
tmp += list2str(item,"","") + ","
else:
tmp += str(item) + ","
resultStr += tmp
resultStr += endStr
return resultStr
#Lecture de fichier
sourceFile = open(sourcefilename,"r")
sourceData = json.load(sourceFile)
sourceFile.close()
#Obtenez les données souhaitées à partir des données JSON
targetData = sourceData.get(targetDataName)
#Obtenir l'en-tête
headerSet = set()
for row in targetData:
colList = row.keys()
for colName in colList:
headerSet.add(colName)
headerstr = ""
for headerName in headerSet:
headerstr += headerName + ","
#Acquisition d'en-tête terminée
#L'acquisition des données
datalist = list()
for row in targetData:
rowstr = ""
for colName in headerSet:
if isinstance(row.get(colName),list):
rowstr += list2str(row.get(colName),"\"","\"") + ","
elif isinstance(row.get(colName),bool):
tmpStr = str(row.get(colName))
rowstr += tmpStr + ","
elif isinstance(row.get(colName),unicode):
rowstr += row.get(colName) + ","
elif isinstance(row.get(colName),type(None)):
rowstr += "None,"
datalist.append(rowstr)
#Ouvrez le fichier d'écriture
outfile = codecs.open(outfilename,"w", "shift_jis")
outfile.write(headerstr + "\n")
for rowstr in datalist:
outfile.write(rowstr + "\n")
outfile.close()
Vous pouvez maintenant créer des données CSV. Une fois converti en données CSV, il peut être ouvert dans Excel et édité de différentes manières.
Je ne connaissais pas Python auparavant, donc j'avais l'habitude de créer des outils en Java, mais Python est très pratique. AWS CLI nécessite Python, il n'est donc pas nécessaire d'ajouter un nouveau Python. Je pense que je vais étudier Python sérieusement.
J'espère que tu trouves cela utile.
Recommended Posts