[PYTHON] environnement en ligne de serveur de code (3) Lancer une instance EC2 avec Boto3

Ceci est l'article du 14ème jour de Advent Calender sur le serveur de code 2019.

Dans la continuité de la dernière fois, je voudrais lancer EC2 Instance.

table des matières Environnement local 1er jour Environnement en ligne, jour 1 Améliorer l'environnement de travail

Environnement en ligne, jour 2 Créer un réseau virtuel

Environnement en ligne 3ème jour Lancement d'une instance EC2 avec Boto3

Environnement en ligne, jour 4 Essayez d'exécuter Code-Server dans le cloud

Environnement en ligne 5ème jour Lancer le serveur de code sur Docker

Environnement en ligne, jour 6 automatisons

Environnement en ligne 7ème jour Deploy compose sur git sur EC2

... En ligne .. Construit avec le fichier Coompose

Version en ligne .. Essayez K8S

...

Remodelage démoniaque

introduction

Je n'ai pas défini la RouteTable. Cela fonctionne dans l'environnement temporel, Peut-être que ça ne marche pas ...

Commençons donc par configurer la table de routage

Qu'est-ce que la table de routage

Vous avez défini la passerelle la dernière fois !!, vous pouvez définir la passerelle à utiliser pour chaque adresse IP accédée à partir du VPC.

Dans ce cas, il vous suffit de vous connecter à la passerelle Internet, Il peut être défini fréquemment, par exemple entre les VPC et les sous-réseaux.

Créer un réseau # 2

Créer une table de routage

Créer



def create_route_table(vpc_id:str):
    res = ec2client.create_route_table(VpcId=vpc_id)
    print("{}".format(res))
    route_table_id = res['RouteTable']['RouteTableId']
    attach_tag(route_table_id)
    return route_table_id

La table de routage est un VPC. Bien sûr ..

Tu peux y aller

Créer une route

Précisons dans RouteTable que toutes les IP peuvent se connecter à Internet

Créer une route


def create_route(route_table_id:str, gateway_id:str):
    resp = ec2client.create_route(RouteTableId=route_table_id,DestinationCidrBlock="0.0.0.0/0",GatewayId=gateway_id)
    print("{}".format(resp))

«0.0.0.0 / 0» signifie toutes les adresses IP. De «0.0.0.0» à «255.255.255.255»

Associer au sous-réseau

python


def associate_route_table(route_table_id:str, subnet_id:str):
    res = ec2client.associate_route_table(RouteTableId=route_table_id,SubnetId=subnet_id)
    print("{}".format(res))
    associate_id = res['AssociationId']
    return associate_id

Supprimer la table de routage

def delete_route_table():
    print(">>> Delete Route Table")
    res = ec2client.describe_route_tables(Filters=[{"Name":"tag:Name","Values":[instance_name]}])
    print("{}".format(res))
    for route_table in res["RouteTables"]:
        for association in route_table.get('Associations',[]):
            ec2client.disassociate_route_table(AssociationId = association['RouteTableAssociationId'])
        res = ec2client.delete_route_table(RouteTableId=route_table['RouteTableId'])
        print("{}".format(res))

