В постоянно развивающемся мире облачных сервисов возможность настраивать и адаптировать конфигурации - это не просто роскошь, а необходимость. Для разработчиков и бизнеса, стремящихся использовать экосистему AWS, Cloud Development Kit (CDK) стал бесценным инструментом. Он не только упрощает управление инфраструктурой, но и предоставляет программный способ развертывания ресурсов на AWS. Одним из таких ресурсов, часто требующих персонализации, является API Gateway.

В этой статье будет дана пошаговая инструкция настройки доменного имени для вашего HTTP Gateway с использованием AWS CDK. Независимо от того, являетесь ли вы опытным пользователем AWS или новичком, это руководство обещает предоставить ценную информацию и практические шаги для улучшения ваших навыков в области облачных сервисов.

Так что запасайтесь чашкой горячего кофе, и приступим к работе!

Типичная инфраструктура AWS

Давайте рассмотрим базовую инфраструктуру, которая широко используется в настоящее время. При работе над одним из проектов (TARGPatrol) мы придерживались аналогичного подхода, поскольку он позволяет создавать гибкие и мощные решения.

Инфраструктура AWS
Инфраструктура AWS

Что мы имеем:

  • AWS VPC позволяет сгруппировать всю инфраструктуру в изолированную виртуальную сеть. Эта виртуальная сеть отражает обычную сеть, которой вы управляете в своем собственном дата-центре, но при этом использует масштабируемую инфраструктуру AWS.

  • AWS API Gateway — это полностью управляемый сервис, который упрощает для разработчиков процесс создания, поддержки, контроля и защиты API независимо от его размера. Этот инструмент, служащий "точкой входа" для приложений, позволяющий получать данные или использовать бизнес-логику из бэкенд-сервисов, позволяет создавать как RESTful, так и WebSocket API. Кроме того, API Gateway совместим с контейнерными, бессерверными и традиционными веб-нагрузками. Существуют два типа шлюзов: REST и HTTP Gateway. REST более дорогой и предоставляет дополнительный функционал, например, Client-Edge оптимизацию, дополнительные настройки безопасности. HTTP Gateway более простой и напоминает Nginx.

  • AWS Route 53 — это надежный и масштабируемый веб-сервис системы доменных имен (DNS). Он направляет запросы пользователей к веб-приложениям, размещенным на AWS либо в локальных установках. Кроме того, AWS Route 53 позволяет регистрировать и привязывать личные домены к вашему AWS API Gateway.

  • AWS Lambda — это бессерверный вычислительный сервис, который облегчает выполнение кода практически для любого приложения или бэкенд-процесса без необходимости управления сервером. Lambda может быть активирован более чем 200 сервисами AWS и SaaS-приложениями, что позволяет платить только за фактическое использование.

Использование AWS Lambda не является обязательным. В качестве альтернативы можно использовать такие сервисы, как EC2, ECS или EKS.

В обширном мире облачных сервисов инфраструктура как код (IAC) заняла значительную нишу. AWS Cloud Development Kit (CDK), собственная разработка Amazon в этой области, представляет собой смену парадигмы мышления в отношении облачных ресурсов.

Что такое AWS CDK?

AWS CDK - это платформа разработки программного обеспечения с открытым исходным кодом, позволяющая определять облачную инфраструктуру в коде и предоставлять ее через AWS CloudFormation. В отличие от традиционного CloudFormation, где разработчики пишут громоздкие шаблоны YAML или JSON, в CDK они могут использовать возможности современных языков программирования, таких как TypeScript, Python, Java или C#. Это обеспечивает возможность повторного использования и более интуитивный опыт разработки.

Преимущества AWS CDK:

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

  • Многократно используемые компоненты: CDK вводит концепцию конструктов - готовых частей облачной инфраструктуры. Это позволяет сократить количество повторяющегося кода и сосредоточиться на уникальных аспектах конкретного проекта.

  • Строгая валидация: Используя возможности основных языков программирования, CDK заранее предоставляет обратную связь с помощью IDE, что упрощает выявление проблем до этапа развертывания.

  • Бесшовная интеграция с сервисами AWS: Благодаря своей "родной" природе CDK легко интегрируется с обширной экосистемой AWS, что позволяет без труда включать в инфраструктуру различные сервисы AWS.

  • Лучшие практики: AWS CDK имеет встроенные настройки по умолчанию, которые соответствуют лучшим практикам AWS, обеспечивая оптимальные конфигурации и безопасность.

  • Гибкость: Хотя CDK предлагает высокоуровневые компоненты для быстрой настройки, у разработчиков также есть возможность при необходимости углубиться и настроить низкоуровневые ресурсы.

Вся инфраструктура TARGParol была построена с использованием AWS CDK/TypeScript, и у нашей команды не возникло с ней никаких проблем.

Подготовка

Для начала необходимо выбрать и зарегистрировать пользовательский домен. Хотя это можно сделать через различных провайдеров, таких как GoDaddy, Cloudflare и т.д., и впоследствии передать управление DNS в AWS, я продемонстрирую, как это сделать непосредственно в AWS.

