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.
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
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
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.
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
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 |
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
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.
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