AWS

AWS EC2 CLI — Довідник команд

Повний довідник AWS CLI команд для Amazon EC2 — instances, AMI, Key Pairs, Security Groups, Elastic IP, EBS, snapshots, IAM Instance Profile, tags. Усі важливі команди з прикладами та очікуваним виводом.

AWS EC2 CLI — Довідник команд

Цей довідник охоплює всі важливі aws ec2 команди, згруповані за категоріями. Для кожної команди наведено опис ключових параметрів та очікуваний вивід терміналу.

Перед використанням переконайтеся, що AWS CLI налаштований: aws configure або змінні середовища AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION. Більшість команд потребують --region — зручно встановити через export AWS_DEFAULT_REGION=eu-central-1.

EC2 Instances — управління instances

run-instances

Запускає один або кілька EC2 instances із вказаним AMI. Це основна команда для створення нових серверів.

--image-id
string required
AMI ID для запуску instance. Формат ami-xxxxxxxxxxxxxxxxx. Прив'язаний до регіону — один і той самий AMI у різних регіонах має різний ID.
--instance-type
string required
Тип instance: t3.micro, t3.medium, m6i.large тощо. Визначає кількість vCPU, RAM та мережеву продуктивність.
--key-name
string
Ім'я Key Pair для SSH-підключення. Без нього не можна підключитись через SSH (якщо не використовується Instance Connect або SSM).
--security-group-ids
list
Список ID Security Groups через пробіл: sg-111 sg-222. Визначає правила мережевого доступу.
--subnet-id
string
ID підмережі VPC для запуску instance. Визначає зону доступності (AZ). Якщо не вказано — AWS вибирає підмережу за замовчуванням.
--count
string
Кількість instances для запуску у форматі мін:макс, наприклад 1:3. Або просто число для точної кількості.
--user-data
string
Bootstrap-скрипт, що виконується при першому запуску. Передається як file://path/to/script.sh або як inline base64-рядок.
--iam-instance-profile
string
IAM Instance Profile для прикріплення ролі: Name=my-profile або Arn=arn:aws:iam::.... Надає instance доступ до AWS-сервісів без hardcode ключів.
--tag-specifications
string
Теги для instance та EBS томів прямо при запуску: 'ResourceType=instance,Tags=[{Key=Name,Value=my-server}]'.
--block-device-mappings
json
Конфігурація EBS томів: розмір, тип, шифрування. Наприклад, збільшити root том до 30 GB.
aws ec2 run-instances — запуск Ubuntu instance
$ aws ec2 run-instances \
> --image-id ami-0a1b2c3d4e5f67890 \
> --instance-type t3.micro \
> --key-name ec2-lab-key \
> --security-group-ids sg-0a1b2c3d4e5f67890 \
> --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=dotnet-api-server}]' \
> --query "Instances[0].InstanceId" \
> --output text --region eu-central-1
i-0a1b2c3d4e5f67890
--query "Instances[0].InstanceId" --output text одразу повертає чистий ID без JSON — зручно для збереження в змінну: INSTANCE_ID=$(aws ec2 run-instances ... --output text).

describe-instances

Повертає інформацію про один або кілька instances: стан, тип, IP-адреси, Security Groups, теги тощо.

--instance-ids
list
Список Instance ID для фільтрації: i-111 i-222. Без цього параметра повертає всі instances у регіоні.
--filters
list
Фільтри у форматі Name=key,Values=val1,val2. Популярні фільтри: instance-state-name (running/stopped), tag:Name, instance-type, image-id.
--query
string
JMESPath вираз для форматування виводу. Часто використовується для вилучення конкретних полів.
aws ec2 describe-instances — статус та IP конкретного instance
$ aws ec2 describe-instances \
> --instance-ids i-0a1b2c3d4e5f67890 \
> --query "Reservations[0].Instances[0].{State:State.Name,IP:PublicIpAddress,Type:InstanceType}" \
> --output table --region eu-central-1
-----------------------------------------------
| DescribeInstances |
+------------+----------------+--------------+
| IP | State | Type |
+------------+----------------+--------------+
| 3.64.185.42 | running | t3.micro |
+------------+----------------+--------------+
aws ec2 describe-instances — знайти всі running instances за тегом
$ aws ec2 describe-instances \
> --filters "Name=instance-state-name,Values=running" \
> "Name=tag:Environment,Values=production" \
> --query "Reservations[*].Instances[*].{ID:InstanceId,IP:PublicIpAddress,Name:Tags[?Key=='Name'].Value|[0]}" \
> --output table --region eu-central-1
--------------------------------------------------
| i-0a1b2c3d4e5f67890 | 3.64.185.42 | api-prod |
| i-0b2c3d4e5f6789012 | 18.184.22.15 | worker-1 |
--------------------------------------------------

