本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過 VPC 端點設定 Amazon S3 儲存貯體的私有存取權
由 Martin Maritsch (AWS)、Gabriel Rodriguez Garcia (AWS)、Shukhrat Khodjaev (AWS)、Nicolas Jacob Baer (AWS)、Mohan Gowda Purushothama (AWS) 和 Joaquin Rinaudo (AWS) 建立
程式碼儲存庫:私有 S3 VPCE | 環境:生產 | 技術:無伺服器 |
AWS 服務:Amazon API Gateway;Amazon S3;Amazon VPC;Elastic Load Balancing (ELB) |
Summary
在 Amazon Simple Storage Service (Amazon S3) 中,預先簽章的 URLs 可讓您與目標使用者共用任意大小的檔案。依預設,Amazon S3 預先簽章的 URLs 可在過期時段內從網際網路存取,這使其方便使用。不過,企業環境通常需要存取 Amazon S3 預先簽章的 URLs,才能僅限於私有網路。
此模式提供無伺服器解決方案,透過使用來自私有網路且沒有網際網路周遊的預先簽章 URLs,安全地與 S3 物件互動。在 架構中,使用者可透過內部網域名稱存取 Application Load Balancer。流量會透過 Amazon API Gateway 和 S3 儲存貯體的虛擬私有雲端 (VPC) 端點在內部路由。 AWS Lambda 函數會透過私有 URLs 端點產生預先簽章的檔案下載 VPC,這有助於增強敏感資料的安全性和隱私權。
先決條件和限制
先決條件
包含部署在 中子網路的 VPC AWS 帳戶 ,該子網路連接至公司網路 (例如,透過 AWS Direct Connect)。
限制
S3 儲存貯體的名稱必須與網域相同,因此建議您檢查 Amazon S3 儲存貯體命名規則。
此範例架構不包含已部署基礎設施的監控功能。如果您的使用案例需要監控,請考慮新增AWS 監控服務。
此範例架構不包含輸入驗證。如果您的使用案例需要輸入驗證並提高安全性,請考慮使用 AWS WAF 來保護您的 API。
此範例架構不包含 Application Load Balancer 的存取記錄。如果您的使用案例需要存取日誌,請考慮啟用負載平衡器存取日誌。
版本
Python 3.11 版或更新版本
Terraform 1.6 版或更新版本
架構
目標技術堆疊
目標技術堆疊中會使用下列 AWS 服務:
Amazon S3 是核心儲存服務,用於安全地上傳、下載和儲存檔案。
Amazon API Gateway 公開與 S3 儲存貯體互動的資源和端點。此服務在產生預先簽章的 URLs 以下載或上傳資料時扮演重要角色。
AWS Lambda 會產生預先簽章的 URLs,用於從 Amazon S3 下載檔案。Lambda 函數由 API Gateway 呼叫。
Amazon VPC 在 VPC 中部署資源以提供網路隔離。VPC 包含子網路和路由表,以控制流量流程。
Application Load Balancer 會將傳入流量路由至 API Gateway 或 S3 儲存貯體的 VPC 端點。它允許企業網路的使用者在內部存取資源。
Amazon S3 的 VPC 端點可在 VPC 和 Amazon S3 中的資源之間進行直接的私有通訊,而不會周遊公有網際網路。
AWS Identity and Access Management (IAM) 控制對 AWS 資源的存取。設定許可以確保與 API 和其他 服務的安全互動。
目標架構
此圖展示了以下要點:
來自公司網路的使用者可以透過內部網域名稱存取 Application Load Balancer。我們假設公司網路與 中的內部網路子網路之間存在連線 AWS 帳戶 (例如,透過 AWS Direct Connect 連線)。
Application Load Balancer 會將傳入流量路由至 API Gateway,以產生預先簽章的 URLs,將資料下載或上傳至 Amazon S3,或 S3 儲存貯體的 VPC 端點。在這兩種情況下,請求都會在內部路由,不需要周遊網際網路。
API Gateway 公開資源和端點,以便與 S3 儲存貯體互動。在此範例中,我們提供端點,以從 S3 儲存貯體下載檔案,但也可以將其擴展以提供上傳功能。
Lambda 函數會產生預先簽章的 URL,透過使用 Application Load Balancer 的網域名稱而非公有 Amazon S3 網域,從 Amazon S3 下載檔案。
使用者會收到預先簽章的 URL,並使用 Application Load Balancer 來從 Amazon S3 下載檔案。負載平衡器包含預設路由,用於將 API 不想要的流量傳送至 S3 儲存貯體的 VPC 端點。
VPC 端點會將具有自訂網域名稱的預先簽章 URL 路由至 S3 儲存貯體。S3 儲存貯體必須具有與網域相同的名稱。
自動化和擴展
此模式使用 Terraform 將基礎設施從程式碼儲存庫部署到 AWS 帳戶。
工具
工具
Python
是一種一般用途的電腦程式設計語言。 Terraform
是來自 HashiCorp 的基礎設施即程式碼 (IaC) 工具,可協助您建立和管理雲端和內部部署資源。 AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列 Shell 中的命令與 AWS 服務互動。
程式碼儲存庫
此模式的程式碼可在 https://github.com/aws-samples/ private-s3-vpce
最佳實務
此模式的範例架構使用 IAM 許可來控制對 API 的存取。任何擁有有效 IAM 憑證的人都可以呼叫 API。如果您的使用案例需要更複雜的授權模型,您可能想要使用不同的存取控制機制。
Epics
任務 | 描述 | 所需的技能 |
---|---|---|
取得 AWS 憑證。 | 檢閱您的 AWS 憑證和對帳戶的存取。如需指示,請參閱 AWS CLI 文件中的組態和憑證檔案設定。 | DevOpsAWS、一般 AWS |
複製儲存庫。 | 複製此模式隨附的 GitHub 儲存庫:
| DevOpsAWS、一般 AWS |
設定變數。 |
| DevOpsAWS、一般 AWS |
部署解決方案。 |
| DevOpsAWS、一般 AWS |
任務 | 描述 | 所需的技能 |
---|---|---|
建立測試檔案。 | 將檔案上傳至 Amazon S3,以建立檔案下載的測試案例。您可以使用 Amazon S3 主控台
| DevOpsAWS、一般 AWS |
測試預先簽章的 URL 功能。 |
| DevOpsAWS、一般 AWS |
清除。 | 確保在不再需要資源時將其移除:
| DevOpsAWS、一般 AWS |
故障診斷
問題 | 解決方案 |
---|---|
S3 物件金鑰名稱具有特殊字元,例如數字符號 (#) 會中斷 URL 參數並導致錯誤。 | 正確編碼 URL 參數,並確保 S3 物件金鑰名稱遵循 Amazon S3 準則。 |
相關資源
Amazon S3:
Amazon API Gateway:
Application Load Balancer:
使用 ALB、S3 和HTTPS 託管內部 PrivateLink 靜態網站
(AWS 部落格文章)