AWS CDK Python


Основы:

Ресурсы и идентификаторы

  • Любая часть инфраструктуры, созданная с помощью CDK, является ресурсом.
  • У каждого ресурса есть идентификатор, который поможет вам найти его позже.
  • Ресурс в CDK соответствует ресурсу в CloudFormation.
  • Идентификатор ресурса также будет идентификатором в CloudFormation.

Конструкты

  • Конструкция – это логическая группировка одного или нескольких ресурсов.
  • Конструкции – это строительные блоки CDK.
  • Конструкты могут быть программно настроены.
  • Конструкции позволяют настраивать повторное использование в рамках организации.

Мы также можем создать другой ресурс на основе конструкции.
Например, нам нужен ресурс (группа безопасности) и идентификатор (WebSG).

Чтобы развернуть все вышеперечисленные ресурсы, называется Stack.

Стек

  • Стек – это единица развертывания в CDK.
  • Стек в CDK соответствует стеку в Cloudformation.
  • Стеки разделяют ограничения стека Cloudformation.
  • У каждого стека есть окружение, которое определяет учетную запись и регион.
  • Среды могут быть явно или неявно определены.

App

  • CDK App – это корень контекстного дерева для проекта CDK.
  • Приложение может содержать один или несколько стеков.
  • Каждый стек в App может содержать свою собственную среду.

Рабочий процесс CDK

  1. Init –> Проект создается с помощью инструмента командной строки
  2. Bootstrap –> Создать необходимые ресурсы AWS для среды CDK Enviroment.
  3. Synth –> Генерирование шаблона Cloudformation из кода.
  4. Deploy –> Шаблон запускается Cloudformation
  5. Update –> Проект CDK обновляется с новой инфраструктурой.
  6. Diff –> Определяются обновления против развернутого стека.
  7. Снова развертывание.

Зачем использовать AWS CDK

Давайте посмотрим на возможности AWS CDK. Вот некоторый код в AWS CDK
проекта для создания службы Amazon ECS с типом запуска AWS Fargate (это
код, который мы используем в разделе Создание службы AWS Fargate с помощью AWS CDK).

class MyEcsConstructStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        vpc = ec2.Vpc(self, "MyVpc", max_azs=3) # default is all AZs in region
        cluster = ecs.Cluster(self, "MyCluster", vpc=vpc)

        ecs_patterns.ApplicationLoadBalancedFargateService(
            self,"MyFargateService",
            cluster=cluster, # Required
            cpu=512, # Default is 256
            desired_count=6, # Default is 1
                                task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(
            image=ecs.ContainerImage.from_registry("amazon/amazon-ecssample")),
            memory_limit_mib=2048, # Default is 512
            public_load_balancer=True) # Default is False
Вход в полноэкранный режим Выход из полноэкранного режима

Этот класс создает шаблон AWS CloudFormation, состоящий из более чем 500
строк.

К другим преимуществам AWS CDK относятся:

  • Использование логики (операторы if, for-loops и т.д.) при определении инфраструктуры.
  • Используйте объектно-ориентированные методы для создания модели вашей системы
  • Определяйте высокоуровневые абстракции, делитесь ими и публикуйте их для своей команды, компании или сообщества.
  • Организуйте свой проект в логические модули
  • Делитесь и повторно используйте свою инфраструктуру как библиотеку
  • Тестируйте код вашей инфраструктуры, используя стандартные отраслевые протоколы
  • Используйте существующий рабочий процесс проверки кода
  • Завершение кода в вашей IDE

Разработка с AWS CDK

AWS CDK Toolkit – это инструмент командной строки для взаимодействия с приложениями CDK. Он позволяет разработчикам синтезировать такие артефакты, как шаблоны AWS CloudFormation, развертывать стеки на AWS-аккаунтах разработчиков и проводить сравнение с развернутым стеком, чтобы понять влияние изменений кода.

Библиотека AWS Construct Library включает модуль для каждого сервиса AWS с конструкциями, которые предлагают богатые API, инкапсулирующие детали создания ресурсов для сервиса Amazon или AWS. Цель библиотеки AWS Construct Library – снизить сложность и уменьшить количество логики, необходимой при интеграции различных сервисов AWS для достижения ваших целей на AWS.

Примечание:
Использование AWS CDK не является платным, но вы можете понести расходы AWS за создание или использование платных ресурсов AWS, таких как запуск экземпляров Amazon EC2 или использование хранилища Amazon S3. Используйте калькулятор цен AWS, чтобы оценить стоимость использования различных ресурсов AWS.


Начало работы:

Создайте приложение:

Каждое приложение AWS CDK должно находиться в отдельной директории со своими локальными зависимостями модулей. Создайте новый каталог для вашего приложения. Начиная с домашнего каталога или другого каталога по вашему желанию, выполните следующие команды.

mkdir hello-cdk
cd hello-cdk
Войти в полноэкранный режим Выйти из полноэкранного режима

Важно
Обязательно используйте имя hello-cdk для каталога проекта, как показано здесь. Шаблон проекта AWS CDK использует имя каталога для наименования вещей в сгенерированном коде, поэтому если вы используете другое имя, часть кода в этом руководстве не будет работать.

Теперь инициализируйте приложение с помощью команды cdk init, указав нужный шаблон (“app”) и язык программирования.

cdk init TEMPLATE --language LANGUAGE
Вход в полноэкранный режим Выйти из полноэкранного режима

т.е.

cdk init app --language python
Войти в полноэкранный режим Выход из полноэкранного режима

![[Вставленное изображение 20220405151619.png]]

После создания приложения также введите следующие две команды, чтобы активировать виртуальную среду Python приложения и установить его зависимости.

source .venv/Scripts/activate
python -m pip install -r requirements.txt
Войти в полноэкранный режим Выйти из полноэкранного режима

Совет –>
Если вы не укажете шаблон, по умолчанию будет “app”, который мы все равно хотели использовать, так что технически вы можете не указывать его и сэкономить четыре нажатия клавиш. Если у вас установлен Git, каждый проект, созданный с помощью cdk init, также инициализируется как Git-репозиторий. Мы пока проигнорируем это, но это будет там, когда вам это понадобится.

Здесь, в Python, сборка не требуется.

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

cdk ls
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Если вы не видите HelloCdkStack, убедитесь, что вы назвали каталог вашего приложения hello-cdk.

Добавьте ведро Amazon S3

На данном этапе ваше приложение не делает ничего полезного, потому что стек не определяет никаких ресурсов. Давайте определим ведро Amazon S3. Установите пакет Amazon S3 из библиотеки AWS Construct Library.

pip install aws-cdk.aws-s3
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Замените первый оператор import в hello_cdk_stack.py в каталоге hello_cdk следующим кодом.

from aws_cdk import (aws_s3 as s3,core)
#Replace the comment with the following code.
bucket = s3.Bucket(self,"MyFirstBucket",versioned=True,)
Войти в полноэкранный режим Выйти из полноэкранного режима

Bucket – это первая конструкция, с которой мы познакомились, поэтому давайте рассмотрим ее подробнее. Как и все конструкции, класс Bucket принимает три параметра.

scope:
Сообщает ведру, что стек является его родителем: он определен в области видимости стека. Вы можете определять конструкции внутри конструкций, создавая иерархию (дерево).
Id:
Логический идентификатор ведра в вашем приложении AWS CDK. Он (плюс хэш, основанный на расположении ведра в стеке) уникально идентифицирует ведро во всех развертываниях, поэтому AWS CDK может обновить его, если вы измените его определение в своем приложении. Ведра также могут иметь имя, которое отделено от этого ID (это свойство bucketName).
props:
Пакет значений, определяющих свойства ведра. Здесь мы определили только одно свойство: versioned, которое позволяет устанавливать версии для файлов в ведре.
Все конструкции принимают эти же три аргумента, поэтому легко ориентироваться при изучении новых конструкций. Как и следовало ожидать, вы можете создать подкласс любой конструкции, чтобы расширить ее под свои нужды или просто изменить ее значения по умолчанию.

Совет –>
Если все реквизиты конструкции являются необязательными, вы можете полностью опустить третий параметр.

Синтез шаблона AWS CloudFormation

Синтезируйте шаблон AWS CloudFormation для приложения следующим образом.

cdk synth
Вход в полноэкранный режим Выйти из полноэкранного режима

Если бы ваше приложение содержало более одного стека, вам нужно было бы указать, какой стек (стеки) синтезировать. Но поскольку приложение содержит только один стек, инструментарий понимает, что вы имеете в виду именно его.

Совет –>
Если вы получили ошибку типа “–app” is required…, это, вероятно, потому, что вы выполняете команду из подкаталога. Перейдите в основной каталог app и попробуйте снова.

Команда cdk synth выполняет ваше приложение, в результате чего ресурсы, определенные в нем, транслируются в шаблон AWS CloudFormation. Результатом выполнения команды cdk synth является шаблон AWS CloudFormation в формате YAML, который выглядит примерно так.

Resources:
  MyFirstBucketB8884501:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: HelloCdkStack/MyFirstBucket/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAA/yXIQQ5AMBBA0bPYt0NZ2XIB4QBSVTHKNNFpRMTdEav/8nNQJWSJPoI0o5MrDnB1rI0T7+pDAVcVjbMs6ol+3R9bG3zcjf1cexqR0dMtmpNnT2kBJSiVLAFR7pEYNwvt3wd3SI6vcAAAAA==
    Metadata:
      aws:cdk:path: HelloCdkStack/CDKMetadata/Default
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
Вход в полноэкранный режим Выход из полноэкранного режима

Даже если вы не очень хорошо знакомы с AWS CloudFormation, вы сможете найти определение для AWS::S3::Bucket и увидеть, как была переведена конфигурация версионности.

Примечание:
Каждый сгенерированный шаблон по умолчанию содержит ресурс AWS::CDK::Metadata. Команда AWS CDK использует эти метаданные для получения информации о том, как используется AWS CDK, чтобы мы могли продолжать улучшать его. Подробности, в том числе о том, как отказаться от отчетов о версиях, смотрите в разделе Отчеты о версиях. Синтезатор cdk генерирует совершенно правильный шаблон AWS CloudFormation. Вы можете взять его и развернуть с помощью консоли AWS CloudFormation. Но в AWS CDK Toolkit эта функция также встроена.

Развертывание стека

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

cdk deploy
Войти в полноэкранный режим Выйти из полноэкранного режима

Как и в случае с cdk synth, вам не нужно указывать имя стека, поскольку в приложении он только один. Синтезировать перед развертыванием необязательно (хотя это хорошая практика). AWS
CDK синтезирует ваш стек перед каждым развертыванием. Если ваши изменения в коде имеют последствия для безопасности, вы увидите краткое описание этих изменений, и вам будет предложено подтвердить их перед развертыванием. cdk deploy отображает информацию о ходе развертывания вашего стека. По завершении снова появляется командная строка. Вы можете перейти в консоль AWS CloudFormation и увидеть, что теперь в ней отображается HelloCdkStack. Вы также найдете
MyFirstBucket в консоли Amazon S3.
Вы развернули свой первый стек с помощью AWS CDK – поздравляем! Но
это еще не все, что есть в AWS CDK.

Изменение приложения

AWS CDK может обновлять развернутые ресурсы после того, как вы измените свое приложение. Давайте внесем небольшие изменения в наше ведро. Мы хотим иметь возможность автоматически удалять ведро при удалении стека, поэтому изменим RemovalPolicy.

Обновить:

# hello_cdk/hello_cdk_stack.py
bucket = s3.Bucket(self,
    "MyFirstBucket",
    versioned=True,
    removal_policy=core.RemovalPolicy.DESTROY)
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь мы воспользуемся командой cdk diff, чтобы увидеть различия между тем, что уже развернуто, и кодом, который мы только что изменили.

cdk diff
Вход в полноэкранный режим Выход из полноэкранного режима

AWS CDK Toolkit запрашивает у вашей учетной записи AWS текущий шаблон AWS CloudFormation для стека hello-cdk и сравнивает его с шаблоном, который он синтезировал из вашего приложения. Раздел Resources в выходных данных должен выглядеть следующим образом.

[~] AWS::S3::Bucket MyFirstBucket MyFirstBucketB8884501
├─ [~] Политика удаления (DeletionPolicy)
│ ├─ [-] Сохранять
│ └─ [+] Удалить
└─ [~] UpdateReplacePolicy
├─ [-] Сохранить
└─ [+] Удалить

Как вы видите, разница показывает, что свойство DeletionPolicy ведра теперь установлено на Delete, что позволяет удалять ведро при удалении его стека. Свойство UpdateReplacePolicy также изменено.
Пусть вас не смущает разница в названии. AWS CDK называет его RemovalPolicy, потому что его значение немного отличается от DeletionPolicy в AWS CloudFormation: AWS CDK по умолчанию сохраняет ведро при удалении стека, а AWS CloudFormation по умолчанию удаляет его. Более подробную информацию см. в разделе Политики удаления.
Вы также видите, что ведро не будет заменено, а будет обновлено.
Теперь приступим к развертыванию.

cdk deploy
Войти в полноэкранный режим Выйдите из полноэкранного режима

Введите y, чтобы одобрить изменения и развернуть обновленный стек. Инструментарий обновляет конфигурацию ведра, как вы просили.

Уничтожение ресурсов приложения

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

cdk destroy
Войдите в полноэкранный режим Выйдите из полноэкранного режима

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

Примечание
Это не сработало бы, если бы мы не изменили RemovalPolicy ведра
всего минуту назад!
Если cdk destroy не срабатывает, это, вероятно, означает, что вы поместили что-то в ведро Amazon S3. AWS CloudFormation не удаляет ведра с файлами в них. Удалите файлы и попробуйте снова.

Работа с AWS CDK в Python

Python является полностью поддерживаемым клиентским языком для AWS CDK и считается стабильным. При работе с AWS CDK на Python используются знакомые инструменты, включая стандартную реализацию Python (CPython), виртуальные среды с virtualenv и программу установки пакетов Python pip. Модули, составляющие библиотеку AWS Construct Library, распространяются через pypi.org. В Python-версии AWS CDK даже используются идентификаторы в стиле Python (например, имена методов в змеином_ регистре).
Вы можете использовать любой редактор или IDE; многие разработчики AWS CDK используют Visual Studio Code (или его эквивалент с открытым исходным кодом VSCodium), который имеет хорошую поддержку Python через официальное расширение. Для начала работы достаточно редактора IDLE, входящего в комплект поставки Python. Модули Python для AWS CDK имеют подсказки типов, которые полезны для инструмента линтинга или IDE, поддерживающей проверку типов.

Предварительные условия

Для работы с AWS CDK необходимо иметь учетную запись AWS и учетные данные, а также установить Node.js и AWS CDK Toolkit. См. раздел Предварительные условия AWS CDK.
Для приложений Python AWS CDK требуется Python 3.6 или более поздней версии. Если он у вас еще не установлен, загрузите совместимую версию для вашей платформы на python.org. Если вы используете Linux, ваша система может поставляться с совместимой версией, или вы можете установить ее с помощью менеджера пакетов вашего дистрибутива (yum, apt и т.д.).
Пользователей Mac может заинтересовать Homebrew, менеджер пакетов в стиле Linux для Mac OS X.
Также необходимы программа установки пакетов Python, pip, и менеджер виртуального окружения, virtualenv. Установка совместимых версий Python в Windows включает эти инструменты. В Linux pip и virtualenv могут быть предоставлены в виде отдельных пакетов в вашем менеджере пакетов. Кроме того, их можно установить с помощью следующих команд:

python -m ensurepip --upgrade
python -m pip install --upgrade pip
python -m pip install --upgrade virtualenv
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы столкнулись с ошибкой разрешения, запустите вышеуказанные команды с флагом –user, чтобы модули были установлены в каталог вашего пользователя, или используйте sudo для получения разрешений на установку модулей в масштабе всей системы.

Примечание
В дистрибутивах Linux принято использовать имя исполняемого файла python3 для Python 3.x, а python относится к установке Python 2.x. Вы можете настроить команду, используемую для запуска вашего приложения, отредактировав cdk.json в основном каталоге проекта.

Создание проекта

Вы создаете новый проект AWS CDK, вызывая команду cdk init в пустом каталоге.

mkdir my-project
cd my-project
cdk init app --language python
Вход в полноэкранный режим Выход из полноэкранного режима

cdk init использует имя папки проекта для наименования различных элементов проекта, включая классы, подпапки и файлы. После инициализации проекта активируйте виртуальную среду проекта. Это позволит установить зависимости проекта локально в папке проекта, а не глобально.

source .env/bin/activate
Вход в полноэкранный режим Выход из полноэкранного режима

Примечание:
Вы можете узнать эту команду как команду Mac/Linux для активации виртуальной среды. Шаблоны Python включают пакетный файл source.bat, который позволяет использовать ту же команду в Windows. Традиционная команда Windows, .envScriptsactivate.bat, тоже работает. Затем установите стандартные зависимости приложения:

python -m pip install -r requirements.txt
Войти в полноэкранный режим Выйти из полноэкранного режима

Важно
Активируйте виртуальную среду проекта всякий раз, когда начинаете работать над ним. В противном случае у вас не будет доступа к установленным там модулям, а модули, которые вы установите, попадут в глобальный каталог модулей Python (или приведут к ошибке разрешения).

Управление модулями библиотеки AWS construct

Используйте программу установки пакетов Python, pip, для установки и обновления модулей библиотеки AWS Construct для использования вашими приложениями, а также других необходимых вам пакетов. pip также автоматически устанавливает зависимости для этих модулей. Чтобы запустить pip без необходимости его установки в специальный каталог, вызовите его как:

python -m pip PIP-COMMAND
Войти в полноэкранный режим Выйти из полноэкранного режима

Модули AWS Construct Library имеют имена типа aws-cdk.SERVICE-NAME. Для
Например, команда ниже устанавливает модули для Amazon S3 и AWS Lambda.

python -m pip install aws-cdk.aws-s3 aws-cdk.aws-lambda
Войти в полноэкранный режим Выйти из полноэкранного режима

Аналогичные имена используются для импорта модулей AWS Construct Library в ваш Python-код (просто замените дефисы на символы подчеркивания).

import aws_cdk.aws_s3 as s3
import aws_cdk.aws_lambda as lam
Войти в полноэкранный режим Выйти из полноэкранного режима

После установки модуля обновите файл requirements.txt, в котором перечислены зависимости вашего проекта. Лучше всего сделать это вручную, а не с помощью pip freeze. pip freeze фиксирует текущие версии всех модулей, установленных в вашей виртуальной среде Python, что может быть полезно при компоновке проекта для запуска в другом месте.
Обычно, однако, в файле requirements.txt следует перечислять только зависимости верхнего уровня (модули, от которых напрямую зависит ваше приложение), а не зависимости этих модулей. Такая стратегия упрощает обновление зависимостей. Вот как может выглядеть ваш файл requirements.txt, если вы установили модули Amazon S3 и AWS Lambda, как показано выше.

aws-cdk.aws-s3==X.YY.ZZ
aws-cdk.aws-lambda==X.YY.ZZ
Вход в полноэкранный режим Выход из полноэкранного режима

Вы можете отредактировать файл requirements.txt, чтобы разрешить обновления; просто замените == перед номером версии на ~=, чтобы разрешить обновление до более высокой совместимой версии, или полностью удалите требование версии, чтобы указать последнюю доступную версию модуля.
Отредактировав файл requirements.txt соответствующим образом для разрешения обновлений, выполните эту команду для обновления установленных модулей вашего проекта в любое время:

pip install --upgrade -r requirements.txt
Войти в полноэкранный режим Выйти из полноэкранного режима

Примечание
Все модули AWS Construct Library, используемые в вашем проекте, должны быть одной и той же версии.

Идиомы AWS CDK в Python

Реквизиты

Все классы библиотеки AWS Construct инстанцируются с помощью трех аргументов: область видимости, в которой определяется конструкция (ее родитель в дереве конструкций), имя и props – связка пар ключ/значение, которую конструкция использует для настройки ресурсов, которые она создает. Другие классы и методы также используют шаблон “связка атрибутов” для аргументов.

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

Например, в методе add_lifecycle_rule ведра Amazon S3 свойство transitions представляет собой список экземпляров Transition.

bucket.add_lifecycle_rule(
    transitions=[
        Transition(
            storage_class=StorageClass.GLACIER,
            transition_after=Duration.days(10))
        ]
)
Вход в полноэкранный режим Выход из полноэкранного режима

При расширении класса или переопределении метода вы можете захотеть принять дополнительные аргументы для своих целей, которые не понимаются родительским классом. В этом случае вам следует принимать аргументы, которые вас не интересуют, используя идиому kwargs, а для принятия интересующих вас аргументов использовать аргументы только с ключевым словом. При вызове конструктора родительского класса или переопределенного метода передавайте только те аргументы, которые он ожидает (часто просто kwargs). Передача аргументов, которые родительский класс или метод не ожидает, приводит к ошибке.
Будущие выпуски AWS CDK могут случайно добавить новое свойство с именем, которое вы использовали для своего собственного свойства. Это не вызовет никаких технических проблем у пользователей вашей конструкции или метода (поскольку ваше свойство не передается “по цепочке”, родительский класс или переопределенный метод просто будет использовать значение по умолчанию), но может вызвать путаницу. Вы можете избежать этой потенциальной проблемы, называя свои свойства так, чтобы они явно принадлежали вашей конструкции. Если новых свойств много, объедините их в класс с соответствующим названием и передайте его в качестве аргумента с одним ключевым словом.***

Оцените статью
Procodings.ru
Добавить комментарий