Рубрики
Без рубрики

Как использовать AWS Python CDK для создания инфраструктуры на ECS.

Недавно на работе мы решили построить конвейер CI / CD, который развернут наше приложение напрямую к AWS …. Помечено с AWS, Python, Devops.

Разверните контейнеровский Python для AWS, используя действия GitHub. (3 часть серии)

Недавно на работе мы решили построить CI/CD-трубопровод, который разворачивает наше приложение непосредственно к AWS. Я никогда не работал с AWS, и это была пропавшая точка на моем резюме, которое демонстрирует, что у меня есть некоторые навыки. Я решил искать некоторые учебники онлайн И мне не повезло получить то, что нам нужно на работе. Я решил написать это руководство, получив что-то работа с различными учебниками, которые я нашел в Интернете.

Что вы узнаете из этой серии.

В этом уроке 3 частей мы узнаем, как создать архитектуру AWS, в которой вы можете развернуть приложение, как преобразовать файл Docker-Compose в определении задачи и как развернуть определение задачи в архитектуру AWS, используя действия GitHub.

Для кого эта серия?

В этом руководстве для разработчиков, которые знакомы с Docker и имеют приложение с помощью Docker-Compose. Хотя серия была написана разработчиком Python и использование Python, концепции могут быть применены к другим языкам программирования.

Какое приложение мы развернут?

В этом руководстве мы будем развернуть приложение Python, которое имеет работника сельдерей, планировщика сельдерея и база данных Redis для обмена сообщениями и задач.

Я не буду говорить о очереди сельдерея и задачи и как использовать эти инструменты, но вы можете начать с ними здесь и начать работу с Docker, вы можете использовать этот и этот Быть знакомым с Docker-Compose.

Эта серия не основана на каких-либо популярных веб-каркасе Python, такая как Django, Flask, или Fastapi, но вы можете адаптировать этот учебник для них, и я уверен, что это будет работать как очарование.

Скелет приложений можно скачать из эта ссылка для начала.

В этой первой части учебника мы узнаем, как создать стопку облака.

Что такое облака AWS?

От Официальная документация , Облачность определяется как:

AWS CloudFormation – это услуга, которая помогает вам моделировать и настроить ресурсы Amazon Web Services, чтобы вы могли потратить меньше времени, управляя этими ресурсами и большее время, ориентируясь на ваши приложения, которые работают в AWS. Вы создаете шаблон, который описывает все ресурсы AWS, которые вы хотите (например, экземпляры Amazon EC2 или экземпляры DB Amazon RDS), и облачность заботится о предоставлении и настраивание этих ресурсов для вас. Вам не нужно индивидуально создавать и настроить ресурсы AWS и выяснить, что зависит от того, что; Облачность обрабатывает все это.

Создание архитектуры AWS

Убедитесь, что вы создали учетную запись AWS, и у вас есть свои учетные данные; ключ доступа и секретный ключ приложения.

Большинство услуг, используемых в этом руководстве, доступны в рамках бесплатного уровня AWS.

Мы разверним наше приложение, используя тип запуска AWS ECS Fargate, который вытащит изображения Docker из эластичного реестра контейнера AKA ECR.

Почему Фаргейт и не EC2?

AWS предоставляет нам в основном два типа запуска, которые являются типом запуска Fargate и EC2.

Усилие Amazon Compute Compute (Amazon EC2) обеспечивает масштабируемую вычислительную емкость в облаке Amazon Web Services (AWS). Использование Amazon EC2 устраняет необходимость ввести в аппаратное обеспечение APPFRONT, поэтому вы можете разрабатывать и развернуть приложения быстрее. Вы можете использовать Amazon EC2, чтобы запустить столько или несколько виртуальных серверов, сколько вам нужно. Это позволяет настроить безопасность и сеть и управлять хранением самостоятельно. С EC2 вам не нужно беспокоиться о аппаратном обеспечении, аппаратное обеспечение управляется AWS.

AWS Fargate – это технология, которую вы можете использовать с Amazon ECS для запуска Контейнеры без необходимости управлять серверами или кластерами экземпляров Amazon EC2. Преимущество Fargate Over EC2 – это тот факт, что вам не нужно настраивать, предоставлять или масштабировать экземпляры кластера и не нужно беспокоиться о виртуальных машинах.

В двух словах:

С виртуальной машиной кто-то все еще должен управлять аппаратным обеспечением, но с EC2, что кто-то AWS, и вы даже никогда не видите оборудования.

С ECS на EC2 кому-то все еще может управлять экземплярами, но с ECS на Fargate, что кто-то AWS, и вы даже никогда не видите экземпляры EC2.