start-instances / stop-instances / reboot-instances

Змінюють стан одного або кількох instances. stop зупиняє instance зі збереженням EBS (обчислення не тарифікуються). reboot перезавантажує без зміни IP та фізичного хосту.

--instance-ids
list required
Один або кілька Instance ID: i-111 i-222. Усі вказані instances отримують нову команду одночасно.
--hibernate
boolean
Лише для stop-instances. Зберігає вміст RAM на EBS-диск. Instance відновиться з того самого стану (вимагає попереднього налаштування Hibernate).
aws ec2 stop-instances / start-instances
$ aws ec2 stop-instances --instance-ids i-0a1b2c3d4e5f67890 --region eu-central-1
{
"StoppingInstances": [{
"InstanceId": "i-0a1b2c3d4e5f67890",
"CurrentState": { "Name": "stopping" },
"PreviousState": { "Name": "running" }
}]
}
$ aws ec2 start-instances --instance-ids i-0a1b2c3d4e5f67890 --region eu-central-1
{
"StartingInstances": [{
"CurrentState": { "Name": "pending" },
"PreviousState": { "Name": "stopped" }
}]
}

terminate-instances

Незворотньо видаляє instance. За замовчуванням root EBS том також видаляється. Перед виконанням переконайтеся, що вибрали правильний Instance ID.

--instance-ids
list required
Instance ID для видалення. Можна передати кілька: i-111 i-222 i-333.
aws ec2 terminate-instances
$ aws ec2 terminate-instances --instance-ids i-0a1b2c3d4e5f67890 --region eu-central-1
{
"TerminatingInstances": [{
"InstanceId": "i-0a1b2c3d4e5f67890",
"CurrentState": { "Name": "shutting-down" },
"PreviousState": { "Name": "running" }
}]
}
terminate-instances — незворотна операція. Після переходу в terminated instance та root EBS том не можна відновити. Завжди перевіряйте --instance-ids перед виконанням.

wait

Блокує виконання скрипту поки instance не досягне цільового стану. Незамінний в автоматизації — дозволяє уникнути polling вручну та sleep.

instance-running
subcommand
Чекати поки instance перейде у стан running. Виконується після run-instances або start-instances.
instance-stopped
subcommand
Чекати поки instance перейде у стан stopped. Корисно перед зміною типу instance або створенням AMI.
instance-status-ok
subcommand
Чекати не лише running, але й успішне проходження обох status checks (system check + instance check). Більш надійний варіант перед SSH-підключенням.
instance-terminated
subcommand
Чекати повного видалення instance. Потрібно перед звільненням Elastic IP або Security Group.
--instance-ids
list required
Instance ID, для якого очікуємо стан.
aws ec2 wait instance-running — блокуючий старт у скрипті
$ INSTANCE_ID=$(aws ec2 run-instances \
> --image-id ami-0a1b2c3d4e5f67890 --instance-type t3.micro \
> --query "Instances[0].InstanceId" --output text --region eu-central-1)
$ echo "Waiting for instance $INSTANCE_ID to start..."
Waiting for instance i-0a1b2c3d4e5f67890 to start...
$ aws ec2 wait instance-status-ok \
> --instance-ids $INSTANCE_ID --region eu-central-1
# ~90 секунд очікування...
$ echo "Instance is ready!"
Instance is ready!

AMI — Amazon Machine Images

describe-images

Шукає AMI у поточному регіоні за фільтрами. Основне використання — знайти актуальний AMI ID для автоматизованих скриптів.

--owners
list required
Власник AMI. 099720109477 — Canonical (Ubuntu), amazon — офіційні Amazon AMI, self — ваші Custom AMI, aws-marketplace — Marketplace.
--filters
list
Фільтри для пошуку: Name=name,Values=*pattern*, Name=state,Values=available, Name=architecture,Values=x86_64.
--image-ids
list
Знайти конкретні AMI за ID. Корисно для перевірки існування або отримання деталей.
--query
string
Зазвичай використовується sort_by(Images, &CreationDate)[-1].ImageId — повертає ID найновішого AMI з результатів фільтрації.
aws ec2 describe-images — актуальний Ubuntu 24.04 AMI
$ aws ec2 describe-images \
> --owners 099720109477 \
> --filters "Name=name,Values=ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*" \
> "Name=state,Values=available" \
> --query "sort_by(Images, &CreationDate)[-1].ImageId" \
> --output text --region eu-central-1
ami-0a1b2c3d4e5f67890
aws ec2 describe-images — актуальний Windows Server 2022 AMI
$ aws ec2 describe-images \
> --owners amazon \
> --filters "Name=name,Values=Windows_Server-2022-English-Full-Base-*" \
> "Name=state,Values=available" \
> --query "sort_by(Images, &CreationDate)[-1].{ID:ImageId,Name:Name}" \
> --output table --region eu-central-1
-----------------------------------------------------------------
| ami-0b1c2d3e4f5a67891 | Windows_Server-2022-English-Full-Base-2024.01.15 |
-----------------------------------------------------------------
Ніколи не хардкодьте AMI ID у скриптах автоматизації — вони змінюються при виході нових версій. Завжди запитуйте актуальний ID через describe-images з відповідними фільтрами.

