使用 AWS Fargate 大規模執行事件驅動和排程工作負載 - AWS 方案指引

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

使用 AWS Fargate 大規模執行事件驅動和排程工作負載

由 HARI OHM PRASATH RAJAGOPAL (AWS) 建立

Summary

注意:AWS CodeCommit 不再提供給新客戶。AWS CodeCommit 的現有客戶可以繼續正常使用服務。進一步了解

此模式說明如何使用 AWS Fargate 在 Amazon Web Services (AWS) 雲端上大規模執行排程和事件驅動的工作負載。

在設定此模式的使用案例中,只要提交提取請求,就會掃描程式碼以取得 AWS 敏感資訊,例如 AWS 帳戶號碼和登入資料。提取請求會啟動 Lambda 函數。Lambda 函數會叫用負責程式碼掃描的 Fargate 任務。每當提出新的提取請求時,就會啟動 Lambda。如果掃描發現任何敏感資訊,Amazon Simple Notification Service (Amazon SNS) 會在電子郵件訊息中傳送掃描結果。

此模式在下列商業使用案例中很有用:

  • 如果您的企業必須執行許多因執行時間 (15 分鐘限制) 或記憶體的限制而無法由 AWS Lambda 執行的排程和事件驅動工作負載

  • 如果您希望 AWS 管理為這些工作負載佈建的執行個體

當您使用此模式時,您可以選擇建立新的虛擬私有雲端 (VPC)。此模式也會使用 AWS CodeCommit。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • 用於託管程式碼庫和建立提取請求的 AWS CodeCommit

  • 在 macOS、Linux 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 1.7 版或更新版本

  • 在容器中執行的工作負載

  • 在 classpath 中設定 Apache Maven 可執行檔

架構

導致容器中 Fargate 任務的提取請求程序,以及傳送電子郵件的 SNS 主題。

整體流程包含下列步驟。

  1. 每當在 CodeCommit 中提交新的提取請求時,就會啟動 Lambda 函數。Lambda 函數會透過 Amazon EventBridge 接聽CodeCommit Pull Request State Change事件。

  2. Lambda 函數會使用下列環境參數提交新的 Fargate 任務,以檢查程式碼並進行掃描。

    RUNNER → <<TaskARN>> SNS_TOPIC → <<SNSTopicARN>> SUBNET → <<Subnet in which Fargate task gets launched>>

    如果掃描在程式碼中找到敏感資訊,Fargate 會將新訊息推送到 Amazon SNS 主題。

  3. SNS 訂閱者會從主題讀取訊息,並傳送電子郵件訊息。

技術

  • AWS CodeCommit

  • Amazon Elastic Container Registry (Amazon ECR)

  • Amazon Elastic Container Service (Amazon ECS)

  • Amazon EventBridge

  • AWS Fargate

  • AWS Lambda

  • Amazon SNS

  • Docker

工具

工具

  • AWS CLI – AWS Command Line Interface (CLI) 是管理 AWS 服務的統一工具。

  • AWS CodeCommit – AWS CodeCommit 是一種全受管的來源控制服務,可託管安全的 Git 型儲存庫。使用 CodeCommit,團隊可以在安全且可擴展的環境中協作處理程式碼。

  • Amazon ECR – Amazon Elastic Container Registry (Amazon ECR) 是全受管登錄檔,開發人員可用來存放、管理和部署 Docker 容器映像。

  • Amazon ECS – Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴展且快速的容器管理服務。您可以使用 Amazon ECS 來執行、停止和管理叢集上的容器。

  • AWS Fargate – AWS Fargate 是一種技術,您可以與 Amazon ECS 搭配使用來執行容器,而無需管理 Amazon EC2 執行個體的伺服器或叢集。

  • AWS Lambda – AWS Lambda 是一種運算服務,支援執行程式碼,無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼,可自動從每天數項請求擴展成每秒數千項請求。

  • Amazon SNS – Amazon Simple Notification Service (Amazon SNS) 是一種受管服務,可將訊息從發佈者交付給訂閱者 (也稱為生產者和消費者)。發佈者透過製作並傳送訊息到主題 (其為邏輯存取點和通訊管道) 與訂閱者進行非同步的通訊。訂閱 SNS 主題的用戶端會使用支援的通訊協定接收已發佈的訊息,例如 Lambda、電子郵件、行動推播通知和行動文字訊息 (SMS)。

  • Docker – Docker 可協助您在稱為容器的套件中建置、測試和交付應用程式。

  • Git 用戶端 – 用來查看必要成品的命令列或桌面工具

  • Maven – Apache Maven 是一種專案管理工具,可集中管理專案的建置、報告和文件。

史詩

任務描述所需的技能

下載程式碼。

附件區段中,下載 .zip 檔案並解壓縮檔案。

開發人員、AWS 系統管理員

設定儲存庫。

在根資料夾mvn clean install上執行 。

開發人員、AWS 系統管理員
任務描述所需的技能

建立 Amazon ECR 儲存庫並登入。

開啟 Amazon ECR 主控台。在導覽窗格中,選擇儲存庫,然後選擇建立儲存庫。如需此案例和其他案例的協助,請參閱相關資源一節。

開發人員、AWS 系統管理員

推送您的容器映像。

