[PYTHON] Code-Server-Online-Umgebung (3) Starten Sie eine EC2-Instanz mit Boto3

Dies ist der Artikel des Adventskalenders zum 14. Tag auf dem Code-Server 2019.

Ich möchte vom letzten Mal an die EC2-Instanz starten.

Inhaltsverzeichnis Tag 1 der lokalen Umwelt Online-Umgebung, Tag 1 Verbesserung der Arbeitsumgebung

Online-Umgebung, Tag 2 Erstellen eines virtuellen Netzwerks

Online-Umgebung 3. Tag Starten einer EC2-Instanz mit Boto3

Online-Umgebung, Tag 4 Versuchen Sie, Code-Server in der Cloud auszuführen

Online-Umgebung 5. Tag Code-Server auf Docker starten

Online-Umgebung, Tag 6 Lassen Sie uns automatisieren

Online-Umgebung 7. Tag Bereitstellen von Compose auf Git auf EC2

... Online .. Erstellt mit Coompose-Datei

Online-Version .. Versuchen Sie K8S

...

Dämonenumbau

Einführung

Ich habe die RouteTable nicht festgelegt. Es funktioniert in der Zeitumgebung, Vielleicht funktioniert es nicht ...

Beginnen wir also mit dem Einrichten der Routentabelle

Was ist die Routentabelle?

Sie haben das Gateway das letzte Mal festgelegt !! Sie können festlegen, welches Gateway für jede IP verwendet werden soll, auf die über die VPC zugegriffen wird.

In diesem Fall müssen Sie lediglich eine Verbindung zum Internet Gateway herstellen. Sie kann häufig festgelegt werden, z. B. zwischen VPCs und Subnetzen.

Erstellen eines Netzwerks # 2

Erstellen Sie eine Routentabelle

Erstellen



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

Die Routentabelle ist eine VPC. Natürlich ..

Du kannst gehen

Erstellen Sie eine Route

Geben Sie in RouteTable an, dass alle IPs eine Verbindung zum Internet herstellen können

Erstellen Sie eine 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" bedeutet alle IPs. Von "0.0.0.0" bis "255.255.255.255"

Mit Subnetz verbinden

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

Routentabelle löschen

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

Das Löschen sieht so aus. Bevor Sie es entfernen, müssen Sie Associate_route_table () aufrufen, um die Zuordnung aufzuheben.

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

Sicherheitsgruppen-Fix

Der letzte Code hat vergessen, die VPC einzustellen.

Erstellen


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

Der bisher geschriebene Code lautet wie folgt

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

Erstellen Sie eine Instanz

Erstellen Sie eine PEM-Datei

Es wird davon ausgegangen, dass Sie mit dem SSH-Schlüssel eine Verbindung zur Instanz herstellen. Erstellen wir einen privaten und einen öffentlichen Schlüssel

PEM-Erstellung


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

PEM-Entfernung


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

Instanz starten

Erstellen


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

Geben Sie das erstellte Subnetz und die Gruppen-ID an.

Diesmal habe ich Ubuntu angegeben. https://aws.amazon.com/jp/amazon-linux-ami/

Löschen



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

Das Löschen ist das gleiche wie zuvor.

Lassen Sie uns nun diejenigen verbinden, die wir bisher erstellt haben.

Führen Sie vorher das Skript aus

Schreiben wir auch ein Skript, das darauf wartet, dass die Instanz gelöscht wird.

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)

Zusammenfassung

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

Der gesamte Code ist unten

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

nächstes Mal

Lassen Sie uns die erstellte virtuelle Instanz bedienen !!

Code

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

Recommended Posts

Code-Server-Online-Umgebung (3) Starten Sie eine EC2-Instanz mit Boto3
Code-Server-Online-Umgebung (4) Starten Sie den Code-Server auf der EC2-Instanz
Code-Server-Online-Umgebung (2) Erstellen Sie mit Boto3 ein virtuelles Netzwerk
Code-Server-Online-Umgebung (5) Starten Sie den Code-Server auf Docker
Code-Server-Online-Umgebung (1)
Code-Server-Online-Umgebung (7) Stellen Sie compose on git auf EC2 bereit
Stoppen Sie eine Instanz mit einem bestimmten Tag in Boto3
Erstellen Sie eine Umgebung mit virtualenv
Code-Server-Online-Umgebung (6) Lassen Sie uns automatisieren
Ruby-Umgebungskonstruktion mit aws EC2
Erstellen Sie eine AWS Cloud9-Entwicklungsumgebung auf einer Amazon EC2-Instanz
Informationen zu EC2-Instanzen mit beliebigen Präfixen im Instanznamen mit boto abrufen
Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
[Python] Erstellen einer Umgebung mit Anaconda [Mac]
Hinweise beim Erstellen einer Umgebung mit Python
Start der AWS EC2-Instanz und SSH-Verbindung
Generieren Sie eine add-in-fähige Excel-Instanz mit xlwings
Starten Sie die Umgebung mit LineBot + Heroku + Docker + Python
Treten Sie einem Online-Richter mit Python 3.x bei
Erstellen Sie eine Python-Umgebung mit pyenv auf EC2 (Ubuntu)
Erstellen einer Anaconda-Umgebung für Python mit pyenv
Verschiedene Befehle zum Erstellen einer Umgebung mit Apache
Erstellen einer AWS EC2 EC2-Instanz (Amazon Linux AMI) 2
Sicherheitseinstellungen nach dem Start einer EC2-Instanz erforderlich
Beschreibe ec2 mit boto3 und rufe den Wert ab
Versuchen Sie, mit VisualStudioCode eine Umgebung für MayaPython zu erstellen