[PYTHON] Il est étonnamment difficile d'obtenir une liste de la dernière date et heure de connexion des espaces de travail

Introduction Je lance Workspaces, mais voici quelques astuces que j'ai trouvées pendant la course.

Qu'est-ce que les espaces de travail Cet article est destiné à ceux qui exploitent réellement des espaces de travail, alors qu'est-ce que VDI? Qu'est-ce que les espaces de travail? Est omis. Voir officiel pour plus de détails. [Amazon WorkSpaces](https://aws.amazon.com/jp/workspaces/)

Pourquoi avez-vous besoin de la dernière date et heure de connexion Si vous exécutez AWS Workspaces, vous voudrez savoir si quelqu'un a créé une instance mais ne l'utilise pas vraiment. Votre dernière date de connexion date d'il y a X mois, vous ne l'utilisez plus? Je veux faire un inventaire.

Comment puis-je obtenir la dernière date et heure de connexion Il n'y a pas de date et heure de dernière connexion dans l'affichage de la liste d'instances de la console de gestion. Si vous regardez les détails un par un, ils sortiront. .. .. L'enquête commence à partir d'ici. Tout d'abord, lorsque je vérifie les spécifications de l'API, il est vrai que [DescribeWorkspaces](https://docs.aws.amazon.com/workspaces/latest/api/API_DescribeWorkspaces.html) qui obtient la liste des instances n'a pas la dernière date de connexion. .. ..

Si vous regardez de plus près la documentation de l'API, vous trouverez la date et l'heure de la dernière connexion LastKnownUserConnectionTimestamp dans DescribeWorkspacesConnectionStatus!

DescribeWorkspacesConnectionStatus


//Response Syntax
{
   "NextToken": "string",
   "WorkspacesConnectionStatus": [ 
      { 
         "ConnectionState": "string",
         "ConnectionStateCheckTimestamp": number,
         "LastKnownUserConnectionTimestamp": number, //<-cette!
         "WorkspaceId": "string"
      }
   ]
}

Cependant, il semble que vous ne puissiez demander que 25 instances maximum après avoir placé WorkspaceId dans cette API et cette requête. S'il y en a 25 ou plus, il semble qu'il ne soit pas possible de tout acquérir en même temps.

WorkspaceIds The identifiers of the WorkSpaces. You can specify up to 25 WorkSpaces.

Utilisez Python pour obtenir la liste Maintenant que je comprends les spécifications de l'API, j'ai créé un programme en Python. En supposant que les autorisations requises se trouvent dans les variables d'environnement, j'ai créé un programme qui crache la liste des instances + la dernière date et heure de connexion au format CSV. Un peu d'ingéniosité est que même si l'ID de Direcotry est affiché en CSV, cela sonne sans savoir ce que c'était, alors je l'ai ajusté pour afficher le nom de Direcotry. Si vous mettez le DirectoryID d'exploitation dans `DirecotryIds` dans un tableau, cela devrait fonctionner. Python 2.7.10.

getInstances.py


import boto3
import csv

# Initialize SDK client for AWS Workspaces
client = boto3.client('workspaces')
paginator_describe = client.get_paginator('describe_workspaces')
paginator_connection = client.get_paginator('describe_workspaces_connection_status')

# Initialize output CSV header
data = [["UserName", "WorkspaceId", "Directory", "State", "ComputerType", "LastLogin"]]


# Initialize Directory ID list
DirectoryIds = [
    'd-XXXXXXXX',
    'd-YYYYYYYY'
]

# Initialize mapping between Directory ID and Name
def addDirectoryMapping(direcotry):
    directoryMapping[direcotry["DirectoryId"]] = direcotry["Alias"]

directoryMapping = {}
paginator = client.get_paginator('describe_workspace_directories')
page_iterator = paginator.paginate()
for page in page_iterator:
    map(addDirectoryMapping, page["Directories"])
print("Direcotry mapping is DONE")


# Find Directory Name from ID
# @param  workspace ID
# @return Name of directory
def findDirectoryName(direcotyrId):
    if direcotyrId in directoryMapping:
        return directoryMapping[direcotyrId]
    else:
        return "Other"

# Find last login time by SingleId
# @param  workspace ID
# @return LastLogin Time
def findLatestLoginTimeById(workspaceId):
    response = client.describe_workspaces_connection_status(
        WorkspaceIds=[
            workspaceId
        ]
    )
    if not len(response["WorkspacesConnectionStatus"])==0:
        connectionStatus = response["WorkspacesConnectionStatus"][0]
        if "LastKnownUserConnectionTimestamp" in connectionStatus:
            return connectionStatus["LastKnownUserConnectionTimestamp"]
        else:
            return "unknown"
    else:
        return "Error"

# Get necessary information from Workspace Instance
# @param workspaces
# @return list
def parse_list(workspaces):
    list=[]
    list.append(workspaces["UserName"])
    list.append(workspaces["WorkspaceId"])
    list.append(findDirectoryName(workspaces["DirectoryId"]))
    list.append(workspaces["State"])
    list.append(workspaces["WorkspaceProperties"]["ComputeTypeName"])
    list.append(findLatestLoginTimeById(workspaces["WorkspaceId"]))
    return list

