前幾天我們完成了本地端非同步模型的底層修煉,對非同步與 Event Loop 機制有了紮實的理解。今天開始,我們要正式跨入雲端戰場,利用 Java 21 與 Netty 非同步 HTTP Client,打造一個高效能的 AWS S3 檔案上傳微服務!
但在開始寫 Java 程式碼連線之前,我們必須先搞懂我們要連線的對象 AWS S3,以及如何安全地與它溝通。
AWS (Amazon Web Services):是全球最大的雲端服務平台。簡單來說,它就像是一間「IT 資源的超級租借市場」。你不需要自己買實體伺服器、拉網路線、吹冷氣維護,只需要滑鼠點一點,就能在幾秒鐘內租到運算力、資料庫與儲存空間。
AWS S3 (Simple Storage Service):是 AWS 最老牌、最核心的物件儲存服務 (Object Storage)。它不像傳統硬碟需要切分資料夾與格式化,而是像一個巨大的 Key-Value 桶子(Bucket):
S3 標榜著驚人的 99.999999999% (11個9) 的資料耐久性,是現代微服務存放靜態檔案的絕對首選。
當我們要把本地端寫好的 Java 程式連上 AWS 服務時,AWS 怎麼知道「你是誰」?又有「什麼權限」可以動我的 S3 儲存貯體?這時就要靠 IAM (Identity and Access Management,身分及存取管理)。
IAM 就像是 AWS 的守門人,它負責管理兩大核心:
- 你是誰 (Authentication):透過帳號密碼、金鑰(Access Key / Secret Key)或 SSO 認證。
- 你能做什麼 (Authorization):透過附加「政策 (Policy)」來規範。
在業界實務中,本機程式碼要連接 AWS,安全層級有以下高低之分:
AWS IAM Identity Center (SSO 認證) :
IAM 角色 (IAM Role) :
IAM User 金鑰 (Access Key / Secret Key) :
AWS 對於新建立的帳號都有100美金的免費額度,非常推薦想要使用雲服務的人都可以註冊試試看
AWS官網點選右上角建立帳戶
輸入電子信箱和名稱後驗證電子信箱,接著先選擇左側的免費試用
輸入地址資訊惠要求要綁一張信用卡,免費方案的話也是要綁卡但不會刷,等待幾分鐘後就會看到主控台頁面了,在上方搜尋欄位輸入「s3」
完成後在頂端搜尋列輸入 IAM 並進入 IAM 主控台,建立一個新的使用者(名稱自訂)按照預設的設定建立
這時回到IAM使用者頁面就會看到剛剛建立的使用者,建立金鑰,選擇本機代碼,建立金鑰
會看到右側出現剛剛建立的金鑰,接著點擊「許可政策」的新增許可,
選擇直接連接政策,查詢AmazonS3FullAccess打勾後點擊下一步,按下「新增許可」就可以啦!
p.s 這是步驟中雖然選 AmazonS3FullAccess 但實務上其實有點危險等於把所有權限給出去,以我們即將開發的 S3 儲存服務來說,我們其實只需要這四個動作:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3ObjectReadWriteActions",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your-bucket-name/*"
},
{
"Sid": "S3BucketListAction",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::your-bucket-name"
}
]
}
從IAM左側政策 (Policies)選單建立政策,將上方json貼進去,在指定到剛剛建立的iam user也可以
現在,大家已經擁有 :
- 一個專屬的 S3 Bucket 名稱
- 一個擁有最小權限的使用者金鑰(Access Key 與 Secret Key)
下一篇 左右開弓 : Java實作 Apache 同步與 Netty 非同步 S3 上傳 我們將在 Java 專案中引入 AWS SDK v2 的 apache-client和netty-nio-client 依賴,並教大家如何利用我們手中的憑證,在程式中初始化S3Client與S3AsyncClient,正式寫 Code 測試檔案上傳。
AWS 決定一個 IAM 主體(User, Role )究竟能做甚麼」,並不是單看一張 Policy 這麼簡單。根據 AWS 官方的安全決策鏈,一個請求從發出到被允許(Allow)或拒絕(Deny),會經過層層關卡的嚴格審查:

權限決策鏈的層層規範:
一個 IAM 主體最終擁有的權限,是經過以下功能的交集(取最小範圍):
為什麼我們選擇用 Policy 的方式來配置?
雖然權限決策鏈看起來極其複雜,但對於我們開發「單一微服務」而言: