Примечание
Основная филиал в настоящее время содержит атомный предварительный просмотр развертываний.
Для самого последнего стабильного выпуска посетите ветвьv0.xПожалуйста, посмотрите наш пост в блоге "Дорога к атомным развертываниям"
или посмотрите последний обзор выпуска для получения дополнительной информации:
Модуль Terraform с нулевым конфигуртом для самостоятельного управления.
Некоторые функции все еще находятся в стадии разработки, вот список функций, которые в настоящее время поддерживаются, и то, что мы планируем принести с следующими выпусками:
v0.15+Следующий модуль Terraform Next.js разработан в виде полного приложения AWS. Он опирается на несколько сервисов AWS и подключает их к работе в качестве единого приложения:

У вас должны быть установлены следующие инструменты:
Примечание. Дополнительно мы предполагаем, что у вас уже есть общедоступная зона, размещенная на Route53, связанную с вашей учетной записью AWS.
Это является требованием на этапе предварительного просмотра атомных развертываний, где каждое развертывание получает уникальный субдомен. Это изменится, как только атомные развертывания станут в целом доступны.
Модуль Terraform содержит систему, которая впоследствии используется для создания новых развертываний и управления псевдонимом (доменов) для вашего приложения следующего.js. Создание стека Terraform требуется только при начальной настройке и создает глобальные ресурсы (Dynable Distails, DynamoDB, хранилище S3), которые используются для обработки входящих запросов на ваш веб -сайт.
Создайте новый файл main.tf в пустой папке (или добавьте его в существующий стек Terraform) и добавьте следующее содержимое:
terraform {
required_providers {
aws = {
source = " hashicorp/aws "
version = " ~> 4.0 "
}
}
}
# Main region where the resources should be created in
# Should be close to the location of your viewers
provider "aws" {
region = " us-west-2 "
}
# Provider used for creating the Lambda@Edge function which must be deployed
# to us-east-1 region (Should not be changed)
provider "aws" {
alias = " global_region "
region = " us-east-1 "
}
# ##########
# Variables
# ##########
variable "custom_domain" {
description = " Your custom domain "
type = string
default = " example.com "
}
# Assuming that the ZONE of your domain is already available in your AWS account (Route 53)
# https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/AboutHZWorkingWith.html
variable "custom_domain_zone_name" {
description = " The Route53 zone name of the custom domain "
type = string
default = " example.com. "
}
# #######
# Locals
# #######
locals {
# A wildcard domain(ex: *.example.com) has to be added when using atomic deployments:
aliases = [ var . custom_domain , " *. ${ var . custom_domain } " ]
}
# ######################
# Route53 Domain record
# ######################
# Get the hosted zone for the custom domain
data "aws_route53_zone" "custom_domain_zone" {
name = var . custom_domain_zone_name
}
# Create a new record in Route 53 for the domain
resource "aws_route53_record" "cloudfront_alias_domain" {
for_each = toset (local . aliases )
zone_id = data . aws_route53_zone . custom_domain_zone . zone_id
name = each . key
type = " A "
alias {
name = module . tf_next . cloudfront_domain_name
zone_id = module . tf_next . cloudfront_hosted_zone_id
evaluate_target_health = false
}
}
# #########
# SSL Cert
# #########
# Creates a free SSL certificate for CloudFront distribution
# For more options (e.g. multiple domains) see:
# https://registry.terraform.io/modules/terraform-aws-modules/acm/aws/
module "cloudfront_cert" {
source = " terraform-aws-modules/acm/aws "
version = " ~> 3.0 "
domain_name = var . custom_domain
zone_id = data . aws_route53_zone . custom_domain_zone . zone_id
subject_alternative_names = slice (local . aliases , 1 , length (local . aliases ))
wait_for_validation = true
tags = {
Name = " CloudFront ${ var . custom_domain } "
}
# CloudFront works only with certs stored in us-east-1
providers = {
aws = aws.global_region
}
}
# #########################
# Terraform Next.js Module
# #########################
module "tf_next" {
source = " milliHQ/next-js/aws "
version = " 1.0.0-canary.4 "
cloudfront_aliases = local . aliases
cloudfront_acm_certificate_arn = module . cloudfront_cert . acm_certificate_arn
deployment_name = " atomic-deployments "
enable_multiple_deployments = true
multiple_deployments_base_domain = " *. ${ var . custom_domain } "
providers = {
aws.global_region = aws.global_region
}
}
# ########
# Outputs
# ########
output "api_endpoint" {
value = module . tf_next . api_endpoint
}
output "api_endpoint_access_policy_arn" {
value = module . tf_next . api_endpoint_access_policy_arn
}Чтобы создать ресурсы в вашей учетной записи AWS, запустите следующие команды:
terraform init # Only needed on the first time running Terraform
terraform plan # (Optional) See what resources Terraform will create
terraform apply # Create the resources in your AWS account
> Apply complete !
>
> Outputs:
>
> api_endpoint = " https://<api-id>.execute-api.us-west-2.amazonaws.com "
> api_endpoint_access_policy_arn = " arn:aws:iam::123456789012:policy/access-api " Позже api_endpoint используется инструментом CLI для создания новых развертываний.
С помощью политики api_endpoint_access_policy_arn AWS вы можете создать новых пользователей (и назначить эту политику), которые могут использовать только инструмент CLI tf-next но не может получить доступ к другим ресурсам внутри вашей учетной записи AWS.
После успешного развертывания ваше приложение Next.js публично доступно в поддоде CloudFront от вывода cloudfront_domain_name .
Для создания и развертывания приложений Next.js для системы мы создали инструмент CLI под названием tf-next .
Это пакет NPM, который можно установить с:
npm i -g tf-next@canary Затем нам нужно построить следующую. JS, чтобы он мог работать в без серверной среде (с AWS Lambda). Это архивируется путем запуска tf-next build в том же каталоге, где находится ваше приложение Next.js (прямо там, где next.config.js ваш package.json .
tf-next build
> All serverless functions created in: 20.791ms
> 1752924 total bytes
> Build successful!
Теперь разверните приложение Next.js, запустив tf-next deploy из того же каталога. Команда Deploy сообщает через обеспеченный (и аутентифицирован с вашим учетным API API) с модулем Terraform.
Чтобы сказать команде, где развернуть приложение, должен быть предоставлен дополнительный флаг --endpoint , который должен использовать значение из вывода api_endpoint из terraform apply Step:
tf-next deploy --endpoint https://<api-id>.execute-api.us-west-2.amazonaws.com
> Available at: https://3edade7a2bf7bb0343699af6b851bbfa.example.com/
Предварительное развертывание теперь можно получить с помощью отображаемого URL -адреса.
Чтобы сделать развертывание доступным из более читаемого URL, вы можете использовать подкоманду tf-next alias :
tf-next alias set my-app.example.com 3edade7a2bf7bb0343699af6b851bbfa.example.com
> Available at: https://my-app.example.com/
Для полного списка доступных команд, которые можно использовать с tf-next , проверьте ссылку на команду.
| Имя | Версия |
|---|---|
| терраформ | > = 0,15 |
| AWS | > = 4,8 |
| Имя | Версия |
|---|---|
| AWS | > = 4,8 |
| Имя | Описание | Тип | По умолчанию | Необходимый |
|---|---|---|---|---|
| CloudFront_acm_certificate_arn | Сертификат ACM ARN для custom_domain | string | null | нет |
| Cloudfront_aliases | Псевдонимы для custom_domain | list(string) | [] | нет |
| CloudFront_Cache_key_headers | Клавиши заголовка, которые следует использовать для расчета клавиши кэша в CloudFront. | list(string) | [ | нет |
| CloudFront_create_distribution | Управляет, должно ли создать основное распределение Cloudfront. | bool | true | нет |
| CloudFront_External_arn | При использовании внешнего распределения облаков предоставьте свой ARN. | string | null | нет |
| CloudFront_External_id | При использовании внешнего распределения облаков предоставьте свой идентификатор. | string | null | нет |
| CloudFront_minimum_protocol_version | Минимальная версия протокола SSL, которую вы хотите использовать для CloudFront для подключений HTTPS. Один из SSLV3, TLSV1, TLSV1_2016, TLSV1.1_2016, TLSV1.2_2018 или TLSV1.2_2019. | string | "TLSv1" | нет |
| CloudFront_origin_Request_policy | ID пользовательской политики запроса, которая переопределяет политику по умолчанию (AllViewer). Может быть пользовательским или управляемым. | string | null | нет |
| CloudFront_price_class | Класс ценой для распределений CloudFront (Main & Proxy Config). Один из Priceclass_all, PriCeclass_200, PriCeclass_100. | string | "PriceClass_100" | нет |
| CloudFront_Response_headers_policy | ID политики заголовков ответов. Может быть пользовательским или управляемым. По умолчанию пусто. | string | null | нет |
| CloudFront_Webacl_id | Дополнительный идентификатор webACL2 ARN или WebACL для связи с дистрибуцией CloudFront | string | null | нет |
| create_image_optimization | Управляют, должны ли ресурсы для поддержки оптимизации изображений или нет. | bool | true | нет |
| debug_use_local_packages | Используйте локально построенные пакеты, а не загружайте их из NPM. | bool | false | нет |
| deployment_name | Идентификатор для группы развертывания (разрешены только буквенно -цифровые символы и дефисы). | string | "tf-next" | нет |
| enable_multiple_deployments | Управляет, должно ли быть возможно запускать несколько развертываний параллельно (требуется несколько_deployments_base_domain). | bool | false | нет |
| image_optimization_lambda_memory_size | Количество памяти в MB. Работник Lambda функция для оптимизации изображений может использовать. Допустимое значение от 128 МБ до 10 240 МБ с шагом 1 МБ. | number | 2048 | нет |
| lambda_attach_policy_json | Развернуть дополнительную политику Lambda JSON. Если false, lambda_policy_json не будет прикреплен к функции Lambda. (Необходимо, поскольку строки политики известны только после применения при использовании Terraforms Data.aws_iam_policy_document) | bool | false | нет |
| lambda_attach_to_vpc | Установите True, если функции Lambda должны быть прикреплены к VPC. Используйте этот параметр, если функции Lambda должны получить доступ к ресурсам VPC. При настройке этого на true используйте vpc_security_group_ids и vpc_subnet_ids, чтобы указать сеть VPC. Обратите внимание, что прикрепление к VPC введет задержку с холодными запусками | bool | false | нет |
| Lambda_policy_json | Дополнительный политический документ как JSON для прикрепления к функциональной роли Lambda | string | null | нет |
| lambda_role_permissions_boundary | Arn of Iam Policy, которая подключает доступ к AWS_IAM_ROLE для лямбды | string | null | нет |
| Multiple_deployments_base_domain | Домен подстановочного знака по умолчанию, где должны быть доступны новые развертывания. Должен быть в форме *.example.com. | string | null | нет |
| теги | Теги метаданных для маркировки ресурсов AWS, которые поддерживают теги. | map(string) | {} | нет |
| TAGS_S3_Bucket | Метки метки для маркировки ведер AWS S3. Переопределяет теги с тем же именем в тегах входных переменных. | map(string) | {} | нет |
| vpc_security_group_ids | Список идентификаторов группы безопасности, которые будут использоваться функциями Lambda. lambda_attach_to_vpc должен быть установлен на True для применения. | list(string) | [] | нет |
| vpc_subnet_ids | Список идентификаторов подсети VPC для подключения функций Lambda. lambda_attach_to_vpc должен быть установлен на True для применения. | list(string) | [] | нет |
| Имя | Описание |
|---|---|
| api_endpoint | Конечная точка API, которая используется CLI. |
| API_ENDPOINT_ACCESS_POLICY_ARN | Арн политики, которая предоставляет доступ к конечной точке API. |
| CloudFront_custom_error_response | Предварительно сконфигурированный пользовательский ответ на ошибку. Распределение CloudFront должно использовать. |
| CloudFront_Default_cache_behavior | Предварительно сконфигурированное поведение кеша по умолчанию. Распределение CloudFront должно использовать. |
| CloudFront_Default_Root_Object | Предварительно сконфигурированный корневой объект. Распределение CloudFront должно использовать. |
| CloudFront_Domain_Name | Домен основного распределения облаков (при создании). |
| CloudFront_hosted_zone_id | Идентификатор зоны основного распределения облаков (при создании). |
| CloudFront_ordered_cache_behaviors | Предварительно сконфигурированное упорядоченное поведение кэша. Распределение Cloudfront должно использовать. |
| Cloudfront_origins | Предварительно сконфигурированное происхождение. Распределение Cloudfront должно использовать. |
| upload_bucket_id | n/a |
Под капотом этот модуль использует много конвейера Vercel. Таким образом, проблемы, которые существуют в Vercel, могут возникнуть и в этом проекте.
Удаление стека ( terraform destroy ) терпит неудачу при первом забеге (Terraform-Provider-AWS#1721)
Это намеренно, потому что мы не можем удалить функцию лямбда@Edge (используемой прокси -модулем) синхронно. Для AWS может потребоваться до часа, чтобы выяснить функцию лямбда@Edge из его распределения CloudFront, даже когда распределение уже уничтожено.
Обходной путь:
После запуска первоначальной команды terraform destroy (которая не удалась) подождите ~ 1 час и запустите команду снова. На этот раз он должен успешно работать и удалить остальную часть стека.
Первоначальное применение сбоя с ошибкой сообщения Error: error creating Lambda Event Source Mapping (#138)
Существует некоторое условие гонки, когда разрешения создаются для статического развертывания Lambda. Это должно происходить только при первом развертывании.
Обходной путь:
Вы должны иметь возможность запустить terraform apply , и создание стека будет продолжаться без этой ошибки.
Взносы приветствуются!
Если вы хотите улучшить этот модуль, посмотрите на наши рекомендации по внесению вклад, чтобы начать работу.
Этот проект поддерживается Millivolt Infrastructure.
Мы создаем пользовательские инфраструктурные решения для любого облачного провайдера.
Apache -2.0 - См. Лицензию для деталей.
ПРИМЕЧАНИЕ. Все образцы проектов в
examples/*лицензированы в качестве MIT для выполнения официальных примеров Next.js.