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

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

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

創建者:哈里歐姆普拉薩特拉賈戈帕爾(AWS)

環境:PoC 或試點

技術:現代化、無伺服器、營運

工作負載:開源

AWS 服務:Amazon EC2 容器註冊表;Amazon ECS;AWS CodeCommit;AWS Fargate;AWS Lambda;Amazon SNS

Summary

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

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

此模式在下列業務使用案例中很有幫助:

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

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

使用此模式時,您可以選擇創建新的虛擬私有雲(VPC)。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • AWS CodeCommit 用於託管代碼庫和創建提取請求

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

  • 在容器中執行的工作

  • 在類路徑中設置的阿帕奇 Maven 可執行文件

架構

整體流程包括以下步驟。

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

  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 命令列界面 (CLI) 是管理 AWS 服務的統一工具。

  • AWS CodeCommit — AWS CodeCommit 是全受管的原始檔控制服務,可託管安全的 Git 儲存庫。使用後 CodeCommit,團隊可以在安全且可高度擴展的環境中協作程式碼。

  • Amazon ECR — 亞馬遜彈性容器登錄 (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 — Doc ker 可協助您在稱為容器的套件中建置、測試和交付應用程式。

  • Git 客戶端-命令行或桌面工具來檢查所需的工件

  • Maven 的-阿帕奇 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 和子網路的 ID。

AWS 系統管理員開發人員
任務描述所需技能
建立叢集和工作。

若要建立 Amazon ECS 叢集和 Fargate 任務定義,請執行「其他資訊」區段中「建立叢集和任務」下的命令。請確定在執行命令介面指令碼時,已將正確的 VPC ID 和 Amazon ECR 存放庫 URI 當做參數傳入。該腳本創建一個指向 Docker 映像(負責掃描)的 Fargate 任務定義。然後,指令碼會建立工作和關聯的執行角色。

AWS 系統管理員開發人員
驗證 Amazon ECS 叢集。

開啟 Amazon ECS 主控台。在導覽窗格中,選擇 [集],然後選擇名為 Fargate 端工作叢集的新建立的 Amazon ECS 叢集。在此之後,在導覽窗格中選擇 [工作定義],並確認有新的任務定義與前置詞awscdkfargateecsTaskDef

AWS 系統管理員開發人員
任務描述所需技能
建立 SNS 主題。

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

AWS 系統管理員開發人員
建立 SNS 訂閱者。

若要為 SNS 主題建立電子郵件訂閱者,請在「其他資訊」區段中的「建立 SNS 訂閱者」下執行命令。確保在 CLI 命令中替換TopicARNEmail address使用。若要接收電子郵件通知,請務必確認作為訂閱者使用的電子郵件地址。

AWS 系統管理員開發人員
任務描述所需技能
建立函數和觸發器。

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

AWS 系統管理員開發人員
任務描述所需技能
測試應用程式。

如果您將任何 AWS 敏感資訊簽入 CodeCommit 存放庫,則應啟動 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