首页 > 其他分享 >使用Terraform极速部署Next.js网站到S3

使用Terraform极速部署Next.js网站到S3

时间:2024-07-05 16:26:38浏览次数:14  
标签:web s3 S3 bucket aws js Terraform next AWS

「AWS?好像很难懂……」

「试过用AWS,但按钮太多,搞不清楚……」

「Terraform?没听说过……」

其实,直到最近我也是这样想的。但即使是我,也能使用Terraform构建网站。在本文中,我将分享如何使用AWS和Terraform将Next.js网站部署到S3的过程!

用到的工具

  • Terraform
  • Node.js
  • AWS CLI

创建并构建Next.js项目

首先,创建要部署的项目。

$ npx create-next-app@latest
Need to install the following packages:
[email protected]
Ok to proceed? (y) y

✔ What is your project named? … frontend
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
Creating a new Next.js app in /app/frontend.

next.config.js 修改为以下内容:

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: "export",
  trailingSlash: true,
};

export default nextConfig;

package.json 中的 scripts 修改为以下内容:

{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "export": "next export"
  }
}

执行以下命令来构建项目并创建 out 文件夹:

npm run build

接下来将生成的 out 文件夹通过 Terraform 上传到 S3。

使用 Terraform 配置 AWS 资源

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "web_hosting_bucket" {
  bucket = "test-deployed-by-terraform"

  force_destroy = true
}

