GNU/Linux >> Linux Esercitazione >  >> Linux

Come creare un'istanza Amazon AWS EC2 utilizzando Python Boto3

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

  1. Account AWS (crea se non ne hai uno)
  2. Comprensione di base di EC2.
  3. Comprensione di base di Python.
  4. Python disponibile sul sistema.

Cosa faremo

  1. Installa Boto3 e altre dipendenze.
  2. Conosci il metodo richiesto.
  3. 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.

  1. 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.
  2. Conteggio minimo: Questa specie rappresenta il numero minimo di istanze da avviare. Questo è un parametro obbligatorio.
  3. Conteggio massimo: Questa specie rappresenta il numero massimo di istanze da avviare. Questo è un parametro obbligatorio.
  4. Tipo di istanza: Il tipo di istanza da creare. Se non lo specifichi, viene utilizzato il tipo di istanza predefinito m1.small.
  5. 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.


Linux
  1. Crea un'istanza EC2 su AWS utilizzando Terraform

  2. Come creare un'istanza RDS su AWS utilizzando Terraform

  3. Come creare un ruolo IAM in AWS utilizzando Terraform

  4. Come creare un utente in Linux usando Python

  5. Come installare jq sull'istanza amazon EC2

Come creare un VPC usando Python Boto3 su Ubuntu

Come creare un'istanza RDS utilizzando Python Boto3 su AWS

Come creare un bucket S3 utilizzando Python Boto3 su AWS

Come creare un'istanza EC2 Ubuntu su AWS

Come avviare RHEL 8 da Amazon EC2 in AWS Cloud

Come installare Rocky Linux 8 sull'istanza Amazon AWS Ec2