create-image

Створює Custom AMI зі знімку запущеного або зупиненого instance. AMI зберігає повний стан EBS-дисків.

--instance-id
string required
Instance ID, з якого створюється AMI.
--name
string required
Ім'я нового AMI. Унікальне в межах акаунту та регіону.
--description
string
Опис AMI для документування вмісту (версія .NET, встановлені пакети тощо).
--no-reboot
boolean
Не перезавантажувати instance під час створення AMI. Швидше, але може призвести до неконсистентного стану файлової системи. Для продакшн — краще без --no-reboot.
aws ec2 create-image — Custom AMI з запущеного instance
$ AMI_ID=$(aws ec2 create-image \
> --instance-id i-0a1b2c3d4e5f67890 \
> --name "dotnet-api-ready-v1.2.0" \
> --description "Ubuntu 24.04 + .NET 8 SDK + nginx 1.24" \
> --query ImageId --output text --region eu-central-1)
$ echo "AMI: $AMI_ID"
AMI: ami-0c2d3e4f5a678901b
# Очікуємо поки AMI стане доступним
$ aws ec2 wait image-available --image-ids $AMI_ID --region eu-central-1
# 3-15 хвилин... AMI готовий

deregister-image

Видаляє реєстрацію AMI — після цього неможливо запустити нові instances з цього AMI. Вже запущені instances продовжують працювати. EBS snapshots, пов'язані з AMI, не видаляються автоматично — потрібно видалити вручну.

--image-id
string required
ID AMI для видалення.
aws ec2 deregister-image — видалення старого AMI та його snapshot
$ aws ec2 deregister-image --image-id ami-0c2d3e4f5a678901b --region eu-central-1
(no output — success)
# Знайти та видалити пов'язані snapshots
$ aws ec2 describe-snapshots \
> --owner-ids self \
> --filters "Name=description,Values=*ami-0c2d3e4f5a678901b*" \
> --query "Snapshots[*].SnapshotId" --output text --region eu-central-1
snap-0d3e4f5a678901bc2
$ aws ec2 delete-snapshot --snapshot-id snap-0d3e4f5a678901bc2 --region eu-central-1
(no output — success)

copy-image

Копіює AMI між регіонами або в межах того самого регіону. Необхідно для мультирегіональних Auto Scaling груп або аварійного відновлення.

--source-image-id
string required
ID AMI у вихідному регіоні.
--source-region
string required
Регіон, де знаходиться AMI-джерело.
--name
string required
Ім'я копії у цільовому регіоні.
--region
string required
Цільовий регіон для копії.
aws ec2 copy-image — копіювання AMI з eu-central-1 до us-east-1
$ aws ec2 copy-image \
> --source-image-id ami-0a1b2c3d4e5f67890 \
> --source-region eu-central-1 \
> --name "dotnet-api-ready-v1.2.0-us" \
> --query ImageId --output text --region us-east-1
ami-0e4f5a678901bc2d3

Key Pairs — SSH ключі

create-key-pair

Створює нову Key Pair та повертає приватний ключ у JSON-відповіді. Це єдиний момент, коли AWS показує приватний ключ — одразу збережіть його у файл.

--key-name
string required
Унікальне ім'я Key Pair в межах регіону.
--key-type
string
Тип ключа: rsa (за замовчуванням, сумісний з PuTTY) або ed25519 (коротший, безпечніший, рекомендований для OpenSSH).
--key-format
string
Формат: pem (для OpenSSH/Linux/Mac) або ppk (для PuTTY на Windows).
aws ec2 create-key-pair — збереження приватного ключа у файл
$ aws ec2 create-key-pair \
> --key-name ec2-lab-key \
> --key-type ed25519 \
> --query "KeyMaterial" \
> --output text --region eu-central-1 > ~/.ssh/ec2-lab-key.pem
$ chmod 400 ~/.ssh/ec2-lab-key.pem
$ cat ~/.ssh/ec2-lab-key.pem
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAA...
-----END OPENSSH PRIVATE KEY-----
chmod 400 — обов'язковий крок. SSH відмовить у підключенні якщо файл ключа має надто відкриті права. Помилка буде: Permissions are too open або bad permissions: ignore key file.

import-key-pair

Імпортує публічний ключ із вашої локальної пари (якщо SSH ключ вже створений). AWS зберігає лише публічну частину.