開啟儲存庫,選擇檢視推送命令,然後登入 Docker。登入後,在其他資訊區段中的推送容器映像下,使用必要的替換執行命令。這會上傳用於執行程式碼掃描的 Docker 容器映像。上傳完成後,複製 Amazon ECR 儲存庫中最新建置的 URL。

開發人員、AWS 系統管理員
任務描述所需的技能

建立 CodeCommit 儲存庫。

若要建立新的 AWS CodeCommit 儲存庫,請在其他資訊區段中的建立 CodeCommit 儲存庫下執行 命令。

開發人員、AWS 系統管理員
任務描述所需的技能

建立 VPC。

如果您想要使用新的 VPC 而非現有的 VPC,請在其他資訊區段中的建立 VPC 下執行命令。AWS Cloud Development Kit (AWS CDK) 指令碼將輸出已建立的 VPC 和子網路 IDs。

開發人員、AWS 系統管理員
任務描述所需的技能

建立叢集和任務。

若要建立 Amazon ECS 叢集和 Fargate 任務定義,請在其他資訊區段中的建立叢集和任務下執行命令。執行 shell 指令碼時,請確定傳入正確的 VPC ID 和 Amazon ECR 儲存庫 URI 做為參數。指令碼會建立指向 Docker 映像的 Fargate 任務定義 (負責掃描)。指令碼接著會建立任務和相關聯的執行角色。

開發人員、AWS 系統管理員

驗證 Amazon ECS 叢集。

開啟 Amazon ECS 主控台。在導覽窗格中,選擇叢集,然後選擇新建立的名為 Fargate-Job-Cluster 的 Amazon ECS 叢集。之後,在導覽窗格中選擇任務定義,並確認有新的任務定義,字首為 awscdkfargateecsTaskDef

開發人員、AWS 系統管理員
任務描述所需的技能

建立 SNS 主題。

若要建立 SNS 主題,請在其他資訊區段中的建立 SNS 主題下執行 命令。建立成功後,請注意在下一個步驟SNS ARN中使用的 。

開發人員、AWS 系統管理員

建立 SNS 訂閱者。

若要為 SNS 主題建立電子郵件訂閱者,請在其他資訊區段中的建立 SNS 訂閱者下執行 命令。請務必取代 TopicARN,並在 CLI 命令Email address中使用 。若要接收電子郵件通知,請務必確認做為訂閱者使用的電子郵件地址。

開發人員、AWS 系統管理員
任務描述所需的技能

建立 函數和 觸發條件。

若要使用 CodeCommit 觸發條件建立 Lambda 函數,請在其他資訊區段中的 Lambda 函數和 CodeCommit 觸發條件下執行 命令。執行 命令之前,請務必將參數取代為對應的值。指令碼會建立 Lambda 函數,並將其設定為在提出新的提取請求時叫用。

開發人員、AWS 系統管理員
任務描述所需的技能

測試應用程式。

如果您簽入 CodeCommit 儲存庫的任何 AWS 敏感資訊,應該啟動 Lambda 函數。Lambda 函數會啟動 Fargate 任務,這會掃描程式碼,並在電子郵件通知中傳送掃描結果。

開發人員、AWS 系統管理員

相關資源

其他資訊

推送容器映像

> cd 1-ecr-image-push > ./run.sh <<ecr-repository>>

建立 CodeCommit 儲存庫

aws codecommit create-repository --repository-name test-repo --repository-description "My Test repository"

建立 VPC

> cd 2-create-vpc > ./run.sh

輸出

aws-batch-cdk-vpc-efs-launch-template.privatesubnet = subnet-<<id>> aws-batch-cdk-vpc-efs-launch-template.publicsubnet = subnet-<<id>> aws-batch-cdk-vpc-efs-launch-template.vpcid = vpc-<<id>>

建立叢集和任務

> export CDK_DEFAULT_ACCOUNT = <<aws_account_id>> > export CDK_DEFAULT_REGION = <<aws_region>> > cd 3-create-ecs-task > ./run.sh <<vpc-id>> <<ecr-repo-uri>>

輸出

aws-cdk-fargate-ecs.CLUSTERNAME = Fargate-Job-Cluster aws-cdk-fargate-ecs.ClusterARN = <<cluster_arn>> aws-cdk-fargate-ecs.ContainerARN = Fargate-Container aws-cdk-fargate-ecs.TaskARN = <<task_arn>> aws-cdk-fargate-ecs.TaskExecutionRole = <<execution_role_arn>> aws-cdk-fargate-ecs.TaskRole = <<task_role_arn>>

建立 SNS 主題

aws sns create-topic --name code-commit-topic

建立 SNS 訂閱者

aws sns subscribe \ --topic-arn <<topic_arn>> \ --protocol email \ --notification-endpoint <<email_address>>

Lambda 函數和CodeCommit 觸發

> export CDK_DEFAULT_ACCOUNT = <<aws_account_id>> > export CDK_DEFAULT_REGION = <<aws_region>> > cd 5-Lambda-CodeCommit-Trigger > ./run.sh <<taskarn>> <<snstopicarn>> subnet-<<id>> <<codecommitarn>>

輸出

aws-cdk-fargate-lambda-event.Cloudwatchrule = <<cloudwatchrule>> aws-cdk-fargate-lambda-event.CodeCommitLambda = AWS-Code-Scanner-Function aws-cdk-fargate-lambda-event.LambdaRole = <<lambdaiamrole>>

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip