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

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

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

建立者 HARIOHMPRASATHRAJAGOPAL(AWS)

環境:PoC 或試行

技術:現代化;無伺服器;管理與治理

工作負載:開放原始碼

AWS 服務:Amazon EC2 Container Registry;Amazon ECS;AWS CodeCommit;AWSFargate;AWSLambda;Amazon SNS

Summary

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

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

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

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

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

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

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

先決條件和限制

先決條件

  • 作用中AWS帳戶

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

  • AWS 命令列介面 (AWS CLI) 1.7 版或更新版本,已在 macOS 、Linux 或 Windows 上安裝和設定

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

  • Classpath 中的 Apache Maven 可執行檔設定

架構

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

整體流程包括下列步驟。

  1. 每當在 中提交新的提取請求時 CodeCommit,就會啟動 Lambda 函數。Lambda 函數會透過 Amazon 監聽CodeCommit Pull Request State Change事件 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 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下執行命令。AWS 雲端開發套件 (AWS CDK) 指令碼將輸出所建立IDs子網路的 VPC和 。

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

建立叢集和任務。

若要建立 Amazon ECS叢集和 Fargate 任務定義,請在其他資訊區段中的建立叢集和任務下執行命令。執行 Shell 指令碼時,請確定URI傳入正確的 VPC ID 和 Amazon ECR 儲存庫做為 參數。指令碼會建立指向 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