--key-name
string required
Ім'я Key Pair в AWS для імпортованого ключа.
--public-key-material
string required
Публічний ключ у форматі fileb://~/.ssh/id_ed25519.pub або file://. fileb:// — бінарний режим (рекомендований).
aws ec2 import-key-pair — ваш існуючий SSH ключ в AWS
$ aws ec2 import-key-pair \
> --key-name my-existing-key \
> --public-key-material fileb://~/.ssh/id_ed25519.pub \
> --region eu-central-1
{
"KeyName": "my-existing-key",
"KeyFingerprint": "4d:21:b7:c3:...:a9",
"KeyPairId": "key-0a1b2c3d4e5f67890"
}

describe-key-pairs / delete-key-pair

describe-key-pairs перелічує всі Key Pairs у регіоні. delete-key-pair видаляє запис з AWS — вже запущені instances залишаються доступними, але новий instance з таким іменем не можна запустити.

describe-key-pairs + delete-key-pair
$ aws ec2 describe-key-pairs \
> --query "KeyPairs[*].{Name:KeyName,Type:KeyType,ID:KeyPairId}" \
> --output table --region eu-central-1
--------------------------------------------------
| DescribeKeyPairs |
+------------------+---------+------------------+
| ec2-lab-key | ed25519 | key-0a1b2c3d... |
| my-existing-key | ed25519 | key-0b2c3d4e... |
+------------------+---------+------------------+
$ aws ec2 delete-key-pair --key-name ec2-lab-key --region eu-central-1
(no output — success)

Security Groups — мережевий доступ

create-security-group

Створює нову Security Group у вказаному VPC.

--group-name
string required
Унікальне ім'я Security Group у межах VPC.
--description
string required
Опис призначення Security Group. Обов'язковий параметр.
--vpc-id
string required
ID VPC, в якому створюється Security Group.
aws ec2 create-security-group — Security Group для .NET API
$ VPC_ID=$(aws ec2 describe-vpcs \
> --filters "Name=isDefault,Values=true" \
> --query "Vpcs[0].VpcId" --output text --region eu-central-1)
$ SG_ID=$(aws ec2 create-security-group \
> --group-name dotnet-api-sg \
> --description "Security group for .NET 8 API" \
> --vpc-id $VPC_ID \
> --query GroupId --output text --region eu-central-1)
sg-0a1b2c3d4e5f67890

authorize-security-group-ingress

Додає правило вхідного трафіку до Security Group.

--group-id
string required
ID Security Group до якої додається правило.
--protocol
string required
Протокол: tcp, udp, icmp, або -1 (all).
--port
integer
Порт або діапазон 80-8080. Для ICMP вказуйте -1.
--cidr
string
CIDR-діапазон джерела: 0.0.0.0/0 (усі), 203.0.113.5/32 (один IP), 10.0.0.0/16 (підмережа).
--source-group
string
ID іншої Security Group як джерела — для правил між instances без прив'язки до IP.
--ip-permissions
json
Складніший формат для кількох правил одразу або для опису по портах.
aws ec2 authorize-security-group-ingress — SSH + HTTP + HTTPS
# SSH лише з вашого поточного IP
$ MY_IP=$(curl -s https://checkip.amazonaws.com)
$ aws ec2 authorize-security-group-ingress \
> --group-id $SG_ID --protocol tcp --port 22 \
> --cidr "${MY_IP}/32" --region eu-central-1
(no output — success)
# HTTP та HTTPS для всіх
$ aws ec2 authorize-security-group-ingress \
> --group-id $SG_ID \
> --ip-permissions '[
> {"IpProtocol":"tcp","FromPort":80,"ToPort":80,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]},
> {"IpProtocol":"tcp","FromPort":443,"ToPort":443,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}
> ]' --region eu-central-1
(no output — success)
Ніколи не відкривайте порт 22 для 0.0.0.0/0 у production. Автоматизовані сканери за лічені хвилини починають підбір паролів. Завжди обмежуйте SSH до /32 вашого IP або використовуйте EC2 Instance Connect / Systems Manager Session Manager.

revoke-security-group-ingress

Видаляє правило вхідного трафіку. Параметри — ті самі, що у authorize-security-group-ingress.

aws ec2 revoke-security-group-ingress — видалення застарілого правила SSH
$ aws ec2 revoke-security-group-ingress \
> --group-id $SG_ID --protocol tcp --port 22 \
> --cidr 203.0.113.5/32 --region eu-central-1
(no output — success)

describe-security-groups

Перелічує Security Groups та їхні правила.

