使用與靜態 IP 地址相關聯的端點來整合 Amazon S3 預先簽章的 URL 產生和物件下載 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用與靜態 IP 地址相關聯的端點來整合 Amazon S3 預先簽章的 URL 產生和物件下載

Song Jin、Eunhye Jo 和 Amazon Web Services Jun Soung Lee

Summary

此模式透過為物件下載建立安全的自訂預先簽章 URLs,簡化對 Amazon Simple Storage Service (Amazon S3) 的存取。解決方案提供具有唯一網域和靜態 IP 地址的單一端點。它專為需要在具有靜態 IP 地址的統一網域下整合 API 和 Amazon S3 端點的客戶量身打造。使用案例涉及遵循 IP 和網域允許清單防火牆政策的使用者,限制對特定網域和 IP 地址的 API 存取。

架構採用金鑰 AWS 服務,包括 AWS Global Accelerator Amazon API Gateway、 AWS Lambda Application Load Balancer AWS PrivateLink和 Amazon S3。此設計會集中 API,以在單一網域下產生預先簽章URLs 和 Amazon S3 端點,並連結至具有兩個靜態 IP 地址的加速器。因此,使用者可以輕鬆地請求預先簽章URLs,並透過具有靜態 IP 地址的統一網域端點下載 Amazon S3 物件。

此架構特別有利於具有嚴格政策或合規要求的客戶,例如公有、醫療和金融領域的客戶。

先決條件和限制

先決條件

  • 作用中 AWS 帳戶

  • 自訂網域名稱的公有託管區域

  • 在您選擇的 AWS Certificate Manager (ACM) 中匯入 AWS 區域 的網域

限制

  • Amazon S3 儲存貯體名稱必須符合端點的網域名稱。此要求旨在確保可透過單一 API 端點提供 Amazon S3 端點。

  • API Gateway 中使用的自訂網域名稱應與單一 API 端點的網域名稱相符。

  • 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性,請參閱AWS 依區域的服務。如需特定端點,請參閱服務端點和配額,然後選擇服務的連結。

架構

下圖顯示此模式的目標架構和工作流程。

預先簽章 URL 產生和物件下載的元件和工作流程。

下圖說明了下列概念和工作流程:

  1. 使用者使用透過 提供的自訂端點 AWS Global Accelerator,使用自訂網域名稱和相關聯的 IP 地址,啟動產生預先簽章 URL 的請求。

  2. Lambda 函數會產生預先簽章的 URL,指向自訂端點。它會以 301 重新導向回應,其中包含產生的預先簽章 URL。透過重新導向的預先簽章 URL,使用者會使用透過 Global Accelerator 提供的自訂端點自動下載物件。

預先簽章 URL 產生和物件下載工作流程的整體架構元件如下:

  • 由 Global Accelerator 佈建靜態 IP 地址。

  • 使用自訂網域名稱,將加速器的別名註冊為 Amazon Route 53 公有託管區域的 A 記錄。

  • 建立儲存貯體名稱符合已註冊自訂網域名稱的 Amazon S3 儲存貯體。

  • 建立 API Gateway 和 Amazon S3 服務的 VPC 端點。

  • 要連線至 Global Accelerator 的內部 Application Load Balancer 組態。

  • 指派已連接 ACM 憑證之 API Gateway 的自訂網域名稱。

  • 部署與 Lambda 函數整合的私有 API Gateway。

  • Lambda 函數配備連接的 AWS Identity and Access Management (IAM) 角色 (具有 GetObject 許可)。

工具

AWS 服務

  • Amazon API Gateway 可協助您建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket APIs。

  • Application Load Balancer 會將傳入應用程式流量分散到多個可用區域中的多個目標,例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。

  • AWS Certificate Manager (ACM) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰,以保護 AWS 網站和應用程式。

  • AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端 基礎設施。

  • AWS Global Accelerator 是一種全域服務,支援多個 中的端點 AWS 區域。您可以建立加速器,透過 AWS 全球網路將流量導向最佳端點。如此可改善網際網路應用程式的可用性和效能,提升全球觀眾的使用體驗。

  • AWS Identity and Access Management (IAM) 透過控制已驗證並獲授權使用的人員,協助您安全地管理對 AWS 資源的存取。

  • AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需按使用的運算時間付費。

  • AWS PrivateLink 可協助您建立從虛擬私有雲端 (VPCs) 到 VPC 外部服務的單向私有連線。

  • Amazon Route 53 是一種可用性高、可擴展性強的 DNS Web 服務。

  • Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。

其他工具

  • Terraform 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具,可協助您建立和管理雲端和內部部署資源。

程式碼儲存庫

您可以根據您的偏好,使用 AWS CDK 或 Terraform 部署此模式。Epics 區段包含兩種部署方法的說明。此模式的程式碼可在下列 GitHub 儲存庫中使用:

最佳實務

  • 為了增強生產環境中的安全性,請務必實作授權機制,例如 Amazon Cognito,以限制對PresignedUrl世代 API 的存取。

  • 遵循最低權限原則,並授予執行任務所需的最低許可。如需詳細資訊,請參閱 IAM 文件中的授予最低權限安全最佳實務

史詩

任務描述所需的技能

決定網域名稱。

決定統一 Amazon S3 端點的公有網域名稱。網域名稱也會用作 Amazon S3 儲存貯體名稱。

AWS 管理員、網路管理員

建立公有的託管區域。

在 Amazon Route 53 中建立公有託管區域。其網域名稱必須與 API Gateway 中使用的網域名稱相符。

AWS 管理員、網路管理員

準備 SSL 憑證。

使用 AWS Certificate Manager (ACM) 為您的 Web 應用程式網域請求匯入 SSL 憑證。

AWS 管理員、網路管理員
任務描述所需的技能

設定 Terraform 開發環境。

若要設定開發環境,請執行下列動作:

  1. 安裝 Terraform 1.0 版或更新版本。

  2. 在終端機視窗中執行下列命令,複製 GitHub s3-presignedurl-staticips-endpoint-with-terraform 儲存庫:

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform.git

AWS 管理員、雲端管理員

修改 .tfvars provider.tf 檔案。

  1. 建立必要.tfvars檔案 – 1.vpc_alb_ga2.apigw_s3_lambda目錄中建立apg.tfvars檔案。這些檔案將包含您的環境特定變數值。

    • 針對 1.vpc_alb_ga/apg.tfvars,使用下列範本建立 檔案:

      hcl environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
    • 對於 2.apigw_s3_lambda/apg.tfvars,使用下列範本建立檔案 (在完成步驟 1 vpc_id後,您將需要更新 ):

      hcl vpc_id = "vpc-xxxxxxxxx" # Update this with the VPC ID output from step 1 environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
  2. 修改provider.tf檔案 1.vpc_alb_ga2.apigw_s3_lambda 資料夾中,編輯provider.tf檔案以符合您的本機 AWS 組態:

    hcl provider "aws" { region = "ap-northeast-2" # Change to your preferred region profile = "apg" # Change to your AWS profile name }

注意下列事項:

  • .tfvars檔案中的預留位置值取代為您的實際值。

  • 完成第一個 Terraform 部署後 (1.vpc_alb_ga),請使用輸出2.apigw_s3_lambda/apg.tfvars中的 VPC ID 更新 中的vpc_id值。

  • 請確定檔案中的 AWS 設定檔名稱與~/.aws/credentials檔案中現有的設定檔provider.tf相符。

  • 網域值應與您的 Route 53 託管區域網域相符。

  • 與網域s3_bucket_prefix結合的 將形成您的 Amazon S3 儲存貯體名稱 (例如 your-bucket-prefix.your-domain.com)。

  • 如果您變更 aws_region,您可能還需要更新main.tf檔案中的硬式編碼可用區域,以符合您選擇的可用區域 AWS 區域。

AWS 管理員、雲端管理員

佈建網路資源。

若要佈建網路資源,請執行下列命令:

cd ./2.vpc_alb_ga terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars

apply 命令執行期間,出現提示時輸入 yes

AWS 管理員、雲端管理員

佈建 API Gateway、Amazon S3 和 Lambda。

若要佈建網路資源,請使用下列命令:

cd ./2.apigw_s3_lambda terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars
AWS 管理員、雲端管理員
任務描述所需的技能

設定 AWS CDK 開發環境。

若要設定開發環境,請執行下列動作:

  1. 安裝 AWS CDK。

  2. 在終端機視窗中執行下列命令,複製 GitHub s3-presignedurl-staticips-endpoint-with-cdk 儲存庫:

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk.git

AWS 管理員、雲端管理員

config/index.ts 檔案中設定網域設定。

若要編輯常數變數的選項,請使用下列命令:

export const options = { certificateArn: '{arn of the acm which created before}', dnsAttr: { zoneName: '{public hosted zone name}', hostedZoneId: 'hosted zone Id', }, domainNamePrefix: '{Prefix for the domain}', presignPath: 'presign', objectsPath: 'objects', };

在命令中,將每個預留位置取代為您自己的資訊:

  • '{arn of the acm which created before}' 將 取代為您的 ACM 憑證 Amazon Resource Name (ARN)。

  • 將 取代'{public hosted zone name}'為您的網域名稱。

  • 將 取代'hosted zone Id'為您的 Route 53 託管區域 ID。

  • '{Prefix for the domain}' 將 取代為您要使用的網域字首。

  • 或者,如果特定使用案例需要,請修改 'presign''objects' 路徑。

AWS 管理員、雲端管理員

部署堆疊。

若要部署兩個堆疊,一個用於虛擬私有雲端 (VPC),另一個用於應用程式,請使用下列命令:

$ npm install $ cdk synth $ cdk deploy --all
AWS 管理員、雲端管理員
任務描述所需的技能

驗證端點的 IP 地址。

若要驗證此模式的網域具有靜態 IP 地址,請使用下列命令:

nslookup ${s3-bucket-prefix}.${domain}
網路管理員

上傳您稍後可以下載的測試檔案。

將測試檔案上傳至 Amazon S3 儲存貯體中的 '/objects' 資料夾。

AWS 管理員、雲端管理員

叫用 API 以產生預先簽章的 URL。

若要產生預先簽章的 URL,請使用下列格式從瀏覽器或 API 用戶端 (例如 Postman) 呼叫 URL:

https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}

${s3-bucket-prefix}和 中的預留位置值取代為您在先前步驟中設定${domain}的值。

應用程式擁有者

檢查結果。

預期的結果是您應該會收到 301 (移動永久) 重新導向狀態碼。此回應將包含預先簽章的 URL,該 URL 應會自動啟動測試檔案的下載。

測試工程師
任務描述所需的技能

銷毀 API Gateway、Amazon S3 和 Lambda 資源。

若要刪除資源,請使用下列命令:

cd ./2.apigw_s3_lambda terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 管理員、雲端管理員

銷毀網路資源。

若要刪除網路資源,請使用下列命令:

cd ./1.vpc_alb_ga terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 管理員、雲端管理員
任務描述所需的技能

銷毀堆疊。

若要同時銷毀 VPC 和應用程式堆疊,請使用下列命令:

$ cdk destroy --all
AWS 管理員、雲端管理員

清空並刪除 Amazon S3 儲存貯體。

清空刪除物件 Amazon S3 儲存貯體,以及預設不會刪除的日誌 Amazon S3 儲存貯體。

Amazon S3 儲存貯體名稱為 ${s3-bucket-prefix}.${domain}${s3-bucket-prefix}.${domain}-logs

如果您偏好使用 AWS Command Line Interface (AWS CLI) 刪除儲存貯體,請使用下列命令:

$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force $ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force

${s3-bucket-prefix}和 取代${domain}為您在先前步驟中設定的值。,/p>

AWS 管理員、雲端管理員

相關資源

AWS 部落格