Когда я впервые столкнулся с задачей оптимизировать облачную инфраструктуру AWS, передо мной стоял типичный вызов: разрозненные сервисы, ручное управление и счета, которые росли быстрее, чем моя зарплата. Но вместо того чтобы тратить недели на ручную настройку, я решил использовать промты — специальные инструкции для AI-ассистентов, которые позволили автоматизировать рутину. Результат превзошел ожидания: за три месяца мы сократили расходы на AWS на 40%, а время на управление инфраструктурой — вдвое. В этой статье я поделюсь проверенными промтами, которые превратили хаос в стройную архитектуру.
Важно понимать: промты — это не магия, а инструмент. Они работают только тогда, когда вы четко формулируете задачу, указываете контекст и ожидаемый результат. Я начну с базовых промтов, которые помогут вам освоиться, затем перейду к продвинутым техникам и закончу экспертными решениями для сложных сценариев.
Базовые промты: первые шаги к автоматизации
1. Генерация Terraform-кода для AWS
Задача: Сгенерировать Terraform-конфигурацию для создания VPC с подсетями, Internet Gateway и NAT Gateway.
Промт:
Сгенерируй Terraform-код для AWS VPC с CIDR 10.0.0.0/16, включающий:
- 2 публичные подсети в разных AZ
- 2 приватные подсети в разных AZ
- Internet Gateway для публичных подсетей
- NAT Gateway в публичной подсети для приватных подсетей
- Таблицы маршрутизации с корректными ассоциациями
Пример результата:
provider "aws" {
region = "us-east-1"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index}.0/24"
availability_zone = element(data.aws_availability_zones.available.names, count.index)
map_public_ip_on_launch = true
}
resource "aws_subnet" "private" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index + 10}.0/24"
availability_zone = element(data.aws_availability_zones.available.names, count.index)
}
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
}
resource "aws_eip" "nat" {
domain = "vpc"
}
resource "aws_nat_gateway" "nat" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public[0].id
}
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
}
resource "aws_route_table" "private" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.nat.id
}
}
resource "aws_route_table_association" "public" {
count = 2
subnet_id = aws_subnet.public[count.index].id
route_table_id = aws_route_table.public.id
}
resource "aws_route_table_association" "private" {
count = 2
subnet_id = aws_subnet.private[count.index].id
route_table_id = aws_route_table.private.id
}
2. Анализ затрат с помощью AWS Cost Explorer
Задача: Получить отчет по затратам за последний месяц с разбивкой по сервисам.
Промт:
Используя AWS Cost Explorer API, составь отчет по затратам за последние 30 дней, сгруппированный по сервисам. Покажи топ-5 сервисов по затратам и процентное соотношение каждого. Данные возьми из метрик LINEITEM_UNBLENDED_COST.
Пример результата:
{
"ResultsByTime": [
{
"TimePeriod": {
"Start": "2026-07-28",
"End": "2026-08-27"
},
"Groups": [
{
"Keys": ["AmazonEC2"],
"Metrics": {
"UnblendedCost": {
"Amount": "1234.56",
"Unit": "USD"
}
}
},
{
"Keys": ["AmazonS3"],
"Metrics": {
"UnblendedCost": {
"Amount": "234.56",
"Unit": "USD"
}
}
}
]
}
]
}
3. Написание CloudFormation-шаблона для EC2-инстанса
Задача: Создать CloudFormation-шаблон для развертывания EC2-инстанса с пользовательскими данными (user-data), устанавливающими Nginx.
Промт:
Создай CloudFormation-шаблон для EC2-инстанса t3.micro с Amazon Linux 2, включи теги Name=WebServer, и добавь user-data скрипт для установки Nginx и запуска сервиса.
Пример результата:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
WebServer:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: ami-0abcdef1234567890
Tags:
- Key: Name
Value: WebServer
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
amazon-linux-extras install nginx1 -y
systemctl enable nginx
systemctl start nginx
Продвинутые промты: оптимизация и автоматизация
4. Создание политики IAM с минимальными правами
Задача: Сгенерировать IAM-политику для EC2-инстанса, чтобы он мог только отправлять логи в CloudWatch Logs.
Промт:
Создай IAM-политику для EC2-инстанса, которая разрешает только действия logs:CreateLogStream, logs:PutLogEvents, logs:DescribeLogStreams для конкретного log-group "/aws/ec2/my-app". Используй принцип наименьших привилегий.
Пример результата:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/ec2/my-app:*"
}
]
}
5. Автоматизация остановки неиспользуемых EC2-инстансов
Задача: Написать AWS Lambda-функцию на Python, которая останавливает EC2-инстансы с тегом AutoStop=true в нерабочее время.
Промт:
Напиши AWS Lambda-функцию на Python, которая:
1. Получает список всех EC2-инстансов с тегом AutoStop=true.
2. Проверяет текущее время по UTC.
3. Если время между 20:00 и 08:00, останавливает инстансы.
4. Логирует действия в CloudWatch.
Пример результата:
import boto3
import datetime
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
current_hour = datetime.datetime.now(datetime.timezone.utc).hour
if 20 <= current_hour or current_hour < 8:
response = ec2.describe_instances(
Filters=[
{'Name': 'tag:AutoStop', 'Values': ['true']},
{'Name': 'instance-state-name', 'Values': ['running']}
]
)
instances = []
for reservation in response['Reservations']:
for instance in reservation['Instances']:
instances.append(instance['InstanceId'])
if instances:
ec2.stop_instances(InstanceIds=instances)
print(f'Stopped instances: {instances}')
else:
print('No instances to stop')
else:
print('Not in stop window')
6. Генерация CloudWatch-алерта для превышения бюджета
Задача: Создать CloudWatch Alarm, который срабатывает при превышении затрат более $500 за день.
Промт:
Создай CloudWatch Alarm на основе метрики AWS/Billing EstimatedCharges с порогом 500 долларов и периодом 6 часов. Укажи действие — отправка уведомления в SNS-топик.
Пример результата:
{
"AlarmName": "DailyBudgetAlarm",
"AlarmDescription": "Alarm when daily cost exceeds $500",
"MetricName": "EstimatedCharges",
"Namespace": "AWS/Billing",
"Statistic": "Maximum",
"Dimensions": [
{
"Name": "Currency",
"Value": "USD"
}
],
"Period": 21600,
"EvaluationPeriods": 1,
"Threshold": 500.0,
"ComparisonOperator": "GreaterThanThreshold",
"AlarmActions": [
"arn:aws:sns:us-east-1:123456789012:budget-alerts"
]
}
Экспертные промты: глубокий уровень
7. Проектирование отказоустойчивой архитектуры с использованием нескольких AZ
Задача: Спроектировать архитектуру веб-приложения с балансировщиком нагрузки и автоматическим масштабированием.
Промт:
Спроектируй архитектуру для высоконагруженного веб-приложения на AWS. Требования:
- Минимум 3 EC2-инстанса в Auto Scaling Group
- Application Load Balancer с HTTP/HTTPS
- Multi-AZ развертывание
- База данных RDS MySQL с Multi-AZ
- Кэширование через ElastiCache Redis
- Укажи, какие сервисы использовать и как они взаимодействуют.
Пример результата:
Архитектура:
- VPC с 2 AZ (us-east-1a, us-east-1b)
- Публичные подсети: для ALB
- Приватные подсети: для EC2 и RDS
- ALB (Application Load Balancer) распределяет трафик между EC2
- Auto Scaling Group: min=3, max=10, scale out при CPU>70%
- RDS MySQL Multi-AZ: первичный в AZ1, резервный в AZ2
- ElastiCache Redis: кластер с 2 репликами для кэширования
- CloudFront для статики
- Route 53 для DNS
8. Оптимизация затрат: выявление недоиспользуемых ресурсов
Задача: Найти EC2-инстансы с низким использованием CPU за последние 30 дней и предложить уменьшение типа.
Промт:
Используя CloudWatch, проанализируй среднюю загрузку CPU всех EC2-инстансов за последние 30 дней. Выяви те, где средняя загрузка меньше 10%. Предложи для них меньший тип инстанса и рассчитай экономию.
Пример результата:
Инстанс i-1234567890abcdef0 (тип m5.large) имеет среднюю загрузку 5%.
Рекомендуемый тип: t3.small (2 vCPU, 2 GB RAM) вместо m5.large (2 vCPU, 8 GB RAM).
Экономия: $0.096 в час (m5.large) - $0.0208 в час (t3.small) = $0.0752 в час, ~$54 в месяц.
9. Создание полного CI/CD пайплайна с AWS CodePipeline
Задача: Сгенерировать CloudFormation-шаблон для CI/CD пайплайна: CodeCommit → CodeBuild → CodeDeploy.
Промт:
Сгенерируй CloudFormation-шаблон для создания пайплайна: CodeCommit репозиторий, CodeBuild проект для сборки Java-приложения, CodeDeploy приложение для EC2. Укажи все необходимые роли и политики.
Пример результата:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
CodeCommitRepo:
Type: AWS::CodeCommit::Repository
Properties:
RepositoryName: "my-app-repo"
BuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: "my-app-build"
ServiceRole: !GetAtt BuildRole.Arn
Artifacts:
Type: CODEPIPELINE
Environment:
Type: LINUX_CONTAINER
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/standard:5.0
Source:
Type: CODEPIPELINE
DeployApp:
Type: AWS::CodeDeploy::Application
Properties:
ApplicationName: "my-app-deploy"
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
RoleArn: !GetAtt PipelineRole.Arn
Stages:
- Name: Source
Actions:
- Name: SourceAction
ActionTypeId:
Category: Source
Owner: AWS
Provider: CodeCommit
Version: 1
Configuration:
RepositoryName: !Ref CodeCommitRepo
BranchName: main
OutputArtifacts:
- Name: SourceArtifact
- Name: Build
Actions:
- Name: BuildAction
ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: 1
Configuration:
ProjectName: !Ref BuildProject
InputArtifacts:
- Name: SourceArtifact
OutputArtifacts:
- Name: BuildArtifact
- Name: Deploy
Actions:
- Name: DeployAction
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CodeDeploy
Version: 1
Configuration:
ApplicationName: !Ref DeployApp
DeploymentGroupName: my-deploy-group
InputArtifacts:
- Name: BuildArtifact
10. Анализ логов CloudTrail для выявления угроз безопасности
Задача: Написать запрос на Athena для поиска неудачных попыток входа в консоль.
Промт:
Напиши SQL-запрос для Athena, который ищет в CloudTrail логи событий ConsoleLogin с результатом Failure за последнюю неделю. Отсортируй по времени.
Пример результата:
SELECT eventtime, username, eventsource, eventname, errorcode
FROM cloudtrail_logs
WHERE eventname = 'ConsoleLogin'
AND errorcode = 'AccessDenied'
AND eventtime >= date_trunc('day', now() - interval '7' day)
ORDER BY eventtime DESC;
Как внедрить промты в повседневную работу
Чтобы получить максимальную выгоду, я рекомендую:
- Начните с малого: выберите один рутинный процесс, например генерацию Terraform-кода, и автоматизируйте его с помощью промтов.
- Создайте библиотеку промтов: сохраняйте удачные формулировки и контексты, чтобы переиспользовать их.
- Интегрируйте с CI/CD: добавьте генерацию кода через промты в пайплайн, чтобы ускорить развертывание.
- Обучайте команду: проведите воркшоп, поделитесь примерами, чтобы все использовали единые стандарты.
- Измеряйте результат: фиксируйте время, затраченное на задачи до и после внедрения, и отслеживайте затраты AWS.
В нашем случае внедрение этих промтов позволило не только сократить расходы на 40%, но и повысить скорость разработки. Мы смогли высвободить время инженеров для более важных задач, а инфраструктура стала прозрачной и управляемой.
Попробуйте применить эти промты в своих проектах — и вы увидите, как автоматизация облака становится простой и эффективной. Если у вас есть свои наработки, делитесь в комментариях: вместе мы сделаем облако лучше!
Комментарии