ECS имеет «тип запуска» либо EC2 (если вы хотите управлять экземплярами самостоятельно) или Fargate (если вы хотите, чтобы AWS управлять экземплярами). Источник Отказ

Объекты, которые нам нужны:

Для развертывания приложения нам понадобятся следующие объекты: кластер, сервис, определение задачи с определением контейнеров, облачные часы для ведения журнала и роли IAM. На рисунке ниже показано, как эти объекты AWS взаимодействуют друг с другом.

Давайте определим некоторые из этих объектов, и тогда мы рассмотрим, как создать стек, содержащий их, используя Python CDK.

  • Кластер : Это логическая группа экземпляров контейнеров, которые ECS может использовать для развертывания контейнеров докеров. Он предоставляет вычислительную мощность для запуска экземпляров контейнеров приложений. На практике кластер обычно прикреплен к экземпляру AWS.

  • Сервис : Это позволяет нам запустить и поддерживать указанное количество экземпляров определения задачи одновременно в кластере Amazon ECS. т.е. Это помогает нам запустить одно- или несколько контейнеров, использующих то же определение задачи.

  • Определение задачи : Определение задачи является спецификацией. Вы используете его, чтобы определить одну или несколько контейнеров (с URI изображения), которые вы хотите запустить вместе, вместе с другими деталями, такими как переменные среды, требования к процессоре/памяти и т. Д. Определение задачи на самом деле ничего не запускает, это описание того, как все будет настроено, когда что-то работает. Определение задачи разделяет некоторые сходства с файлом Docker-Compose. Во второй части этого учебника мы будем преобразовать документ Docker-Compose в определение задачи.

  • Задача : Задача – это фактическая вещь, которая работает. ECS использует определение задачи для запуска задачи; Он загружает изображения контейнера, настраивает среду выполнения в зависимости от других деталей в определении задачи. Вы можете запустить одну или много задач для любого определения задания. Каждая рабочая задача – это набор из одного или нескольких запускающихся контейнеров – контейнеров в задаче все работает на одном случае.

  • cloudwatch. : Cloudwatch – это служба мониторинга, мы используем его в этом стеке, чтобы получить и визуализировать журналы из контейнеров докеров.

Со всеми описанными объектами мы теперь можем научиться создавать их, используя Python CDK.

Создание архитектуры:

Чтобы построить инфраструктуру, мы будем использовать AWS Cloud Development Kit (CDK) . Если вы новичок в CDK, см. Начало работы с AWS CDK , это просто и просто установить. В этом посте мы будем использовать CDK с Python 3.7. Еще одна альтернатива CDK состоит в том, чтобы создать приложение через консоль AWS. Тем не менее, я нашел CDK, чтобы быть самым простым подходом, потому что он позволяет вам иметь контроль над кодом, который вы пишете.

После установки проверки CDK, если он работает со следующей командой:

  • cdk --version должен выводить вашу версию CDK.
Инициализация AWS CLI:

Убедитесь, что у вас есть AWS CLI, установленный на вашем компьютере. Настройте свой AWS CLI С помощью IAM пользователем, который имеет разрешения для создания ресурсов (роль VPC, ECS, ECR, IAM), описанные в шаблоне ниже. После конфигурации вы должны иметь клавиши AWS, хранящиеся на вашем компьютере в следующем расположении:

  • ~/.aws/учетные данные : Если вы используете Mac или Linux

  • C: \ Пользователи \ Имя пользователя \ .aws \ config : Если вы находитесь в Windows

Содержание этого файла должно выглядеть так:

[default]

region=your region

aws_access_key_id = *********************************

aws_secret_access_key = ******************************

С учетными данными клиент CLI и установили CDK, давайте перейдем на второй шаг о создании архитектуры.

Инициализация проекта CDK:

Чтобы инициализировать CDK, мы создадим новый Python Project, который будет содержать код для создания архитектуры.

Шаг 1 : Создание проекта

Запустите следующую команду, чтобы создать новый проект CDK:

MKDIR ECS-DEVOPS-CDK

Введите проект, используя:

CD ECS-DEVOPS-CDK

Или если вы используете VSCODE, вы можете открыть проект с VS-кодом, используя:

Код ECS-DEVOPS-CDK

  • Шаг 2 : Инициализируйте проект Python CDK:

Для инициализации проекта CDK запустите следующую команду:

CDK INIT –Language Python

Команда создаст новый проект Python CDK, и мы будем редактировать его на следующем шаге, чтобы построить наш стек.

