在上一篇的內容中,我們介紹了認識了 SDK(Software Development Kit)以及 CDK(Cloud Development Kit)。並且透過設定 IAM 後取得存取金鑰,成功透過 CLI 介面在 AWS 上建立了一個 S3 Bucket。接下來,我們的目標是用 SDK 與 CDK 讓它「動起來」。
不過在正式進入SDK的操作之前,我們先來看一下S3是什麼樣的服務,而在AWS Console上該怎麼操作這個服務?
Amazon Simple Storage Service (Amazon S3) 是物件儲存服務,提供領先業界的可擴展性、資料可用性、安全性及效能。各種規模和各業界的數百萬家客戶可以存放、管理、分析和保護幾乎任何使用案例的任何資料量,如資料湖、雲端原生應用程式和行動應用程式。藉助符合成本效益的儲存類別和易於使用的管理功能,您可以最佳化成本、組織和分析資料並設定精密的存取控制,以滿足特定的業務和合規需求。
簡單的來說,你可以在S3上創建一個儲存貯體(Bucket)並且在其中儲存幾乎各種物件(Object),並且可以透過SDK、URL來訪問或進行操作,這也使得S3的應用情境變得非常多元。
S3 的常見使用場景有以下這些:
靜態網站託管(也就是我們的前端部署方式!)
檔案上傳與備份
大數據分析的資料儲存來源
事件驅動觸發(檔案上傳觸發 Lambda 執行程式)
那我們現在來進入實戰試試看透過AWS Console的圖形介面來手動託管靜態網站到S3上吧!
第一步,上傳靜態資源至S3 Bucket
首先我們要準備靜態資源,可以請AI幫你寫個簡單的網頁或是用手邊有的html都可以(後來發現最好是存在根目錄下,包資料夾進去會遇到網站託管URL索引不到文件導致403的問題)
因為我們要部署的是一個靜態網站 可以視情況上傳html、CSS、JS或甚至是SVG等圖檔到裡面來
第二步,進入設定
回到我們建立Bucket的頁面並選擇「屬性」(Properties)
將頁面滾至最下方,看到靜態網站託管進入編輯將其啟用
記得依照你上傳至 Bucket 的檔案名稱設定 index.html 與 error.html(發生錯誤時使用者會看到的頁面)
第三步,將S3 bucket與object公開至網路
為了讓網站可以讓其他人看到,我們必須調整一下網路設定
一樣回到前一個頁面,進入「許可」(Permissions)
將封鎖公有許可權都給關閉(這也意味著所有知道URL的人都可以進入你的S3 bucket中!)
完成後一樣在許可設定頁面中往下會看到「物件擁有權」(Object Ownership)
進入後將ACL給啟用
再跳出回到建立Bucket的頁面選擇物件(Object)
選擇「動作」->「使用ACL設為公有」
第四步,取得物件的URL
終於成功了!但有沒有覺得莫名的煩躁?怎麼點來點去要跳來跳去處理好多設定,如果是大型專案的話誰偷偷動了甚麼設定都難以發覺,甚至可能調整設定就得找半天還要被警告訊息給轟炸!
這時候該使用 SDK 簡化這些問題,SDK 將複雜的權限設定與服務功能用類(Class)來包裝,使各種設定屬性可以在程式碼中一目了然。
第一步,安裝SDK依賴(以Python為例)
pip install boto3 #我也不知道為什麼是這麼奇怪的名字
記得先在你的環境中設定好 AWS CLI 的存取金鑰(Day4 有設定過的人可以跳過~):
aws configure
第二步,寫code來把剛剛的過程打包!
以下是一個python環境的範例程式碼(包含創建S3 Bucket、上傳檔案、調整設定)
import boto3
import json
# 1. 初始化 S3 客戶端
region = "ap-east-2"
s3 = boto3.client('s3', region_name=region)
bucket_name = "my-static-website-demo" # 換成你的 bucket 名稱
# 2. 建立 Bucket(需指定區域)
s3.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={'LocationConstraint': region}
)
print(f" S3 Bucket {bucket_name} 已建立")
# 2.5. 關閉 Block Public Access 設定
s3.put_public_access_block(
Bucket=bucket_name,
PublicAccessBlockConfiguration={
'BlockPublicAcls': False,
'IgnorePublicAcls': False,
'BlockPublicPolicy': False,
'RestrictPublicBuckets': False
}
)
print(" 已關閉 Block Public Access")
# 2.6. 啟用ACL
s3.put_bucket_ownership_controls(
Bucket=bucket_name,
OwnershipControls={
'Rules': [
{
'ObjectOwnership': 'ObjectWriter'
}
]
}
)
print(" 已啟用ACL")
# 3. 上傳 index.html
with open("index.html", "rb") as f:
s3.put_object(
Bucket=bucket_name,
Key="index.html",
Body=f,
ContentType="text/html",
ACL="public-read" # 現在可以使用ACL了
)
print(" index.html 已上傳並設為 public")
# 4. 設定靜態網站託管
s3.put_bucket_website(
Bucket=bucket_name,
WebsiteConfiguration={
'IndexDocument': {'Suffix': 'index.html'},
'ErrorDocument': {'Key': 'error.html'}
}
)
print(" 已開啟靜態網站託管")
# 5. 顯示網站 URL
website_url = f"http://{bucket_name}.s3-website.{region}.amazonaws.com"
print(f" 你的網站已上線於: {website_url}")
恭喜你完成了網站的部署!
和剛剛在圖形化介面操作的步驟一模一樣,但有沒有覺得比起點來點去更加明瞭?
程式將流程打包還有一大好處,出了任何問題都可以透過報錯更清楚錯誤環節出在哪 (多利用try catch!)
並且打包好的流程還可以進一步用CI/CD工具管理,讓開發迭代速度再快一倍,這也是我們這幾天的小目標之一!
今天總算是進入較實戰的部分了,希望大家都有了解了S3是什麼樣的一個服務,透過這篇文章也希望各位能夠對整個部署的流程感到不那麼害怕XD。再下一篇我們將會介紹CDK!這是IaC (Infrastructure as Code)的根本組成,也是CI/CD pipeline中不可或缺的一個部件,再敬請期待囉!