有沒有想過,如何在雲端輕鬆建置並經營一個網站?我將向你展示如何使用 Terraform,這是一個非常棒的工具,讓你可以編寫程式碼,在 AWS 等服務上建立自己的基礎架構。

我們將部署一個簡單的網頁伺服器,執行一個漂亮的網站模板,並在過程中學習一些關鍵概念。

入門所需

在我們深入研究之前,請確保您已設定好以下幾項:

Terraform:這是我們將要使用的主要工具。您可以從官方網站下載。

AWS CLI:這可以讓你的電腦與你的 Amazon Web Services 帳戶通訊。你需要安裝它並使用你的憑證進行設定。

AWS 帳戶:如果您還沒有帳戶,可以註冊免費方案帳戶。

為 Terraform 配置 IAM 用戶

在深入編寫 Terraform 程式碼之前,我們需要確保以正確的方式連接到 AWS。

專業提示:🚨 切勿將您的 AWS 根帳戶用於專案!相反,我們將為 Terraform 建立專用的 IAM 使用者。

方法如下:

  1. 登入 AWS 控制台並開啟 IAM(身分和存取管理)。

  2. 建立一個新使用者 - 將其命名為 terraform-user 之類的名稱。

在存取類型下,選取編程存取(這將為您提供存取密鑰 ID 和秘密存取密鑰)。

  1. 設定權限:

為了學習,您可以附加 AdministratorAccess(完全存取權限)。

但在現實世界中,您只會授予所需的確切權限。

  1. 下載憑證:將 .csv 檔案與您的金鑰一起保存,以確保其安全!

  2. 配置 AWS CLI,以便 Terraform 知道如何連接。在終端機中執行以下命令:

aws configure

然後輸入您的:

存取密鑰ID

秘密存取密鑰

預設區域:us-east-1

輸出格式:json

步驟 1設定專案資料夾

首先,讓我們開始整理吧!在你的電腦上為你的專案建立一個新資料夾,我使用了 vscode(使用它更容易設定你的專案)。在這個資料夾中,你將建立幾個文件。你可以將我下面提供的程式碼複製到每個文件中。

以下是您需要的文件清單:

提供者.tf

vars.tf

密鑰對.tf

secgrp.tf

實例.tf

web.sh

步驟 2告訴 Terraform 使用 AWS(provider.tf)

這個文件就像一個介紹。它告訴 Terraform:“嘿,我們將與 AWS 合作,我們將在美國東部(弗吉尼亞北部)地區。”

只需將此程式碼複製到名為 provider.tf 的檔案中即可。

provider "aws" {
  region = var.region
} 

步驟 3使用變陣列織程式碼(vars.tf)

我們可以使用變數,而不必一遍又一遍地輸入諸如“us-east-1”之類的內容。這使得您的程式碼更簡潔,並且以後更容易更改。此文件定義了您的資源將儲存在何處以及我們將使用的伺服器類型。

將此程式碼複製到 vars.tf 中。

variable "region" {
  default = "us-east-1"
}

variable "zone1" {
  default = "us-east-1a"
}

variable "webuser" {
  default = "ubuntu"
}

variable "amiID" {
  type = map(any)
  default = {
    us-east-2 = "ami-0cfde0ea8edd312d4"
    us-east-1 = "ami-0360c520857e3138f"
  }
}

步驟 4建立金鑰來鎖定和解鎖您的伺服器(keypair.tf 和 dovekey.pub)

要安全地登入伺服器,您需要一個特殊的金鑰。這是一個稱為 SSH 的標準流程。

打開終端並建立自己的金鑰對。您可以在終端機中使用以下命令:

ssh-keygen

它會要求您輸入檔案路徑:輸入密鑰名稱;按回車鍵。

這將建立兩個檔案:dovekey(你的私鑰)和 dovekey.pub(你的公鑰)。請妥善保管私鑰!

將新 dovekey.pub 檔案的全部內容複製到同名的新檔案中。

現在,建立一個名為 keypair.tf 的檔案來告訴 AWS 辨識您的公鑰。

resource "aws_key_pair" "dove-key" {
  key_name   = "dove-key"
  public_key = file("dovekey.pub")
}

步驟 5設定伺服器的防火牆(secgrp.tf)

可以將安全群組視為伺服器的數位保鑣。它決定誰可以存取,誰不能存取。

我們的安全小組將讓人們:

SSH(連接埠 22):僅限您的電腦。重要提示:您必須將 IP 位址 197.211.58.41/32 變更為您自己的 IP 位址。在 Google 上快速搜尋「我的 IP 是什麼」即可找到。

HTTP(連接埠 80):世界上任何地方的每個人都可以看到您的網站。

所有出站流量:您的伺服器將能夠連接到網路以下載更新和檔案。

將此程式碼複製到 secgrp.tf

resource "aws_security_group" "dove-sg" {
  name        = "dove-sg"
  description = "dove-sg"
  tags = {
    Name = "dove-sg"
  }
}

