Mit Python und xonsh gut gemacht, so dass Sie die EC2-Instanz sehen können, indem Sie einfach die Shell betreten

Einführung

Studiert ihr alle Terraform? (Einschüchternd)

Ich fange gerade erst an und jetzt verzweifelt [dieses Buch](https://www.amazon.co.jp/ Üben Sie das Terraform-System-Design und die Best Practices in der AWS-Technology Fountain Series (NextPublishing) -Nomura-Tomonori-ebook / Ich lese dp / B07XT7LJLC) Es macht viel Spaß und ich hoffe, dass das Studium der Infrastruktur Fortschritte macht, wenn die AWS-Umgebung frei berührt wird, aber ich war mit der Lernumgebung unzufrieden.

Es ist zu nervig, die AWS-Konsole einzeln zu sehen! !! !!

Obwohl es in dem Buch geschrieben ist (Details sind beängstigend für das Urheberrecht, ich werde es vermeiden, eine Erklärung abzugeben). Um die AWS-Instanz zu überprüfen, denke ich, dass ich von der Konsole aus über die Web-Benutzeroberfläche prüfen werde

Das ist normalerweise in Ordnung, aber trotzdem "Erstellen Sie eine Instanz mit Terraform ... Dann? Als nächstes löschen? Ja Ja ... Dann? Eine andere Konsole ..." Es war ziemlich schmerzhaft, dies zu tun, während man sich den Kindle ansah

Außerdem bin ich nicht an unbekannten Instanzen interessiert und möchte sie nicht berühren, also möchte ich nur, dass die Funktion sie anzeigt. Sie können awc cli verwenden, aber ich möchte, dass es wie eine Web-Benutzeroberfläche aussieht, ohne den Filter zu beißen

Derzeit sind nur EC2-Instanzen eingerichtet, daher ist es einfach, sie aufzulisten. Machen Sie es also! Es ist wie

Vorbereitung

Repository erstellen

Erstellen Sie zunächst als Vorbereitung ein Repository für Terraform Aufgrund der Natur von Terraform kann das Erstellen eines Repositorys natürlich sein, da die Quellcodeverwaltung die Grundlage ist. Dann denke ich, dass es einfacher wäre, das Anzeigeskript für die Python-Instanz in dieses Repository einzubetten.

In meinem Fall ist es ein Repository, das ich zum Üben erstellt habe, also habe ich das Skript in das Repository eingebettet. Das Repository kann jedoch nicht veröffentlicht werden, da es mit dem Urheberrecht des Buches zusammenhängt. Danke für Ihr Verständnis

Verwalten Sie AWS-Token mit direnv und dotenv!

direnv

direnv ist ein netter Kerl, der sagt: "Geben Sie einfach das Verzeichnis ein und der Alias und die Umgebung werden ohne Erlaubnis geladen!"

dotenv

Ich benutze immer dotenv mit direnv Ich habe das Gefühl, dass ich es ab npm eingefügt habe, daher ist es ein wenig mühsam, aber ich denke, dass Mac-Benutzer problemlos eingeben können, da es Methoden gibt, um npm in Brew zu setzen.

Halten Sie die AWS IAM-Informationen in dotenv

Diejenigen, die bisher gelesen haben, sind wahrscheinlich diejenigen, die AWS IAM-Informationen berührt haben. Oder vielleicht lesen Sie ein Terraform-Buch Also von den IAM-Informationen

Ich werde nicht erklären, was das bedeutet Wenn Sie mehr über die Bedeutung dieser Token erfahren möchten, besuchen Sie bitte die offizielle Seite.

Wenn ich von dem praktischen Terraform-Buch spreche, in dem ich die Token-Informationen erhalten oder zu Beginn geschrieben habe, denke ich, dass es reibungslos sein wird, wenn Sie von der Person, die Kapitel 2 eingegeben hat, zur nächsten übergehen können.

Beschreiben Sie die Token-Informationen tatsächlich mit dotenv Erstellen Sie eine .env-Datei direkt unter dem Repository-Repo

Als Einschränkung wird die .env-Datei so wie sie ist auf git hochgeladen. Bitte spiegeln Sie sie in .gitignore richtig wider.

repo/.gitignore


.env

repo/.env


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

So überprüfen Sie, ob es richtig funktioniert

Verwenden Sie dotenv mit direnv

Als nächstes erfahren Sie, wie Sie dotenv mit direnv laden und die Einstellungen im Arbeitsverzeichnis automatisch wiedergeben. direnv liest Informationen in .envrc

repo/.envrc


dotenv
xonsh --rc xonshrc.xsh

Das dotenv in der ersten Zeile ist so eingestellt, dass .env automatisch mit direnv gelesen wird.

Ich werde die Erklärung später weglassen, aber ich werde eine Shell namens xonsh verwenden Dies liegt daran, dass Python-Skripte problemlos auf dem Terminal ausgeführt werden können. Wenn Sie also AWS-Skripte in Python schreiben, können Sie sie ganz bequem in der Shell ausführen.

Zusammenfassung

Mit den oben genannten Einstellungen können Sie einfach eine Verbindung zu AWS herstellen, indem Sie das Verzeichnis eingeben. Es gibt keine Unannehmlichkeiten, selbst wenn Sie es täglich verwenden, und es wird viel einfacher sein, Terraform zu entwickeln.

Verwenden wir das Anzeigeskript für die EC2-Instanzliste in Python!

Nachdem Sie direnv und dotenv festgelegt haben, führen Sie das Skript aus, das die Instanz in Python anzeigt.

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())

