Notiz
Der Hauptzweig enthält derzeit die Atomic Deployments Alpha Preview.
Für die neueste stabile Version sehen Sie sich diev0.x-Zweigstelle an.Bitte beachten Sie unseren Blog -Beitrag "Der Weg zu atomaren Einsätzen".
Oder sehen Sie sich die neueste Release -Bewertung an, um weitere Informationen zu erhalten:
Ein Terraformmodul mit Null-Config-Modul zum Selbsthosting Next.js Sites serverlos auf AWS Lambda.
Einige Funktionen befinden sich noch in der Entwicklung. Hier finden Sie eine Liste von Funktionen, die derzeit unterstützt werden und was wir mit den nächsten Veröffentlichungen mitbringen möchten:
v0.15+Das nächste.js -Terraform -Modul ist als vollständige Stack AWS -App gestaltet. Es stützt sich auf mehrere AWS -Dienste und verbindet sie mit einer einzigen Anwendung:

Sie sollten die folgenden Tools installieren lassen:
Hinweis: Zusätzlich nehmen wir hier an, dass Sie bereits eine öffentliche Route53 -Hosted -Zone mit Ihrem AWS -Konto zugeordnet haben.
Dies ist eine Voraussetzung in der Vorschauphase der Atombereitstellungen, in der jede Bereitstellung eine eindeutige Subdomain zugewiesen wird. Es wird sich ändern, sobald atomare Bereitstellungen im Allgemeinen verfügbar sind.
Das Terraform -Modul enthält das System, das später zum Erstellen neuer Bereitstellungen und Verwaltung der Aliase (Domains) für Ihre nächsten.js -App (en) verwendet wird. Das Erstellen des Terraform -Stacks ist nur für das Erstaufbau erforderlich und erstellt die globalen Ressourcen (CloudFront -Verteilungen, DynamoDB -Tabellen, S3 -Speicher), die zum Umgang mit eingehenden Anforderungen auf Ihre Website verwendet werden.
Erstellen Sie eine neue main.tf -Datei in einem leeren Ordner (oder fügen Sie sie zu Ihrem vorhandenen Terraform -Stack hinzu) und fügen Sie den folgenden Inhalt hinzu:
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
}Führen Sie die folgenden Befehle aus, um die Ressourcen in Ihrem AWS -Konto zu erstellen:
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 " Der api_endpoint wird später vom CLI -Tool zum Erstellen neuer Bereitstellungen verwendet.
Mit der AWS-Richtlinie api_endpoint_access_policy_arn können neue Benutzer erstellen (und diese Richtlinie zuweisen), die nur das CLI-Tool tf-next verwenden können, aber nicht auf andere Ressourcen in Ihrem AWS-Konto zugreifen können.
Nach der erfolgreichen Bereitstellung ist Ihre nächste cloudfront_domain_name
Für das Erstellen und Bereitstellen von nächsten.js-Apps für das System haben wir ein CLI-Tool namens tf-next erstellt.
Es ist ein NPM -Paket, das mit:
npm i -g tf-next@canary Als nächstes müssen wir die nächsten.js erstellen, damit es in einer serverlosen Umgebung (mit AWS Lambda) ausgeführt werden kann. Dies wird archiviert, indem tf-next build im selben Verzeichnis ausgeführt wird, in dem sich Ihre nächste.js-App befindet (genau dort, wo sich Ihr package.json oder next.config.js Dateien befindet):
tf-next build
> All serverless functions created in: 20.791ms
> 1752924 total bytes
> Build successful!
Bereiten Sie nun die Next.js-App bereit, indem Sie tf-next deploy aus demselben Verzeichnis ausführen. Der Befehl Bereitstellungsbefehl kommuniziert mit einer gesicherten API (und mit Ihren AWS -Anmeldeinformationen) mit dem Terraform -Modul.
Um den Befehl zu informieren, wo die App bereitgestellt werden soll, muss ein zusätzliches --endpoint -Flag bereitgestellt werden, der den Wert aus der Ausgabe api_endpoint aus dem terraform apply -Antragsschritt verwenden sollte:
tf-next deploy --endpoint https://<api-id>.execute-api.us-west-2.amazonaws.com
> Available at: https://3edade7a2bf7bb0343699af6b851bbfa.example.com/
Auf die Vorschau -Bereitstellung kann jetzt von der angezeigten URL zugegriffen werden.
Um die Bereitstellung einer lesbareren URL zur Verfügung zu stellen, können Sie den tf-next alias Unterbefehl verwenden:
tf-next alias set my-app.example.com 3edade7a2bf7bb0343699af6b851bbfa.example.com
> Available at: https://my-app.example.com/
Eine vollständige Liste der verfügbaren Befehle, die mit tf-next verwendet werden können, überprüfen Sie die Befehlsreferenz.
| Name | Version |
|---|---|
| Terraform | > = 0,15 |
| AWS | > = 4,8 |
| Name | Version |
|---|---|
| AWS | > = 4,8 |
| Name | Beschreibung | Typ | Standard | Erforderlich |
|---|---|---|---|---|
| CloudFront_acm_certificate_arn | ACM -Zertifikat ARN für Custom_Domain | string | null | NEIN |
| CloudFront_aliases | Aliase für Custom_domain | list(string) | [] | NEIN |
| CloudFront_cache_key_Headers | Headertasten, mit denen die Cache -Taste in CloudFront berechnet werden sollte. | list(string) | [ | NEIN |
| Cloudfront_create_distribution | Steuert, ob die Hauptverteilung der Cloudfront erstellt werden soll. | bool | true | NEIN |
| CloudFront_external_arn | Bei Verwendung einer externen CloudFront -Verteilung geben Sie ihren ARN an. | string | null | NEIN |
| CloudFront_external_id | Bei Verwendung einer externen CloudFront -Verteilung geben Sie seine ID an. | string | null | NEIN |
| CloudFront_Minimum_Protocol_version | Die minimale Version des SSL -Protokolls, die CloudFront für HTTPS -Verbindungen verwenden soll. Eine von SSLV3, TLSV1, TLSV1_2016, TLSV1.1_2016, TLSV1.2_2018 oder TLSV1.2_2019. | string | "TLSv1" | NEIN |
| CloudFront_Origin_request_policy | ID einer benutzerdefinierten Anforderungsrichtlinie, die die Standardrichtlinie (Allviewer) überschreibt. Kann individuell oder verwaltet werden. | string | null | NEIN |
| CloudFront_price_Class | Preisklasse für die Cloudfront -Verteilungen (Haupt- und Proxy -Konfiguration). Eine von PriceClass_all, PriceClass_200, PriceClass_100. | string | "PriceClass_100" | NEIN |
| CloudFront_Response_Headers_Policy | ID einer Antwort -Header -Richtlinie. Kann individuell oder verwaltet werden. Standard ist leer. | string | null | NEIN |
| CloudFront_Webacl_id | Eine optionale WebACL2 -ARN- oder WebACL | string | null | NEIN |
| create_image_optimization | Steuert, ob Ressourcen für die Unterstützung der Bildoptimierung erstellt werden sollten oder nicht. | bool | true | NEIN |
| DEBUG_USE_LOCAL_PACKAGES | Verwenden Sie lokal erstellte Pakete, anstatt sie von NPM herunterzuladen. | bool | false | NEIN |
| Bereitstellung_Name | Kennung für die Bereitstellungsgruppe (nur die alphanumerischen Unterkünfte und Bindestriche sind erlaubt). | string | "tf-next" | NEIN |
| enable_multiple_deployments | Kontrolliert, ob es möglich sein sollte, mehrere Bereitstellungen parallel auszuführen (erfordert multiple_deployments_base_domain). | bool | false | NEIN |
| Image_Optimization_Lambda_Memory_SIZE | Speichermenge in MB Die Arbeiter -Lambda -Funktion für die Bildoptimierung kann verwendet werden. Gültiger Wert zwischen 128 MB und 10.240 MB, in 1 MB -Schritten. | number | 2048 | NEIN |
| lambda_attach_policy_json | Ob zusätzliche Lambda JSON -Richtlinien eingesetzt werden. Wenn dies falsch ist, wird Lambda_Policy_json nicht an die Lambda -Funktion angeschlossen. (Notwendig, da die Richtlinienketten erst nach Anwendung bei der Verwendung von Teraforms -Daten bekannt sind. | bool | false | NEIN |
| lambda_attach_to_vpc | Setzen Sie auf True, wenn die Lambda -Funktionen an einen VPC angeschlossen werden sollten. Verwenden Sie diese Einstellung, wenn die Lambda -Funktionen auf VPC -Ressourcen zugreifen sollten. Verwenden Sie bei der Einstellung dieser TRUE VPC_SECURITY_GROUP_IDS und VPC_SUBNET_IDS, um das VPC -Netzwerk anzugeben. Beachten Sie, dass das Anbringen an einem VPC eine Verzögerung der Erkältungsstarts einführen würde | bool | false | NEIN |
| lambda_policy_json | Zusätzliches Richtliniendokument als JSON, um die Rolle der Lambda -Funktion anzuhängen, | string | null | NEIN |
| lambda_role_permissions_boundary | ARN der IAM -Richtlinie, dass Scopes AWS_IAM_ROLE -Zugriff auf die Lambda | string | null | NEIN |
| multiple_deployments_base_domain | Standard -Wildcard -Domain, in der neue Bereitstellungen verfügbar sein sollten. Sollte in Form von *.example.com sein. | string | null | NEIN |
| Tags | Tag -Metadaten zum Beschriften von AWS -Ressourcen, die Tags unterstützen. | map(string) | {} | NEIN |
| tags_s3_bucket | Tag -Metadaten zum Beschriften von AWS S3 Eimer. Überschreiben Sie Tags mit demselben Namen in Eingabevariablen -Tags. | map(string) | {} | NEIN |
| vpc_security_group_ids | Die Liste der Sicherheitsgruppen -IDs, die von den Lambda -Funktionen verwendet werden sollen. lambda_attach_to_vpc sollte auf true festgelegt werden, damit diese angewendet werden. | list(string) | [] | NEIN |
| vpc_subnet_ids | Die Liste der VPC -Subnetz -IDs zum Anhängen der Lambda -Funktionen. lambda_attach_to_vpc sollte auf true festgelegt werden, damit diese angewendet werden. | list(string) | [] | NEIN |
| Name | Beschreibung |
|---|---|
| api_endpoint | API -Endpunkt, der von der CLI verwendet wird. |
| api_endpoint_access_policy_arn | ARN der Richtlinie, die Zugriff auf den API -Endpunkt gewährt. |
| CloudFront_Custom_error_response | Vorkonfigurierte benutzerdefinierte Fehlerantwort Die CloudFront -Verteilung sollte verwendet werden. |
| Cloudfront_default_cache_behavior | Vorkonfiguriertes Standard -Cache -Verhalten Die CloudFront -Verteilung sollte verwendet werden. |
| CloudFront_default_root_object | Vorkonfiguriertes Root -Objekt Die CloudFront -Verteilung sollte verwendet werden. |
| Cloudfront_domain_name | Domäne der Hauptverteilung der Cloudfront (wenn erstellt). |
| CloudFront_hosted_zone_id | Zonen -ID der Hauptverteilung der Cloudfront (wenn erstellt). |
| CloudFront_Ordered_cache_Behaviors | Vorkonfigurierte geordnete Cache -Verhaltensweisen Die CloudFront -Verteilung sollte verwendet werden. |
| Cloudfront_origins | Vorkonfigurierte Herkunft Die CloudFront -Verteilung sollte verwendet werden. |
| upload_bucket_id | n / A |
Unter der Motorhaube verwendet dieses Modul eine Menge von Vercels Build -Pipeline. Es werden also auch bei diesem Projekt Probleme in Vercel vorhanden.
Stack Deletion ( terraform destroy ) fällt beim ersten Lauf (Terraform-Provider-Aws#1721) fehl.
Dies ist beabsichtigt, da wir eine Lambda@Edge -Funktion (vom Proxy -Modul verwendet) auf synchroner Weise nicht löschen können. Es kann bis zu einer Stunde dauern, bis AWS eine Lambda@Edge -Funktion von seiner CloudFront -Verteilung entbehrt, selbst wenn die Verteilung bereits zerstört wird.
Problemumgehung:
Nach dem Ausführen des anfänglichen terraform destroy (das fehlgeschlagen) warte ~ 1 Stunde und führe den Befehl erneut aus. Diesmal sollte es erfolgreich ausgeführt und den Rest des Stapels löschen.
Die erste Anwendung schlägt Fehler bei der Fehlermeldung Error: error creating Lambda Event Source Mapping (#138)
Es gibt eine gewisse Rennbedingung, wenn die Berechtigungen für die statische Bereitstellung Lambda erstellt werden. Dies sollte nur bei der ersten Bereitstellung geschehen.
Problemumgehung:
Sie sollten in der Lage sein, terraform apply , und die Stapelerstellung würde ohne diesen Fehler verlaufen.
Beiträge sind willkommen!
Wenn Sie dieses Modul verbessern möchten, sehen Sie sich bitte unsere beitragenden Richtlinien an, um loszulegen.
Dieses Projekt wird durch Millivolt -Infrastruktur aufrechterhalten.
Wir erstellen kundenspezifische Infrastrukturlösungen für jeden Cloud -Anbieter.
Apache -2.0 - Siehe Lizenz für Details.
Hinweis: Alle Beispielprojekte in
examples/*werden als MIT lizenziert, um den offiziellen Beispielen für die nächsten.js einzuhalten.