aws ec2 describe-security-groups — всі правила конкретної SG
$ aws ec2 describe-security-groups \
> --group-ids $SG_ID \
> --query "SecurityGroups[0].IpPermissions[*].{Proto:IpProtocol,From:FromPort,To:ToPort,CIDR:IpRanges[0].CidrIp}" \
> --output table --region eu-central-1
------------------------------------------
| Proto | From | To | CIDR |
+-----------+--------+------+-------------+
| tcp | 22 | 22 | 203.0.113.5/32 |
| tcp | 80 | 80 | 0.0.0.0/0 |
| tcp | 443 | 443 | 0.0.0.0/0 |
------------------------------------------

Elastic IP — статична публічна адреса

allocate-address

Виділяє нову Elastic IP адресу для вашого акаунту. Після виділення IP прив'язаний до акаунту (та тарифікується ~$0.005/год якщо не прикріплений до запущеного instance).

--domain
string required
Завжди vpc — для instance у VPC (сучасний підхід). Застарілий standard для EC2-Classic більше не підтримується.
--network-border-group
string
Для виділення Elastic IP в конкретній Local Zone або Outpost зоні.
aws ec2 allocate-address — виділити Elastic IP
$ aws ec2 allocate-address \
> --domain vpc --region eu-central-1
{
"PublicIp": "3.64.185.42",
"AllocationId": "eipalloc-0a1b2c3d4e5f67890",
"PublicIpv4Pool": "amazon",
"NetworkBorderGroup": "eu-central-1",
"Domain": "vpc"
}

associate-address / disassociate-address

associate-address прикріплює Elastic IP до instance. disassociate-address від'єднує (EIP залишається виділеним та тарифікується — не плутати з release-address).

--instance-id
string
Instance ID для прикріплення. Або --network-interface-id для прикріплення до ENI.
--allocation-id
string required
ID виділеної Elastic IP у форматі eipalloc-xxx.
--allow-reassociation
boolean
Дозволити переприкріплення EIP вже прикріпленого до іншого instance.
associate-address + disassociate-address
$ ALLOC_ID="eipalloc-0a1b2c3d4e5f67890"
$ ASSOC_ID=$(aws ec2 associate-address \
> --instance-id $INSTANCE_ID \
> --allocation-id $ALLOC_ID \
> --query AssociationId --output text --region eu-central-1)
eipassoc-0b2c3d4e5f6789012
# Від'єднати без звільнення EIP
$ aws ec2 disassociate-address \
> --association-id $ASSOC_ID --region eu-central-1
(no output — success)

release-address

Повністю звільняє Elastic IP — адреса повертається до пулу AWS і тарифікація зупиняється. Виконується після disassociate-address.

aws ec2 release-address — повне звільнення EIP
$ aws ec2 release-address \
> --allocation-id eipalloc-0a1b2c3d4e5f67890 --region eu-central-1
(no output — success)
Після release-address ця IP-адреса більше не належить вашому акаунту — вона може бути виділена іншому клієнту AWS. Якщо вона використовується в DNS записах — сайт перестане працювати до оновлення DNS.

describe-addresses

Перелічує всі Elastic IP у регіоні разом з інформацією про прикріплення.

aws ec2 describe-addresses — огляд всіх EIP
$ aws ec2 describe-addresses \
> --query "Addresses[*].{IP:PublicIp,AllocID:AllocationId,InstanceId:InstanceId,AssocID:AssociationId}" \
> --output table --region eu-central-1
-------------------------------------------------------------------------------------
| 3.64.185.42 | eipalloc-0a1b... | i-0a1b2c... | eipassoc-0b2c... |
| 52.29.111.5 | eipalloc-0c3d... | None | None | ← тарифікується!
-------------------------------------------------------------------------------------
Регулярно перевіряйте describe-addresses — EIP з InstanceId: None тарифікується (~$3.6/місяць кожен). Звільняйте невикористані адреси.

EBS — Elastic Block Store

create-volume

Створює новий EBS том у вказаній Availability Zone. Том не підключений — потрібна окрема команда attach-volume.

--size
integer required
Розмір у гігабайтах. Для gp3: мінімум 1 GB, максимум 16,384 GB.
--volume-type
string required
Тип тому: gp3 (рекомендований загального призначення), gp2 (застарілий), io2 (high IOPS), st1 (throughput HDD), sc1 (cold HDD).
--availability-zone
string required
AZ для тому: eu-central-1a. Важливо: том і instance мають бути в одній AZ.
--iops
integer
Тільки для gp3 і io2. Для gp3: 3000 за замовчуванням, до 16,000. Для io2: до 64,000.
--throughput
integer
Тільки для gp3. Пропускна здатність у MB/s: 125 за замовчуванням, до 1,000.
--encrypted
boolean
Шифрування тому ключем KMS. Рекомендується для production.
aws ec2 create-volume — gp3 том 50 GB з шифруванням
$ VOLUME_ID=$(aws ec2 create-volume \
> --size 50 \
> --volume-type gp3 \
> --availability-zone eu-central-1a \
> --encrypted \
> --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=data-volume}]' \
> --query VolumeId --output text --region eu-central-1)
vol-0a1b2c3d4e5f67890

