У швидкому світі розробки програмного забезпечення доставка безперервних оновлень без порушення досвіду користувача залишається значною проблемою. Однією з ефективних стратегій для цього є підхід до розгортання з використанням "блакитно-зеленого" (blue-green deployment) підходу. У цій статті ми обговоримо, як реалізувати блакитно-зелене розгортання для застосунку на Amazon Elastic Container Service (ECS), використовуючи різні сервіси AWS, такі як CodeCommit, CodeBuild, CodeDeploy і CodePipeline.
Проєктування пайплайну
Що таке Блакитно-зелене Розгортання?
Блакитно-зелене розгортання — це стратегія, яка мінімізує час простою та ризики, використовуючи два ідентичні середовища для виробництва, які називаються "Блакитним" (Blue) та "Зеленим" (Green). У будь-який момент часу лише одне з цих середовищ є активним, обробляючи весь виробничий трафік, в той час як інше залишається бездіяльним.
Цей підхід дозволяє розробникам перемикатися між середовищами, перенаправляючи трафік зі старої версії (Blue) на нову (Green). Якщо після переключення в Зеленому середовищі виникають проблеми, можна легко повернутися до Блакитного середовища, забезпечуючи стабільність і безперервність роботи системи.
Огляд архітектури для Node.js застосунку на AWS ECS
Ось як ви можете налаштувати блакитно-зелене розгортання для Node.js застосунку, використовуючи AWS:
1. AWS CodeCommit
Розпочнемо з вихідного коду. AWS CodeCommit буде хостити репозиторій для коду вашого Node.js застосунку. Хоча ми використовуємо CodeCommit тут, ви також можете вибрати GitHub або GitLab, залежно від ваших вподобань.
2. AWS CodeBuild
AWS CodeBuild — це повністю керована служба безперервної інтеграції, яка компілює ваш вихідний код, виконує тести та створює програмні пакети, готові до розгортання. З CodeBuild ви можете створювати Docker-образи з Dockerfile і пушити ці образи в AWS Elastic Container Registry (ECR).
#BuildSpec.yaml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
- ACCOUNT_ID=$(echo $CODEBUILD_BUILD_ARN | cut -f5 -d ':') && echo "The Account ID is $ACCOUNT_ID"
- echo "The AWS Region is $AWS_DEFAULT_REGION"
- REPOSITORY_URI=$ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$ACCOUNT_ID-application
- echo "The Repository URI is $REPOSITORY_URI"
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $REPOSITORY_URI
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=$COMMIT_HASH
build:
on-failure: ABORT
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $REPOSITORY_URI:$IMAGE_TAG .
- docker tag $REPOSITORY_URI:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing image definitions file...
- printf '[{"name":”myimage","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
artifacts:
files:
- imagedefinitions.json
- imageDetail.json
- appspec.yaml
- taskdef.json
3. AWS Elastic Container Registry (ECR)
Amazon ECR — це реєстр Docker-контейнерів, який дозволяє зберігати, керувати та розгортати Docker-образи. Він інтегрується з Amazon ECS, спрощуючи робочий процес від розробки до виробництва.
4. Amazon Elastic Container Service (ECS)
Це основа вашої операції, де керуються та запускаються ваші Docker-контейнеризовані застосунки. ECS дозволяє запускати та зупиняти ваші застосунки за допомогою простих API-викликів. Ви можете налаштувати ваш застосунок для використання або Amazon EC2, або Fargate, що позбавляє вас від необхідності керувати серверами.
5.
AWS CodeDeploy
AWS CodeDeploy автоматизує розгортання коду на будь-які інстанси, включаючи інстанси Amazon EC2 та інстанси, що працюють на локальних серверів. AWS CodeDeploy полегшує швидке випускання нових функцій, допомагає уникнути простоїв під час розгортання застосунків і справляється зі складністю оновлення ваших застосунків.
#AppSpec.yaml
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition:
LoadBalancerInfo:
ContainerName: "application"
ContainerPort: 80
6. AWS CodePipeline
AWS CodePipeline — це служба CD (Continuous Delivery), яка автоматизує етапи, необхідні для безперервного випуску змін у вашому програмному забезпеченні. Створюючи робочий процес в CodePipeline, ваші зміни коду автоматично збираються, тестуються і готуються до випуску в продуктивне середовище.
Процес CodePipeline
Реалізація пайплайну для розгортання
Інтегруючи CodeCommit, CodeBuild, CodeDeploy і CodePipeline, ви можете автоматизувати та керувати всім життєвим циклом процесу доставки програмного забезпечення.
- Джерело (Source Stage): Запускається після коміту в репозиторій AWS CodeCommit.
- Етап побудови (Build Stage): Використовує AWS CodeBuild для створення Docker-образу, який потім пушиться в AWS ECR.
- Етап розгортання (Deploy Stage): Використовує AWS CodeDeploy для переходу з попередньої версії (Blue) на нову версію (Green) на ECS.
Висновок
Реалізація блакитно-зелених розгортань для ваших застосунків на AWS ECS може значно підвищити стабільність виробничого середовища вашого проєкту та дозволити безперебійно доставляти покращення. Використовуючи еластичну природу ECS і потужність інших сервісів AWS, ви можете створити надійний, масштабований і стійкий до відмов пайплайн для розгортання, забезпечуючи, щоб ваші сервіси завжди були доступні і актуальні.
Ps: Повний проєкт і інструкцію можна знайти в моєму Github
Перекладено з: Implementing Blue-Green Deployment for Applications on AWS ECS