iT邦幫忙

2025 iThome 鐵人賽

DAY 5
2
Build on AWS

一步步帶你認識 Cloud Native —— 用AWS免費服務打造雲原生專案系列 第 5

Day5 SDK 操作 S3 部暑網站! & S3服務介紹 | 程式化部署AWS服務邁向CI/CD!(2)

  • 分享至 

  • xImage
  •  

歡迎來到本系列的第五篇文章!


上一篇的內容中,我們介紹了認識了 SDK(Software Development Kit)以及 CDK(Cloud Development Kit)。並且透過設定 IAM 後取得存取金鑰,成功透過 CLI 介面在 AWS 上建立了一個 S3 Bucket。接下來,我們的目標是用 SDK 與 CDK 讓它「動起來」。


不過在正式進入SDK的操作之前,我們先來看一下S3是什麼樣的服務,而在AWS Console上該怎麼操作這個服務?

根據AWS Document

Amazon Simple Storage Service (Amazon S3) 是物件儲存服務,提供領先業界的可擴展性、資料可用性、安全性及效能。各種規模和各業界的數百萬家客戶可以存放、管理、分析和保護幾乎任何使用案例的任何資料量,如資料湖、雲端原生應用程式和行動應用程式。藉助符合成本效益的儲存類別和易於使用的管理功能,您可以最佳化成本、組織和分析資料並設定精密的存取控制,以滿足特定的業務和合規需求。

簡單的來說,你可以在S3上創建一個儲存貯體(Bucket)並且在其中儲存幾乎各種物件(Object),並且可以透過SDK、URL來訪問或進行操作,這也使得S3的應用情境變得非常多元。

S3 的常見使用場景有以下這些:

  • 靜態網站託管(也就是我們的前端部署方式!)

  • 檔案上傳與備份

  • 大數據分析的資料儲存來源

  • 事件驅動觸發(檔案上傳觸發 Lambda 執行程式)

那我們現在來進入實戰試試看透過AWS Console的圖形介面來手動託管靜態網站到S3上吧!

第一步,上傳靜態資源至S3 Bucket
首先我們要準備靜態資源,可以請AI幫你寫個簡單的網頁或是用手邊有的html都可以(後來發現最好是存在根目錄下,包資料夾進去會遇到網站託管URL索引不到文件導致403的問題)

https://ithelp.ithome.com.tw/upload/images/20250815/20178103cTt5ep7mno.png
因為我們要部署的是一個靜態網站 可以視情況上傳html、CSS、JS或甚至是SVG等圖檔到裡面來

第二步,進入設定

回到我們建立Bucket的頁面並選擇「屬性」(Properties)
https://ithelp.ithome.com.tw/upload/images/20250815/20178103LD9h589AGY.png
將頁面滾至最下方,看到靜態網站託管進入編輯將其啟用
https://ithelp.ithome.com.tw/upload/images/20250815/201781036S72qTtbea.png

記得依照你上傳至 Bucket 的檔案名稱設定 index.html 與 error.html(發生錯誤時使用者會看到的頁面)

第三步,將S3 bucket與object公開至網路

為了讓網站可以讓其他人看到,我們必須調整一下網路設定

一樣回到前一個頁面,進入「許可」(Permissions)
https://ithelp.ithome.com.tw/upload/images/20250815/20178103UaCRueidpD.png
將封鎖公有許可權都給關閉(這也意味著所有知道URL的人都可以進入你的S3 bucket中!)

完成後一樣在許可設定頁面中往下會看到「物件擁有權」(Object Ownership)
https://ithelp.ithome.com.tw/upload/images/20250815/20178103HXdB7N0x7n.png
進入後將ACL給啟用

再跳出回到建立Bucket的頁面選擇物件(Object)
https://ithelp.ithome.com.tw/upload/images/20250815/20178103ZjV6GmJ8WT.png
選擇「動作」->「使用ACL設為公有」

第四步,取得物件的URL

進行到這裡必要的設定都已經完成了!接下來我們就可以透過URL來訪問儲存在bucket中的object
因為我們是要託管一個靜態網站,那麼我們就找到index.html檔案的URL~
https://ithelp.ithome.com.tw/upload/images/20250815/20178103geakcRN7Pa.png
有這個URL之後就成功訪問到我們上傳的網頁啦
https://ithelp.ithome.com.tw/upload/images/20250815/20178103OhQilvloOG.png

終於成功了!但有沒有覺得莫名的煩躁?怎麼點來點去要跳來跳去處理好多設定,如果是大型專案的話誰偷偷動了甚麼設定都難以發覺,甚至可能調整設定就得找半天還要被警告訊息給轟炸!

這時候該使用 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中不可或缺的一個部件,再敬請期待囉!


上一篇
Day4 SDK?CDK?程式化部署AWS服務邁向CI/CD!(1): IAM設定、終端部署S3 Bucket
下一篇
Day6 IaC 程式定義基礎設施 CloudFormation及 CDK介紹| 程式化部署AWS服務邁向CI/CD!(3)
系列文
一步步帶你認識 Cloud Native —— 用AWS免費服務打造雲原生專案24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
viiccwen
iT邦新手 5 級 ‧ 2025-08-16 00:49:12

學長好帥,謝謝學長的教學 🤓✋

我要留言

立即登入留言