注記
メインブランチには現在、Atomic Deployments Alphaプレビューが含まれています。
最も安定したリリースについては、v0.xブランチをご覧ください。ブログ投稿「Atomic Deploymentsへの道」をご覧ください
または、詳細については、最新リリースのレビューをご覧ください。
AWS LambdaのSETSES SETES SETES next.jsサイトのゼロコンフィグテラフォームモジュール。
いくつかの機能はまだ開発中です。ここに現在サポートされている機能のリストと、次のリリースでもたらす予定のリストがあります。
v0.15+Next.js Terraformモジュールは、フルスタックAWSアプリとして設計されています。複数のAWSサービスに依存しており、単一のアプリケーションとして機能するように接続します。

次のツールをインストールする必要があります。
注:さらに、ここでは、AWSアカウントに関連付けられたパブリックルート53ホストゾーンが既にあると想定しています。
これは、Atomic Deploymentsのプレビューフェーズの要件であり、各展開が一意のサブドメインを割り当てられます。アトミックデプロイメントが一般的に利用可能になると、変更されます。
Terraformモジュールには、新しい展開の作成とNext.jsアプリのエイリアス(ドメイン)の管理に後で使用されるシステムが含まれています。 Terraformスタックの作成は、初期セットアップでのみ必要であり、グローバルリソース(CloudFront Distributions、DynamoDBテーブル、S3ストレージ)を作成します。これは、着信要求をWebサイトに処理するために使用されます。
空のフォルダーに新しい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_domain_name出力からクラウドフロントサブドメインで公開されます。
next.jsアプリをシステムに構築および展開するためにtf-nextというCLIツールを作成しました。
以下でインストールできるNPMパッケージです。
npm i -g tf-next@canary次に、サーバーレス環境(AWS Lambdaを使用)で実行できるように、Next.jsを構築する必要があります。これは、next.jsアプリが配置されている同じディレクトリでtf-next buildを実行することでアーカイブされます( package.jsonまたはnext.config.jsファイルが配置されている場所):
tf-next build
> All serverless functions created in: 20.791ms
> 1752924 total bytes
> Build successful!
次に、同じディレクトリからtf-next deployを実行して、Next.jsアプリを展開します。 Deployコマンドは、Terraformモジュールを使用して、担保付き(およびAWS資格情報で認証された)APIを介して通信します。
アプリの展開場所をコマンドに伝えるには、追加の--endpointフラグを提供する必要があります。これはterraform applyのapi_endpoint出力からの値を使用する必要があります。
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 Subcommandを使用できます。
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 | custom_domainのACM証明書ARN | string | null | いいえ |
| cloudfront_aliase | custom_domainのエイリアス | list(string) | [] | いいえ |
| cloudfront_cache_key_headers | クラウドフロントのキャッシュキーを計算するために使用するヘッダーキー。 | list(string) | [ | いいえ |
| cloudfront_create_distribution | メインクラウドフロント分布を作成するかどうかを制御します。 | bool | true | いいえ |
| cloudfront_external_arn | 外部クラウドフロント分布を使用する場合、ARNを提供します。 | string | null | いいえ |
| cloudfront_external_id | 外部クラウドフロント分布を使用する場合、IDを提供します。 | string | null | いいえ |
| cloudfront_minimum_protocol_version | クラウドフロントにHTTPS接続に使用したいSSLプロトコルの最小バージョン。 SSLV3、TLSV1、TLSV1_2016、TLSV1.1_2016、TLSV1.2_2018またはTLSV1.2_2019の1つ。 | string | "TLSv1" | いいえ |
| cloudfront_origin_request_policy | デフォルトポリシー(AllViewer)をオーバーライドするカスタム要求ポリシーのID。カスタムまたは管理することができます。 | string | null | いいえ |
| cloudfront_price_class | クラウドフロントディストリビューションの価格クラス(メインおよびプロキシ構成)。 priceclass_allの1つ、priceclass_200、priceclass_100。 | string | "PriceClass_100" | いいえ |
| cloudfront_response_headers_policy | 応答ヘッダーポリシーのID。カスタムまたは管理することができます。デフォルトは空です。 | string | null | いいえ |
| cloudfront_webacl_id | CloudFront Distributionに関連付けるオプションのWebacl2 ARNまたはWebacl ID | string | null | いいえ |
| create_image_optimization | 画像最適化サポートのリソースを作成する必要があるかどうかを制御します。 | bool | true | いいえ |
| debug_use_local_packages | NPMからダウンロードするのではなく、ローカルに構築されたパッケージを使用します。 | bool | false | いいえ |
| deployment_name | 展開グループの識別子(小文字の英数字とハイフンのみが許可されています)。 | string | "tf-next" | いいえ |
| enable_multiple_deployments | 複数の展開を並行して実行できるかどうかを制御します(multiple_deployments_base_domainが必要です)。 | bool | false | いいえ |
| image_optimization_lambda_memory_size | MBのメモリの量イメージ最適化のためのワーカーラムダ関数は使用できます。 128 MBから10,240 MBの間の有効な値、1 MBの増分。 | 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 | Lambda関数をVPCに接続する必要がある場合は、trueに設定します。 Lambda関数によってVPCリソースにアクセスする必要がある場合は、この設定を使用してください。これをtrueに設定するときは、vpc_security_group_idsとvpc_subnet_idsを使用して、VPCネットワークを指定します。 VPCに取り付けるとコールドスタートの遅延が導入されることに注意してください | bool | false | いいえ |
| lambda_policy_json | Lambda機能の役割に付着するJSONとしての追加のポリシー文書 | string | null | いいえ |
| lambda_role_permissions_boundary | lambdaのaws_iam_roleアクセスをスコープするIAMポリシーのARN | 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関数で使用されるセキュリティグループIDのリスト。 Lambda_attach_to_vpcは、これらを適用するためにTRUEに設定する必要があります。 | list(string) | [] | いいえ |
| vpc_subnet_ids | lambda関数を添付するVPCサブネットIDのリスト。 Lambda_attach_to_vpcは、これらを適用するためにTRUEに設定する必要があります。 | list(string) | [] | いいえ |
| 名前 | 説明 |
|---|---|
| api_endpoint | CLIが使用するAPIエンドポイント。 |
| api_endpoint_access_policy_arn | ARN APIエンドポイントへのアクセスを付与するポリシー。 |
| cloudfront_custom_error_response | 事前に設定されたカスタムエラー応答クラウドフロント分布が使用する必要があります。 |
| cloudfront_default_cache_behavior | 事前に設定されたデフォルトのキャッシュ動作クラウドフロント分布が使用する必要があります。 |
| cloudfront_default_root_object | 事前に設定されたルートオブジェクトクラウドフロント分布が使用する必要があります。 |
| cloudfront_domain_name | メインクラウドフロント分布のドメイン(作成された場合)。 |
| cloudfront_hosted_zone_id | メインクラウドフロントディストリビューションのゾーンID(作成された場合)。 |
| cloudfront_ordered_cache_behaviors | CloudFront Distributionが使用する予定の順序付けられたキャッシュ動作。 |
| cloudfront_origins | 事前に設定された起源クラウドフロント分布が使用する必要があります。 |
| upload_bucket_id | n/a |
フードの下で、このモジュールは多くのVercelのビルドパイプラインを使用しています。したがって、Vercelに存在する問題は、このプロジェクトでも発生する可能性があります。
スタック削除( terraform destroy )が最初の実行で失敗します(Terraform-Provider-Aws#1721)
これは、Lambda@Edge機能(プロキシモジュールで使用)を同期的に削除できないため、意図的です。 AWSが、分布がすでに破壊されている場合でも、クラウドフロント分布からラムダ@エッジ機能をバインドするのに最大1時間かかることがあります。
回避策:
最初のterraform destroyコマンド(失敗した)を実行した後、1時間待機し、コマンドを再度実行します。今回は正常に実行され、スタックの残りの部分を削除する必要があります。
エラーメッセージError: error creating Lambda Event Source Mapping (#138)
静的展開Lambdaに対してアクセス許可が作成されると、いくつかの人種状態があります。これは、最初の展開でのみ発生するはずです。
回避策:
terraform apply再度適用できるはずです。このエラーなしでスタック作成は進行します。
貢献は大歓迎です!
このモジュールを改善したい場合は、貢献ガイドラインをご覧ください。
このプロジェクトは、ミリボルトインフラストラクチャによって維持されています。
クラウドプロバイダー向けのカスタムインフラストラクチャソリューションを構築しています。
Apache -2.0-詳細については、ライセンスを参照してください。
注:
examples/*のすべてのサンプルプロジェクトは、公式Next.jsの例に準拠するためにMITとしてライセンスされています。