Speichern Sie das Python-Skript

python describe_instances.py

Versuche zu rennen Die Instanz wird in Dataframe angezeigt und kann aufgelistet werden.

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

Verwenden wir xonsh vorübergehend mit direnv!

xonsh ist eine Shell, mit der Sie Einstellungen in Python anpassen können Es wird häufig von Python-Benutzern verwendet und wird empfohlen, da es auch mit Standardeinstellungen sehr praktisch ist. (Übrigens benutze ich es normalerweise nicht. Irgendwie.)

Die Bereitstellung ist einfach. Verwenden Sie einfach den in Python verwendeten Paketmanager-Pip.

pip install xonsh

Es gab früher eine Beschreibung von xonsh in .envrc, aber lassen Sie uns die Shell vorübergehend auf xonsh umstellen und das Skript zur Anzeige der Instanzliste auf xonsh ausführen! Ist ein Versuch

Warum xonsh vorübergehend verwenden?

Der Grund für die vorübergehende Verwendung von xonsh ist eindeutig, dass der Aufwand für das Aufrufen von Python in der Shell zu groß ist. Es ist sehr ineffizient, eine Verbindung zu AWS herzustellen, die Liste zu verarbeiten und jedes Mal vom Shell-Aufruf aus anzuzeigen. Daher habe ich xonsh gewählt, das sogar Variablen in der Shell speichern kann.

xonsh Einstellungen

xonsh kann bequem durch Erstellen einer xonshrc-Datei angepasst werden Hier nehmen wir Änderungen am offiziellen xonshrc vor, damit Sie problemlos Ihr eigenes Skript zur Anzeige der Instanzliste ausführen können.

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


#Von hier aus das Original xonshrc

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

#Importieren Sie Ihre eigene Funktion
import describe_instances
_df = describe_instances.to_pandas()
#Zeigen Sie die Spalten 0 bis 5 an
print(_df[_df.columns[0:5]])

Tips

Wechseln Sie jetzt einfach in das Verzeichnis, und die Instanzliste wird automatisch angezeigt, und noch mehr.

describe_instances.to_pandas()

Sie können eine Liste der Datenrahmen erhalten, indem Sie sie einfach einfüllen

Es ist praktisch, also benutze es bitte ~~~

Recommended Posts

Mit Python und xonsh gut gemacht, so dass Sie die EC2-Instanz sehen können, indem Sie einfach die Shell betreten
Konvertieren Sie Gesichtsbilder mit PULSE in eine hohe Bildqualität, damit Sie die Poren und die Textur sehen können
Überlegen Sie, wann Sie mit Python3 und Scala3 in 10 Jahren gute Arbeit leisten können.
Bis Sie Blender installieren und vorerst mit Python ausführen können
[Python] Ich habe eine Funktion erstellt, die AES entschlüsselt und entschlüsselt, indem ich sie einfach mit pycrypto geworfen habe.
Warum kann ich das Modul durch Importieren mit Python verwenden?
Was können Sie mit den Standardstatistiken der Python-Bibliothek tun?
Das Geheimnis der Zahl, die nur durch Anordnen von 1s gesehen werden kann - Die Anzahl der Wiederholungen und die mysteriöse Natur -
Ich habe die Jumbo-Lotterie zum Jahresende mit Python gekauft und analysiert, die in Colaboratory ausgeführt werden kann
Verstehen Sie die Wahrscheinlichkeiten und Statistiken, die für das Fortschrittsmanagement mit einem Python-Programm verwendet werden können
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Überlegen Sie im Qiita-Artikel, was Sie mit Python tun können
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann