本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Application Load Balancer 在 Amazon ECS 中使用交互 TLS 簡化應用程式身分驗證
由 Olawale Olaleye (AWS) 和 Shamanth Devagari (AWS) 建立
Summary
此模式可協助您使用 Application Application Load Balancer (ALB),透過 Amazon Elastic Container Service (Amazon ECS) 中的交互 TLS,簡化應用程式身分驗證並卸載安全負擔。使用 ALB,您可以從中驗證 X.509 用戶端憑證 AWS Private Certificate Authority。這種強大的組合有助於實現服務之間的安全通訊,減少應用程式中複雜身分驗證機制的需求。此外, 模式會使用 Amazon Elastic Container Registry (Amazon ECR) 來存放容器映像。
此模式中的範例使用來自公有圖庫的 Docker 影像,最初建立範例工作負載。之後,新的 Docker 映像會建置為儲存在 Amazon ECR 中。對於來源,請考慮 Git 型系統,例如 GitHub、GitLab 或 Bitbucket,或使用 Amazon Simple Storage Service Amazon S3 (Amazon S3)。若要建置 Docker 映像,請考慮 AWS CodeBuild 針對後續映像使用 。
先決條件和限制
先決條件
限制
Application Load Balancer 的相互 TLS 僅支援 X.509v3 用戶端憑證。不支援 X.509v1 用戶端憑證。
此模式程式碼儲存庫中提供的 CloudFormation 範本不包含佈建 CodeBuild 專案做為堆疊的一部分。
有些 AWS 服務 不適用於所有 AWS 區域。如需區域可用性,請參閱AWS 依區域的服務
。如需特定端點,請參閱服務端點和配額,然後選擇服務的連結。
產品版本
Docker 27.3.1 版或更新版本
AWS CLI 2.14.5 版或更新版本
架構
下圖顯示此模式的架構元件。

該圖顯示以下工作流程:
建立 Git 儲存庫,並將應用程式程式碼遞交至儲存庫。
在 中建立私有憑證授權機構 (CA) AWS Private CA。
建立 CodeBuild 專案。CodeBuildproject 由遞交變更觸發,並建立 Docker 映像並將建置映像發佈至 Amazon ECR。
從 CA 複製憑證鏈和憑證內文,並將憑證套件上傳至 Amazon S3。
使用您上傳到 Amazon S3 的 CA 套件建立信任存放區。將信任存放區與 Application Load Balancer (ALB) 上的交互 TLS 接聽程式建立關聯。
使用私有 CA 為容器工作負載發行用戶端憑證。也使用 建立私有 TLS 憑證 AWS Private CA。
將私有 TLS 憑證匯入 AWS Certificate Manager (ACM),並搭配 ALB 使用。
當 與 中的容器工作負載通訊時, 中的容器工作負載
ServiceTwo
會使用發行的用戶端憑證來驗證 ALBServiceOne
。當 與 中的容器工作負載通訊時, 中的容器工作負載
ServiceOne
會使用發行的用戶端憑證來驗證 ALBServiceTwo
。
自動化和擴展
透過使用 CloudFormation AWS Cloud Development Kit (AWS CDK) 或 SDK 中的 API 操作來佈建 AWS 資源,即可完全自動化此模式。
您可以使用 AWS CodePipeline 實作持續整合和持續部署 (CI/CD) 管道,使用 CodeBuild 自動化容器映像建置程序,並將新版本部署到 Amazon ECS 叢集服務。
工具
AWS 服務
AWS Certificate Manager (ACM) 可協助您建立、存放和續約公有和私有 SSL/TLS X.509 憑證和金鑰,以保護 AWS 網站和應用程式。
AWS CloudFormation 可協助您設定 AWS 資源、快速一致地佈建資源,以及在整個 AWS 帳戶 和 生命週期中管理資源 AWS 區域。
AWS CodeBuild 是一種全受管建置服務,可協助您編譯原始程式碼、執行單元測試,並產生準備好部署的成品。
Amazon Elastic Container Registry (Amazon ECR) 是一種受管容器映像登錄服務,安全、可擴展且可靠。
Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴展的快速容器管理服務,用於執行、停止和管理叢集上的容器。您可以在 管理的無伺服器基礎設施上執行任務和服務 AWS Fargate。或者,若要進一步控制您的基礎設施,您可以在您管理的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體叢集上執行任務和服務。
Amazon ECS Exec 可讓您直接與容器互動,而不需要先與主機容器作業系統互動、開啟傳入連接埠或管理 SSH 金鑰。您可以使用 ECS Exec 在 Amazon EC2 執行個體上執行的容器或在容器上執行 shell AWS Fargate。
Elastic Load Balancing (ELB) 會將傳入的應用程式或網路流量分散到多個目標。例如,您可以在一或多個可用區域中將流量分配到 Amazon EC2 執行個體、容器和 IP 地址。ELB 會監控其已註冊目標的運作狀態,並僅將流量路由至運作狀態良好的目標。ELB 會在傳入流量隨時間變更時擴展負載平衡器。它可以自動擴展到大多數工作負載。
AWS Fargate 可協助您執行容器,而不需要管理伺服器或 Amazon EC2 執行個體。Fargate 與 Amazon ECS 和 Amazon Elastic Kubernetes Service (Amazon EKS) 相容。您可以使用 Fargate 啟動類型或 Fargate 容量提供者來執行 Amazon ECS 任務和服務。若要這樣做,請將應用程式封裝在容器中、指定 CPU 和記憶體需求、定義聯網和 IAM 政策,以及啟動應用程式。每個 Fargate 任務都有自己的隔離界限,不會與其他任務共用基礎核心、CPU 資源、記憶體資源或彈性網路界面。
AWS Private Certificate Authority 可讓您建立私有憑證授權機構 (CA) 階層 (包括根 CA 和次級 CA),而不需要操作內部部署 CA 的投資和維護成本。
其他工具
程式碼儲存庫
此模式的程式碼可在 GitHub mTLS-with-Application-Load-Balancer-in-Amazon-ECS
最佳實務
使用 Amazon ECS Exec 執行命令或取得在 Fargate 上執行的容器 shell。您也可以使用 ECS Exec 來協助收集診斷資訊以進行偵錯。
使用安全群組和網路存取控制清單 ACLs) 來控制服務之間的傳入和傳出流量。Fargate 任務會從虛擬私有雲端 (VPC) 中設定的子網路接收 IP 地址。
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
下載原始程式碼。 | 若要下載此模式的原始碼,請分叉或複製 GitHub mTLS-with-Application-Load-Balancer-in-Amazon-ECS | DevOps 工程師 |
建立 Git 儲存庫。 | 若要建立 Git 儲存庫以包含 Dockerfile 和
| DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
在 中建立私有 CA AWS Private CA。 | 若要建立私有憑證授權機構 (CA),請在終端機中執行下列命令。將範例變數中的值取代為您自己的值。
如需詳細資訊,請參閱 AWS 文件中的在 中建立私有 CA AWS Private CA。 | DevOps 工程師,AWS DevOps |
建立並安裝私有 CA 憑證。 | 若要為您的私有根 CA 建立和安裝憑證,請在終端機中執行下列命令:
| AWS DevOps,DevOps 工程師 |
請求受管憑證。 | 若要在 中請求私有憑證 AWS Certificate Manager 以搭配私有 ALB 使用,請使用下列命令:
| DevOps 工程師,AWS DevOps |
使用私有 CA 發行用戶端憑證。 |
此命令會傳回兩個服務的 CSR 和私有金鑰。
如需詳細資訊,請參閱 AWS 文件中的發行私有終端實體憑證。 | DevOps 工程師,AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
AWS 服務 使用 CloudFormation 範本佈建 。 | 若要佈建虛擬私有雲端 (VPC)、Amazon ECS 叢集、Amazon ECS 服務、Application Load Balancer 和 Amazon Elastic Container Registry (Amazon ECR),請使用 CloudFormation 範本。 | DevOps 工程師 |
取得變數。 | 確認您有執行兩個服務的 Amazon ECS 叢集。若要擷取資源詳細資訊並將其儲存為變數,請使用下列命令:
| DevOps 工程師 |
建立 CodeBuild 專案。 | 若要使用 CodeBuild 專案為您的 Amazon ECS 服務建立 Docker 映像,請執行下列動作:
如需詳細資訊,請參閱 AWS 文件中的在 中建立建置專案 AWS CodeBuild。 | AWS DevOps,DevOps 工程師 |
建置 Docker 映像。 | 您可以使用 CodeBuild 來執行映像建置程序。CodeBuild 需要與 Amazon ECR 互動和使用 Amazon S3 的許可。 在此程序中,會建置 Docker 映像並推送至 Amazon ECR 登錄檔。如需範本和程式碼的詳細資訊,請參閱其他資訊。 (選用) 若要在本機建置以供測試之用,請使用下列命令:
| DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
將 CA 憑證上傳至 Amazon S3。 | 若要將 CA 憑證上傳至 Amazon S3 儲存貯體,請使用下列範例命令:
| AWS DevOps,DevOps 工程師 |
建立信任存放區。 | 若要建立信任存放區,請使用下列範例命令:
| AWS DevOps,DevOps 工程師 |
上傳用戶端憑證。 | 若要將用戶端憑證上傳至 Amazon S3 for Docker 映像,請使用下列範例命令:
| AWS DevOps,DevOps 工程師 |
修改接聽程式。 | 若要在 ALB 上啟用交互 TLS,請使用下列命令修改 HTTPS 接聽程式:
如需詳細資訊,請參閱 AWS 文件中的在 Application Load Balancer 上設定交互 TLS。 | AWS DevOps,DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
更新 Amazon ECS 任務定義。 | 若要更新 Amazon ECS 任務定義,請修改新修訂中的 若要取得個別服務的值,請使用您在先前步驟中建置的新 Docker 映像 Uri 更新任務定義:
如需詳細資訊,請參閱 AWS 文件中的使用 主控台更新 Amazon ECS 任務定義。 | AWS DevOps,DevOps 工程師 |
更新 Amazon ECS 服務。 | 使用最新的任務定義更新服務。此任務定義是新建置 Docker 映像的藍圖,其中包含交互 TLS 身分驗證所需的用戶端憑證。 若要更新服務,請使用下列程序:
對其他服務重複這些步驟。 | AWS 管理員、AWS DevOps、DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
複製應用程式 URL。 | 使用 Amazon ECS 主控台檢視任務。當任務狀態更新為執行中時,選取任務。在任務區段中,複製任務 ID。 | AWS 管理員、AWS DevOps |
測試您的應用程式。 | 若要測試您的應用程式,請使用 ECS Exec 存取任務。
| AWS 管理員、AWS DevOps |
相關資源
Amazon ECS 文件
其他 AWS 資源
如何使用 AWS 私有 CA 在 Application Load Balancer 上設定 mTLS?
(AWS re:Post)
其他資訊
編輯 Dockerfile
下列程式碼顯示您在服務 1 的 Dockerfile 中編輯的命令:
FROM public.ecr.aws/nginx/nginx:latest WORKDIR /usr/share/nginx/html RUN echo "Returning response from Service 1: Ok" > /usr/share/nginx/html/index.html ADD client_cert1.cert client_private-key1.pem /usr/local/share/ca-certificates/ RUN chmod -R 400 /usr/local/share/ca-certificates/
下列程式碼顯示您在服務 2 的 Dockerfile 中編輯的命令:
FROM public.ecr.aws/nginx/nginx:latest WORKDIR /usr/share/nginx/html RUN echo "Returning response from Service 2: Ok" > /usr/share/nginx/html/index.html ADD client_cert2.cert client_private-key2.pem /usr/local/share/ca-certificates/ RUN chmod -R 400 /usr/local/share/ca-certificates/
如果您使用 CodeBuild 建置 Docker 映像, buildspec
檔案會使用 CodeBuild 組建編號來唯一地將映像版本識別為標籤值。您可以變更 buildspec
檔案以符合您的需求,如下列buildspec
自訂程式碼所示:
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: # change the S3 path depending on the service - aws s3 cp s3://$YOUR_S3_BUCKET_NAME/serviceone/ $CodeBuild_SRC_DIR/ --recursive - echo Build started on `date` - echo Building the Docker image... - docker build -t $ECR_REPOSITORY_URI:latest . - docker tag $ECR_REPOSITORY_URI:latest $ECR_REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $ECR_REPOSITORY_URI:latest - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... # for ECS deployment reference - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: - imagedefinitions.json