attach-volume / detach-volume

attach-volume підключає EBS том до instance (том і instance — у тій самій AZ). На Linux пристрій з'являється як /dev/xvdf або /dev/nvme1n1. detach-volume від'єднує перед видаленням тому або переміщенням до іншого instance.

--volume-id
string required
ID EBS тому для підключення.
--instance-id
string required
ID instance, до якого підключається том.
--device
string required
Ім'я пристрою: /dev/xvdf, /dev/xvdg тощо. AWS рекомендує /dev/sd[f-z], але на сучасних Nitro-instance пристрій відображається як /dev/nvme[1-26]n1 незалежно від вказаного імені.
attach-volume + форматування + монтування на Linux
$ aws ec2 attach-volume \
> --volume-id vol-0a1b2c3d4e5f67890 \
> --instance-id $INSTANCE_ID \
> --device /dev/xvdf --region eu-central-1
{
"VolumeId": "vol-0a1b2c3d4e5f67890",
"InstanceId": "i-0a1b2c3d4e5f67890",
"State": "attaching",
"Device": "/dev/xvdf"
}
# Після підключення на сервері (SSH):
$ sudo mkfs.ext4 /dev/nvme1n1 # Форматування (лише для нового тому!)
$ sudo mkdir -p /data
$ sudo mount /dev/nvme1n1 /data # Монтування
ubuntu@server:~$ df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/nvme1n1 50G 24K 50G 1% /data

create-snapshot

Створює point-in-time резервну копію EBS тому, збережену в S3. Snapshot — інкрементальний (зберігаються лише зміни з часу попереднього snapshot).

--volume-id
string required
ID EBS тому для резервної копії.
--description
string
Опис snapshot. Корисно для ідентифікації: Before .NET upgrade 2024-01-15.
aws ec2 create-snapshot + очікування completion
$ SNAP_ID=$(aws ec2 create-snapshot \
> --volume-id vol-0a1b2c3d4e5f67890 \
> --description "Backup before .NET upgrade" \
> --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=data-backup-2024}]' \
> --query SnapshotId --output text --region eu-central-1)
snap-0d3e4f5a678901bc2
$ aws ec2 wait snapshot-completed --snapshot-ids $SNAP_ID --region eu-central-1
# Від кількох хвилин до годин залежно від розміру тому...
# Snapshot готовий!

modify-volume

Змінює розмір, тип або IOPS існуючого EBS тому без зупинки instance. Після зміни потрібно розширити файлову систему зсередини ОС.

--volume-id
string required
ID EBS тому для модифікації.
--size
integer
Новий розмір у GB. Можна тільки збільшувати — зменшення неможливе.
--volume-type
string
Зміна типу (наприклад, з gp2 на gp3).
--iops
integer
Нова кількість IOPS (для gp3 та io2).
aws ec2 modify-volume — збільшення root тому + resize на Linux
$ aws ec2 modify-volume \
> --volume-id vol-0a1b2c3d4e5f67890 \
> --size 50 --region eu-central-1
{ "VolumeModification": { "ModificationState": "modifying" } }
# Після зміни — розширити файлову систему на Linux (SSH):
ubuntu@server:~$ sudo growpart /dev/nvme0n1 1
CHANGED: partition=1 start=2048 old: size=41940959 end=41943007 new: size=104855519 end=104857567
ubuntu@server:~$ sudo resize2fs /dev/nvme0n1p1
resize2fs 1.46.5: Filesystem at /dev/nvme0n1p1 is now 52427759 blocks long.

describe-volumes / delete-volume

describe-volumes перелічує томи та їхній стан. delete-volume видаляє том (том має бути у стані available — не підключений).

describe-volumes + delete-volume
$ aws ec2 describe-volumes \
> --filters "Name=attachment.instance-id,Values=$INSTANCE_ID" \
> --query "Volumes[*].{ID:VolumeId,Size:Size,Type:VolumeType,State:State}" \
> --output table --region eu-central-1
-----------------------------------------------------------
| vol-0a1b2c3d... | 20 | gp3 | in-use | (root)
| vol-0b2c3d4e... | 50 | gp3 | in-use | (data)
-----------------------------------------------------------
# Detach перед видаленням
$ aws ec2 detach-volume --volume-id vol-0b2c3d4e5f6789012 --region eu-central-1
$ aws ec2 wait volume-available --volume-ids vol-0b2c3d4e5f6789012 --region eu-central-1
$ aws ec2 delete-volume --volume-id vol-0b2c3d4e5f6789012 --region eu-central-1
(no output — success)

Tags — теги ресурсів

create-tags

Додає або оновлює теги на будь-якому EC2 ресурсі: instance, AMI, volume, snapshot, Security Group, Elastic IP тощо.