resource "aws_vpc_security_group_ingress_rule" "ssh-from-my-ip" {
  security_group_id = aws_security_group.dove-sg.id
  cidr_ipv4         = "197.211.58.41/32"
  from_port         = 22
  ip_protocol       = "tcp"
  to_port           = 22
}

resource "aws_vpc_security_group_ingress_rule" "allow_http" {
  security_group_id = aws_security_group.dove-sg.id
  cidr_ipv4         = "0.0.0.0/0"
  from_port         = 80
  ip_protocol       = "tcp"
  to_port           = 80
}

resource "aws_vpc_security_group_egress_rule" "allow_all_outbound_ipv4" {
  security_group_id = aws_security_group.dove-sg.id
  cidr_ipv4         = "0.0.0.0/0"
  ip_protocol       = "-1"
}

步驟 6建置伺服器! (instance.tf)

這是主要事件。此文件告訴 Terraform 建立 AWS 伺服器(EC2 實例),並將其連結到我們剛剛定義的金鑰對和安全群組。

這裡比較特殊的部分是 provisioner 區塊。它告訴 Terraform 要執行以下操作:

將我們的web.sh檔案上傳到伺服器。

透過 SSH 登入伺服器。

執行 web.sh 腳本來安裝我們的網站!

resource "aws_instance" "web" {
  ami                    = var.amiID[var.region]
  instance_type          = "t3.micro"
  key_name               = "dove-key"
  vpc_security_group_ids = [aws_security_group.dove-sg.id]
  availability_zone      = var.zone1

  tags = {
    Name    = "Dove-web"
    project = "Dove"
  }

  provisioner "file" {
    source      = "web.sh"
    destination = "/tmp/web.sh"
  }

  connection {
    type        = "ssh"
    user        = var.webuser
    private_key = file("dovekey")
    host        = self.public_ip
  }

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/web.sh",
      "sudo /tmp/web.sh"
    ]
  }
}

步驟 7“魔術”腳本(web.sh)

這個簡單的腳本實際上會安裝一個 Web 伺服器(Apache)並在其上建立一個網站。它會下載一個免費的網站模板(我使用了 topplate.com 的模板),解壓縮後將所有文件複製到正確的位置。

#!/bin/bash
apt update
apt install wget unzip apache2 -y
systemctl start apache2
systemctl enable apache2
wget https://www.tooplate.com/zip-templates/2117_infinite_loop.zip
unzip -o 2117_infinite_loop.zip
cp -r 2117_infinite_loop/* /var/www/html/
systemctl restart apache2

步驟 9取得新伺服器的詳細資訊(outputs.tf)

這裡我們告訴 Terraform 在建立完所有內容後向我們顯示最重要的資訊。這樣可以非常輕鬆地找到您的新網站。

建立一個名為outputs.tf的新檔案並新增以下程式碼:

output "instance_id" {
  description = "The ID of the EC2 instance"
  value       = aws_instance.web.id
}

output "public_ip" {
  description = "The public IP address of the EC2 instance"
  value       = aws_instance.web.public_ip
}

步驟 10關於州檔案的重要說明

執行 Terraform 時,它會建立類似 terraform.tfstate 和 terraform.tfstate.backup 的檔案。這些文件非常重要,因為它們記錄了 Terraform 建立的所有內容。

千萬不要把這些文件提交到 Git!它們可能包含敏感訊息,如果你和團隊合作,可能會造成巨大的問題。

為了防止這種情況,請在專案資料夾中建立一個名為 .gitignore 的檔案並新增以下幾行,或者我們可以建立一個 s3bucket,但現在讓我們堅持這樣做:

地形

.terraform/

*.tfstate

*.tfstate.備份

第 11 步執行您的程式碼!

現在到了有趣的部分!打開終端,轉到專案資料夾,然後逐一執行這些命令。

初始化 Terraform:

terraform init-啟動你的 terraform

terraform fmt- 修正文件格式

terraform 驗證 - 檢查您的設定是否有語法錯誤

terraform plan-向您展示將套用哪些變更。

terraform apply-應用計畫(並觀察魔法發生!)。

出現提示時,輸入「yes」並按 Enter。 Terraform 現在將為您建立所有內容。

第 12 步檢查一下!

過程完成後,您將看到您定義的輸出!只需複製 public_ip 值並將其貼上到您的 Web 瀏覽器中即可。您應該會看到您的新網站!

步驟13清理!

為了避免被 AWS 收取費用,完成後最好清理資源。只需執行以下簡單命令:

地形破壞

這會摧毀你創造的一切。一切都消失了!

就這樣!下面是已配置的網站圖片。

網站即時發佈於tooplate

VsCode 顯示資料夾結構


原文出處:https://dev.to/victoria_obanegha_/automating-website-deployment-on-aws-using-terraform-1a0l


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝10   💬6   ❤️11
454
🥈
我愛JS
📝1   💬5   ❤️4
88
🥉
AppleLily
📝1   💬4   ❤️1
47
#4
💬2  
6
#5
💬1  
5
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次