Il est facile de lancer de nouvelles instances à partir de la console EC2, mais vous devez parfois automatiser la tâche à partir d'un script shell. Dans ce cas, l'AWS CLI dispose de commandes étendues pour lancer des instances à partir de la ligne de commande.
Ce dont vous aurez besoin
Pour commencer, vous aurez besoin de l'AWS CLI installée et configurée avec un Utilisateur IAM qui a accès pour créer de nouvelles instances.
À moins que vous ne vouliez automatiser leur création, vous aurez besoin d'un groupe de sécurité existant avec les règles déjà configurées. Bien que l'interface Web crée un nouveau groupe pour chaque instance par défaut, vous pouvez réutiliser des groupes de sécurité pour un nombre illimité d'instances. Gardez à l'esprit, cependant, qu'un port ouvert dans un groupe de sécurité ouvrira ce port sur chaque instance.
Si vous souhaitez créer un nouveau groupe de sécurité à partir de la ligne de commande, vous pouvez créer et ouvrir des ports avec les commandes suivantes:
aws ec2 create-security-group --group-name NewSecurityGroup --description "Créé à partir de CLI" aws ec2 authorize-security-group-ingress --group-name NewSecurityGroup --protocol tcp --port 22 --cidr 0.0.0.0/0
Quel que soit l'itinéraire que vous choisissez, vous devrez noter l'ID du groupe de sécurité. Vous pouvez le trouver à partir de la ligne de commande en décrivant le groupe de sécurité:
aws ec2 describe-security-groups --group-names EC2SecurityGroup
Qui affichera des informations sur le groupe, y compris l'ID du groupe.
Vous devrez noter le nom de la paire de clés que vous utilisez pour accéder aux instances. Par souci de simplicité, vous souhaiterez probablement utiliser la même paire de clés, plutôt que d'en créer une nouvelle pour chaque nouvelle instance que vous créez.
Vous aurez besoin d'une AMI pour lancer l'image à partir de. Il peut s'agir d'une nouvelle AMI, comme Amazon Linux 2 ou Ubuntu Server LTS 18.04, ou il peut s'agir de votre propre AMI personnalisée avec un logiciel préinstallé. (plus à ce sujet ci-dessous).
Vous devez connaître votre ID de sous-réseau. Vous souhaiterez lancer toutes vos instances dans le même sous-réseau et certainement dans la même zone de disponibilité, car le transfert de données entre les zones entraîne des coûts. Vous pouvez trouver l'ID de sous-réseau à partir de la console AWS EC2 ou à partir de la ligne de commande avec jq:
aws ec2 descriptions-instances | jq '.Reservations (0) .Instances (0) .NetworkInterfaces (0) .SubnetId'
Créer des instances à partir de la ligne de commande
Vous pouvez lancer des instances à l'aide de la run-instances
commander. Cette commande a beaucoup d'options, mais ceux qui importent le plus sont:
instances d'exécution aws ec2 --image-id ami-00000000 --count 1 --type d'instance t2.micro --key-name MyKeyPair --security-group-ids sg-00000000 --subnet-id subnet-00000000 --tag-specifications 'ResourceType = instance, Tags = ({Key = Name, Value = cli-generated})'
Vous devrez remplacer l'ID AMI, le nom de la paire de clés, l'ID du groupe de sécurité et l'ID de sous-réseau par vos propres valeurs. Le final --tag-spécification
La directive attribue le nom à l'instance, que vous souhaitez également modifier.
Cela lancera une base t2.micro
micro-instance dans la région par défaut de votre compte. Cette commande produira un lot des données JSON:
{ "OwnerId": "123456789012", "ReservationId": "r-5875ca20", "Groupes": ( { "GroupName": "my-sg", "GroupId": "sg-903004f8" } ), "Les instances": ( { "Surveillance": { "État": "désactivé" }, "PublicDnsName": null, "Plateforme": "fenêtres", "Etat": { "Code": 0, "Nom": "en attente" }, "EbsOptimized": faux, "LaunchTime": "2013-07-19T02: 42: 39.000Z", "PrivateIpAddress": "10.0.1.114", "ProductCodes": (), "VpcId": "vpc-1a2b3c4d", "InstanceId": "i-5203422c", "ImageId": "ami-173d747e", "PrivateDnsName": ip-10-0-1-114.ec2.internal, "KeyName": "MyKeyPair", "SecurityGroups": ( { "GroupName": "my-sg", "GroupId": "sg-903004f8" } ), "ClientToken": null, "SubnetId": "subnet-6e7f829e", "InstanceType": "t2.micro", "Interfaces réseau": ( { "Statut": "en cours d'utilisation", "SourceDestCheck": vrai, "VpcId": "vpc-1a2b3c4d", "Description": "Interface réseau principale", "NetworkInterfaceId": "eni-a7edb1c9", "PrivateIpAddresses": ( { "PrivateDnsName": "ip-10-0-1-114.ec2.internal", "Primaire": vrai, "PrivateIpAddress": "10.0.1.114" } ), "PrivateDnsName": "ip-10-0-1-114.ec2.internal", "Attachement": { "Statut": "attaché", "DeviceIndex": 0, "DeleteOnTermination": vrai, "AttachmentId": "eni-attach-52193138", "AttachTime": "2013-07-19T02: 42: 39.000Z" }, "Groupes": ( { "GroupName": "my-sg", "GroupId": "sg-903004f8" } ), "SubnetId": "subnet-6e7f829e", "OwnerId": "123456789012", "PrivateIpAddress": "10.0.1.114" } ), "SourceDestCheck": vrai, "Emplacement": { "Location": "par défaut", "GroupName": null, "AvailabilityZone": "us-west-2b" }, "Hyperviseur": "xen", "BlockDeviceMappings": ( { "DeviceName": "/ dev / sda1", "Ebs": { "Statut": "attaché", "DeleteOnTermination": vrai, "VolumeId": "vol-877166c8", "AttachTime": "2013-07-19T02: 42: 39.000Z" } } ), "Architecture": "x86_64", "StateReason": { "Message": "en attente", "Code": "en attente" }, "RootDeviceName": "/ dev / sda1", "VirtualizationType": "hvm", "RootDeviceType": "ebs", "Mots clés": ( { "Value": "MyInstance", "Clé": "Nom" } ), "AmiLaunchIndex": 0 } ) }
Vous souhaiterez probablement le rediriger vers un fichier et l'enregistrer pour référence ultérieure. Vous pouvez utiliser un utilitaire comme jq pour travailler avec JSON sur la ligne de commande, ou l'importer dans un script Python ou Node pour un accès facile.
Une fois l'instance créée, vous pourrez y accéder via SSH à partir de son adresse IP publique ou de son adresse IP privée si vous disposez d'un serveur OpenVPN exécuté sur votre sous-réseau.
Configuration d'un script d'installation
AWS vous permet de passer un script d'installation à l'instance qui sera exécutée au lancement. Dans ce script, vous pouvez effectuer automatiquement toute configuration de la machine que vous devez faire, comme l'installation et la configuration de programmes.
Pour passer le script de la CLI, vous voudrez utiliser le --données d'utilisateur
et passez le fichier en utilisant fichier://
:
instances d'exécution aws ec2 --image-id ami-00000000 --count 1 --type d'instance t2.micro --key-name MyKeyPair --security-group-ids sg-00000000 --subnet-id subnet-00000000 --tag-specifications 'ResourceType = instance, Tags = ({Key = Name, Value = cli-generated})' - fichier de données utilisateur: //startup_script.sh
Cela ne fonctionnera qu'une seule fois, et pas à chaque redémarrage.
Création d'une AMI personnalisée
Amazon Machine Images (AMI) est un moyen facile de créer des copies de serveurs avec des logiciels préinstallés, vous n'avez donc pas besoin d'exécuter un script d'installation à chaque fois. Cela peut rendre votre processus de démarrage beaucoup plus rapide, car vous n'aurez pas à attendre que le logiciel s'installe sur de nouvelles instances.
Pour en créer un, vous voudrez probablement recommencer à zéro pour vous assurer que tout est correct, bien que vous puissiez simplement utiliser votre serveur préconfiguré comme modèle.
Si vous partez de zéro, créez une nouvelle instance t2.micro avec une AMI de base comme Amazon Linux 2 pour vous servir de point de départ. Configurez-le avec tous les programmes dont vous avez besoin et vérifiez que tout fonctionne comme prévu.
Ensuite, à partir de la console AWS EC2, cliquez avec le bouton droit sur votre instance et choisissez Image> Créer une image:
Cela créera automatiquement une AMI en fonction de votre instance. Vous pouvez également créer une AMI basée sur des instantanés, mais cet assistant créera un instantané pour vous permettre de créer l'AMI avec.
Votre AMI peut prendre un peu de temps à créer, mais une fois terminé, vous pourrez y accéder dans l'onglet AMI de la console EC2. Vous pouvez prendre l'ID AMI et l'utiliser pour créer de nouvelles instances basées sur cette AMI. Vous pouvez également l'utiliser comme base pour un modèle de lancement de groupe de mise à l'échelle automatique, qui est couvert dans notre guide d'utilisation des AMI.