# Get necessary information from Workspace Connection Status
# @param WorkspacesConnectionStatus
# @return list
def parse_list_connection(WorkspacesConnectionStatus):
    list=[]
    list.append(WorkspacesConnectionStatus["WorkspaceId"])
    if "LastKnownUserConnectionTimestamp" in WorkspacesConnectionStatus:
        list.append(WorkspacesConnectionStatus["LastKnownUserConnectionTimestamp"])
    else:
        list.append("unknown")
    return list

# Export CSV file
def exportCSV(data):
    with open("VDI_LIST.csv", "w") as f:
        writer = csv.writer(f, lineterminator="\n")
        writer.writerows(data)
        print("Create File is DONE")

# main function
def describeWorkspacesByDirectoryId (Id):  
    try:
        workspacesDescribeInDirectory = []
        print(Id + " is started")
        # describe workspaces
        page_iterator_describe = paginator_describe.paginate(DirectoryId=Id,PaginationConfig={'PageSize': 10})
        for page in page_iterator_describe:
            workspacesDescribeInDirectory = map(parse_list, page["Workspaces"])
            data.extend(workspacesDescribeInDirectory)
        print(Id + " describe_workspaces is DONE")
    except Exception as e:
        print(e.message + " :: impacted Directory ID is " + Id)

map(describeWorkspacesByDirectoryId, DirectoryIds)
exportCSV(data)

Analyse d'utilisation plus avancée En passant, [Workspaces Cost Optimizer](Workspaces Cost Optimizer), un service qui analyse l'utilisation https://docs.aws.amazon.com/solutions/latest/workspaces-cost-optimizer/welcome.html)がAWSでは用意されているみたいなので、本格的な運用ではコレを利用するのが良いみたい。

Conclusion Il serait préférable d'exécuter le lot une fois par mois, mais comme j'avais une application pour une opération manuelle (rires), il y avait des utilisateurs qui ne s'étaient jamais connectés même si j'avais créé une instance, donc c'était un programme étonnamment utile. fait.

Recommended Posts

Il est étonnamment difficile d'obtenir une liste de la dernière date et heure de connexion des espaces de travail
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
[Introduction à Python] Quelle est la différence entre une liste et un taple?
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
[Python] Obtenez la dernière date de mise à jour du site Web
[Python] Créer une liste de date et d'heure (type datetime) pour une certaine période
Script Python pour obtenir une liste d'exemples d'entrée pour le concours AtCoder
Comment obtenir une liste de fichiers dans le même répertoire avec python
L'histoire du serveur Web et du DAG d'Airflow, dont le chargement prend beaucoup de temps
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
J'ai réussi à le faire parce que la coutume de joindre un zip avec un mot de passe à un e-mail et de dire «Je vous enverrai le mot de passe séparément» est gênante.
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
Script pour obtenir la date d'expiration du certificat SSL
Créer une liste lorsque la nomenclature est pour une certaine période de temps
Crache une liste de noms de fichiers, de dates de dernière modification et de codes de caractères en python3
Obtenir la valeur d'une clé spécifique jusqu'à l'index spécifié de la liste de dictionnaires en Python
Donnez une date et une heure à la commande d'historique et collectez les fichiers d'historique de tous les utilisateurs avec un script
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Essayez d'obtenir la liste des fonctions du paquet Python> os
[Commande] Commande pour obtenir une liste de fichiers contenant des caractères pleine largeur
[Python] Créer une liste de dates et d'heures pour une période spécifiée
Obtenez le nombre d'éléments spécifiques dans la liste python
Obtenez une adresse IP globale et exportez-la vers des feuilles de calcul Google
Comment obtenir une liste d'exceptions intégrées pour python
Obtenez la date et l'heure actuelles en Python, en tenant compte du décalage horaire
Comment obtenir une liste de liens à partir d'une page de wikipedia
Y a-t-il un secret dans la fréquence des nombres de rapport de circonférence?
Comment connecter le contenu de la liste dans une chaîne de caractères
Gratter la liste des magasins membres Go To EAT dans la préfecture de Fukuoka et la convertir en CSV
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Gratter la liste des magasins membres Go To EAT dans la préfecture de Niigata et la convertir en CSV
python Remarque: enumerate () -Obtenir l'index et l'élément de la liste en même temps et tourner pour l'instruction
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
Définit la date de la dernière modification du fichier enfant sur la date de modification du répertoire parent
Remarque: obtenez les premier et dernier éléments de Python OrderedDict de manière non destructive
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
Est-il facile de synthétiser un médicament sur le marché?
Sous Linux, l'horodatage d'un fichier est un peu dépassé.
Supprimer un caractère spécifique en Python s'il s'agit du dernier
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Qu'est-ce qu'un chien? Volume de requêtes GET et paramètres de requête
Comment obtenir une liste excluant les éléments dont l'index est i ...?
Convertissez le résultat de python optparse en dict et utilisez-le
Creusez le répertoire et créez une liste de chemins de répertoire + noms de fichiers
Créez une fonction pour obtenir le contenu de la base de données dans Go
Obtenez le titre et la date de livraison de Yahoo! News en Python
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Est-il possible de se lancer dans une entreprise de pré-cotation et de faire fortune avec des stock-options?
Obtenez une liste des paramètres de caméra qui peuvent être définis avec cv2.VideoCapture et faites-en un type de dictionnaire
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
Pour Windows: obtenez une liste de répertoires et de fichiers dans un répertoire spécifique.
Jusqu'à ce que vous obteniez un instantané du service Amazon Elasticsearch et que vous le restauriez
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste