iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0
Software Development

學校沒教的後端生存指南:30 天打造非同步 S3 微服務,部署 K8s 實現 HA 架構系列 第 6

[ Day 6 ] 實戰演練:雲端前哨站 AWS S3 最小權限原則(IAM)到本地服務連線

  • 分享至 

  • xImage
  •  

前幾天我們完成了本地端非同步模型的底層修煉,對非同步與 Event Loop 機制有了紮實的理解。今天開始,我們要正式跨入雲端戰場,利用 Java 21 與 Netty 非同步 HTTP Client,打造一個高效能的 AWS S3 檔案上傳微服務!
但在開始寫 Java 程式碼連線之前,我們必須先搞懂我們要連線的對象 AWS S3,以及如何安全地與它溝通。

AWS 與 AWS S3是什麼?

  1. AWS (Amazon Web Services):是全球最大的雲端服務平台。簡單來說,它就像是一間「IT 資源的超級租借市場」。你不需要自己買實體伺服器、拉網路線、吹冷氣維護,只需要滑鼠點一點,就能在幾秒鐘內租到運算力、資料庫與儲存空間。

  2. AWS S3 (Simple Storage Service):是 AWS 最老牌、最核心的物件儲存服務 (Object Storage)。它不像傳統硬碟需要切分資料夾與格式化,而是像一個巨大的 Key-Value 桶子(Bucket):

    • Value:你丟進去的檔案(圖片、影片、PDF、備份檔等)
    • Key:檔案的完整路徑(例如 uploads/2026/avatar.png)

S3 標榜著驚人的 99.999999999% (11個9) 的資料耐久性,是現代微服務存放靜態檔案的絕對首選。

什麼是 IAM?

當我們要把本地端寫好的 Java 程式連上 AWS 服務時,AWS 怎麼知道「你是誰」?又有「什麼權限」可以動我的 S3 儲存貯體?這時就要靠 IAM (Identity and Access Management,身分及存取管理)。

IAM 就像是 AWS 的守門人,它負責管理兩大核心:
- 你是誰 (Authentication):透過帳號密碼、金鑰(Access Key / Secret Key)或 SSO 認證。
- 你能做什麼 (Authorization):透過附加「政策 (Policy)」來規範。

在業界實務中,本機程式碼要連接 AWS,安全層級有以下高低之分:

  1. AWS IAM Identity Center (SSO 認證) :

    • 現代開發首選
    • 透過AWS CLI登入公司統一的 SSO 門戶,本機程式會自動取得暫時性的憑證(Token)
    • 最安全,電腦裡完全不會留存任何永久性的金鑰,就算電腦被偷,短暫的 Token 也會快速過期
  2. IAM 角色 (IAM Role) :

    • 雲端生產環境(EC2/EKS)的黃金標準
    • 服務部署到雲端(如 EC2 或 EKS 叢集)時,不會在伺服器上設定金鑰,會直接把一個IAM Role綁定給該伺服器。AWS SDK 會自動在背景申請每小時自動輪替的暫時性憑證
  3. IAM User 金鑰 (Access Key / Secret Key) :

    • 本機開發與測試 這是最直觀、最老牌的方式
    • 產生一組永久有效的憑證。雖然設定簡單,但要注意寫在環技變數中,不然如果跟著程式碼推上GitHub,保證 5 分鐘內就會被自動化爬蟲掃走,隔天就會收到 AWS 寄來的幾萬元挖礦帳單!

操作步驟

建立帳號

AWS 對於新建立的帳號都有100美金的免費額度,非常推薦想要使用雲服務的人都可以註冊試試看

  1. AWS官網點選右上角建立帳戶
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864hSQH5xe4cp.png

  2. 輸入電子信箱和名稱後驗證電子信箱,接著先選擇左側的免費試用
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864QxkKCQhCx4.png

  3. 輸入地址資訊惠要求要綁一張信用卡,免費方案的話也是要綁卡但不會刷,等待幾分鐘後就會看到主控台頁面了,在上方搜尋欄位輸入「s3」
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864QUP39oKwIh.png

建立S3 bucket

  1. 找到服務後選擇建立儲存貯體,只需要設定一個bucketName即可
  • 儲存貯體名稱:輸入一個全球唯一的名稱(例如:ithome-iron)。
  • AWS 區域:選擇距離你最近的 Region(例如 ap-northeast-1 東京),以降低網路延遲。
  • 其餘設定保持預設,直接拉到最下方點擊「建立儲存貯體」。
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864H5IqUY23v9.png

建立自訂的最小權限 Policy

  1. 完成後在頂端搜尋列輸入 IAM 並進入 IAM 主控台,建立一個新的使用者(名稱自訂)按照預設的設定建立
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864YZmUOzLuXR.png

  2. 這時回到IAM使用者頁面就會看到剛剛建立的使用者,建立金鑰,選擇本機代碼,建立金鑰

    • 一定要把存取金鑰(access key)和私密存取金鑰(secret key)記下來,secret key只會產生一次遺失就只能重新產生了
    • 等等寫程式連線會用到access key, secret key
      https://ithelp.ithome.com.tw/upload/images/20260901/20183864XiZI74WqAP.png
  3. 會看到右側出現剛剛建立的金鑰,接著點擊「許可政策」的新增許可,
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864HEiYCmN7Xs.png

  4. 選擇直接連接政策,查詢AmazonS3FullAccess打勾後點擊下一步,按下「新增許可」就可以啦!
    https://ithelp.ithome.com.tw/upload/images/20260901/20183864BzOoJWNjG4.png
    p.s 這是步驟中雖然選 AmazonS3FullAccess 但實務上其實有點危險等於把所有權限給出去,以我們即將開發的 S3 儲存服務來說,我們其實只需要這四個動作:

    • s3:PutObject:允許上傳檔案
    • s3:GetObject:允許讀取/下載檔案
    • s3:DeleteObject:允許刪除檔案
    • s3:ListBucket:允許列出桶子底下的檔案清單
      因此有些人會透過自訂的Json Policy來取代FullAccess
{
    "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 權限決策鏈 (Permission Decision Chain)

AWS 決定一個 IAM 主體(User, Role )究竟能做甚麼」,並不是單看一張 Policy 這麼簡單。根據 AWS 官方的安全決策鏈,一個請求從發出到被允許(Allow)或拒絕(Deny),會經過層層關卡的嚴格審查:

https://ithelp.ithome.com.tw/upload/images/20260901/201838641tLcpfcGqK.jpg

  1. 權限決策鏈的層層規範:
    一個 IAM 主體最終擁有的權限,是經過以下功能的交集(取最小範圍):

    • Organizations SCP (服務控制政策):企業在多帳號架構下,用來限制子帳號的「權限天花板」(例如:禁止子帳號使用特定 Region 的服務)。
    • Permissions Boundary (權限邊界):用來限制該 IAM User「能被賦予的最大權限範圍」,防止開發人員在擁有 IAM 權限時,偷偷給自己開出太大的權限。
    • Session Principal (臨時權限):當我們透過 STS API (如 AssumeRole) 獲取臨時權限時,被呼叫的角色權限也會納入最終考量。
    • Identity-based Policy (身分政策) 與 Resource-based Policy (資源政策):身分政策是綁在 User/Role 上的(我們接下來要做的);資源政策是直接綁在 S3 Bucket 上的(Bucket Policy)。
  2. 為什麼我們選擇用 Policy 的方式來配置?
    雖然權限決策鏈看起來極其複雜,但對於我們開發「單一微服務」而言:

    • SCP 與 Permissions Boundary 通常是企業雲端維運團隊(Platform/Cloud Admin)在管理的「安全護欄(Guardrails)」,一般開發者無法也不需要改動。
    • Identity-based Policy 是我們做為後端開發者最直觀、最能精確控制微服務行為的工具。
    • 透過將客製化的 JSON Policy 直接附加在服務專用的 IAM User 上,我們能確保服務只拿到它運作所需的最低權限。

參考資料


上一篇
[ Day 5 ] 非同步救星:初探 Netty 與 Event Loop 事件驅動模型
下一篇
[ Day 7 ] 左右開弓 : Java實作 Apache 同步與 Netty 非同步 S3 上傳
系列文
學校沒教的後端生存指南:30 天打造非同步 S3 微服務,部署 K8s 實現 HA 架構8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言