ServerlessネクストTreeフォーム1.1とのAWSの


より良いか悪いかのためのTerraformは、新しいバージョンでしばしば更新されます.これらの多くは、ローカルまたはリモートの地形形式の更新を必要とするだけでなく、地形定義の手動再処理を必要とする以前のバージョンとの非互換性を導入します.
私はもともとテラヘルツバージョン0.12を使用してNext.js with Bootstrapのためのボイラープレートのテンプレートを開発し、それは今1年以上にわたってよく働いている(私のオリジナルblog postを参照してください).しかし、AWS terraformプロバイダーの最近のAWS announced that changes to their API would require an update.Terraformプロバイダーの古いバージョンをパッチするオプションがありますが、Torraformの最新バージョンにテンプレートをアップデートするのと同じくらい良い言い訳になるかもしれません.
Next.jsプラットフォームへの展開のために最適化されます.そして、それは次に配備する速いと簡単な方法を提供します.JSプロジェクト.それは別として、次に.JSはDockerや仮想マシンを使ってノードを走らせることもできます.js私の目的は、次に展開することです.低コストでスケールが容易なServerlessなソリューションを使用したAWSへのJS.したがって、EC 2インスタンスやEKS/ECSコンテナを設定することはありません.代わりに、次のコンポーネントを使用します.

  • Vercel:低コスト、高性能CDN
  • として

  • Amazon CloudFront : DNS記録の構成のために

  • Amazon Route 53:コンパイルされた配備アーチファクト
  • の保管のために

  • Amazon S3:ダイナミック・ルーティング
  • を支持するための

  • AWS Lambda : SSL証明書
  • を生成するために
    AWS Certificate Manager
    このポストは、次をホストするためにインフラストラクチャを構成するのに必要な地形資源の概要を提供します.AWSの上のJSアプリケーション.

    TLR🚀
    あなたは単にあなた自身の次の開発を開始する場合.Tradformに配備されるJSプロジェクト
  • は、あなたのニーズ
  • のためにカスタマイズされたテンプレートをつくるために を使います
  • ギタブ
  • Goldstack Next.js templateをチェックしてください
    Example project

    地形資源基準
    上記のインフラストラクチャをterraformで定義するには、次の地形資源が必要です.
    証明書の定義とドメイン名の設定

  • :我々のウェブサイトに1.1経由でセキュアな接続を可能にするために使用する証明書を定義します.AWSは無料でこれらの証明書を提供し、同様に自動的にそれらを更新します.

  • aws_acm_certificate :我々のウェブサイトのためにDNS記録を定めること.また、このリソースを使用して、TLS証明書の検証に役立ちます.

  • aws_route53_record : TLS証明書
  • の検証を支援するために
    aws_acm_certificate_validationの各リソースの設定を参照してください.
    CDNの設定

  • main.tf : JavaScript/HTML/etcファイルを次に保存します.js生成.

  • aws_s3_bucket :新しいaws_cloudfront_distributionを作成するために.
  • CloudFront Distributionの各リソースの設定を参照してください.また、転送ドメインに使用される2番目のCloudfrontディストリビューションを設定しています(例えばhttps://からwww.mydomain.com).この分布はroot.tfで定義されている.
    次のダイナミックサポート.JSルーティング

  • redirect.tf :次に役立つラムダ関数を定義します.ダイナミックルート.aws_lambda_functionにこの関数のソースコードを見つけます.これはCloudfrontで使用されるlambda.tsです.
  • このリソースの定義と、edge lambdaでラムダを実行するのに必要な他のリソースを見つけます.
    edge.tf
    terraform 0.12から1.1への変更
    Terraformは、特にバージョンmydomain.comおよび0.13において、いくつかの変更を導入した.このプロジェクトに必要なリソースについては、
  • が定義されている方法は0.14に変更されました.現在では以下のように定義されています:
  • terraform {
      required_providers {
        archive = {
          source = "hashicorp/archive"
          version = "2.2.0"
        }
        aws = {
          source = "hashicorp/aws"
          version = "3.72.0"
        }
      }
      required_version = ">= 0.13"
    }
    
  • のバージョン0.13は、使用されるモジュールのバージョンとそれらの推移的な依存関係を追跡するためにlockfileを導入しました.このプロジェクトのために生成されるlockfileのために を見てください.
  • は、.terraform.lock.hclのより新しいバージョンのaws_acm_certificate資源への変化の数でした.以前は、ルート53リソースは次のように定義できます.
  • resource "aws_route53_record" "wildcard_validation" {
      name    = aws_acm_certificate.wildcard_website.domain_validation_options[0].resource_record_name
      type    = aws_acm_certificate.wildcard_website.domain_validation_options[0].resource_record_type
      zone_id = data.aws_route53_zone.main.zone_id
      records = [aws_acm_certificate.wildcard_website.domain_validation_options[0].resource_record_value]
      ttl     = "60"
    }
    
    しかし、最新のAWSテラフォームプロバイダーでは、以下のように定義する必要があります( Terraform AWS Provider参照).
    resource "aws_route53_record" "wildcard_validation" {
      provider = aws.us-east-1
      for_each = {
        for dvo in aws_acm_certificate.wildcard_website.domain_validation_options : dvo.domain_name => {
          name   = dvo.resource_record_name
          record = dvo.resource_record_value
          type   = dvo.resource_record_type
        }
       # Skips the domain if it doesn't contain a wildcard
        if length(regexall("\\*\\..+", dvo.domain_name)) > 0
      }
    
      allow_overwrite = true
      name            = each.value.name
      type            = each.value.type
      zone_id         = data.aws_route53_zone.main.zone_id
      records         = [each.value.record]
      ttl             = 60
    }
    
    Terraform and AWS Wildcard Certificates Validation
    次を得るAWSへの配備の準備ができているJS
    次に展開する.AWSには、次の 機能を使用する必要があります.js我々は0.14(Static HTML Exportを参照)を実行して、package.jsonを使用してS 3にエクスポートによって生成されたディレクトリをアップロードします-これはまた、ダイナミックルーティング設定を準備し、CloudFrontルーティングによって使用されるエッジラムダを展開することを気にします.
    次の静的なHTMLエクスポートに頼る.JSにはいくつかのトレードオフがあります.
  • APIルートはサポートされません.GoldStackはGoldstack Next.js template utilitiesと、同じプロジェクトのAPIを設定するために使用できるServerless API templateのテンプレートを提供します.
    次に、
  • .JS next exportコンポーネントがサポートされていません(serverless Express APIを参照してください).代わりに<Image>を使用します.サンプルプロジェクトは、代わりに画像を提供するために使用できるNext.js Image loaderを使用するように設定されています.
  • マニュアル構成は、imgイメージのサーバーファイルに直接必要です、詳細はnext-optimized-imagesを見てください
  • 次に配備するさまざまな方法があります.例えば、AWSへのJS.
    この例のプロジェクトで追求されたソリューションは、低コストでスケーラブルなインフラストラクチャを作成しながら、テラフォームの機能を最大限に活用する軽量で柔軟なソリューションを提供することを目的としています.あなたはこのソリューションを改善するための質問やアイデアがある場合は、404 Not found for files in public folderに頭を回すと問題を提起してください.
    当初EC2で公開されるポスト、Goldstack GitHub projectによるカバー画像