Bon avec Python et xonsh pour que vous puissiez voir l'instance EC2 simplement en entrant dans le shell

introduction

Etudiez-vous tous Terraform? (Intimidant)

Je ne fais que commencer et maintenant désespérément [ce livre](https://www.amazon.co.jp/ Pratiquez la conception et les meilleures pratiques Terraform-System dans AWS-Technology Fountain Series (NextPublishing) -Nomura-Tomonori-ebook / Je lis dp / B07XT7LJLC) C'est très amusant et j'espère que l'étude de l'infrastructure progressera si l'environnement AWS est librement touché, mais je n'étais pas satisfait de l'environnement d'étude.

C'est trop ennuyeux de voir la console AWS une par une! !! !!

Bien que cela soit écrit dans le livre (les détails font peur au droit d'auteur, j'éviterai de faire une déclaration) En gros, pour vérifier l'instance AWS, je pense que je vais vérifier depuis la console par l'interface utilisateur Web

C'est généralement bien, mais de toute façon "Créer une instance avec Terraform ... Alors? Supprimer ensuite? Oui Oui ... Alors? Une autre console ..." C'était assez pénible de le faire en regardant le Kindle

De plus, je ne suis pas intéressé par les instances inconnues et je ne veux pas les toucher, donc je veux juste que la fonction les affiche. Vous pouvez utiliser awc cli, mais je veux que cela ressemble à une interface utilisateur Web sans mordre le filtre

Pour le moment, seules les instances EC2 ont été configurées pour le moment, il est donc facile de les répertorier, alors faites-le! C'est comme

Préparation

Créer un référentiel

Tout d'abord, en guise de préparation, créez un référentiel pour Terraform En raison de la nature de Terraform, la création d'un référentiel peut être naturelle car le contrôle du code source en est la base. Ensuite, je pense qu'il serait plus facile d'incorporer le script d'affichage de l'instance Python dans ce référentiel.

Dans mon cas, c'est un référentiel que j'ai créé pour la pratique, j'ai donc intégré le script dans le référentiel. Cependant, le référentiel ne peut pas être publié car il est lié au droit d'auteur du livre. Merci de votre compréhension

Gérez les jetons AWS avec direnv et dotenv!

direnv

direnv est un gars sympa qui dit "il suffit d'entrer dans le répertoire et l'alias et l'environnement seront chargés sans permission!"

dotenv

J'utilise toujours dotenv avec direnv J'ai l'impression de le mettre à partir de npm, donc c'est un peu gênant, mais je pense que les utilisateurs de Mac peuvent facilement entrer car il existe des méthodes pour mettre npm dans brew.

Conserver les informations AWS IAM dans dotenv

Ceux qui ont lu jusqu'ici sont probablement ceux qui ont touché aux informations AWS IAM. Ou peut-être que vous lisez un livre Terraform Donc des informations IAM

Je n'expliquerai pas ce que ça veut dire Si vous souhaitez en savoir plus sur la signification de ces jetons, veuillez consulter la page officielle.

En parlant du livre pratique Terraform dont j'ai obtenu les informations symboliques ou que j'ai écrit au début, je pense que ce sera facile si vous pouvez passer de la personne qui est entrée au chapitre 2 à la suivante.

Décrivez réellement les informations du jeton à l'aide de dotenv Créez un fichier .env directement sous le référentiel du référentiel

En guise de mise en garde, le fichier .env sera téléchargé sur git tel quel, veuillez donc le refléter correctement dans .gitignore.

repo/.gitignore


.env

repo/.env


AWS_ACCESS_KEY_ID=AAAAAAAAAAAAAAAAAAAA
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AWS_DEFAULT_REGION=ap-northeast-1

Comment vérifier si cela fonctionne correctement

Utiliser dotenv avec direnv

Ensuite, comment charger dotenv avec direnv et refléter automatiquement les paramètres sous le répertoire de travail. direnv lit les informations dans .envrc

repo/.envrc


dotenv
xonsh --rc xonshrc.xsh

Le dotenv sur la première ligne est configuré pour lire automatiquement .env avec direnv.

Étant donné que le script Python peut être facilement exécuté sur le terminal, si vous écrivez le script AWS en Python, vous pouvez l'exécuter avec shell assez facilement. Résumé Avec ce qui précède, c'est un paramètre que vous pouvez facilement vous connecter à AWS simplement en entrant dans le répertoire Ce n'est pas gênant à utiliser et le développement de Terraform sera beaucoup plus facile. Utilisons le script d'affichage de la liste d'instances EC2 en Python! Après avoir défini direnv et dotenv, exécutons le script qui affiche l'instance en Python.

repo/describe_instances.py


import os
import boto3
import pandas as pd


def create_session():
    client = boto3.session.Session(
        aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
        aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
        region_name=os.environ["AWS_DEFAULT_REGION"]
    ).client("ec2")

    return client


def to_pandas():
    response = create_session().describe_instances()
    df = pd.io.json.json_normalize(
        pd.DataFrame(
            pd.DataFrame(
                response["Reservations"]
            ) \
                .apply(lambda r: r.str[0])
                .Instances \
                .values
        )[0]
    )
    df.loc[df["Tags"].isnull(), "Tags"] = df.loc[df["Tags"].isnull(), "Tags"].apply(lambda x: [])
    df.Tags = df.Tags.apply(lambda r: {t["Key"]: t["Value"] for t in r} if len(r) > 0 else {})
    df = pd.concat([df.drop(["Tags"], axis=1), df["Tags"].apply(pd.Series)], axis=1)
    df["SecurityGroups"] = df["SecurityGroups"].apply(lambda r: ", ".join([i["GroupName"] for i in r]))

    return df[["Name",
               "ImageId",
               "InstanceType",
               "Placement.AvailabilityZone",
               "State.Name",
               "PublicDnsName",
               "PublicIpAddress",
               "KeyName",
               "Monitoring.State",
               "LaunchTime",
               "SecurityGroups",
               "Owner",
               ]].sort_values(["LaunchTime",
                               "State.Name"],
                              ascending=[False,
                                         True])


if __name__ == "__main__":
    print(to_pandas())

Enregistrez le script Python

python describe_instances.py

Essayez de courir L'instance est affichée dans Dataframe et peut être répertoriée.

Name ImageId InstanceType Placement.AvailabilityZone State.Name PublicDnsName PublicIpAddress KeyName Monitoring.State LaunchTime SecurityGroups Owner
linux-adfdsf ami-2dfdfs t2.medium ap-northeast-1a running ec2-25-25-25-25.ap-northeast-1.compute.amazonaws.com 111.111.111.1 dfdfdest disabled 2020-01-10T01:01:32+0000 mdfsfsest NaN

Utilisons temporairement xonsh avec direnv!

xonsh est un shell qui vous permet de personnaliser les paramètres en Python Il est souvent utilisé par les utilisateurs de Python, et il est recommandé car il est assez pratique même avec des paramètres standard. (Au fait, je ne l'utilise généralement pas. D'une manière ou d'une autre.)

C'est facile à déployer, il suffit d'utiliser le gestionnaire de packages pip utilisé dans Python.

pip install xonsh

Il y avait une description de xonsh dans .envrc plus tôt, mais passons temporairement le shell à xonsh et exécutons le script d'affichage de la liste d'instances sur xonsh! Est une tentative

Pourquoi utiliser temporairement xonsh

La raison d'utiliser temporairement xonsh est, tout simplement, la raison principale est que la surcharge de l'appel de Python sur le shell est trop importante. Il est très inefficace de se connecter à AWS, de traiter la liste et de l'afficher à chaque fois à partir de l'appel du shell, j'ai donc choisi xonsh, qui peut même stocker des variables dans le shell.

paramètres xonsh

xonsh peut être facilement personnalisé en créant un fichier xonshrc Ici, nous apporterons des modifications au xonshrc officiel afin que vous puissiez facilement exécuter votre propre script d'affichage de liste d'instances.

repo/xonshrc.xsh


# adjust some paths
$PATH.append('/home/scopatz/sandbox/bin')
$LD_LIBRARY_PATH = ['/home/scopatz/.local/lib', '/home/scopatz/miniconda3/lib', '']

# alias to quit AwesomeWM from the terminal
def _quit_awesome(args, stdin=None):
    lines = $(ps ux | grep "gnome-session --session=awesome").splitlines()
    pids = [l.split()[1] for l in lines]
    for pid in pids:
        kill @(pid)

aliases['qa'] = _quit_awesome

# some customization options, see https://xon.sh/envvars.html for details
$MULTILINE_PROMPT = '`·.,¸,.·*¯`·.,¸,.·*¯'
$XONSH_SHOW_TRACEBACK = True
$XONSH_STORE_STDOUT = True
$XONSH_HISTORY_MATCH_ANYWHERE = True
$COMPLETIONS_CONFIRM = True
$XONSH_AUTOPAIR = True


#D'ici le xonshrc original

import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

#Importez votre propre fonction
import describe_instances
_df = describe_instances.to_pandas()
#Afficher les colonnes 0 à 5
print(_df[_df.columns[0:5]])

Tips

Maintenant, déplacez-vous simplement vers le répertoire et la liste des instances s'affichera automatiquement, et même plus.

describe_instances.to_pandas()

Vous pouvez obtenir une liste de Dataframes simplement en versant

C'est pratique, alors veuillez l'utiliser ~~~

Recommended Posts

Bon avec Python et xonsh pour que vous puissiez voir l'instance EC2 simplement en entrant dans le shell
Convertissez l'image du visage en une qualité d'image élevée avec PULSE afin que vous puissiez voir les pores et la texture
Prise en compte du moment où vous pouvez faire du bon travail en 10 ans avec Python3 et Scala3.
Jusqu'à ce que vous puissiez installer Blender et l'exécuter avec python pour le moment
[Python] J'ai créé une fonction qui déchiffre et décrypte AES simplement en le lançant avec pycrypto.
Pourquoi puis-je utiliser le module en important avec python?
Ce que vous pouvez faire avec les statistiques de la bibliothèque Python standard
Le mystère du nombre qui peut être vu simplement en arrangeant les 1-Le nombre de repunits et de propriétés mystérieuses-
J'ai acheté et analysé la loterie jumbo de fin d'année avec Python qui peut être exécutée dans Colaboratory
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Considérez ce que vous pouvez faire avec Python dans l'article Qiita
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python