🏠 Домашнее задание 6: Security Groups через AWS CLI

⚡ Суть задания

Создать Security Group через AWS CLI, добавить правила для портов 3306 и 443, добавить SSH через консоль, прислать результат describe-security-groups, затем удалить SG.

Задание из LMS (оригинал)

  1. При помощи aws cli создайте security group с Вашим именем и Вашей группой (например --group-name 20240915-andrew-sg) и описанием ("Security Group for MySQL and HTTPS and SSH"). Скопируйте id только что созданной sg, например, sg-092d4ec2208cc14a6.
  2. При помощи aws cli добавьте правила входящего (inbound) трафика для портов 3306 (с комментарием mysql) и 443 (с комментарием https) для 0.0.0.0 (для всех адресов) --cidr 0.0.0.0/0.
  3. В AWS Management Console (UI) — найдите свою security group и добавьте ещё одно правило: порт 22 (SSH) для вашего IP-адреса:
    • В поле Type выберите SSH (порт 22 будет добавлен автоматически)
    • В поле Source выберите опцию My IP — это автоматически подставит ваш текущий IP-адрес
    • Добавьте описание в поле Description (опционально, например, "SSH My IP")
  4. Пришлите результат выполнения команды (не забудьте указать id именно Вашей security group!): aws ec2 describe-security-groups --group-ids sg-092d4ec2208cc14a6 --query 'SecurityGroups[*].IpPermissions' --output json
  5. Пришлите команды, использованные для создания security group и правил (из п. 1 и 2).
  6. Удалите Вашу security group с inbound и outbound правилами.

Подготовка окружения

1. AWS CLI установлен и настроен

Убедитесь, что AWS CLI v2 установлен и настроен:

# Терминал (PowerShell)
aws --version
# Ожидаем: aws-cli/2.x.x ...

aws configure list
# Ожидаем: access_key и secret_key заполнены, region = eu-central-1

Если ещё не настраивали — выполните:

# Терминал
aws configure
# Ввести: Access Key ID, Secret Access Key, eu-central-1, json

2. Проверка прав доступа

# Терминал — убеждаемся, что CLI работает с AWS
aws ec2 describe-security-groups --output table
# Должен вернуть список SG без ошибки Access Denied

Пошаговое решение

Шаг 1: Создать Security Group

Замените 20240915-andrew-sg на ваш формат: YYYYMMDD-yourname-sg.

# Терминал
# Создаём Security Group и сохраняем её ID
aws ec2 create-security-group \
  --group-name "20240915-andrew-sg" \
  --description "Security Group for MySQL and HTTPS and SSH" \
  --region eu-central-1

Ответ команды вернёт JSON с GroupId:

{
    "GroupId": "sg-092d4ec2208cc14a6"
}
Скопируйте GroupId — он понадобится в следующих командах. Замените sg-092d4ec2208cc14a6 на ваш реальный ID.

Шаг 2: Добавить правила inbound (порты 3306 и 443)

# Терминал
# Добавляем порт 3306 (MySQL) для всех адресов с комментарием
aws ec2 authorize-security-group-ingress \
  --group-id sg-092d4ec2208cc14a6 \
  --ip-permissions \
  '[{"IpProtocol":"tcp","FromPort":3306,"ToPort":3306,"IpRanges":[{"CidrIp":"0.0.0.0/0","Description":"mysql"}]}]' \
  --region eu-central-1

# Добавляем порт 443 (HTTPS) для всех адресов с комментарием
aws ec2 authorize-security-group-ingress \
  --group-id sg-092d4ec2208cc14a6 \
  --ip-permissions \
  '[{"IpProtocol":"tcp","FromPort":443,"ToPort":443,"IpRanges":[{"CidrIp":"0.0.0.0/0","Description":"https"}]}]' \
  --region eu-central-1
Связь с теорией: Параметр --ip-permissions с JSON — это полный формат правила, позволяющий задать Description. Более простой формат (--protocol tcp --port 3306 --cidr 0.0.0.0/0) не поддерживает Description. Подробнее: Справочник → Security Groups.

Шаг 3: Добавить правило SSH через консоль AWS

  1. Откройте AWS Management Console → EC2 → Security Groups
  2. Найдите вашу SG по имени (например 20240915-andrew-sg)
  3. Нажмите на ID группы → вкладка Inbound rules
  4. Нажмите Edit inbound rules
  5. Нажмите Add rule:
    • Type: SSH (порт 22 подставится автоматически)
    • Source: My IP (автоматически подставит ваш текущий IP)
    • Description: SSH My IP
  6. Нажмите Save rules

Шаг 4: Проверка — describe-security-groups

# Терминал — команда для проверки и сдачи в LMS
aws ec2 describe-security-groups \
  --group-ids sg-092d4ec2208cc14a6 \
  --query 'SecurityGroups[*].IpPermissions' \
  --output json \
  --region eu-central-1

Ожидаемый вывод (три правила: SSH, MySQL, HTTPS):

[
    [
        {
            "FromPort": 22,
            "IpProtocol": "tcp",
            "IpRanges": [
                {
                    "CidrIp": "YOUR.IP.ADDRESS/32",
                    "Description": "SSH My IP"
                }
            ],
            "ToPort": 22
        },
        {
            "FromPort": 443,
            "IpProtocol": "tcp",
            "IpRanges": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "Description": "https"
                }
            ],
            "ToPort": 443
        },
        {
            "FromPort": 3306,
            "IpProtocol": "tcp",
            "IpRanges": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "Description": "mysql"
                }
            ],
            "ToPort": 3306
        }
    ]
]

Шаг 5: Сдача задания в LMS

Скопируйте и пришлите:

  1. JSON-вывод команды describe-security-groups (из шага 4)
  2. Команды, использованные в шагах 1 и 2 (создание SG и добавление правил)

Шаг 6: Удаление Security Group

Перед удалением SG сначала нужно удалить все inbound и outbound правила, затем саму группу. Или можно удалить сразу, если SG не используется EC2-инстансами.
# Терминал — удаление inbound правил
aws ec2 revoke-security-group-ingress \
  --group-id sg-092d4ec2208cc14a6 \
  --ip-permissions \
  '[{"IpProtocol":"tcp","FromPort":3306,"ToPort":3306,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]},{"IpProtocol":"tcp","FromPort":443,"ToPort":443,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]' \
  --region eu-central-1

# Удаляем правило SSH (замените YOUR.IP.ADDRESS на ваш IP)
aws ec2 revoke-security-group-ingress \
  --group-id sg-092d4ec2208cc14a6 \
  --protocol tcp \
  --port 22 \
  --cidr YOUR.IP.ADDRESS/32 \
  --region eu-central-1

# Удаляем саму Security Group
aws ec2 delete-security-group \
  --group-id sg-092d4ec2208cc14a6 \
  --region eu-central-1
# Терминал — проверяем, что SG удалена
aws ec2 describe-security-groups \
  --group-ids sg-092d4ec2208cc14a6 \
  --region eu-central-1
# Должна вернуть: InvalidGroup.NotFound

Проверка в VS Code

Запуск команд в терминале VS Code

  1. Открыть VS Code
  2. Терминал → New Terminal (или Ctrl+`)
  3. Убедиться, что открыт PowerShell: в строке терминала должно быть PS C:\...
  4. Выполнить команды пошагово, копируя из этой страницы

Работа с файлом .aws/credentials

Открыть файл credentials в VS Code для проверки:

# Терминал PowerShell
code $HOME\.aws\credentials
Убедитесь, что файл credentials НЕ открыт в репозитории git. Проверьте .gitignore.

Связь с теорией и примерами