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
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
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
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
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»
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
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]}]
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
https://github.com/kyorohiro/advent-2019-code-server/blob/master/remote_cs01/for_aws/main.py
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)
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.
É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)
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
Exploitons l'instance virtuelle créée !!
https://github.com/kyorohiro/advent-2019-code-server/tree/master/remote_cs02
Recommended Posts