После быстрого взгляда вы должны увидеть такую структуру в вашем проекте:

.

├── README.md

├── app.py

├── cdk.json

├── ecs_devops_cdk

│ ├── __init__.py

│ └── ecs_devops_cdk_stack.py

├── requirements.txt

├── setup.py

└── source.bat

  • Шаг 3 : Активировать виртуальную среду:

Вы можете активировать вашу виртуальную среду, используя следующую команду:

На Mac и Linux: Источник .env/Bin/Activate

Для Windows: .env \ Scripts \ Activate.bat

  • Шаг 4 : Установка зависимостей:

С помощью виртуальной среды созданы мы теперь можем установить зависимости:

PIP Установка -R требования. atxt и pip install aws_cdk.aws_ec2 aws_cdk.aws_ecs aws_cdk.aws_ecr aws_cdk.aws_iam

С инициализированным проектом мы теперь можем перейти к следующему шагу, где мы будем создавать наши компоненты.

Создание объектов:

Теперь мы можем перейти к шагу создания стека

Если вы откроете файл под ecs_devops_cdk/ecs_devops_cdk_stack.py. Вы должны быть в состоянии увидеть следующие:

from aws_cdk import core

class EcsDevopsCdkStack(core.Stack):

def __init__ (self, scope: core.Construct, construct_id: str, **kwargs) -> None:

super(). __init__ (scope, construct_id, **kwargs)

Он в основном класс, который будет содержать код, определяющий наш стек.

Шаг 1 : Импортировать Основная функциональность

Отредактируйте первую строку для импорта кода, который нам нужно создать следующий стек:

` питон

От AWS_CDK Import (CORE, AWS_ECS AS ECS, AWS_ECR AS ECR, AWS_EC2 AS EC2, AWS_IAM AS IAM, AWS_LOGS) `

Шаг 2 : Создайте репозиторий контейнера

Чтобы создать репозиторий контейнеров, вы можете использовать следующую команду:

ecr_repository = ecr.Repository(self, "ecs-devops-repository", repository_name="ecs-devops-repository")

Шаг 3 : Создание VPC:

Мы можем либо создать VPC или использовать существующую VPC. Для создания использования VPC можно добавить следующий код __init__ метод.

vpc = ec2.Vpc(self, "ecs-devops-vpc", max_azs=3)

Вы также можете использовать существующую VPC, если это так, чтобы вы использовали следующие строки:

vpc = ec2.Vpc.from_lookup(self, "ecs-devops-vpc",vpc_id='vpc-number')

Для этого вам нужно имя VPC и соответствующий идентификатор.

Шаг 4: Кластерное создание:

С созданным VPC мы можем прикрепить к нему кластер. Чтобы создать кластер, мы можем использовать следующий код:

cluster = ecs.Cluster(self,

"ecs-devops-cluster",

cluster_name="ecs-devops-cluster",

vpc=vpc)

Шаг 5: Создание роли:

Давайте создадим роль, роль даст разрешение на обслуживание на выполнение задач.

execution_role = iam.Role(self, "ecs-devops-execution-role", assumed_by=iam.ServicePrincipal("ecs-tasks.amazonaws.com"), role_name="ecs-devops-execution-role")

С созданием роли исполнения мы можем приложить политику ему, чтобы дать ему разрешение.

