Вступ
Безперервна інтеграція та доставка (CI/CD) і комплексний моніторинг є критично важливими для сучасних хмарних додатків. AWS надає CodePipeline для оркестрації розгортань, CodeBuild для збірки артефактів, CodeDeploy для автоматизованих розгортань, X-Ray для розподіленої трасування та CloudWatch для метрик і логів.
Цей посібник досліджує автоматизацію CI/CD конвеєрів, blue/green розгортання, патерни розподіленої трасування та моніторинг продакшену. Ми розглянемо практичні стратегії розгортання, налагодження мікросервісів і практики спостережуваності.
Серія AWS Developer Certification
📚 Переглянути повний посібник AWS Developer Certification - Опануйте всі 7 частин з нашим комплексним шляхом навчання.
Це Частина VII (Поточна стаття) нашого комплексного 7-частинного посібника для AWS розробників:
- Частина I: IAM EC2 та Auto Scaling
- Частина II: RDS Aurora та DynamoDB
- Частина III: SQS SNS та Kinesis
- Частина IV: Lambda API Gateway
- Частина V: ECS Fargate та IaC
- Частина VI: Cognito KMS Security
- Частина VII: CodePipeline та Monitoring (Поточна стаття)
← Частина VI: Cognito KMS Security
AWS CodePipeline
Архітектура конвеєра
CodePipeline оркеструє CI/CD робочі процеси через етапи (Source, Build, Test, Deploy) з автоматизованими затвердженнями.
Ключові концепції:
- Stage (Етап): Логічна фаза в конвеєрі (Source, Build, Test, Deploy)
- Action (Дія): Завдання всередині етапу (наприклад, CodeBuild, CodeDeploy, Lambda invoke)
- Artifact (Артефакт): Вивід з одного етапу, переданий наступному етапу
- Transition (Перехід): З'єднання між етапами (може бути вимкнено)
Створення конвеєра з AWS CLI
# Створення конвеєра (потрібен файл pipeline.json)
aws codepipeline create-pipeline --cli-input-json file://pipeline.json
# Запуск виконання конвеєра
aws codepipeline start-pipeline-execution --name my-pipeline
# Отримання стану конвеєра
aws codepipeline get-pipeline-state --name my-pipeline
# Увімкнення/вимкнення переходу етапу
aws codepipeline disable-stage-transition \
--pipeline-name my-pipeline \
--stage-name Deploy \
--transition-type Inbound \
--reason "Тестування в процесі"
Приклад визначення конвеєра:
{
"pipeline": {
"name": "my-web-app-pipeline",
"roleArn": "arn:aws:iam::123456789012:role/CodePipelineServiceRole",
"artifactStore": {
"type": "S3",
"location": "my-pipeline-artifacts-bucket"
},
"stages": [
{
"name": "Source",
"actions": [
{
"name": "SourceAction",
"actionTypeId": {
"category": "Source",
"owner": "AWS",
"provider": "CodeCommit",
"version": "1"
},
"configuration": {
"RepositoryName": "my-app",
"BranchName": "main"
},
"outputArtifacts": [{ "name": "SourceOutput" }]
}
]
},
{
"name": "Build",
"actions": [
{
"name": "BuildAction",
"actionTypeId": {
"category": "Build",
"owner": "AWS",
"provider": "CodeBuild",
"version": "1"
},
"configuration": {
"ProjectName": "my-build-project"
},
"inputArtifacts": [{ "name": "SourceOutput" }],
"outputArtifacts": [{ "name": "BuildOutput" }]
}
]
},
{
"name": "Deploy",
"actions": [
{
"name": "DeployAction",
"actionTypeId": {
"category": "Deploy",
"owner": "AWS",
"provider": "CodeDeploy",
"version": "1"
},
"configuration": {
"ApplicationName": "my-app",
"DeploymentGroupName": "production"
},
"inputArtifacts": [{ "name": "BuildOutput" }]
}
]
}
]
}
}
AWS CodeBuild
Архітектура збірки
CodeBuild компілює код, запускає тести та створює артефакти розгортання, використовуючи buildspec.yml.
Приклад buildspec.yml
version: 0.2
env:
parameter-store:
DB_PASSWORD: /myapp/db/password
secrets-manager:
API_KEY: prod/api:key
phases:
install:
runtime-versions:
nodejs: 18
commands:
- npm install
pre_build:
commands:
- echo "Запуск тестів..."
- npm test
- echo "Вхід в Amazon ECR..."
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
build:
commands:
- echo "Збірка Docker образу..."
- docker build -t my-app:$CODEBUILD_RESOLVED_SOURCE_VERSION .
- docker tag my-app:$CODEBUILD_RESOLVED_SOURCE_VERSION $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/my-app:latest
post_build:
commands:
- echo "Завантаження Docker образу..."
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/my-app:latest
- echo "Збірка завершена $(date)"
artifacts:
files:
- '**/*'
base-directory: dist
cache:
paths:
- 'node_modules/**/*'
Запуск збірки:
# Запуск збірки
aws codebuild start-build --project-name my-project
# Запуск збірки з перевизначенням змінної середовища
aws codebuild start-build \
--project-name my-project \
--environment-variables-override name=ENV,value=production,type=PLAINTEXT
AWS CodeDeploy
Стратегії розгортання
CodeDeploy підтримує in-place та blue/green розгортання для EC2, Lambda та ECS.
In-Place розгортання (EC2):
- Оновлює існуючі інстанси поступово
- Без змін інфраструктури
- Потенційний простій під час розгортання
Blue/Green розгортання (EC2/ECS/Lambda):
- Створює нове середовище (green) поруч з існуючим (blue)
- Направляє трафік на green після валідації
- Легкий відкат шляхом перемикання трафіку назад на blue
appspec.yml для EC2
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html
hooks:
ApplicationStop:
- location: scripts/stop_server.sh
timeout: 300
runas: root
BeforeInstall:
- location: scripts/install_dependencies.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/configure_app.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/start_server.sh
timeout: 300
runas: root
ValidateService:
- location: scripts/validate_service.sh
timeout: 300
runas: root
Команди CodeDeploy CLI
# Створення розгортання
aws deploy create-deployment \
--application-name my-app \
--deployment-group-name production \
--s3-location bucket=my-deployments,key=app.zip,bundleType=zip
# Отримання статусу розгортання
aws deploy get-deployment --deployment-id d-ABCDEFGH
# Зупинка розгортання
aws deploy stop-deployment \
--deployment-id d-ABCDEFGH \
--auto-rollback-enabled
Конфігурація Blue/Green розгортання:
{
"deploymentGroupName": "my-app-blue-green",
"blueGreenDeploymentConfiguration": {
"terminateBlueInstancesOnDeploymentSuccess": {
"action": "TERMINATE",
"terminationWaitTimeInMinutes": 5
},
"deploymentReadyOption": {
"actionOnTimeout": "CONTINUE_DEPLOYMENT"
},
"greenFleetProvisioningOption": {
"action": "COPY_AUTO_SCALING_GROUP"
}
}
}
AWS X-Ray
Архітектура розподіленої трасування
X-Ray відстежує запити через мікросервіси для виявлення вузьких місць продуктивності та помилок.
Ключові концепції:
- Trace (Траса): Повний шлях запиту від початку до кінця (ідентифікується Trace ID)
- Segment (Сегмент): Дані з одного сервісу (наприклад, Lambda функція)
- Subsegment (Підсегмент): Деталізована операція всередині сегменту (наприклад, виклик DynamoDB)
- Annotations (Анотації): Індексовані пари ключ-значення для фільтрації
- Metadata (Метадані): Неіндексовані додаткові дані
Інструментування Node.js з X-Ray
const AWSXRay = require('aws-xray-sdk-core');
const AWS = AWSXRay.captureAWS(require('aws-sdk'));
const express = require('express');
const app = express();
// Увімкнення X-Ray для Express
app.use(AWSXRay.express.openSegment('MyApp'));
const dynamodb = new AWS.DynamoDB.DocumentClient();
app.get('/api/users/:id', async (req, res) => {
// Створення підсегменту для виклику DynamoDB
const segment = AWSXRay.getSegment();
const subsegment = segment.addNewSubsegment('DynamoDB-GetUser');
try {
const result = await dynamodb
.get({
TableName: 'Users',
Key: { userId: req.params.id },
})
.promise();
// Додавання анотації (індексується, фільтрується)
subsegment.addAnnotation('userId', req.params.id);
// Додавання метаданих (не індексується)
subsegment.addMetadata('userDetails', result.Item);
subsegment.close();
res.json(result.Item);
} catch (error) {
subsegment.addError(error);
subsegment.close();
res.status(500).json({ error: error.message });
}
});
app.use(AWSXRay.express.closeSegment());
app.listen(3000);
Правила семплінгу X-Ray
Контроль вартості збору трас за допомогою правил семплінгу:
{
"version": 2,
"rules": [
{
"description": "Семплювати всі помилки",
"host": "*",
"http_method": "*",
"url_path": "*",
"fixed_target": 0,
"rate": 1.0,
"priority": 1,
"service_name": "*",
"service_type": "*",
"resource_arn": "*",
"attributes": {
"http.status_code": "5*"
}
},
{
"description": "Семплювати 10% успішних запитів",
"host": "*",
"http_method": "*",
"url_path": "*",
"fixed_target": 1,
"rate": 0.1,
"priority": 100
}
],
"default": {
"fixed_target": 1,
"rate": 0.05
}
}
Запит трас з AWS CLI:
# Отримання зведень трас
aws xray get-trace-summaries \
--start-time 2025-01-01T00:00:00Z \
--end-time 2025-01-01T23:59:59Z \
--filter-expression 'service("my-api") AND http.status = 500'
# Отримання повних деталей траси
aws xray batch-get-traces --trace-ids 1-5f27cd-abc123def456
AWS CloudWatch
Архітектура моніторингу
CloudWatch збирає метрики, логи та події для комплексної спостережуваності.
Користувацькі метрики з Node.js SDK
const {
CloudWatchClient,
PutMetricDataCommand,
} = require('@aws-sdk/client-cloudwatch');
const client = new CloudWatchClient({ region: 'us-east-1' });
async function publishMetric(metricName, value, unit = 'Count') {
const command = new PutMetricDataCommand({
Namespace: 'MyApp/Production',
MetricData: [
{
MetricName: metricName,
Value: value,
Unit: unit,
Timestamp: new Date(),
Dimensions: [
{ Name: 'Environment', Value: 'production' },
{ Name: 'Service', Value: 'api' },
],
},
],
});
await client.send(command);
}
// Використання
await publishMetric('OrdersProcessed', 150, 'Count');
await publishMetric('ResponseTime', 245, 'Milliseconds');
Тривоги CloudWatch
# Створення тривоги для високого CPU
aws cloudwatch put-metric-alarm \
--alarm-name high-cpu-alarm \
--alarm-description "Сповіщення при CPU понад 80%" \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
# Створення комбінованої тривоги (кілька умов)
aws cloudwatch put-composite-alarm \
--alarm-name critical-system-alarm \
--alarm-rule "ALARM(high-cpu-alarm) OR ALARM(high-memory-alarm)" \
--alarm-actions arn:aws:sns:us-east-1:123456789012:critical-alerts
CloudWatch Logs Insights
Запити до логів з SQL-подібним синтаксисом:
# Приклад запиту: Знайти помилки за останню годину
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 100
Виконання запиту через CLI:
aws logs start-query \
--log-group-name /aws/lambda/my-function \
--start-time $(date -u -d '1 hour ago' +%s) \
--end-time $(date -u +%s) \
--query-string 'fields @timestamp, @message | filter @message like /ERROR/ | limit 100'
Практики для продакшену
Практики CI/CD
- Автоматизоване тестування: Запускайте юніт, інтеграційні та безпекові тести на етапі збірки
- Ручні затвердження: Вимагайте затвердження перед розгортанням на продакшен
- Blue/Green розгортання: Використовуйте для розгортань без простою
- Стратегія відкату: Увімкніть автоматичний відкат при помилці розгортання
- Версіювання артефактів: Позначайте артефакти SHA коміту або номером збірки
Практики X-Ray
- Семплінг: Використовуйте правила для контролю обсягу та вартості трас
- Анотації: Індексуйте важливі поля (userId, environment) для фільтрації
- Підсегменти: Відстежуйте зовнішні виклики (DynamoDB, S3, HTTP) окремо
- Відстеження помилок: Завжди фіксуйте помилки з
subsegment.addError() - Карта сервісів: Використовуйте для візуалізації залежностей і затримок
Практики CloudWatch
- Користувацькі метрики: Публікуйте бізнес-метрики (замовлення, виручка) поряд з системними
- Агрегація логів: Використовуйте групи логів з політиками утримання
- Тривоги: Встановлюйте пороги на основі історичних даних, уникайте хибних спрацювань
- Дашборди: Створюйте дашборди для різних ролей (dev, ops, business)
- Фільтри метрик: Витягуйте метрики з логів (кількість помилок, перцентилі затримки)
Усунення проблем
Поширені проблеми:
- CodePipeline зависає: Перевірте IAM дозволи для ролі сервісу конвеєра
- CodeBuild падає: Перегляньте CloudWatch Logs, перевірте синтаксис buildspec.yml
- CodeDeploy таймаут: Переконайтеся, що на EC2 інстансі запущено агент CodeDeploy
- X-Ray відсутні траси: Переконайтеся, що демон X-Ray запущено, перевірте IAM дозволи
- CloudWatch немає даних: Перевірте namespace/dimensions метрики, перевірте timestamp
Команди для налагодження:
# Перевірка статусу агента CodeDeploy
sudo service codedeploy-agent status
# Перегляд логів демона X-Ray
tail -f /var/log/xray/xray.log
# Тест публікації метрики CloudWatch
aws cloudwatch put-metric-data \
--namespace Test \
--metric-name TestMetric \
--value 1
Поради для іспиту
Ключові концепції:
- CodePipeline: Етапи (Source, Build, Deploy), Артефакти зберігаються в S3
- CodeBuild: Використовує buildspec.yml, підтримує Docker, інтегрується з ECR
- CodeDeploy: In-place vs Blue/Green, потрібен appspec.yml
- X-Ray: Trace = повний запит, Segment = сервіс, Subsegment = операція
- CloudWatch: Метрики (5-хв за замовчуванням, 1-хв детальні), Утримання логів, Тривоги
Поширені сценарії:
- "Потрібні автоматизовані розгортання" → CodePipeline + CodeDeploy
- "Розгортання без простою" → Blue/Green з CodeDeploy
- "Налагодження затримки мікросервісів" → Розподілене трасування X-Ray
- "Моніторинг помилок додатку" → CloudWatch Logs + Тривоги
- "Відстеження бізнес-метрик" → Користувацькі метрики CloudWatch
Висновок
Сервіси AWS CI/CD та моніторингу забезпечують повну автоматизацію та спостережуваність для хмарних додатків. CodePipeline оркеструє робочі процеси, CodeBuild компілює артефакти, CodeDeploy виконує розгортання, X-Ray відстежує запити через сервіси, а CloudWatch моніторить метрики та логи.
Обирайте CodePipeline для наскрізної автоматизації, blue/green розгортання для нульового простою, X-Ray для налагодження розподілених систем та CloudWatch для комплексного моніторингу. Розуміння патернів розгортання, стратегій трасування та налаштування тривог є критично важливим як для надійності продакшену, так і для іспиту AWS Certified Developer Associate.
Часті запитання
П: Як працює CodePipeline інтеграція з GitHub?
CodePipeline підключається до GitHub через GitHub App або OAuth токени як джерело. Налаштуйте вебхуки для автоматичного запуску конвеєру при коміті/мердж. CodePipeline витягує код в артефактний bucket S3, передає наступним стадіям (Build, Deploy). Використовуйте GitHub Actions для складних робочих процесів CI або CodeBuild для керованої збірки в AWS.
П: Чим відрізняються CodeDeploy in-place від blue/green розгортань?
In-place розгортання оновлює існуючі інстанси на місці, зупиняє застосунок, розгортає нову версію, перезапускає. Blue/green створює нове середовище (green), переключає трафік від старого (blue), завершує blue після успіху. In-place економічніше; blue/green забезпечує швидке відкочування та нульовий простій.
П: Як працює розподілене трасування X-Ray?
X-Ray відстежує запити через мікросервіси за допомогою X-Ray SDK в застосунку. SDK генерує сегменти (покриття сервісу) та підсегменти (операції), передає trace ID через заголовки HTTP. X-Ray daemon агрегує та надсилає дані в сервіс X-Ray. Сервісні карти візуалізують потік запитів, виявляють вузькі місця з латентністю, показують залежності.
П: Що таке CloudWatch детальний моніторинг?
Детальний моніторинг надає метрики EC2 з 1-хвилинними інтервалами замість стандартних 5-хвилинних. Увімкніть під час запуску інстансу або для існуючих інстансів (додаткова вартість). Детальні метрики дозволяють швидше Auto Scaling реагування на зміни трафіку та детальнішу видимість продуктивності. Критично для production навантажень з динамічними потребами.
П: Як працює CodeBuild buildspec.yml?
buildspec.yml визначає команди збірки в фазах: install (залежності), pre_build (тести), build (компіляція), post_build (пакування). Вказує runtime (образ Docker), змінні середовища, артефакти для завантаження та кешування залежностей. CodeBuild читає buildspec з коду або визначає вбудований в конфігурації проєкту. Підтримує кілька buildspecs для різних середовищ.
П: Що таке X-Ray sampling та чому він важливий?
Sampling контролює скільки запитів X-Ray трасує для управління витратами та навантаженням. Правила sampling визначають відсоток/фіксовану кількість для трасування на основі атрибутів (сервіс, метод, URL). За замовчуванням: перший запит/секунду + 5% додаткових. Налаштуйте правила для критичних ендпоінтів (100%) або низькопріоритетних (1%) для балансу видимості та витрат.
П: Як працюють CloudWatch Log Insights запити?
Log Insights надає потужну мову запитів для аналізу CloudWatch Logs. Запити підтримують фільтрацію (fields, filter), агрегацію (stats), сортування (sort) та обмеження (limit). Автоматично виявляє поля в JSON/структурованих логах. Приклади: знайти помилки за коду помилки, підрахувати IP адреси, відстежити затримки P99. Корисно для налагодження, аналітики продуктивності та виявлення аномалій.