Перейдите в раздел Route 53 Service и выберите Domains -> Registered domains. 

Регистрация домена AWS
Регистрация домена AWS

Далее вам нужно будет выбрать подходящее имя для своего пользовательского домена и приобрести его, если оно доступно. Процесс займет несколько минут, после чего вы сможете просмотреть свой домен в разделе Hosted Zones.

Зоны хостинга AWS
Зоны хостинга AWS

Заказ сертификатов

После завершения регистрации домена следующим шагом будет получение сертификата для защиты трафика по протоколу HTTPS. 

Хотя AWS CDK может облегчить заказ сертификата, это процесс можно выполнить отдельно. Зайдите в AWS Certificate Manager и выберите "Request". Выберите публичный сертификат. При появлении запроса на ввод доменного имени введите приобретенное ранее имя. Если требуется защитить поддомен, можно указать дополнительное имя, например subdomain.example.com. Кроме того, можно использовать подстановочные знаки типа *.example.com для защиты всех поддоменов основного домена. Выберите функцию DNS Validation для подтверждения связи между сертификатом и доменом. В этом процессе можно положиться на AWS: когда появится запрос на добавление подтверждающих DNS-записей, просто нажмите "ОК".

Генерация сертификата может занять несколько минут. После этого сертификат можно просмотреть на панели управления AWS Certificate Manager.

Менеджер сертификатов AWS
Менеджер сертификатов AWS

Чтобы интегрировать его в код AWS CDK, вам понадобится ARN. Просто нажмите на сертификат и скопируйте значение ARN.

ARN (Amazon Resource Name) сертификата AWS
ARN (Amazon Resource Name) сертификата AWS

Я надеюсь, что вы знакомы с AWS CDK. Если нет, то для того, чтобы сделать первые шаги, можно воспользоваться отличной статьей. Вкратце, вам просто нужно установить AWS CDK CLI и создать новый проект.

Первое, что необходимо определить в стеке AWS CDK, - это VPC. Его можно создать с помощью всего нескольких строк кода:

const vpc = new Vpc(this, "VPC", {
 vpcName: "VpcName",
 ipAddresses: IpAddresses.cidr("10.0.0.0/16"),
 subnetConfiguration: [
   { name: 'Public', cidrMask: 24, subnetType: SubnetType.PUBLIC },
   {
     name: 'Private',
     cidrMask: 24,
     subnetType: SubnetType.PRIVATE_WITH_EGRESS,
   },
   {
     name: 'Isolated',
     cidrMask: 24,
     subnetType: SubnetType.PRIVATE_ISOLATED,
   },
 ],
});

Здесь мы создаем новый VPC с тремя подсетями. Хотя это не имеет прямого отношения к теме статьи, разумно подготовиться к любым дополнительным ресурсам, которые вы, возможно, захотите использовать в будущем. Обратите внимание, что natGateways не имеет значения, если мы используем Lambda в качестве бэкенда. Однако если вы планируете развернуть экземпляры EC2 или ECS/EKS и дать им доступом в Интернет, то как минимум один natGateway необходим.

Нам понадобится несколько констант из ресурсов, которые были созданы вручную:

const domainName = "targpatrol.xyz";
const hostedZoneId = "Z01395012LPLFQI32IEEA";
const certArn =
"arn:aws:acm:us-east-1:988135634994:certificate/496295d2-317a-4622-85a2-4cc5b6ea6519";
const lambdaRepository = "111122223333.dkr.ecr.us-east-1.amazonaws.com";

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

Теперь можно импортировать 'HostedZone' и создать новый домен. Кроме того, необходимо настроить DNS-запись, которая будет направлять трафик на API gateway, что мы и сделаем на следующем этапе.

const hostedZoned = HostedZone.fromHostedZoneAttributes(
 this,
 "HostedZone",
 {
   zoneName: props.domainName,
   hostedZoneId: props.hostedZoneId,
 }
);


const domainName = new DomainName(this, "DomainName", {
 domainName: props.domainName,
 certificate: Certificate.fromCertificateArn(
   this,
   "Certificate",
   props.certArn
 ),
 securityPolicy: SecurityPolicy.TLS_1_2,
});


new ARecord(this, "DnsRecord", {
 zone: hostedZoned,
 recordName: props.domainName,
 target: RecordTarget.fromAlias(
   new ApiGatewayv2DomainProperties(
     domainName.regionalDomainName,
     domainName.regionalHostedZoneId
   )
 ),
});

Настроив домен и DNS, мы можем приступить к работе с HTTP API Gateway. Но сначала давайте создадим простую функцию Lambda в качестве бэкенда.

const lambda = new DockerImageFunction(this, "LambdaFunction", {
 functionName: "FunctionName",
 code: DockerImageCode.fromEcr(
   Repository.fromRepositoryName(
     this,
     "LambdaRepository",
     props.lambdaRepository
   ),
   { tagOrDigest: "latest" }
 ),
});

