Поиск по сайту:

Как автоматизировать создание виртуальных машин AWS из командной строки


Новые экземпляры легко запускать из консоли EC2, но иногда вам нужно автоматизировать задачу из сценария оболочки. В этом случае в интерфейсе командной строки AWS есть обширные команды для запуска экземпляров из командной строки.

Что вам понадобится

Для начала вам потребуется установить AWS CLI и настроить пользователя IAM, у которого есть доступ для создания новых экземпляров.

Если вы не хотите автоматизировать их создание, вам понадобится существующая группа безопасности с уже настроенными правилами. Хотя веб-интерфейс по умолчанию создает новую группу для каждого экземпляра, вы можете повторно использовать группы безопасности для любого количества экземпляров. Имейте в виду, однако, что порт, открытый в группе безопасности, будет открывать этот порт в каждом экземпляре.

Если вы хотите создать новую группу безопасности из командной строки, вы можете создать и открыть порты с помощью следующих команд:

aws ec2 create-security-group --group-name NewSecurityGroup --description "Created from CLI"
aws ec2 authorize-security-group-ingress --group-name NewSecurityGroup --protocol tcp --port 22 --cidr 0.0.0.0/0

Какой бы маршрут вы ни выбрали, вам необходимо записать идентификатор группы безопасности. Узнать это можно из командной строки, описав группу безопасности:

aws ec2 describe-security-groups --group-names EC2SecurityGroup

Который покажет информацию о группе, включая идентификатор группы.

Вам нужно будет записать имя пары ключей, которую вы используете для доступа к экземплярам. Для простоты вы, вероятно, захотите использовать одну и ту же пару ключей, а не создавать новую для каждого нового экземпляра, который вы создаете.

Вам понадобится AMI для запуска образа. Это может быть свежий образ AMI, такой как Amazon Linux 2 или Ubuntu Server LTS 18.04, или ваш собственный образ AMI с предустановленным программным обеспечением. (подробнее об этом ниже).

Вам нужно знать свой идентификатор подсети. Вы захотите запустить все свои инстансы в одной подсети и определенно в одной и той же зоне доступности, так как передача данных между зонами требует затрат. Идентификатор подсети можно найти в консоли AWS EC2 или в командной строке с помощью jq:

aws ec2 describe-instances | jq '.Reservations[0].Instances[0].NetworkInterfaces[0].SubnetId'

Создание экземпляров из командной строки

Вы можете запускать экземпляры с помощью команды run-instances . Эта команда имеет множество опций, но самые важные из них:

aws ec2 run-instances 
--image-id ami-00000000 
--count 1 
--instance-type t2.micro 
--key-name MyKeyPair 
--security-group-ids sg-00000000 
--subnet-id subnet-00000000 
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=cli-generated}]'

Вам нужно будет заменить идентификатор AMI, имя пары ключей, идентификатор группы безопасности и идентификатор подсети своими собственными значениями. Последняя директива --tag-specification присваивает экземпляру имя, которое вы также захотите изменить.

Это запустит базовый микроэкземпляр t2.micro в регионе вашей учетной записи по умолчанию. Эта команда выведет много данных JSON:

{
    "OwnerId": "123456789012",
    "ReservationId": "r-5875ca20",
    "Groups": [
        {
            "GroupName": "my-sg",
            "GroupId": "sg-903004f8"
        }
    ],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": null,
            "Platform": "windows",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "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",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-1a2b3c4d",
                    "Description": "Primary network interface",
                    "NetworkInterfaceId": "eni-a7edb1c9",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                            "Primary": true,
                            "PrivateIpAddress": "10.0.1.114"
                        }
                    ],
                    "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                    "Attachment": {
                        "Status": "attached",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-52193138",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "my-sg",
                            "GroupId": "sg-903004f8"
                        }
                    ],
                    "SubnetId": "subnet-6e7f829e",
                    "OwnerId": "123456789012",
                    "PrivateIpAddress": "10.0.1.114"
                }              
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": null,
                "AvailabilityZone": "us-west-2b"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "Status": "attached",
                        "DeleteOnTermination": true,
                        "VolumeId": "vol-877166c8",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    }
                }              
            ],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "RootDeviceName": "/dev/sda1",
            "VirtualizationType": "hvm",
            "RootDeviceType": "ebs",
            "Tags": [
                {
                    "Value": "MyInstance",
                    "Key": "Name"
                }
            ],
            "AmiLaunchIndex": 0
        }
    ]
}

Вы, вероятно, захотите передать это в файл и сохранить для дальнейшего использования. Вы можете использовать такую утилиту, как jq, для работы с JSON в командной строке или импортировать его в скрипт Python или Node для быстрого доступа.

После создания экземпляра вы сможете получить к нему доступ через SSH с его общедоступного IP-адреса или частного IP-адреса, если у вас есть сервер OpenVPN, работающий в вашей подсети.

Настройка сценария установки

AWS позволяет передать инстансу скрипт установки, который будет запускаться при запуске. В этом сценарии вы можете автоматически выполнять любую необходимую вам настройку машины, например, установку и настройку программ.

Чтобы передать скрипт из CLI, вам нужно использовать параметр --user-data и передать файл с помощью file://:

aws ec2 run-instances 
--image-id ami-00000000 
--count 1 
--instance-type t2.micro 
--key-name MyKeyPair 
--security-group-ids sg-00000000 
--subnet-id subnet-00000000 
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=cli-generated}]' 
--user-data file://startup_script.sh

Это будет работать только один раз, а не при каждой перезагрузке.

Создание пользовательского AMI

Amazon Machine Images (AMI) — это простой способ создания копий серверов с предустановленным программным обеспечением, поэтому вам не нужно каждый раз запускать сценарий установки. Это может значительно ускорить процесс загрузки, поскольку вам не придется ждать, пока программное обеспечение будет установлено на новых экземплярах.

Чтобы создать его, вы, вероятно, захотите начать с нуля, чтобы убедиться, что все правильно, хотя вы можете просто использовать предварительно настроенный сервер в качестве шаблона.

Если вы начинаете с нуля, создайте новый экземпляр t2.micro с базовым AMI, таким как Amazon Linux 2, который будет служить отправной точкой. Настройте его со всеми необходимыми программами и убедитесь, что все работает должным образом.

Затем в консоли AWS EC2 щелкните правой кнопкой мыши свой экземпляр и выберите «Образ» > «Создать образ»:

Это автоматически создаст AMI на основе вашего экземпляра. Вы также можете создать AMI на основе моментальных снимков, но этот мастер создаст моментальный снимок, с помощью которого вы создадите AMI.

Создание AMI может занять некоторое время, но как только это будет сделано, вы сможете получить к нему доступ на вкладке AMI консоли EC2. Вы можете взять идентификатор AMI и использовать его для создания новых экземпляров на основе этого AMI. Вы также можете использовать его в качестве основы для шаблона запуска Autoscaling Group, который описан в нашем руководстве по использованию AMI.