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

AWS Logo

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

Что вам нужно

Для начала вам потребуется установить и настроить интерфейс командной строки AWS с Пользователь 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 (AMI) — это простой способ создания копий серверов с предустановленным программным обеспечением, поэтому вам не нужно каждый раз запускать скрипт установки. Это может значительно ускорить процесс загрузки, так как вам не придется ждать установки программного обеспечения в новых экземплярах.

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

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

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

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

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

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.