execution_role.add_to_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, resources=["*"], actions=["ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "logs:CreateLogStream", "logs:PutLogEvents"] ))

С созданной ролью IAM мы можем приложить к этому определение задачи

Шаг 6 : Создание определения задания:

Вот код, который мы использовали для создания определения задания;

task_definition = ecs.FargateTaskDefinition(self, "ecs-devops-task-definition", execution_role=execution_role, family="ecs-devops-task-definition")

И контейнер:

container = task_definition.add_container("ecs-devops-sandbox", image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample") )

В вышеупомянутом коде мы изначально указываем определение задачи для запуска с примерным контейнером из публичного выборочного реестра AWS. Этот контейнер для образца заменяется нашим контейнером приложений, когда наш CI/CD-трубопровод обновляет определение задачи. Мы используем контейнер из реестра для образца, чтобы позволить услуге стабилизировать, прежде чем любые изображения контейнера приложений добавляются в наш репозиторий ECR.

С созданным определением задач мы можем прикрепить службу, которая будет работать.

Шаг 7: Создание услуги:

service = ecs.FargateService(self, "ecs-devops-service", cluster=cluster, task_definition=task_definition, service_name="ecs-devops-service")

Служба использует определение задачи, и вы можете видеть, что он прикреплен к нашему созданному кластеру.

PS: Когда экземпляр AWS находится в публичной подсети, вам необходимо автоматически назначать публичные IP-адреса к контейнерам, чтобы предоставить им доступ в Интернет. Это поможет Вашему сервису загрузки документа докера с публичного хранилища. В этом случае вы можете использовать следующий код при создании службы.:

service = ecs.FargateService(self,

"service-name",

cluster=cluster,

task_definition=task_definition,

service_name="service-name",

assign_public_ip=True, # this is important

security_groups=[list of security groups , also important],

vpc_subnets=[list of subnets]

)

Обратите внимание на use_public_ip, Группа безопасности и подсети VPC.

Шаг 8 : Создание группы журнала CloudWatch:

log_group = aws_logs.LogGroup(



self,



"ecs-devops-service-logs-groups",



log_group_name="ecs-devops-service-logs")

Как уже говорилось, прежде чем мы будем передавать журналы Docker в нашу группу журнала, созданную в CloudWatch.

Со всеми созданными объектами давайте убедитесь, что у нас есть все ингредиенты для нашего стека в следующем обновленном файле.

ecs_devops_cdk/ecs_devops_cdk_stack.py.

from aws_cdk import (core, aws_ecs as ecs, aws_ecr as ecr, aws_ec2 as ec2, aws_iam as iam, aws_logs)



class EcsDevopsCdkStack(core.Stack):

def __init__ (self, scope: core.Construct, construct_id: str, **kwargs) -> None:



super(). __init__ (scope, construct_id, **kwargs)

ecr_repository = ecr.Repository(self, "ecs-devops-repository", repository_name="ecs-devops-repository")

vpc = ec2.Vpc(self, "ecs-devops-vpc", max_azs=3)

cluster = ecs.Cluster(self, "ecs-devops-cluster", cluster_name="ecs-devops-cluster", vpc=vpc)

execution_role = iam.Role(self, "ecs-devops-execution-role", assumed_by=iam.ServicePrincipal("ecs-tasks.amazonaws.com"), role_name="ecs-devops-execution-role")

execution_role.add_to_policy(iam.PolicyStatement(

effect=iam.Effect.ALLOW, resources=["*"],

actions=["ecr:GetAuthorizationToken",

"ecr:BatchCheckLayerAvailability",

"ecr:GetDownloadUrlForLayer",

"ecr:BatchGetImage",



"logs:CreateLogStream",



"logs:PutLogEvents" ] ))



task_definition = ecs.FargateTaskDefinition(self, "ecs-devops-task-definition", execution_role=execution_role,

family="ecs-devops-task-definition")

container = task_definition.add_container("ecs-devops-sandbox", image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample"))

service = ecs.FargateService(self, "ecs-devops-service", cluster=cluster, task_definition=task_definition, service_name="ecs-devops-service")

log_group = aws_logs.LogGroup(self, "ecs-devops-service-logs-groups", log_group_name="ecs-devops-service-logs")

Перед созданием стека открыть файл приложение

Вы должны увидеть что-то вроде этого:

from aws_cdk import core

from ecs_devops_cdk.ecs_devops_cdk_stack import EcsDevopsCdkStack

app = core.App()



EcsDevopsCdkStack(app, "ecs-devops-cdk")

app.synth()

Замените строку, в которой работает ваш стек, 4-й строка, со следующим:

EcsDevopsCdkStack(app, "ecs-devops-cdk", env={



'account': " **************",



'region': "your region"



})

С этим набором; Теперь вы можете создать свой стек. С созданным кодом мы теперь можем запустить следующую команду для создания нашего стека.

развертывание CDK

Если все идет хорошо, вы должны быть созданы стек. В результате у вас будет кластер, запустив службу, которая развертывает определение задачи, а создана группа журнала CloudWatch.

Вы можете проверить свой стек из консоли AWS, навигацию на следующий ссылка Отказ

Если вы хотите, вы можете проверить этот проект на GitHub здесь Отказ

Это все для этой первой части, нам удалось создать наш корабль и добавить самые важные объекты к нему.

Теперь мы готовы упаковать контейнеры и доставлять наш контент нашему клиенту.

Во второй части этой серии мы узнаем, как преобразовать наш файл Pocter-Compose в определение задачи, описанному в этом руководстве. Тогда увидимся!

Разверните контейнеровский Python для AWS, используя действия GitHub. (3 часть серии)

Оригинал: “https://dev.to/espoir/how-to-use-the-aws-python-cdk-to-create-an-infrastructure-on-ecs-3lcc”