Observação
Atualmente, a filial principal contém a visualização alfa de implantações atômicas.
Para a última versão estável, consulte a ramificaçãov0.xConsulte a nossa postagem no blog "O caminho para implantações atômicas"
Ou assista à última revisão de lançamento para obter mais informações:
Um módulo Terraform de Config Zero para Sites Auto-Host.
Alguns recursos ainda estão em desenvolvimento, aqui está uma lista de recursos que são suportados atualmente e o que planejamos trazer com os próximos lançamentos:
v0.15+O módulo Next.JS Terraform foi projetado como um aplicativo AWS de pilha completa. Ele se baseia em vários serviços da AWS e os conecta para funcionar como um único aplicativo:

Você deve ter as seguintes ferramentas instaladas:
NOTA: Além disso, assumimos aqui que você já possui uma zona hospedada em rota pública 53 associada à sua conta da AWS.
Este é um requisito na fase de visualização das implantações atômicas, onde cada implantação recebe um subdomínio exclusivo atribuído. Ele mudará assim que as implantações atômicas se tornarem geralmente disponíveis.
O módulo Terraform contém o sistema que é usado posteriormente para criar novas implantações e gerenciar os aliases (domínios) para o seu próximo.js aplicativos. A criação da pilha Terraform é necessária apenas na configuração inicial e cria os recursos globais (distribuições CloudFront, Tabelas DynamoDB, armazenamento S3) usado para lidar com solicitações de entrada no seu site.
Crie um novo arquivo main.tf em uma pasta vazia (ou adicione -a à sua pilha de terraform existente) e adicione o seguinte conteúdo:
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
}Para criar os recursos em sua conta da AWS, execute os seguintes comandos:
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 " O api_endpoint é posteriormente usado pela ferramenta CLI para criar novas implantações.
Com a política api_endpoint_access_policy_arn AWS, você pode criar novos usuários (e atribuir essa política) que só podem usar a ferramenta CLI tf-next , mas não pode acessar outros recursos dentro da sua conta AWS.
Após a implantação bem cloudfront_domain_name , seu próximo aplicativo.
Para criar e implantar aplicativos Next.js para o sistema, criamos uma ferramenta CLI chamada tf-next .
É um pacote NPM que pode ser instalado com:
npm i -g tf-next@canary Em seguida, precisamos construir o Next.js para que ele possa ser executado em um ambiente sem servidor (com a AWS Lambda). Isso é arquivado executando tf-next build no mesmo diretório em que seu aplicativo Next.js está localizado (exatamente onde estão localizados os arquivos package.json ou next.config.js ):
tf-next build
> All serverless functions created in: 20.791ms
> 1752924 total bytes
> Build successful!
Agora implante o aplicativo Next.js, executando tf-next deploy no mesmo diretório. O comando implantação se comunica através de uma API segura (e autenticada com suas credenciais da AWS) com o módulo Terraform.
Para informar o comando onde implantar o aplicativo, um sinalizador adicional --endpoint deve ser fornecido, que deve usar o valor da saída api_endpoint da etapa do terraform apply :
tf-next deploy --endpoint https://<api-id>.execute-api.us-west-2.amazonaws.com
> Available at: https://3edade7a2bf7bb0343699af6b851bbfa.example.com/
A implantação de visualização agora pode ser acessada pelo URL exibido.
Para disponibilizar a implantação em um URL mais legível, você pode usar o subcomando tf-next alias :
tf-next alias set my-app.example.com 3edade7a2bf7bb0343699af6b851bbfa.example.com
> Available at: https://my-app.example.com/
Para obter uma lista completa de comandos disponíveis que podem ser usados com tf-next , verifique a referência de comando.
| Nome | Versão |
|---|---|
| Terraform | > = 0,15 |
| AWS | > = 4.8 |
| Nome | Versão |
|---|---|
| AWS | > = 4.8 |
| Nome | Descrição | Tipo | Padrão | Obrigatório |
|---|---|---|---|---|
| Cloudfront_acm_certificate_arn | Certificado ACM ARN para Custom_Domain | string | null | não |
| Cloudfront_aliases | Aliases para Custom_Domain | list(string) | [] | não |
| Cloudfront_cache_key_headers | Teclas de cabeçalho que devem ser usadas para calcular a tecla de cache no CloudFront. | list(string) | [[ | não |
| Cloudfront_create_distribution | Controla se a principal distribuição do CloudFront deve ser criada. | bool | true | não |
| Cloudfront_external_arn | Ao usar uma distribuição externa do CloudFront, forneça seu ARN. | string | null | não |
| Cloudfront_external_id | Ao usar uma distribuição externa do CloudFront, forneça seu ID. | string | null | não |
| Cloudfront_minimum_protocol_version | A versão mínima do protocolo SSL que você deseja que o CloudFront use para conexões HTTPS. Um dos SSLV3, TLSV1, TLSV1_2016, TLSV1.1_2016, TLSV1.2_2018 ou TLSV1.2_2019. | string | "TLSv1" | não |
| Cloudfront_origin_request_policy | ID de uma política de solicitação personalizada que substitui a política padrão (AllViewer). Pode ser personalizado ou gerenciado. | string | null | não |
| Cloudfront_price_class | Classe de preço para as distribuições CloudFront (Config Main & Proxy). Um de PriceClass_all, PriceClass_200, PriceClass_100. | string | "PriceClass_100" | não |
| CloudFront_Response_Headers_Policy | Id de uma política de cabeçalhos de resposta. Pode ser personalizado ou gerenciado. O padrão está vazio. | string | null | não |
| Cloudfront_webacl_id | Um ID opcional webacl2 ou webacl para se associar à distribuição CloudFront | string | null | não |
| create_image_otimization | Controla se os recursos para o suporte a otimização de imagem devem ser criados ou não. | bool | true | não |
| Debug_use_local_packages | Use pacotes construídos localmente em vez de baixá -los no NPM. | bool | false | não |
| implantação_name | Identificador para o grupo de implantação (apenas caracteres alfanuméricos e hífens minúsculos são permitidos). | string | "tf-next" | não |
| enable_multiple_deploymentments | Controla se deve ser possível executar várias implantações em paralelo (requer múltiplo_deploamentos_base_domain). | bool | false | não |
| Image_Optimization_lambda_memory_size | Quantidade de memória no MB A função Lambda do trabalhador para otimização de imagem pode usar. Valor válido entre 128 Mb a 10.240 MB, em incrementos de 1 MB. | number | 2048 | não |
| lambda_attach_policy_json | Se deve implantar políticas adicionais de Lambda JSON. Se false, lambda_policy_json não será anexado à função Lambda. (Necessário, pois as seqüências políticas são conhecidas apenas após a aplicação ao usar o TerraForms Data.AWS_IAM_POLICY_DOCUMENT) | bool | false | não |
| lambda_attach_to_vpc | Defina como true se as funções Lambda deverão ser anexadas a um VPC. Use essa configuração se os recursos VPC deverão ser acessados pelas funções Lambda. Ao definir isso como true, use VPC_Security_Group_Ids e VPC_SUBNET_IDS para especificar a rede VPC. Observe que o anexo a um VPC introduziria um atraso em partidas frias | bool | false | não |
| lambda_policy_json | Documento de política adicional como JSON para anexar à função de função lambda | string | null | não |
| Lambda_ROLE_PERMISSIONS_BOUNDARY | Política do IAM que esconde o AWS_IAM_ROLE Acesso para o Lambda | string | null | não |
| MULTION_DEPLAPELAÇÕES_BASE_DOMAIN | Domínio de curinga padrão onde novas implantações devem estar disponíveis. Deve estar na forma de *.example.com. | string | null | não |
| tags | Tag metadados para rotular recursos da AWS que suportam tags. | map(string) | {} | não |
| tags_s3_bucket | Tag metadados para rotular baldes AWS S3. Substitui tags com o mesmo nome nas tags variáveis de entrada. | map(string) | {} | não |
| VPC_Security_Group_Ids | A lista de IDs do grupo de segurança a serem usados pelas funções Lambda. lambda_attach_to_vpc deve ser definido como true para que sejam aplicados. | list(string) | [] | não |
| VPC_SUBNET_IDS | A lista de IDs de sub -rede VPC para anexar as funções Lambda. lambda_attach_to_vpc deve ser definido como true para que sejam aplicados. | list(string) | [] | não |
| Nome | Descrição |
|---|---|
| api_endpoint | Endpoint da API que é usado pela CLI. |
| api_endpoint_access_policy_arn | ARN da política que concede acesso ao terminal da API. |
| CloudFront_Custom_error_Response | Resposta de erro personalizado pré -configurado A distribuição do CloudFront deve usar. |
| Cloudfront_default_cache_behavior | Comportamento de cache padrão pré -configurado A distribuição do CloudFront deve usar. |
| Cloudfront_default_root_object | Objeto raiz pré -configurado A distribuição CloudFront deve usar. |
| CloudFront_Domain_Name | Domínio da distribuição principal do CloudFront (quando criado). |
| Cloudfront_hosted_zone_id | ID da zona da distribuição principal do CloudFront (quando criado). |
| Cloudfront_ordered_cache_behaviors | Comportamentos de cache ordenados pré -configurados A distribuição do CloudFront deve usar. |
| Cloudfront_origins | Origens pré -configuradas que a distribuição do CloudFront deve usar. |
| upload_bucket_id | n / D |
Sob o capô, este módulo usa muito do pipeline de Build da Vercel. Portanto, é provável que os problemas que existam no Vercel também ocorram neste projeto.
A exclusão da pilha ( terraform destroy ) falha na primeira corrida (Terraform-Provider-AWS#1721)
Isso é intencional porque não podemos excluir uma função Lambda@Edge (usada pelo módulo proxy) de maneira síncrona. Pode levar até uma hora para que a AWS desbloqueie uma função Lambda@Edge da distribuição do CloudFront, mesmo quando a distribuição já está destruída.
Solução alternativa:
Depois de executar o comando inicial terraform destroy (que falhou), espere ~ 1 hora e execute o comando novamente. Desta vez, ele deve ser executado com sucesso e excluir o restante da pilha.
Aplicar inicial falha com Error: error creating Lambda Event Source Mapping (#138)
Há alguma condição de corrida quando as permissões são criadas para a implantação estática Lambda. Isso só deve acontecer na primeira implantação.
Solução alternativa:
Você deve ser capaz de executar terraform apply novamente e a criação da pilha prosseguiria sem esse erro.
As contribuições são bem -vindas!
Se você deseja melhorar este módulo, consulte nossas diretrizes contribuintes para começar.
Este projeto é mantido pela infraestrutura do Millivolt.
Criamos soluções de infraestrutura personalizadas para qualquer provedor de nuvem.
Apache -2.0 - Consulte Licença para obter detalhes.
NOTA: Todos os projetos de amostra em
examples/*são licenciados como MIT para cumprir os exemplos oficiais do próximo.JS.