--resources
list required
Список ID ресурсів: i-111 vol-222 snap-333. Можна тегувати кілька ресурсів одночасно.
--tags
list required
Теги у форматі Key=Name,Value=my-server. Кілька тегів через пробіл: Key=Env,Value=prod Key=Owner,Value=team-backend.
aws ec2 create-tags — додати кілька тегів до instance
$ aws ec2 create-tags \
> --resources $INSTANCE_ID \
> --tags \
> Key=Name,Value=dotnet-api-prod \
> Key=Environment,Value=production \
> Key=Owner,Value=backend-team \
> Key=CostCenter,Value=CC-123 \
> --region eu-central-1
(no output — success)

describe-tags

Знаходить EC2 ресурси за їхніми тегами.

aws ec2 describe-tags — знайти всі production instances
$ aws ec2 describe-tags \
> --filters "Name=key,Values=Environment" \
> "Name=value,Values=production" \
> "Name=resource-type,Values=instance" \
> --query "Tags[*].{ResourceId:ResourceId,Value:Value}" \
> --output table --region eu-central-1
---------------------------------------------
| i-0a1b2c3d4e5f67890 | production |
| i-0b2c3d4e5f6789012 | production |
---------------------------------------------

IAM Instance Profile — прив'язка ролей

associate-iam-instance-profile

Прикріплює IAM Instance Profile (і відповідно IAM Role) до запущеного instance. Дозволяє коду на instance звертатись до AWS-сервісів без hardcode ключів.

--instance-id
string required
Instance ID для прикріплення IAM Role.
--iam-instance-profile
string required
Instance Profile у форматі Name=profile-name або Arn=arn:aws:iam::....
aws ec2 associate-iam-instance-profile — прикріплення ролі до instance
$ aws ec2 associate-iam-instance-profile \
> --instance-id $INSTANCE_ID \
> --iam-instance-profile Name=ec2-s3-readonly-profile \
> --region eu-central-1
{
"IamInstanceProfileAssociation": {
"AssociationId": "iip-assoc-0a1b2c3d4e5f67890",
"InstanceId": "i-0a1b2c3d4e5f67890",
"IamInstanceProfile": { "Arn": "arn:aws:iam::123456789012:instance-profile/ec2-s3-readonly-profile" },
"State": "associated"
}
}

describe-iam-instance-profile-associations / replace / disassociate

describe — переглянути поточну прив'язку. replace — замінити IAM Role без від'єднання (нульовий downtime). disassociate — прибрати IAM Role з instance.

describe + replace-iam-instance-profile-association
# Переглянути поточну прив'язку
$ aws ec2 describe-iam-instance-profile-associations \
> --filters "Name=instance-id,Values=$INSTANCE_ID" \
> --query "IamInstanceProfileAssociations[0].{AssocID:AssociationId,Profile:IamInstanceProfile.Arn,State:State}" \
> --output table --region eu-central-1
-----------------------------------------------------------------------------------------------
| iip-assoc-0a1b... | arn:aws:iam::123456789012:instance-profile/ec2-s3-readonly-profile | associated |
-----------------------------------------------------------------------------------------------
# Замінити роль на нову без зупинки instance
$ aws ec2 replace-iam-instance-profile-association \
> --association-id iip-assoc-0a1b2c3d4e5f67890 \
> --iam-instance-profile Name=ec2-full-access-profile \
> --region eu-central-1
{ "State": "associated", ... }

User Data — bootstrap-скрипти

describe-instance-attribute (userData)

Читає User Data вже запущеного instance у base64. Корисно для перевірки або дебагу bootstrap-скрипту.

aws ec2 describe-instance-attribute userData — читання bootstrap скрипту
$ aws ec2 describe-instance-attribute \
> --instance-id $INSTANCE_ID \
> --attribute userData \
> --query "UserData.Value" \
> --output text --region eu-central-1 | base64 --decode
#!/bin/bash
apt-get update -y
apt-get install -y dotnet-sdk-8.0
mkdir -p /var/app
echo "Setup completed at $(date)" >> /var/app/setup.log

modify-instance-attribute (userData)

Змінює User Data у зупиненого instance. Нові дані застосуються при наступному запуску.

aws ec2 modify-instance-attribute userData — оновлення bootstrap
# Instance має бути STOPPED перед зміною User Data
$ NEW_SCRIPT=$(base64 -w0 new-setup.sh)
$ aws ec2 modify-instance-attribute \
> --instance-id $INSTANCE_ID \
> --attribute userData \
> --value "$NEW_SCRIPT" \
> --region eu-central-1
(no output — success)
# Стартуємо instance — bootstrap запуститься знову
$ aws ec2 start-instances --instance-ids $INSTANCE_ID --region eu-central-1
User Data виконується лише один раз при першому запуску instance. Щоб виконати його знову після modify-instance-attribute, потрібно зупинити та запустити instance (не reboot). Логи User Data на Ubuntu: /var/log/cloud-init-output.log.

