Catatan
Cabang utama saat ini berisi Pratinjau Alpha Penyebaran Atom.
Untuk rilis stabil terakhir, lihat cabangv0.xSilakan lihat posting blog kami "The Road to Atomic Deployments"
Atau tonton ulasan rilis terbaru untuk informasi lebih lanjut:
Modul terraform nol-konfigurasi untuk hosting mandiri Next.js Situs tanpa server di AWS Lambda.
Beberapa fitur masih sedang dikembangkan, berikut adalah daftar fitur yang saat ini didukung dan apa yang kami rencanakan untuk dibawa dengan rilis berikutnya:
v0.15+Modul terraform berikutnya.js dirancang sebagai aplikasi AWS tumpukan penuh. Ini bergantung pada beberapa layanan AWS dan menghubungkannya untuk berfungsi sebagai aplikasi tunggal:

Anda harus menginstal alat berikut:
Catatan: Selain itu, kami berasumsi di sini bahwa Anda sudah memiliki zona host route53 umum yang terkait dengan akun AWS Anda.
Ini adalah persyaratan dalam fase pratinjau penyebaran atom, di mana setiap penyebaran mendapatkan subdomain unik yang ditetapkan. Ini akan berubah setelah penyebaran atom menjadi tersedia secara umum.
Modul Terraform berisi sistem yang kemudian digunakan untuk membuat penyebaran baru dan mengelola alias (domain) untuk aplikasi selanjutnya.js Anda. Membuat tumpukan terraform hanya diperlukan pada pengaturan awal dan menciptakan sumber daya global (distribusi cloudfront, tabel DynamoDB, penyimpanan S3) yang digunakan untuk menangani permintaan yang masuk ke situs web Anda.
Buat file main.tf baru di folder kosong (atau tambahkan ke tumpukan terraform Anda yang ada) dan tambahkan konten berikut:
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
}Untuk membuat sumber daya di akun AWS Anda, jalankan perintah berikut:
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 kemudian digunakan oleh alat CLI untuk membuat penyebaran baru.
Dengan Kebijakan api_endpoint_access_policy_arn AWS Anda dapat membuat pengguna baru (dan menetapkan kebijakan itu) yang hanya dapat menggunakan alat CLI tf-next tetapi tidak dapat mengakses sumber daya lain di dalam akun AWS Anda.
Setelah penyebaran yang berhasil, aplikasi Next.js Anda tersedia untuk umum di subdomain CloudFront dari output cloudfront_domain_name .
Untuk membangun dan menggunakan aplikasi Next.js ke sistem kami membuat alat CLI yang disebut tf-next .
Ini adalah paket NPM yang dapat diinstal dengan:
npm i -g tf-next@canary Selanjutnya, kita perlu membangun Next.js sehingga dapat berjalan di lingkungan tanpa server (dengan AWS Lambda). Ini diarsipkan dengan menjalankan tf-next build di direktori yang sama di mana aplikasi Next.js Anda berada (tepat di next.config.js package.json Anda.
tf-next build
> All serverless functions created in: 20.791ms
> 1752924 total bytes
> Build successful!
Sekarang gunakan aplikasi Next.js dengan menjalankan tf-next deploy dari direktori yang sama. Perintah Deploy berkomunikasi melalui API yang diamankan (dan diautentikasi dengan kredensial AWS Anda) dengan modul terraform.
Untuk memberi tahu perintah di mana harus menggunakan aplikasi, bendera --endpoint tambahan harus disediakan, yang seharusnya menggunakan nilai dari output api_endpoint dari terraform apply langkah:
tf-next deploy --endpoint https://<api-id>.execute-api.us-west-2.amazonaws.com
> Available at: https://3edade7a2bf7bb0343699af6b851bbfa.example.com/
Penyebaran pratinjau sekarang dapat diakses oleh URL yang ditampilkan.
Untuk membuat penyebaran tersedia dari URL yang lebih mudah dibaca, Anda dapat menggunakan sub-perintah tf-next alias :
tf-next alias set my-app.example.com 3edade7a2bf7bb0343699af6b851bbfa.example.com
> Available at: https://my-app.example.com/
Untuk daftar lengkap perintah yang tersedia yang dapat digunakan dengan tf-next , periksa referensi perintah.
| Nama | Versi |
|---|---|
| Terraform | > = 0,15 |
| AWS | > = 4.8 |
| Nama | Versi |
|---|---|
| AWS | > = 4.8 |
| Nama | Keterangan | Jenis | Bawaan | Diperlukan |
|---|---|---|---|---|
| cloudfront_acm_certificate_arn | Sertifikat ACM ARN untuk Custom_Domain | string | null | TIDAK |
| cloudfront_aliases | Alias untuk custom_domain | list(string) | [] | TIDAK |
| cloudfront_cache_key_headers | Kunci header yang harus digunakan untuk menghitung kunci cache di CloudFront. | list(string) | [ | TIDAK |
| cloudfront_create_distribution | Mengontrol apakah distribusi cloudfront utama harus dibuat. | bool | true | TIDAK |
| cloudfront_external_arn | Saat menggunakan distribusi CloudFront eksternal memberikan ARN -nya. | string | null | TIDAK |
| cloudfront_external_id | Saat menggunakan distribusi CloudFront eksternal memberikan ID -nya. | string | null | TIDAK |
| cloudfront_minimum_protocol_version | Versi minimum protokol SSL yang Anda ingin CloudFront gunakan untuk koneksi HTTPS. Salah satu dari SSLV3, TLSV1, TLSV1_2016, TLSV1.1_2016, TLSV1.2_2018 atau TLSV1.2_2019. | string | "TLSv1" | TIDAK |
| cloudfront_origin_request_policy | ID dari Kebijakan Permintaan Kustom yang mengesampingkan kebijakan default (AllViewer). Dapat disesuaikan atau dikelola. | string | null | TIDAK |
| cloudfront_price_class | Kelas Harga untuk Distribusi CloudFront (Main & Proxy Config). Salah satu priceclass_all, priceclass_200, priceClass_100. | string | "PriceClass_100" | TIDAK |
| cloudfront_response_headers_policy | ID dari kebijakan header respons. Dapat disesuaikan atau dikelola. Default kosong. | string | null | TIDAK |
| cloudfront_webacl_id | WebAcl2 ARN atau Webacl ID opsional untuk dikaitkan dengan distribusi CloudFront | string | null | TIDAK |
| create_image_optimization | Mengontrol apakah sumber daya untuk dukungan optimisasi gambar harus dibuat atau tidak. | bool | true | TIDAK |
| debug_use_local_packages | Gunakan paket yang dibangun secara lokal daripada mengunduhnya dari NPM. | bool | false | TIDAK |
| Deployment_name | Identifier untuk kelompok penyebaran (hanya karakter alfanumerik kecil dan tanda hubung yang diizinkan). | string | "tf-next" | TIDAK |
| enable_multiple_deployments | Kontrol apakah harus dimungkinkan untuk menjalankan beberapa penyebaran secara paralel (membutuhkan multiple_deployments_base_domain). | bool | false | TIDAK |
| image_optimization_lambda_memory_size | Jumlah memori dalam MB fungsi lambda pekerja untuk optimasi gambar dapat digunakan. Nilai yang valid antara 128 MB hingga 10.240 MB, dalam kenaikan 1 MB. | number | 2048 | TIDAK |
| lambda_attach_policy_json | Apakah akan menggunakan kebijakan Lambda JSON tambahan. Jika false, lambda_policy_json tidak akan dilampirkan ke fungsi lambda. (Perlu karena string kebijakan hanya diketahui setelah berlaku saat menggunakan data terraforms.aws_iam_policy_document) | bool | false | TIDAK |
| lambda_attach_to_vpc | Setel ke true jika fungsi lambda harus dilampirkan ke VPC. Gunakan pengaturan ini jika sumber daya VPC harus diakses oleh fungsi Lambda. Saat mengatur ini ke true, gunakan VPC_Security_Group_IDS dan VPC_SUBNET_IDS untuk menentukan jaringan VPC. Perhatikan bahwa melekat pada VPC akan memperkenalkan penundaan untuk memulai dingin | bool | false | TIDAK |
| lambda_policy_json | Dokumen Kebijakan Tambahan sebagai JSON untuk dilampirkan pada peran fungsi Lambda | string | null | TIDAK |
| lambda_role_permissions_boundary | ARN dari kebijakan IAM yang melingkupi akses AWS_IAM_ROLE untuk lambda | string | null | TIDAK |
| multiple_deployments_base_domain | Domain wildcard default di mana penyebaran baru harus tersedia. Harus dalam bentuk *.example.com. | string | null | TIDAK |
| tag | Tag metadata untuk memberi label sumber daya AWS yang mendukung tag. | map(string) | {} | TIDAK |
| TAGS_S3_BUCKET | Tag metadata untuk memberi label ember AWS S3. Menimpa tag dengan nama yang sama dalam tag variabel input. | map(string) | {} | TIDAK |
| vpc_security_group_ids | Daftar ID Grup Keamanan yang akan digunakan oleh fungsi Lambda. lambda_attach_to_vpc harus ditetapkan untuk benar untuk diterapkan. | list(string) | [] | TIDAK |
| vpc_subnet_ids | Daftar ID Subnet VPC untuk melampirkan fungsi Lambda. lambda_attach_to_vpc harus ditetapkan untuk benar untuk diterapkan. | list(string) | [] | TIDAK |
| Nama | Keterangan |
|---|---|
| api_endpoint | Titik akhir API yang digunakan oleh CLI. |
| API_ENDPOINT_ACCESS_POLICY_ARN | ARN dari kebijakan yang memberikan akses ke titik akhir API. |
| cloudfront_custom_error_response | Respons kesalahan khusus yang telah dikonfigurasi sebelumnya. Distribusi CloudFront harus digunakan. |
| cloudfront_default_cache_behavior | Perilaku cache default yang telah dikonfigurasi sebelumnya. Distribusi CloudFront harus digunakan. |
| cloudfront_default_root_object | Objek root yang telah dikonfigurasi sebelumnya. Distribusi CloudFront harus digunakan. |
| cloudfront_domain_name | Domain distribusi cloudfront utama (saat dibuat). |
| cloudfront_hosted_zone_id | ID zona distribusi cloudfront utama (saat dibuat). |
| cloudfront_ordered_cache_behaviors | Perilaku cache yang sudah dikonfigurasi sebelumnya yang harus digunakan oleh distribusi CloudFront. |
| cloudfront_origins | Asal yang telah dikonfigurasi sebelumnya, distribusi CloudFront yang harus digunakan. |
| unggah_bucket_id | n/a |
Di bawah kap modul ini menggunakan banyak pipa build Vercel. Jadi masalah yang ada di Vercel cenderung terjadi pada proyek ini juga.
Penghapusan tumpukan ( terraform destroy ) gagal pada lari pertama (Terraform-Provider-Aws#1721)
Ini disengaja karena kami tidak dapat menghapus fungsi lambda@edge (digunakan oleh modul proxy) dengan cara yang sinkron. Ini bisa memakan waktu hingga satu jam untuk AWS untuk melepaskan fungsi lambda@edge dari distribusi CloudFront itu bahkan ketika distribusi sudah dihancurkan.
Solusi:
Setelah menjalankan perintah terraform destroy awal (yang gagal) tunggu ~ 1 jam dan jalankan perintah lagi. Kali ini harus berjalan dengan sukses dan menghapus sisa tumpukan.
Awal Apply Gagal dengan Kesalahan Pesan Kesalahan Error: error creating Lambda Event Source Mapping (#138)
Ada beberapa kondisi ras ketika izin dibuat untuk penempatan statis lambda. Ini seharusnya hanya terjadi pada penyebaran pertama.
Solusi:
Anda harus dapat menjalankan terraform apply lagi dan pembuatan tumpukan akan dilanjutkan tanpa kesalahan ini.
Kontribusi dipersilakan!
Jika Anda ingin meningkatkan modul ini, silakan lihat pedoman yang berkontribusi untuk memulai.
Proyek ini dikelola oleh infrastruktur milivolt.
Kami membangun solusi infrastruktur khusus untuk setiap penyedia cloud.
Apache -2.0 - Lihat Lisensi untuk detailnya.
CATATAN: Semua proyek sampel dalam
examples/*dilisensikan sebagai MIT untuk mematuhi contoh resmi Next.js.