resource "aws_s3_bucket_public_access_block" "web_hosting_bucket_public_access_block" {
  bucket = aws_s3_bucket.web_hosting_bucket.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

resource "aws_s3_bucket_policy" "bucket_policy" {
  bucket = aws_s3_bucket.web_hosting_bucket.id
  policy = data.aws_iam_policy_document.policy_document.json
  depends_on = [
    aws_s3_bucket_public_access_block.web_hosting_bucket_public_access_block, # パブリックアクセスブロックの設定を待たないとエラーが発生する
  ]
}

data "aws_iam_policy_document" "policy_document" {
  statement {
    sid    = "Statement1"
    effect = "Allow"
    principals {
      type        = "*"
      identifiers = ["*"]
    }
    actions = [
      "s3:GetObject"
    ]
    resources = [
      "${aws_s3_bucket.web_hosting_bucket.arn}/*"
    ]
  }
}

resource "aws_s3_bucket_website_configuration" "web_hosting_bucket_config" {
  bucket = aws_s3_bucket.web_hosting_bucket.id

  index_document {
    suffix = "index.html"
  }

  error_document {
    key = "error.html"
  }
}

module "template_files" {
  source   = "hashicorp/dir/template"
  base_dir = "../frontend/out" # Build文件夹
}

resource "aws_s3_object" "bucket_object" {
  for_each     = module.template_files.files
  bucket       = aws_s3_bucket.web_hosting_bucket.id
  key          = each.key
  source       = each.value.source_path
  content_type = each.value.content_type
  etag         = filemd5(each.value.source_path)
}

解説

● 设置AWS提供者,指定东京区域(ap-northeast-1)
● 创建S3存储桶
  ● 存储桶名称:"test-deployed-by-terraform"
  ● 设置 `force_destroy: true`,即使有内容也可以删除
● 允许存储桶的所有公共访问设置
● 配置存储桶策略
  ● 赋予所有用户 `GetObject` 权限
● 将存储桶配置为网站托管
  ● 索引文档:`index.html`
  ● 错误文档:`error.html`
● 使用模板文件模块读取本地文件
● 创建S3对象资源
  ● 将模板文件模块读取的文件上传到S3
  ● 设置内容类型和ETAG(用于检测上传文件的更改)

Terraform执行

terraform init   # 初期化
terraform plan   # 確認PLAN
terraform apply -auto-approve # release

确认部署内容

AWS 控制台→S3 详细信息页面→属性→静态网站托管的存储桶网站端点,访问该端点后,您应该会看到以下画面。 至此,部署完成。

写在最后

感觉如何?就我个人而言,我发现使用Terraform以代码的形式管理和执行基础设施,比手动操作AWS控制台界面要简单得多。这样一来,使用AWS的门槛也降低了。(毕竟,AWS的控制台界面功能太多,很难找到需要操作的地方……)

标签:web,s3,S3,bucket,aws,js,Terraform,next,AWS
From: https://blog.csdn.net/rralucard123/article/details/140200870

相关文章

  • (四)JS逆向——中国观鸟网
    爬取观鸟网的信息 有sign值,timestamp和requestid,要看这些值是怎么生成的 载荷有加密的数据 返回值也经过加密 搜索requestid,找到了eval加密的代码,通过解密,就能找到生成这些值的代码段 代码格式化后,找到了这几个值的生成位置 requestid的生成是随机值,timestamp......
  • threejs入门2:Creating a scene
    参考:https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-sceneThegoalofthissectionistogiveabriefintroductiontothree.js.Wewillstartbysettingupascene,withaspinningcube.Aworkingexampleisprovidedatthebottomof......
  • windows安装以及切换使用nodejs多版本
    1安装nvmnvm是一个简单的bash脚本,它是用来管理系统中多个已存的Node.js版本。可以先把系统已有的node卸载掉,也可不卸载,但是以防没必要的冲突,尽量还是卸掉。1.1下载nvm下载地址:https://github.com/coreybutler/nvm-windows/releases,下载.zip后缀的这个文件,下载后解压安装即可......
  • JavaWeb—jsp篇
    概述JavaServerPages:java服务器端页面      可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码      用于简化书写 原理jsp实际就是一个servletjsp就是java代码  脚本<% 代码%>:定义的java代码,在service方法中。......
  • 邮件显示统计图表echarts-java+phantomjs实现
    邮件显示统计图表echarts-java+phantomjs实现项目背景是产品业务上的订阅推送,纯java后端实现,通过邮件将统计报表发送给用户。这里会涉及一些关键点:首先是统计图表的生成,我们采用常见的echarts,简单易用,支持图表类型丰富美观;java后端实现可使用echarts-java来实现图表的生成......
  • 数据集转换JSON
    procedureTForm1.DataSetToJSON(DataSet:TDataSet);varJSONObject:TJSONObject;JSONArray:TJSONArray;JSONItem:TJSONObject;i:integer;beginJSONArray:=TJSONArray.Create;//创建JSON数组//创建后不需要释放free(会自动释放),如果操作释放free动作会报错whilenot......
  • [NodeJS] timers阶段的源码解析
    timers阶段是Nodejs事件循环中的一个阶段,这一阶段主要是检查是否有到期的定时器,如果有则执行其回调。相关源码位置:timers阶段:node/deps/uv/src/timer.catmain·nodejs/node(github.com)timers阶段的代码比较少,这里直接贴出来,你也可以点进去上面的源码看自己感兴趣的部分......
  • Java 中Json中既有对象又有数组的参数 如何转化成对象
    1.示例一:解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象在Java中处理JSON数据,尤其是当JSON结构中既包含对象又包含数组时,常用的库有org.json、Gson和Jackson。这里我将以Gson为例来展示如何解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象。首先......
  • Qt Json详细介绍
    一.概念介绍JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它具有以下特点:易读性:JSON使用人类可读的文本格式表示数据,采用键值对的方式组织数据,易于阅读和编辑。轻量级:JSON数据格式较为简洁,不包含冗余信息,适合网络传输和存......
  • Java中的JSON神器,如何轻松玩转复杂数据结构
    哈喽,大家好,我是木头左!一、揭秘JSON世界的基石在Java的世界中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于机器解析和生成。JSON在日常开发中的应用非常广泛,无论是前后端的数据交互,还是配置文件的读取,都离不开JSON的身影。那......