CodePipeline Blue-Green X-Ray трасування: Майстерність CI/CD

AWS CI/CD та Моніторинг: CodePipeline, X-Ray та CloudWatch

Вступ

Безперервна інтеграція та доставка (CI/CD) і комплексний моніторинг є критично важливими для сучасних хмарних додатків. AWS надає CodePipeline для оркестрації розгортань, CodeBuild для збірки артефактів, CodeDeploy для автоматизованих розгортань, X-Ray для розподіленої трасування та CloudWatch для метрик і логів.

Цей посібник досліджує автоматизацію CI/CD конвеєрів, blue/green розгортання, патерни розподіленої трасування та моніторинг продакшену. Ми розглянемо практичні стратегії розгортання, налагодження мікросервісів і практики спостережуваності.

Серія AWS Developer Certification

📚 Переглянути повний посібник AWS Developer Certification - Опануйте всі 7 частин з нашим комплексним шляхом навчання.

Це Частина VII (Поточна стаття) нашого комплексного 7-частинного посібника для AWS розробників:

  1. Частина I: IAM EC2 та Auto Scaling
  2. Частина II: RDS Aurora та DynamoDB
  3. Частина III: SQS SNS та Kinesis
  4. Частина IV: Lambda API Gateway
  5. Частина V: ECS Fargate та IaC
  6. Частина VI: Cognito KMS Security
  7. Частина VII: CodePipeline та Monitoring (Поточна стаття)

← Частина VI: Cognito KMS Security


AWS CodePipeline

Архітектура конвеєра

CodePipeline оркеструє CI/CD робочі процеси через етапи (Source, Build, Test, Deploy) з автоматизованими затвердженнями.

   Робочий процес CodePipeline   

   тригер   

   артефакти   

  Етап Source  

  CodeCommit/GitHub  

  Етап Build  

  CodeBuild  

  Етап Test  

  CodeBuild  

  Ручне затвердження  

  SNS сповіщення  

  Етап Deploy  

  CodeDeploy  

  S3 артефакти  

  Продакшен  

  EC2/ECS  

Ключові концепції:

  • 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.

   Середовище CodeBuild   

  Вихідний код  

  CodeCommit/GitHub  

  buildspec.yml  

  Фаза Install  

  Залежності  

  Фаза Pre-build  

  Тести  

  Фаза Build  

  Компіляція  

  Фаза Post-build  

  Пакування  

  S3 артефакти  

  CloudWatch Logs  

Приклад 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 відстежує запити через мікросервіси для виявлення вузьких місць продуктивності та помилок.

   Мікросервіси   

   відправка трас   

   відправка трас   

  Запит клієнта  

  API Gateway  

  Trace ID: abc123  

  Lambda функція  

  Сегмент  

  DynamoDB  

  Підсегмент  

  Сервіс 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 збирає метрики, логи та події для комплексної спостережуваності.

   Функції CloudWatch   

   Джерела даних   

  Метрики EC2  

  Логи Lambda  

  Додаток  

  Користувацькі метрики  

  CloudWatch  

  Метрики  

  Логи  

  Тривоги  

  Дашборди  

  SNS  

  Сповіщення  

Користувацькі метрики з 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

  1. Автоматизоване тестування: Запускайте юніт, інтеграційні та безпекові тести на етапі збірки
  2. Ручні затвердження: Вимагайте затвердження перед розгортанням на продакшен
  3. Blue/Green розгортання: Використовуйте для розгортань без простою
  4. Стратегія відкату: Увімкніть автоматичний відкат при помилці розгортання
  5. Версіювання артефактів: Позначайте артефакти SHA коміту або номером збірки

Практики X-Ray

  1. Семплінг: Використовуйте правила для контролю обсягу та вартості трас
  2. Анотації: Індексуйте важливі поля (userId, environment) для фільтрації
  3. Підсегменти: Відстежуйте зовнішні виклики (DynamoDB, S3, HTTP) окремо
  4. Відстеження помилок: Завжди фіксуйте помилки з subsegment.addError()
  5. Карта сервісів: Використовуйте для візуалізації залежностей і затримок

Практики CloudWatch

  1. Користувацькі метрики: Публікуйте бізнес-метрики (замовлення, виручка) поряд з системними
  2. Агрегація логів: Використовуйте групи логів з політиками утримання
  3. Тривоги: Встановлюйте пороги на основі історичних даних, уникайте хибних спрацювань
  4. Дашборди: Створюйте дашборди для різних ролей (dev, ops, business)
  5. Фільтри метрик: Витягуйте метрики з логів (кількість помилок, перцентилі затримки)

Усунення проблем

Поширені проблеми:

  • 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

Поради для іспиту

Ключові концепції:

  1. CodePipeline: Етапи (Source, Build, Deploy), Артефакти зберігаються в S3
  2. CodeBuild: Використовує buildspec.yml, підтримує Docker, інтегрується з ECR
  3. CodeDeploy: In-place vs Blue/Green, потрібен appspec.yml
  4. X-Ray: Trace = повний запит, Segment = сервіс, Subsegment = операція
  5. 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. Корисно для налагодження, аналітики продуктивності та виявлення аномалій.