EC2 Instance Connect

send-ssh-public-key

Тимчасово завантажує ваш SSH публічний ключ на instance (дійсний 60 секунд). Дозволяє підключитись через стандартний ssh без попередньо збереженого Key Pair.

--instance-id
string required
ID instance для завантаження ключа.
--instance-os-user
string required
Ім'я OS-користувача: ubuntu для Ubuntu AMI, ec2-user для Amazon Linux, Administrator для Windows.
--ssh-public-key
string required
Шлях до публічного ключа: file://~/.ssh/id_ed25519.pub.
--availability-zone
string required
AZ, де знаходиться instance.
aws ec2-instance-connect send-ssh-public-key + підключення
$ AZ=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID \
> --query "Reservations[0].Instances[0].Placement.AvailabilityZone" \
> --output text --region eu-central-1)
$ aws ec2-instance-connect send-ssh-public-key \
> --instance-id $INSTANCE_ID \
> --instance-os-user ubuntu \
> --ssh-public-key file://~/.ssh/id_ed25519.pub \
> --availability-zone $AZ --region eu-central-1
{ "Success": true, "RequestId": "a1b2c3d4-..." }
# Підключаємось протягом 60 секунд
$ ssh -i ~/.ssh/id_ed25519 ubuntu@3.64.185.42
ubuntu@ip-172-31-10-25:~$

mssh — CLI утиліта (рекомендована альтернатива)

mssh — утиліта ec2instanceconnectcli, що автоматично виконує send-ssh-public-key + ssh в одній команді. Зручніший варіант для повсякденної роботи.

mssh — підключення через EC2 Instance Connect в одну команду
$ pip install ec2instanceconnectcli
Successfully installed ec2instanceconnectcli-1.0.3
# Підключення за Instance ID (не потрібен .pem ключ)
$ mssh ubuntu@i-0a1b2c3d4e5f67890 --region eu-central-1
ubuntu@ip-172-31-10-25:~$
mssh — ідеальний варіант для розробників: не потрібно зберігати .pem файли, не потрібно знати публічний IP, не потрібно відкривати 22 порт для 0.0.0.0/0. Достатньо дозволити трафік з IP-діапазонів EC2 Instance Connect AWS (публікуються в aws ec2 describe-managed-prefix-lists).

Корисні однорядники

Швидка автоматизація — змінні середовища для роботи

# Базові змінні для роботи в скриптах
export REGION="eu-central-1"
export INSTANCE_ID="i-0a1b2c3d4e5f67890"
export SG_ID="sg-0a1b2c3d4e5f67890"
export VOLUME_ID="vol-0a1b2c3d4e5f67890"
export ALLOC_ID="eipalloc-0a1b2c3d4e5f67890"

Отримати публічний IP instance

aws ec2 describe-instances \
    --instance-ids $INSTANCE_ID \
    --query "Reservations[0].Instances[0].PublicIpAddress" \
    --output text --region $REGION

Знайти default VPC і підмережу

VPC_ID=$(aws ec2 describe-vpcs \
    --filters "Name=isDefault,Values=true" \
    --query "Vpcs[0].VpcId" --output text --region $REGION)

SUBNET_ID=$(aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=$VPC_ID" \
              "Name=defaultForAz,Values=true" \
    --query "Subnets[0].SubnetId" --output text --region $REGION)

Зупинити і видалити instance + EIP + Security Group

# Повне очищення ресурсів після lab-роботи
REGION="eu-central-1"

# 1. Від'єднати та звільнити EIP
ASSOC_ID=$(aws ec2 describe-addresses \
    --allocation-ids $ALLOC_ID \
    --query "Addresses[0].AssociationId" --output text --region $REGION)
aws ec2 disassociate-address --association-id $ASSOC_ID --region $REGION
aws ec2 release-address --allocation-id $ALLOC_ID --region $REGION

# 2. Видалити instance
aws ec2 terminate-instances --instance-ids $INSTANCE_ID --region $REGION
aws ec2 wait instance-terminated --instance-ids $INSTANCE_ID --region $REGION

# 3. Видалити Security Group (лише після того, як instance terminated)
aws ec2 delete-security-group --group-id $SG_ID --region $REGION

echo "Cleanup complete!"

Список усіх instances у регіоні з тегами Name та станом

aws ec2 describe-instances \
    --query "Reservations[*].Instances[*].{ID:InstanceId,Name:Tags[?Key=='Name'].Value|[0],State:State.Name,Type:InstanceType,IP:PublicIpAddress}" \
    --output table --region $REGION
Copyright © 2026