In questo articolo vedremo come creare un'istanza EC2 utilizzando Python Boto3. Useremo il metodo "create_instances" per creare un'istanza. Ci sono molti altri metodi che rientrano nel servizio di istanza EC2, per conoscerli visita la pagina ufficiale di Boto3 qui. Tutti questi diversi metodi aiutano a creare risorse diverse che rientrano nel servizio EC2 di AWS.
Prima di procedere, presumo che tu abbia una conoscenza di base di EC2 e Python.
Se non hai familiarità con le istanze EC2 e cosa imparare per crearne una dalla Console AWS, puoi fare clic qui.
Prerequisiti
- Account AWS (crea se non ne hai uno)
- Comprensione di base di EC2.
- Comprensione di base di Python.
- Python disponibile sul sistema.
Cosa faremo
- Installa Boto3 e altre dipendenze.
- Conosci il metodo richiesto.
- Crea un'istanza EC2 utilizzando Python Boto3.
Installa le dipendenze di Boto3
Python viene fornito per impostazione predefinita in Ubuntu 18.04 Server, quindi non è necessario installarlo.
Per verificare la versione di Python sul tuo sistema, usa il comando seguente.
quale python
/usr/bin/python --version
O
python --versione
Se non hai pip e stai usando Ubuntu Linux, esegui il comando seguente per aggiornare prima il repository locale.
sudo apt update
Per installare pip usa il comando seguente.
sudo apt install python-pip
Per verificare la versione di Pip installata, esegui il comando seguente.
pip --versione
Una volta che hai python e pip, puoi installare Boto3.
L'installazione di Boto3 è molto semplice e diretta. Per installare Boto3 usa il seguente comando.
pip installa boto3
Per verificare se il Boto3 è installato e la sua versione, eseguire il comando seguente.
pip mostra boto3
Conosci il metodo richiesto
Per creare una semplice istanza EC2 utilizzeremo il metodo "create_instances". Di seguito è riportata la sintassi del metodo con tutti i parametri che può accettare. Non useremo tutti questi parametri per creare un'istanza, ma puoi provare se vuoi.
Sintassi di richiesta:
instance = ec2.create_instances( BlockDeviceMappings=[ { 'DeviceName': 'string', 'VirtualName': 'string', 'Ebs': { 'DeleteOnTermination': True|False, 'Iops': 123, 'SnapshotId': 'string', 'VolumeSize': 123, 'VolumeType': 'standard'|'io1'|'gp2'|'sc1'|'st1', 'KmsKeyId': 'string', 'Encrypted': True|False }, 'NoDevice': 'string' }, ], ImageId='string', InstanceType='t1.micro'|'t2.nano'|'t2.micro'|'t2.small'|'t2.medium'|'t2.large'|'t2.xlarge'|'t2.2xlarge'|'t3.nano'|'t3.micro'|'t3.small'|'t3.medium'|'t3.large'|'t3.xlarge'|'t3.2xlarge'|'t3a.nano'|'t3a.micro'|'t3a.small'|'t3a.medium'|'t3a.large'|'t3a.xlarge'|'t3a.2xlarge'|'m1.small'|'m1.medium'|'m1.large'|'m1.xlarge'|'m3.medium'|'m3.large'|'m3.xlarge'|'m3.2xlarge'|'m4.large'|'m4.xlarge'|'m4.2xlarge'|'m4.4xlarge'|'m4.10xlarge'|'m4.16xlarge'|'m2.xlarge'|'m2.2xlarge'|'m2.4xlarge'|'cr1.8xlarge'|'r3.large'|'r3.xlarge'|'r3.2xlarge'|'r3.4xlarge'|'r3.8xlarge'|'r4.large'|'r4.xlarge'|'r4.2xlarge'|'r4.4xlarge'|'r4.8xlarge'|'r4.16xlarge'|'r5.large'|'r5.xlarge'|'r5.2xlarge'|'r5.4xlarge'|'r5.8xlarge'|'r5.12xlarge'|'r5.16xlarge'|'r5.24xlarge'|'r5.metal'|'r5a.large'|'r5a.xlarge'|'r5a.2xlarge'|'r5a.4xlarge'|'r5a.8xlarge'|'r5a.12xlarge'|'r5a.16xlarge'|'r5a.24xlarge'|'r5d.large'|'r5d.xlarge'|'r5d.2xlarge'|'r5d.4xlarge'|'r5d.8xlarge'|'r5d.12xlarge'|'r5d.16xlarge'|'r5d.24xlarge'|'r5d.metal'|'r5ad.large'|'r5ad.xlarge'|'r5ad.2xlarge'|'r5ad.4xlarge'|'r5ad.8xlarge'|'r5ad.12xlarge'|'r5ad.16xlarge'|'r5ad.24xlarge'|'x1.16xlarge'|'x1.32xlarge'|'x1e.xlarge'|'x1e.2xlarge'|'x1e.4xlarge'|'x1e.8xlarge'|'x1e.16xlarge'|'x1e.32xlarge'|'i2.xlarge'|'i2.2xlarge'|'i2.4xlarge'|'i2.8xlarge'|'i3.large'|'i3.xlarge'|'i3.2xlarge'|'i3.4xlarge'|'i3.8xlarge'|'i3.16xlarge'|'i3.metal'|'i3en.large'|'i3en.xlarge'|'i3en.2xlarge'|'i3en.3xlarge'|'i3en.6xlarge'|'i3en.12xlarge'|'i3en.24xlarge'|'i3en.metal'|'hi1.4xlarge'|'hs1.8xlarge'|'c1.medium'|'c1.xlarge'|'c3.large'|'c3.xlarge'|'c3.2xlarge'|'c3.4xlarge'|'c3.8xlarge'|'c4.large'|'c4.xlarge'|'c4.2xlarge'|'c4.4xlarge'|'c4.8xlarge'|'c5.large'|'c5.xlarge'|'c5.2xlarge'|'c5.4xlarge'|'c5.9xlarge'|'c5.12xlarge'|'c5.18xlarge'|'c5.24xlarge'|'c5.metal'|'c5d.large'|'c5d.xlarge'|'c5d.2xlarge'|'c5d.4xlarge'|'c5d.9xlarge'|'c5d.12xlarge'|'c5d.18xlarge'|'c5d.24xlarge'|'c5d.metal'|'c5n.large'|'c5n.xlarge'|'c5n.2xlarge'|'c5n.4xlarge'|'c5n.9xlarge'|'c5n.18xlarge'|'cc1.4xlarge'|'cc2.8xlarge'|'g2.2xlarge'|'g2.8xlarge'|'g3.4xlarge'|'g3.8xlarge'|'g3.16xlarge'|'g3s.xlarge'|'g4dn.xlarge'|'g4dn.2xlarge'|'g4dn.4xlarge'|'g4dn.8xlarge'|'g4dn.12xlarge'|'g4dn.16xlarge'|'cg1.4xlarge'|'p2.xlarge'|'p2.8xlarge'|'p2.16xlarge'|'p3.2xlarge'|'p3.8xlarge'|'p3.16xlarge'|'p3dn.24xlarge'|'d2.xlarge'|'d2.2xlarge'|'d2.4xlarge'|'d2.8xlarge'|'f1.2xlarge'|'f1.4xlarge'|'f1.16xlarge'|'m5.large'|'m5.xlarge'|'m5.2xlarge'|'m5.4xlarge'|'m5.8xlarge'|'m5.12xlarge'|'m5.16xlarge'|'m5.24xlarge'|'m5.metal'|'m5a.large'|'m5a.xlarge'|'m5a.2xlarge'|'m5a.4xlarge'|'m5a.8xlarge'|'m5a.12xlarge'|'m5a.16xlarge'|'m5a.24xlarge'|'m5d.large'|'m5d.xlarge'|'m5d.2xlarge'|'m5d.4xlarge'|'m5d.8xlarge'|'m5d.12xlarge'|'m5d.16xlarge'|'m5d.24xlarge'|'m5d.metal'|'m5ad.large'|'m5ad.xlarge'|'m5ad.2xlarge'|'m5ad.4xlarge'|'m5ad.8xlarge'|'m5ad.12xlarge'|'m5ad.16xlarge'|'m5ad.24xlarge'|'h1.2xlarge'|'h1.4xlarge'|'h1.8xlarge'|'h1.16xlarge'|'z1d.large'|'z1d.xlarge'|'z1d.2xlarge'|'z1d.3xlarge'|'z1d.6xlarge'|'z1d.12xlarge'|'z1d.metal'|'u-6tb1.metal'|'u-9tb1.metal'|'u-12tb1.metal'|'u-18tb1.metal'|'u-24tb1.metal'|'a1.medium'|'a1.large'|'a1.xlarge'|'a1.2xlarge'|'a1.4xlarge'|'a1.metal'|'m5dn.large'|'m5dn.xlarge'|'m5dn.2xlarge'|'m5dn.4xlarge'|'m5dn.8xlarge'|'m5dn.12xlarge'|'m5dn.16xlarge'|'m5dn.24xlarge'|'m5n.large'|'m5n.xlarge'|'m5n.2xlarge'|'m5n.4xlarge'|'m5n.8xlarge'|'m5n.12xlarge'|'m5n.16xlarge'|'m5n.24xlarge'|'r5dn.large'|'r5dn.xlarge'|'r5dn.2xlarge'|'r5dn.4xlarge'|'r5dn.8xlarge'|'r5dn.12xlarge'|'r5dn.16xlarge'|'r5dn.24xlarge'|'r5n.large'|'r5n.xlarge'|'r5n.2xlarge'|'r5n.4xlarge'|'r5n.8xlarge'|'r5n.12xlarge'|'r5n.16xlarge'|'r5n.24xlarge'|'inf1.xlarge'|'inf1.2xlarge'|'inf1.6xlarge'|'inf1.24xlarge'|'m6g.metal'|'m6g.medium'|'m6g.large'|'m6g.xlarge'|'m6g.2xlarge'|'m6g.4xlarge'|'m6g.8xlarge'|'m6g.12xlarge'|'m6g.16xlarge', Ipv6AddressCount=123, Ipv6Addresses=[ { 'Ipv6Address': 'string' }, ], KernelId='string', KeyName='string', MaxCount=123, MinCount=123, Monitoring={ 'Enabled': True|False }, Placement={ 'AvailabilityZone': 'string', 'Affinity': 'string', 'GroupName': 'string', 'PartitionNumber': 123, 'HostId': 'string', 'Tenancy': 'default'|'dedicated'|'host', 'SpreadDomain': 'string', 'HostResourceGroupArn': 'string' }, RamdiskId='string', SecurityGroupIds=[ 'string', ], SecurityGroups=[ 'string', ], SubnetId='string', UserData='string', AdditionalInfo='string', ClientToken='string', DisableApiTermination=True|False, DryRun=True|False, EbsOptimized=True|False, IamInstanceProfile={ 'Arn': 'string', 'Name': 'string' }, InstanceInitiatedShutdownBehavior='stop'|'terminate', NetworkInterfaces=[ { 'AssociatePublicIpAddress': True|False, 'DeleteOnTermination': True|False, 'Description': 'string', 'DeviceIndex': 123, 'Groups': [ 'string', ], 'Ipv6AddressCount': 123, 'Ipv6Addresses': [ { 'Ipv6Address': 'string' }, ], 'NetworkInterfaceId': 'string', 'PrivateIpAddress': 'string', 'PrivateIpAddresses': [ { 'Primary': True|False, 'PrivateIpAddress': 'string' }, ], 'SecondaryPrivateIpAddressCount': 123, 'SubnetId': 'string', 'InterfaceType': 'string' }, ], PrivateIpAddress='string', ElasticGpuSpecification=[ { 'Type': 'string' }, ], ElasticInferenceAccelerators=[ { 'Type': 'string', 'Count': 123 }, ], TagSpecifications=[ { 'ResourceType': 'client-vpn-endpoint'|'customer-gateway'|'dedicated-host'|'dhcp-options'|'elastic-ip'|'fleet'|'fpga-image'|'host-reservation'|'image'|'instance'|'internet-gateway'|'key-pair'|'launch-template'|'natgateway'|'network-acl'|'network-interface'|'placement-group'|'reserved-instances'|'route-table'|'security-group'|'snapshot'|'spot-fleet-request'|'spot-instances-request'|'subnet'|'traffic-mirror-filter'|'traffic-mirror-session'|'traffic-mirror-target'|'transit-gateway'|'transit-gateway-attachment'|'transit-gateway-multicast-domain'|'transit-gateway-route-table'|'volume'|'vpc'|'vpc-peering-connection'|'vpn-connection'|'vpn-gateway'|'vpc-flow-log', 'Tags': [ { 'Key': 'string', 'Value': 'string' }, ] }, ], LaunchTemplate={ 'LaunchTemplateId': 'string', 'LaunchTemplateName': 'string', 'Version': 'string' }, InstanceMarketOptions={ 'MarketType': 'spot', 'SpotOptions': { 'MaxPrice': 'string', 'SpotInstanceType': 'one-time'|'persistent', 'BlockDurationMinutes': 123, 'ValidUntil': datetime(2015, 1, 1), 'InstanceInterruptionBehavior': 'hibernate'|'stop'|'terminate' } }, CreditSpecification={ 'CpuCredits': 'string' }, CpuOptions={ 'CoreCount': 123, 'ThreadsPerCore': 123 }, CapacityReservationSpecification={ 'CapacityReservationPreference': 'open'|'none', 'CapacityReservationTarget': { 'CapacityReservationId': 'string' } }, HibernationOptions={ 'Configured': True|False }, LicenseSpecifications=[ { 'LicenseConfigurationArn': 'string' }, ], MetadataOptions={ 'HttpTokens': 'optional'|'required', 'HttpPutResponseHopLimit': 123, 'HttpEndpoint': 'disabled'|'enabled' } )
Non avremo bisogno di tutti questi parametri, quindi vediamo solo i parametri obbligatori e necessari per iniziare con la creazione di una semplice istanza EC2.
- ID immagine: Questa specie l'ID dell'AMI da utilizzare per creare un'istanza. Questo parametro è necessario per avviare un'istanza e deve essere specificato.
- Conteggio minimo: Questa specie rappresenta il numero minimo di istanze da avviare. Questo è un parametro obbligatorio.
- Conteggio massimo: Questa specie rappresenta il numero massimo di istanze da avviare. Questo è un parametro obbligatorio.
- Tipo di istanza: Il tipo di istanza da creare. Se non lo specifichi, viene utilizzato il tipo di istanza predefinito m1.small.
- NomeChiave: Il nome della coppia di chiavi. Devi specificare il nome della coppia di chiavi che hai creato sull'account AWS e che hai salvato anche localmente. Se non lo specifichi, non sarai in grado di connetterti all'istanza.
Crea un'istanza EC2 utilizzando Python Boto3
Per creare una semplice istanza EC2, prima dichiara tutte le variabili richieste e i relativi valori in "config.properties". Assicurati di modificare i valori di "aws_access_key_id_value" e "aws_secret_access_key_value" rispettivamente con il tuo access_key_id e access_key_value. Il resto dei valori puoi specificare in base alla tua scelta e disponibilità nell'account AWS.
vim config.properties
aws_access_key_id_value='ACCESS-KEY-OF-THE-AWS-ACCOUNT' aws_secret_access_key_value='SECRETE-KEY-OF-THE-AWS-ACCOUNT' region_name_value='us-west-2' ImageId_value = 'ami-08692d171e3cf02d6' MinCount_value = 1 MaxCount_value = 1 InstanceType_value = 't2.micro' KeyName_value = 'my-key'
Ora crea "ec2.py" con il codice seguente che leggerà i valori da "config.properties" e creerà un'istanza per te.
vim ec2.py
import boto3 def getVarFromFile(filename): import imp f = open(filename) global data data = imp.load_source('data', '', f) f.close() getVarFromFile('config.properties') ec2 = boto3.resource( 'ec2', aws_access_key_id=data.aws_access_key_id_value, aws_secret_access_key=data.aws_secret_access_key_value, region_name=data.region_name_value ) instance = ec2.create_instances( ImageId = data.ImageId_value, MinCount = data.MinCount_value, MaxCount = data.MaxCount_value, InstanceType = data.InstanceType_value, KeyName = data.KeyName_value) print (instance[0].id)
Ora sei pronto per creare un'istanza, eseguire lo script che abbiamo appena creato utilizzando il comando seguente.
python ec2.py
L'ID istanza verrà stampato sullo schermo.
Puoi verificare dalla console se l'istanza è stata creata o meno con l'ID istanza che hai appena visto stampato sul terminale. Qui puoi vedere che l'istanza è stata creata e lo "Status Check" è in fase di inizializzazione.
Conclusione
Abbiamo visto il metodo per creare un'istanza EC2 utilizzando la libreria Boto3. Abbiamo anche visto i parametri che sono obbligatori e necessari per creare una semplice istanza EC2. Puoi utilizzare questo codice per personalizzare e creare un'istanza a tua scelta. Prova a utilizzare parametri diversi che abbiamo saltato in questo articolo.