1.Работа с SSH-ключами
Создание пары SSH-ключей
1 |
# aws ec2 create-key-pair --key-name my_demo_aws_ssh_key --query 'KeyMaterial' --output text > ~/.ssh/demo_aws_ssh_key.pem |
Установка корректных прав на приватный ключ
1 |
# chmod 400 ~/.ssh/demo_aws_ssh_key.pem |
Просмотр доступных ключей
1 |
# aws ec2 describe-key-pairs |
1 2 3 4 5 6 7 8 |
{ "KeyPairs": [ { "KeyName": "my_demo_aws_ssh_key", "KeyFingerprint": "b7:40:79:65:96:3f:0a:b7:6e:47:13:93:c0:50:bd:fa:4e:d1:76:27" } ] } |
Удаление ключа
1 |
# aws ec2 delete-key-pair --key-name my_demo_aws_ssh_key |
http://docs.aws.amazon.com/cli/latest/userguide/cli-ec2-keypairs.html
2.Работа с группами безопасностями
Создание группы безопасности
1 |
# aws ec2 create-security-group --group-name my-demo-sg --description "My demo security group" --vpc-id vpc-f0594f97 |
1 2 3 |
{ "GroupId": "sg-dcfaada7" } |
Просмотр информации о группе безопасности
1 |
# aws ec2 describe-security-groups --group-ids sg-dcfaada7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "SecurityGroups": [ { "IpPermissionsEgress": [ { "IpProtocol": "-1", "PrefixListIds": [], "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": [], "Ipv6Ranges": [] } ], "Description": "My demo security group", "IpPermissions": [], "GroupName": "my-demo-sg", "VpcId": "vpc-f0594f97", "OwnerId": "211718304900", "GroupId": "sg-dcfaada7" } ] } |
Добавление разрешающего правила для входящего TCP-трафика по SSH c IP-адреса 159.224.XXX.YYY
(если необходимо разрешить подключение по SSH отовсюду,то используем 0.0.0.0/0)
1 |
# aws ec2 authorize-security-group-ingress --group-id sg-dcfaada7 --protocol tcp --port 22 --cidr 159.224.XXX.YYY/32 |
Проверка наличия добавленного правила
1 |
# aws ec2 describe-security-groups --group-ids sg-dcfaada7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
{ "SecurityGroups": [ { "IpPermissionsEgress": [ { "IpProtocol": "-1", "PrefixListIds": [], "IpRanges": [ { "CidrIp": "0.0.0.0/0" } ], "UserIdGroupPairs": [], "Ipv6Ranges": [] } ], "Description": "My demo security group", "IpPermissions": [ { "PrefixListIds": [], "FromPort": 22, "IpRanges": [ { "CidrIp": "159.224.XXX.YYY/32" } ], "ToPort": 22, "IpProtocol": "tcp", "UserIdGroupPairs": [], "Ipv6Ranges": [] } ], "GroupName": "my-demo-sg", "VpcId": "vpc-f0594f97", "OwnerId": "211718304900", "GroupId": "sg-dcfaada7" } ] } |
Удаление разрешающего правила для входящего TCP-трафика по SSH c IP-адреса 159.224.XXX.YYY
Выполняем с опцией —dry-run для проверки корректности синтаксиса команды
1 |
# aws ec2 revoke-security-group-ingress --group-id sg-dcfaada7 --protocol tcp --port 22 --cidr 159.224.XXX.YYY/32 --dry-run |
Если синтаксис верный,то получаем сообщение
1 |
An error occurred (DryRunOperation) when calling the RevokeSecurityGroupIngress operation: Request would have succeeded, but DryRun flag is set. |
После чего выполняем фактическое удаление правила
1 |
# aws ec2 revoke-security-group-ingress --group-id sg-dcfaada7 --protocol tcp --port 22 --cidr 159.224.XXX.YYY/32 |
Удаление группы безопасности
1 |
# aws ec2 delete-security-group --group-id sg-dcfaada7 |
http://docs.aws.amazon.com/cli/latest/userguide/cli-ec2-sg.html
3.Запуск EC2-инстанса
1 |
# aws ec2 run-instances --image-id ami-1a962263 --count 1 --instance-type t2.micro --key-name my_demo_aws_ssh_key --security-group-ids sg-dcfaada7 --subnet-id subnet-e6ceb5bd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
{ "Instances": [ { "Monitoring": { "State": "disabled" }, "PublicDnsName": "", "StateReason": { "Message": "pending", "Code": "pending" }, "State": { "Code": 0, "Name": "pending" }, "EbsOptimized": false, "LaunchTime": "2017-12-18T21:40:41.000Z", "PrivateIpAddress": "172.29.1.29", "ProductCodes": [], "VpcId": "vpc-f0594f97", "StateTransitionReason": "", "InstanceId": "i-0fbfbc77f76a67fc2", "ImageId": "ami-1a962263", "PrivateDnsName": "ip-172-29-1-29.eu-west-1.compute.internal", "KeyName": "my_demo_aws_ssh_key", "SecurityGroups": [ { "GroupName": "my-demo-sg", "GroupId": "sg-dcfaada7" } ], "ClientToken": "", "SubnetId": "subnet-e6ceb5bd", "InstanceType": "t2.micro", "NetworkInterfaces": [ { "Status": "in-use", "MacAddress": "0a:18:c5:3c:9e:7e", "SourceDestCheck": true, "VpcId": "vpc-f0594f97", "Description": "", "NetworkInterfaceId": "eni-c5a613c6", "PrivateIpAddresses": [ { "PrivateDnsName": "ip-172-29-1-29.eu-west-1.compute.internal", "Primary": true, "PrivateIpAddress": "172.29.1.29" } ], "PrivateDnsName": "ip-172-29-1-29.eu-west-1.compute.internal", "Attachment": { "Status": "attaching", "DeviceIndex": 0, "DeleteOnTermination": true, "AttachmentId": "eni-attach-dc3eb132", "AttachTime": "2017-12-18T21:40:41.000Z" }, "Groups": [ { "GroupName": "my-demo-sg", "GroupId": "sg-dcfaada7" } ], "Ipv6Addresses": [], "OwnerId": "211718304900", "SubnetId": "subnet-e6ceb5bd", "PrivateIpAddress": "172.29.1.29" } ], "SourceDestCheck": true, "Placement": { "Tenancy": "default", "GroupName": "", "AvailabilityZone": "eu-west-1a" }, "Hypervisor": "xen", "BlockDeviceMappings": [], "Architecture": "x86_64", "RootDeviceType": "ebs", "RootDeviceName": "/dev/xvda", "VirtualizationType": "hvm", "AmiLaunchIndex": 0 } ], "ReservationId": "r-0b90304797eae08f9", "Groups": [], "OwnerId": "211718304900" } |
Добавление тега для созданного инстанса
1 |
# aws ec2 create-tags --resources i-0fbfbc77f76a67fc2 --tags Key=Name,Value=app01 |
Просмотр информации о существующих инстансах
1 |
# aws ec2 describe-instances |
Запуск инстанса с дополнительным диском размером 15Gb стандартного типа с запретом удаления диска после удаления инстанса
1 |
# aws ec2 run-instances --image-id ami-1a962263 --count 1 --instance-type t2.micro --key-name my_demo_aws_ssh_key --security-group-ids sg-dcfaada7 --subnet-id subnet-e6ceb5bd --block-device-mappings '[{"DeviceName":"/dev/sdb","Ebs":{"VolumeSize":15,"DeleteOnTermination":false,"VolumeType":"standard"}}]' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
… "BlockDeviceMappings": [ { "DeviceName": "/dev/xvda", "Ebs": { "Status": "attached", "DeleteOnTermination": true, "VolumeId": "vol-083a236e4b40db8d9", "AttachTime": "2017-12-18T22:00:56.000Z" } }, { "DeviceName": "/dev/sdb", "Ebs": { "Status": "attached", "DeleteOnTermination": false, "VolumeId": "vol-09a0313bdf43c5940", "AttachTime": "2017-12-18T22:00:56.000Z" } } ], "Architecture": "x86_64", "RootDeviceType": "ebs", "RootDeviceName": "/dev/xvda", "VirtualizationType": "hvm", "AmiLaunchIndex": 0 } ], … |
Аналогично,но с использованием отдельного файла для описания параметров создания дополнительного диска
Например, параметры создания дополнительного диска опишим не в командной строки, а в отдельном файле в формате JSON и подключим этот файл при выполнении команды по созданию дополнительного диска
1 |
# aws ec2 run-instances --image-id ami-1a962263 --count 1 --instance-type t2.micro --key-name my_demo_aws_ssh_key --security-group-ids sg-dcfaada7 --subnet-id subnet-e6ceb5bd --block-device-mappings file://filename.json |
1 |
# cat filename.json |
1 2 3 4 5 6 7 8 9 10 |
[ { "DeviceName": "/dev/sdb", "Ebs": { "VolumeSize": 15, "DeleteOnTermination": false, "VolumeType": "standard" } } ] |
Чтение файла из текущей директории
1 |
--block-device-mappings file://filename.json |
Чтение файла из директории /tmp
1 |
--block-device-mappings file:///tmp/filename.json |
Чтение файла из S3-бакета
Например, из бакета mydemobuckets3, расположенного в Ирландии(eu-west-1)
1 |
--block-device-mappings https://s3-eu-west-1.amazonaws.com/mydemobuckets3/filename.json |
Перезагрузка инстанса
1 |
# aws ec2 reboot-instances --instance-ids i-0fbfbc77f76a67fc2 |
Удаление инстанса
1 |
# aws ec2 terminate-instances --instance-ids i-0fbfbc77f76a67fc2 |
Фильтрация результатов информации об инстансах
Просмотр инстансов с типом t2.micro/m1.medium, расположенных в зоне доступности(датацентре) eu-west-1a
1 |
# aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro,m1.medium" "Name=availability-zone,Values=eu-west-1a" |
ShortHand-синтаксис
1 |
# aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro,m1.medium" |
Эквивалентен JSON-формату
1 |
# aws ec2 describe-instances --filters '{"Name": "instance-type", "Values": ["t2.micro", "m1.medium"]}' |
Просмотр инстансов, запущенных с указанных ami-образов
1 |
# aws ec2 describe-instances --filters "Name=image-id,Values=ami-1a962263,ami-y0123456" |
Просмотр доступных дисков
1 |
# aws ec2 describe-volumes --query 'Volumes[*]' |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[ { "AvailabilityZone": "eu-west-1a", "Attachments": [], "Encrypted": false, "VolumeType": "standard", "VolumeId": "vol-09a0313bdf43c5940", "State": "available", "SnapshotId": "", "CreateTime": "2017-12-18T22:00:56.087Z", "Size": 15 } ] |
Удаление диска, который не подсоединен к инстансу
1 |
# aws ec2 delete-volume --volume-id vol-09a0313bdf43c5940 |
Проверка,что диск был удален
1 |
# aws ec2 describe-volumes --query 'Volumes[*]' |
1 |
[] |
Просмотр только первого диска
1 |
# aws ec2 describe-volumes --query 'Volumes[0]' |
Просмотр всех дисков
1 |
# aws ec2 describe-volumes --query 'Volumes[*]' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[ { "AvailabilityZone": "eu-west-1a", "Attachments": [ { "AttachTime": "2017-12-18T16:35:35.000Z", "InstanceId": "i-0b68e5a7310c3f677", "VolumeId": "vol-0b0dc817b5483c176", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/xvda" } ], "Encrypted": false, "VolumeType": "gp2", "VolumeId": "vol-0b0dc817b5483c176", "State": "in-use", "Iops": 100, "SnapshotId": "snap-049e2cbd0e7328e2a", "CreateTime": "2017-12-18T16:35:35.166Z", "Size": 8 } ] |
Аналогчино,но с выводом только некоторых параметров/элементов этих дисков
(идентификатора диска,зоны доступности,размера диска)
1 |
# aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,AZ:AvailabilityZone,Size:Size}' |
1 2 3 4 5 6 7 |
[ { "AZ": "eu-west-1a", "ID": "vol-0b0dc817b5483c176", "Size": 8 } ] |
Аналогично, но с выводом идентификатора инстанса
1 |
# aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' |
1 2 3 4 5 6 7 8 |
[ { "InstanceId": "i-0b68e5a7310c3f677", "AZ": "eu-west-1a", "ID": "vol-0b0dc817b5483c176", "Size": 8 } ] |
Просмотр дисков в определенном регионе
1 |
# aws ec2 describe-volumes --query 'Volumes[?AvailabilityZone==`eu-west-1a`]' |
Получение IP-адреса интсанса по его идентификатору
1 |
# aws ec2 describe-instances --instance-ids i-0b68e5a7310c3f677 --query 'Reservations[0].Instances[0].PublicIpAddress' |
1 |
"54.154.140.213" |
http://docs.aws.amazon.com/cli/latest/userguide/cli-ec2-launch.html
Использование CLI Skeleton
1 |
# aws ec2 run-instances --generate-cli-skeleton > ec2runinst.json |
Изменить содержимое файла ec2runinst.json,подставив свои значения в соответствующие поля,оставив при этом «DryRun»: true, допускается удаление неиспользуемых параметров/элементов
Проверяем синтаксиc JSON(т.к в файле «DryRun»: true, то фактического выполнения запуска инстанса не будет)
1 |
# aws ec2 run-instances --cli-input-json file://ec2runinst.json |
Если с синтаксисом все в порядке, то вывод предыдущей команды должен быть таким
1 |
A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set. |
Если нет, исправляем ошибки и снова выполняем предыдущую команду
После чего отключаем DryRun-параметр
меняем
«DryRun»: с true на false
И выполняем команду по запуску инстанса
1 |
# aws ec2 run-instances --cli-input-json file://ec2runinst.json |
http://docs.aws.amazon.com/cli/latest/userguide/generate-cli-skeleton.html
Справка по командам EC2
Список доступных команд
1 |
# aws ec2 help |
Справка по конкретной команде
1 |
# aws ec2 commandname help |