La suppression ressemble à ceci. Avant de le supprimer, vous devez appeler ʻassociate_route_table () `pour le dissocier.

Filters=[{"Name":"vpc-id","Values":[vpc_id]}]

Correction du groupe de sécurité

Le dernier code a oublié de définir le VPC.

Créer


def create_security_group(vpc_id):
    print(">>> CREATE SECURITY GROUP")
    res = ec2client.create_security_group(Description="AdventCodeServer",GroupName=instance_name,VpcId=vpc_id)
    print("{}".format(res))
    group_id = res['GroupId']
    attach_tag(group_id)
    return group_id

Le code écrit jusqu'à présent est le suivant

https://github.com/kyorohiro/advent-2019-code-server/blob/master/remote_cs01/for_aws/main.py

Créer une instance

Créer un fichier PEM

Il est supposé que vous vous connecterez à l'instance à l'aide de la clé SSH. Créons une clé privée et une clé publique

Création de PEM


def create_pem():
    pem_file = open("{}.pem".format(instance_name),"w")
    pem_file.write("")
    try:
        print(">>> CREATE KEY_PAIR")
        res = ec2client.create_key_pair(KeyName=instance_name)
        print("{}".format(res))
        pem_file.write(res['KeyMaterial'])
    finally:
        pem_file.close()
    return instance_name

Suppression du PEM


def delete_pem():
    print(">>>> DELETE KeyPair")
    ec2client.delete_key_pair(KeyName=instance_name)

Lancer l'instance

Créer


def create_instance(subnet_id:str, group_id:str):
    print(">>>> CREATE INSTANCE")
    res = ec2client.run_instances(ImageId="ami-0cd744adeca97abb1",#KeyName="xx",
        InstanceType='t2.micro',
        MinCount=1,MaxCount=1,KeyName=instance_name,
        TagSpecifications=[
            {
                'ResourceType': 'instance',
                'Tags': [{
                    'Key': 'Name',
                    'Value': instance_name
                }]
            }
        ],NetworkInterfaces=[{"SubnetId":subnet_id,'AssociatePublicIpAddress': True,'DeviceIndex':0,'Groups': [group_id]}]
        )
    print("{}".format(res))

Spécifiez le sous-réseau créé et group_id.

Cette fois, j'ai spécifié Ubuntu. https://aws.amazon.com/jp/amazon-linux-ami/

Effacer



def delete_instance():
    print(">>>> ec2client.describe_instances")
    res = ec2client.describe_instances(
        Filters=[{"Name":"tag:Name","Values":[instance_name]}]
        )
    print("{}".format(res))

    print(">>>> DELETE Instance")
    for reservation in res['Reservations']:
        for instance in reservation['Instances']:
            instance_id = instance['InstanceId']
            res = ec2client.terminate_instances(InstanceIds=[instance_id])

    print("{}".format(res))

La suppression est la même que précédemment.

Maintenant, connectons ceux que nous avons créés jusqu'à présent.

Exécutez le script, avant cela

Écrivons également un script qui attend que l'instance soit supprimée.

python


def wait_instance_is_terminated():
    while(True):
        res = ec2client.describe_instances(
            Filters=[{"Name":"tag:Name","Values":[instance_name]}]
            )
        terminated = False
        for reservation in res['Reservations']:
            for instance in reservation['Instances']:
                instance_state = instance['State']['Name']
                print("------{}".format(instance_state))
                if instance_state != 'terminated':
                    terminated = True
        if terminated == False:
            break
        time.sleep(6)

Résumé

main.py


import boto3
from boto3_type_annotations import ec2
from botocore.exceptions import ClientError
from typing import Dict, List 
import time
import network

instance_name= "advent-code-server"
ec2client:ec2.Client = boto3.client("ec2")


def create_pem():
    pem_file = open("{}.pem".format(instance_name),"w")
    pem_file.write("")
    try:
        print(">>> CREATE KEY_PAIR")
        res = ec2client.create_key_pair(KeyName=instance_name)
        print("{}".format(res))
        pem_file.write(res['KeyMaterial'])
    finally:
        pem_file.close()
    return instance_name

def delete_pem():
    print(">>>> DELETE KeyPair")
    ec2client.delete_key_pair(KeyName=instance_name)

def create_instance(subnet_id:str, group_id:str):

    print(">>>> CREATE INSTANCE")
    # Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-0cd744adeca97abb1 (64-bit x86) / ami-0f0dcd3794e1da1e1 (64-bit Arm)
    # https://aws.amazon.com/jp/amazon-linux-ami/
    res = ec2client.run_instances(ImageId="ami-0cd744adeca97abb1",#KeyName="xx",
        InstanceType='t2.micro',
        MinCount=1,MaxCount=1,KeyName=instance_name,
        TagSpecifications=[
            {
                'ResourceType': 'instance',
                'Tags': [
                {
                    'Key': 'Name',
                    'Value': instance_name
                }
                ]
            }
        ],NetworkInterfaces=[{"SubnetId":subnet_id,'AssociatePublicIpAddress': True,'DeviceIndex':0,'Groups': [group_id]}]
        )
    print("{}".format(res))

    return instance_name


def delete_instance():
    print(">>>> ec2client.describe_instances")
    res = ec2client.describe_instances(
        Filters=[{"Name":"tag:Name","Values":[instance_name]}]
        )
    print("{}".format(res))

    print(">>>> DELETE Instance")
    for reservation in res['Reservations']:
        for instance in reservation['Instances']:
            print("------{}".format(instance))
            instance_id = instance['InstanceId']
            print(">>>> {}".format(instance_id))
            res = ec2client.terminate_instances(InstanceIds=[instance_id])

    print("{}".format(res))

def wait_instance_is_terminated():
    while(True):
        res = ec2client.describe_instances(
            Filters=[{"Name":"tag:Name","Values":[instance_name]}]
            )
        terminated = False
        for reservation in res['Reservations']:
            for instance in reservation['Instances']:
                instance_state = instance['State']['Name']
                print("------{}".format(instance_state))
                if instance_state != 'terminated':
                    terminated = True
        if terminated == False:
            break
        time.sleep(6)

if __name__ == "__main__":
    res = network.create()
    create_pem()
    create_instance(res["subnet_id"], res["group_id"])
    delete_instance()
    wait_instance_is_terminated()
    delete_pem()
    network.delete()

Le code entier est ci-dessous

https://github.com/kyorohiro/advent-2019-code-server/tree/master/remote_cs02/for_aws

la prochaine fois

Exploitons l'instance virtuelle créée !!

code

https://github.com/kyorohiro/advent-2019-code-server/tree/master/remote_cs02

Recommended Posts

environnement en ligne de serveur de code (3) Lancer une instance EC2 avec Boto3
environnement en ligne du serveur de code (4) Lancer le serveur de code sur l'instance EC2
environnement en ligne de serveur de code (2) Créer un réseau virtuel avec Boto3
environnement en ligne du serveur de code (5) Lancer le serveur de code sur Docker
environnement en ligne de serveur de code (1)
environnement en ligne de serveur de code (7) Déploiement de compose sur git sur EC2
Arrêter une instance avec une balise spécifique dans Boto3
Créer un environnement avec virtualenv
environnement en ligne de serveur de code (6) Automatisons
Construction de l'environnement Ruby avec AWS EC2
Créer un environnement de développement AWS Cloud9 sur une instance Amazon EC2
Obtenez des informations sur les instances EC2 avec des préfixes arbitraires dans le nom de l'instance avec boto
Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda
[Python] Création d'un environnement avec Anaconda [Mac]
Remarques lors de la création d'un environnement avec python
Lancement de l'instance AWS EC2 et connexion SSH
Générer une instance Excel compatible avec les compléments avec xlwings
Environnement de lancement avec LineBot + Heroku + Docker + Python
Rejoignez un juge en ligne avec Python 3.x
Créer un environnement python avec pyenv sur EC2 (ubuntu)
Construire un environnement Anaconda pour Python avec pyenv
Diverses commandes pour créer un environnement avec Apache
Création d'une instance AWS EC2 EC2 (Amazon Linux AMI) 2
Paramètres de sécurité requis après le lancement d'une instance EC2
Décrivez ec2 avec boto3 et récupérez la valeur
Essayez de créer un environnement pour MayaPython avec VisualStudioCode