Эта тема является предметом моей презентации в пользовательской группе пользователей AWS ManiLa Manila 20 августа 2020 года.
Облачная информация — это мощный инструмент для определения вашей инфраструктуры в качестве кода. Его декларативный синтаксис предоставляет способ описания состояния вашей инфраструктуры в файле JSON или YAML. Он также имеет синтаксис для создания и настройки (почти) любых ресурсов AWS, которые вам могут понадобиться.
Ограничения облака
Ограничения CF начинают показывать, когда вы пытаетесь ввести настраиваемость в ваших шаблонах. Например, вы хотите создать шаблон, который может предусматривать службу ECS для любого из ваших настоящих и будущих приложений. Такое требование примет его необходимость для шаблона CF настраиваемым. И настраиваемость означает, что вам нужно:
- Входные данные: в нашем примере службы ECS входы — это место, где пользователь может выбрать, следует ли включать автоматическое масштабирование или нет. Вы также можете добавить параметры для пользователя, чтобы настроить, как ведет себя автоматически масштабирование (то есть, как и, как часто случается масштабирование)
- Логика: Убедитесь, что ресурсы автоматического масштабирования построены, когда пользователь говорит, что он хочет автоматический масштабирование.
С этой целью AWS предоставил множество входных и логических функций, которые помогают нам создавать обобщенные шаблоны. Но как вы разрабатываете более сложные шаблоны CF, вы будете неизбежно Найти эти функции отсутствующие.
Этот пост — это прохождение высокого уровня о том, как создавать обобщенные шаблоны.
Этот пост не вступительный. Есть много хороших учебных пособий в Интернете для этого. Вместо этого это прохождение на высоком уровне в техниках, которые вы можете использовать, чтобы сделать шаблоны настраиваемыми. Если вы хотите погрузиться глубже в любые конкретные решения, есть ссылки, предоставляемые на каждом повороте для вас, чтобы исследовать. 🚏
Начнем с внедрения функций в CF, сделанном для настройки шаблона. Затем мы прогрессируем, глядя на решения за пределами CF, которые помогают нам по-настоящему настраиваемые шаблоны.
(1) Посмотрите, какие шаблоны CF должны предложить
Перед тем, как попробовать более сложные решения в этом посте, важно задать себе: Я пытаюсь сделать уже решить существующую функцию в шаблонах CF? . Если ответ да, то лучше придерживаться собственного синтаксиса шаблона CF.
Параметры : Переменные, которые вы определяете во время разработки, но значения которых заполняются только тогда, когда пользователь использует ваш шаблон.
- Воспроизведение с различными типами параметров, чтобы помочь своим пользователям настроить настройки в своем шаблоне. Вы можете иметь строки, выбирать коробки (где вы определяете выбор и выбираете один из них), строки с разделителями запятыми и даже типы, которые позволяют своим пользователям указывать уже существующие ресурсы AWS, такие как VPC и подсети.
- Псевдо-параметры — Переменные выполнения, определенные окружающей средой, вы создали свой стек, например AWS:: Region , AWS:: Stackname. , и т.д.
Внутренние функции : Встроенные функции в CF, которые помогут вам манипулировать переменными, значения которых доступны только во время выполнения (параметры I.E, внутренние функции, свойства ресурсов для создания в стеке)
- Несколько из этих функций о манипулирующем входе, созданном пользователем ввода в разделе «Параметры». Наиболее распространенные из всех являются Fn:: Sub Отказ Это позволяет ссылаться на параметры CF, как если бы вы делали строку интерполяции в Python:
$ {AWS:: Stackname} - $ {userInputparameter}
- Там также специальные параметры для создания VPC, которые помогут вам сделать свой шаблон более настраиваемым. Проверьте FN:: Getazs и FN:: CIDR.
- Несколько из этих функций о манипулирующем входе, созданном пользователем ввода в разделе «Параметры». Наиболее распространенные из всех являются Fn:: Sub Отказ Это позволяет ссылаться на параметры CF, как если бы вы делали строку интерполяции в Python:
- Условия : Раздел шаблона CF, который помогает вам создать ресурс, глядя, если параметры, предоставленные пользователем, выполняют определенное состояние. Этот синтаксис известен как Условные функции (то есть вы можете использовать
Fn:: Если
,Fn:: равен
,Fn:: или
,Fn:: и
,Fn:: не
, и т.д) Выходы : Этот раздел определяет выходы, которые вы покажете своих пользователей после успешного создания стека все ресурсы в шаблоне.
- Это также может помочь вам экспортировать значения, которые вы хотите импортировать и использовать в других стеках CF, которые вы создаете.
(2) Разделите работу между несколькими шаблонами CF
Поскольку наша инфраструктура становится все больше, один шаблон CF мы используем, становится неизвестным. Также будет много повторного кода, так как нам может придеться развертывать две копии одного и того же ресурса. Примером было бы, если бы мы хотели определить два отдельных кластера ECS с каждой собственной группой автоматической масштабирования экземпляров EC2. Это 200 строк кластера YAML за ECS.
Вложенный стек — позволяет нам создавать отдельные шаблоны для компонентов, которые мы повторно используем. Чтобы создать два кластера ECS в среде, мы можем создать отдельный
ecs_cluster.yml
шаблон. Затем мы можем добавить две ссылки на этот шаблон в нашем основном шаблоне CF.- Все шаблоны, на которые ссылаются в основной шаблон, создается одновременно
Перекрестные ссылки — позволяет нам создавать стеки, которые ссылочные значения в стеке что уже существует . Мы должны явно «экспортировать» значения из шаблона источника, чтобы другие шаблоны могли «импортировать» и использовать их.
- Это позволяет отдельные команды управлять разными частями вашей инфраструктуры. Например, вы можете иметь команду инфраструктуры управлять стеком, содержащим VPC, подсети, IGW и NAT-GW. Затем команда Core Application управляет стеком с кластером ECS. Индивидуальные команды SPRINT управляют услугами ECS.
В приведенном ниже примере сетевой стек был создан первым. Затем стек базы данных ссылается на значения в стеке сети через перекрестные ссылки. Между тем, стек службы ECS вложил вложенный стек CI/CD и был создан одновременно.
(3) макросы облака
Как вы строите более сложные и настраиваемые шаблоны, функции в # 1 и # 2 будут недостаточно. CF Macros позволяет использовать свой собственный синтаксис в шаблонах CF.
Cloudformation Macros Являются ли лямбда функции, код которого сканирует шаблон CF для специального синтаксиса. Когда он находит этот синтаксис, он использует Python (или любой из поддерживаемых языков) для добавления изменений в шаблон, прежде чем передавать его в службу отчетности для обработки. Он также имеет доступ к значению параметров, поставляемых при создании стека.
Это также действует как препроцессоры шаблону. Вы можете создавать свои собственные макросы, или вы можете просто использовать уже публично. Чтобы использовать макрос, разверните функцию лямбда и зарегистрируйте ее в качестве макроса облака. После регистрации вы можете добавить макрос в Трансформировать
Раздел вашего шаблона CF.
AWS CloudFormation Macros Github Repository Это отличное место для начала в поисках макросов, которые могут соответствовать вашим потребностям. Вы также можете проверить Собственный сверкающий список в Джешане в Github Отказ
Но вот известный список макросов от меня, что вы можете найти полезным:
- Pypaper — Запустите фактический код Python в шаблоне. Вы можете поместить код Python на блоке внутри вашего шаблона CF. Во время выполнения макрос Pypaper будет искать эти блоки и запустить код Python внутри. Какое значение для
вывод
Переменная будет возвращена в этот конкретный блок. - Считать — Добавить свойство «COUNT», которая позволяет создавать 2, 3 или более копий этого ресурса
(4) Используйте структуру развертывания для серверульных приложений
MACROS Cloudfationation также показывает вам кончик настраиваемого доступного. Для приложений без прослушивания две рамки выделяются в использовании макросов.
AWS SAM — модель приложения без сервеса
AWS SAM дает вам краткосрочный синтаксис, который поможет вам быстро работать с серверуми. Макрос CF за SAM переводит синтаксис сокращения в более подробную синтаксис CF, прежде чем передавать его обратно в CF для обработки.
Шаблон ниже может уже развернуть функцию лямбда. Это сделало бы в два раза больше строк в ср. Под шаблоном вы также можете добавить ванильный CF-код для вашей функции AWS AWS Lambda (I.E Dynamodb)
Transform: AWS::Serverless-2016-10-31 Resources: LambdaFunctionOne: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.8 CodeUri: 's3://testBucket/mySourceCode.zip'
SF — Смертная рамка
Serverless Framework представляет собой структуру развертывания, которая предоставляет свой собственный синтаксис для развертывания серверу без сервезна через несколько облачных поставщиков. Как AWS SAM, он переводит неверный шаблон на шаблон CF. Затем он разворает шаблон как стек CF. Его раздел «Resource» выступает в качестве части, в котором вы можете бросить синтаксис CF для обеспечения зависимостей, которые может потребоваться вашему приложению без сервеса (I.E. Dynamodb)
service: ecs-codedeploy-bluegreen-custom-resource provider: name: aws runtime: python3.7 iamRoleStatements: - Effect: "Allow" Action: "codedeploy:*" Resource: "*" - Effect: "Allow" Action: "iam:PassRole" Resource: "arn:aws:iam::XXXXXXXXXXXXXXX:role/ecsCodeDeployRole" functions: hello: handler: handler.hello plugins: - serverless-python-requirements resources: Resources: # AWS RESOURCES DEFINED IN CLOUDFORMATION
Он также имеет яркую экосистему плагинов, которые помогут вам еще быстрее. В Еще один блог пост Я обсуждаю, как я смог использовать Безсекретный питон-требования
плагин Для управления зависимостями моим квартовым приложением через SF (кварта похоже на лучшую структуру колба Python) . SF будет один для загрузки пакетов Python My App, нуждается в приложении, свяжите его вместе с созданным мной кодом, и загрузите, что на ведро S3 в качестве файла zip. Этот zip-файл будет код, развернутый в лямбде
В одном из приложений, которые я разработал, я использовал плагин Serverless-wsgi
Развернуть приложение My Flask с помощью веб-сервера WSGI.
(5) Посмотрите на дорожной карте CloudFation
Облачная информация поддержала много услуг AWS, но это не поддержало все. Это заняло Джаб от террафора в последнее время Поскольку Terraform поддерживает новые AWS Services гораздо быстрее, чем CAVS CloudFormation, делает.
Поскольку ваш корпус использования с CF становится более конкретным, вы бы потратите функциональные пробелы в CF, что террафом уже охватывает. Одним из них является синее/зеленое развертывание для служб ECS. Сообщество было Запрашивая эту функцию от AWS с января 2019 года Отказ Они могли доставить только ограниченный выпуск в 2 мае 20120 года. Какое значительное время выполнения (и это даже не завершено!).
В случае, если я столкнулся с такими функциями пробелы, мой GO-сайт — это AWS CloudFormation Coverage Roadmap Отказ Пользователи со всего мира, используя CF Откройте вопросы здесь, чтобы запросить команду AWS Cloudbration в (i) создавать новые функции, которые они найдут полезными, а (ii) попросить команду охватить функции уже в AWS API, но еще не в CF API, но еще не в CF API, но еще не в CF API Отказ Пользователи здесь также разделяют свои обходные пути для проблемы.
Есть и другие репозитории GitHub Roundmap, такие как этот для ECS Отказ Иногда пользователи также размещают запросы на функцию для CF в дорожной карте сервиса, которую они хотят добавить в CF.
(6) пользовательские ресурсы
Один из наиболее распространенного обходного пути для функциональных пробелов CF использует пользовательские ресурсы облака. По сути, мы создаем функцию лямбда, которая определяет код в Python (или любой поддерживаемый язык), который создает пользовательский ресурс. Таким образом, для синего/зеленого приведенного выше примера я могу создать скрипт BOTO3, который создает группу развертывания коде. Затем я развернул этот скрипт Boto3 в лямбде.
Затем в шаблоне CF мы будем ссылаться на этот пользовательский ресурс в поле «Тип». В поле «Свойства» мы обязаны определить свойство «ServiceToken», которая определяет арну функции лямбда. Остальные свойства являются входами, которые функция лямбда может использовать во время выполнения, чтобы создать пользовательский ресурс.
MyUseCustomLambda: Type: Custom::CodeDeployCustomGroup Version: "1.0" Properties: Name: UseCustomLambda ServiceToken: arn:aws:lambda:ap-southeast-1:account_id:function:ecs-codedeploy-bluegreen-macro-dev-hello ELBName: "" TG1Name: !Sub "${AWS::StackName}-blue-tg" TG2Name: !Sub "${AWS::StackName}-green-tg" GroupName: !Sub "${AWS::StackName}-deployment-group" ClusterName: !Ref EcsClusterName ServiceName: !Sub "${AWS::StackName}-service" ListenerArn: Fn::ImportValue: Fn::Sub: "${AANetworkStack}-LoadBalancerListenerArn" DeploymentStyle: BLUE_GREEN
Мы также можем создавать другие ресурсы с помощью CF пользовательских ресурсов. Например, мы можем использовать API GCP и создайте там сервер и имейте этот ресурс, созданный рядом с ресурсами AWS, предоставленных на сам сервере.
Это Средний пост Chris Hare Предоставляет отличное введение на пользовательские ресурсы.
Это все!
А ты? Каковы советы по настройке, которые вы можете поделиться с нами?
Я рад принять ваши комментарии/отзывы на этом посте. Просто комментируйте ниже, или напишите мне!
Особые благодаря Александре Дебгиве для Issplash Cover Image.
Оригинал: «https://dev.to/raphael_jambalos/customizable-cloudformation-templates-4l0e»