有沒有想過,如何在雲端輕鬆建置並經營一個網站?我將向你展示如何使用 Terraform,這是一個非常棒的工具,讓你可以編寫程式碼,在 AWS 等服務上建立自己的基礎架構。
我們將部署一個簡單的網頁伺服器,執行一個漂亮的網站模板,並在過程中學習一些關鍵概念。
入門所需
在我們深入研究之前,請確保您已設定好以下幾項:
Terraform:這是我們將要使用的主要工具。您可以從官方網站下載。
AWS CLI:這可以讓你的電腦與你的 Amazon Web Services 帳戶通訊。你需要安裝它並使用你的憑證進行設定。
AWS 帳戶:如果您還沒有帳戶,可以註冊免費方案帳戶。
為 Terraform 配置 IAM 用戶
在深入編寫 Terraform 程式碼之前,我們需要確保以正確的方式連接到 AWS。
專業提示:🚨 切勿將您的 AWS 根帳戶用於專案!相反,我們將為 Terraform 建立專用的 IAM 使用者。
方法如下:
登入 AWS 控制台並開啟 IAM(身分和存取管理)。
建立一個新使用者 - 將其命名為 terraform-user 之類的名稱。
在存取類型下,選取編程存取(這將為您提供存取密鑰 ID 和秘密存取密鑰)。
為了學習,您可以附加 AdministratorAccess(完全存取權限)。
但在現實世界中,您只會授予所需的確切權限。
下載憑證:將 .csv 檔案與您的金鑰一起保存,以確保其安全!
配置 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 收取費用,完成後最好清理資源。只需執行以下簡單命令:
地形破壞
這會摧毀你創造的一切。一切都消失了!
就這樣!下面是已配置的網站圖片。
原文出處:https://dev.to/victoria_obanegha_/automating-website-deployment-on-aws-using-terraform-1a0l