В постоянно развивающемся мире облачных сервисов возможность настраивать и адаптировать конфигурации - это не просто роскошь, а необходимость. Для разработчиков и бизнеса, стремящихся использовать экосистему AWS, Cloud Development Kit (CDK) стал бесценным инструментом. Он не только упрощает управление инфраструктурой, но и предоставляет программный способ развертывания ресурсов на AWS. Одним из таких ресурсов, часто требующих персонализации, является API Gateway.
В этой статье будет дана пошаговая инструкция настройки доменного имени для вашего HTTP Gateway с использованием AWS CDK. Независимо от того, являетесь ли вы опытным пользователем AWS или новичком, это руководство обещает предоставить ценную информацию и практические шаги для улучшения ваших навыков в области облачных сервисов.
Так что запасайтесь чашкой горячего кофе, и приступим к работе!
Типичная инфраструктура AWS
Давайте рассмотрим базовую инфраструктуру, которая широко используется в настоящее время. При работе над одним из проектов (TARGPatrol) мы придерживались аналогичного подхода, поскольку он позволяет создавать гибкие и мощные решения.
![Инфраструктура AWS Инфраструктура AWS](https://habrastorage.org/getpro/habr/upload_files/290/ae9/aa0/290ae9aa0279502cbb9d0cf7cd49c82a.png)
Что мы имеем:
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](https://habrastorage.org/getpro/habr/upload_files/2f9/fbc/d9f/2f9fbcd9f4912e7f25f695ab6a172240.png)
Далее вам нужно будет выбрать подходящее имя для своего пользовательского домена и приобрести его, если оно доступно. Процесс займет несколько минут, после чего вы сможете просмотреть свой домен в разделе Hosted Zones.
![Зоны хостинга AWS Зоны хостинга AWS](https://habrastorage.org/getpro/habr/upload_files/12f/116/784/12f11678484d05e471fed80c634b47a7.png)
Заказ сертификатов
После завершения регистрации домена следующим шагом будет получение сертификата для защиты трафика по протоколу HTTPS.
Хотя AWS CDK может облегчить заказ сертификата, это процесс можно выполнить отдельно. Зайдите в AWS Certificate Manager и выберите "Request". Выберите публичный сертификат. При появлении запроса на ввод доменного имени введите приобретенное ранее имя. Если требуется защитить поддомен, можно указать дополнительное имя, например subdomain.example.com. Кроме того, можно использовать подстановочные знаки типа *.example.com для защиты всех поддоменов основного домена. Выберите функцию DNS Validation для подтверждения связи между сертификатом и доменом. В этом процессе можно положиться на AWS: когда появится запрос на добавление подтверждающих DNS-записей, просто нажмите "ОК".
Генерация сертификата может занять несколько минут. После этого сертификат можно просмотреть на панели управления AWS Certificate Manager.
![Менеджер сертификатов AWS Менеджер сертификатов AWS](https://habrastorage.org/getpro/habr/upload_files/5d4/b4a/b43/5d4b4ab438b58832d2c526f99fedf2dc.png)
Чтобы интегрировать его в код AWS CDK, вам понадобится ARN. Просто нажмите на сертификат и скопируйте значение ARN.
![ARN (Amazon Resource Name) сертификата AWS ARN (Amazon Resource Name) сертификата AWS](https://habrastorage.org/getpro/habr/upload_files/cc6/fc8/faf/cc6fc8fafb7a50cb22a7aeabe9677353.png)
Я надеюсь, что вы знакомы с 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 лучшая, из всех которые я когда либо видел.