В завершение необходимо настроить HTTP API Gateway и подключить к нему купленный домен. Как уже говорилось ранее, AWS предлагает различные типы API Gateway, включая HTTP API и REST API. Если говорить коротко, то REST API предоставляет больше возможностей, но его стоимость в три раза выше. HTTP API можно сравнить с базовым прокси-сервисом nginx, обеспечивающим контроль над HTTP(S) трафиком. В данном руководстве я буду рассматривать HTTP API Gateway.

const gateway = new HttpApi(this, "HttpApiGateway", {
 disableExecuteApiEndpoint: true,
 defaultDomainMapping: {
   domainName,
 },
});


gateway.addRoutes({
 path: "/api/v1/test",
 methods: [HttpMethod.POST],
 integration: new HttpLambdaIntegration("LambdaIntegration", lambda),
});

В заключение: Достоинства AWS CDK

Работа в экосистеме AWS поначалу может показаться сложной, но такие инструменты, как AWS CDK, специально разработаны для упрощения и оптимизации процессов. Позволяя разработчикам использовать привычные языки программирования и предоставляя интуитивно понятную структуру для определения и развертывания облачной инфраструктуры, AWS CDK действительно коренным образом меняет процесс разработки облачных решений.

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

Использование AWS CDK - шаг в будущее облачного развертывания, где гибкость сочетается с эффективностью. Как всегда, постоянное обучение и адаптация являются ключом к использованию всего потенциала любого инструмента, и AWS CDK не является исключением.

Благодарим вас за то, что присоединились к нам в этом исследовании мира AWS CDK. Мы призываем вас погружаться, экспериментировать и делиться своим опытом с широким сообществом разработчиков. Приятного кодирования!

P.S. Весь код можно найти в репозитории по ссылке

P.S.S. Нет смысла обсуждать, что лучше Terraform CDK или AWS CDK, так как AWS CDK заточен только под AWS. С другой стороны, документация от AWS лучшая, из всех которые я когда либо видел.

Комментарии (4)


  1. Algrinn
    28.10.2023 12:16
    +2

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


    1. BeQuick Автор
      28.10.2023 12:16
      +2

      Тут я с вами не соглашусь, так как у меня довольно большой опыт работы с другими облачными провайдерами, а именно: Digital Ocean, GCP, Yandex Cloud. Какие-то недостатки есть у каждого, но и плюсы свои тоже есть. Например, Digital Ocean предлагает очень понятную ценовую политику. А Яндекс просто дешевле.

      На мой взгляд, AWS реально очень выгодно использовать, если:

      • решение уже зрелое, понятна текущая потребность в ресурсах, а так же прогноз на ближайшие 1-3 года, тогда предоплаченные планы делают AWS самым дешевым решением из всех

      • есть потребность в специальных инструментах, например, AWS Athena или что-то подобное, чего нет у конкуретнов / работает хуже

      • небольшие стартапы, тогда AWS Free Tier может немного сэкономить денег


      1. smarthomeblog
        28.10.2023 12:16

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

        Лично я бы даже используя AWS использовал бы Terraform для развертывания инфрастурктуры. CloudFormation и AWS CDK поянтное дело предоставляют больше возможностей. Но с Terraform будет гораздо проще перейти куда-то еще. Плюс Terrafrom позволяет не только с облаками работаеть, но и с сервисом логов Sumo Logic, к примеру, или Grafana.

        За статью - спасибо! Познавательно


        1. BeQuick Автор
          28.10.2023 12:16

          Спасибо, я не совсем так вопрос понял.

          Действительно, при разработке решений я стараюсь не привязываться к конкретному облачному провайдеру, более того, желательно иметь возможность запустить все решение в тестовой / демо версии на обычном голом железе без каких-либо технологий со стороны облачного провайдера, используя только open-source решения. В идеале, чтобы можно было все запустить из обычного docker compose.

          Например:

          • Lambda могут быть завернуты в свои docker контейнеры с разными триггерами ( cron, sqs consumer, http server и т д) -- фактически получается имитация лямбды функции

          • SQS можно заменить на ElasticMQ

          • S3 можно заменить на minio

          • Вместо Congnito можно использовать Keycloak

            и т.д.

          Localstack при этом я не использую, чтобы точно отмежеваться от AWS.

          Это добавляет больше работы, вопросов с тестированием и т.д., но есть 2 больших плюса:

          • легко разрабатывать локально

          • нет зависимости от облачного провайдера

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

          В результате решение может быть перенесено на любую платформу.

          Касательно, Terraform. В целом согласен, как мне кажется, было бы хорошо, чтобы остался только Terraform как стандарт. Но я думаю, что для этого еще надо несколько лет. AWS CDK более зрелое решение, уже вторая версия, пусть и только под AWS. Terrafrom еще только 0.19.0. Хотя возможно, что все будет так как и с react-native, где релизной версии полноценной нет, но cотни тысяч приложений уже разработаны и давно хорошо работают.