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

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

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

創建由哈里歐姆普拉薩斯拉賈戈帕爾(AWS)

環境:PoC 或試驗

技能:現代化;無伺服器;作業

工作負載:開放原始碼

AWS 服務:AWS EC2 Container Registry; 亞馬遜 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) 1.7 版或更新版本,並在 macOS、Linux 或視窗安裝和設定。

  • 容器中執行的工作負載

  • 在類路徑中設置的 Apache Maven 可執行文件

Architecture

整體流程包含下列步驟。

  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

Tools

工具

  • 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 是一個項目管理工具,用於集中管理項目的構建,報告和文檔。

Epics

任務描述所需技能
下載驗證碼。

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

開發人員,AWS 系統管理員
設定回購。

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

開發人員,AWS 系統管理員
任務描述所需技能
建立 Amazon ECR 儲存庫並登入。

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

開發人員,AWS 系統管理員
推送您的容器映像。

開啟儲存庫,選擇檢視推送命令,然後登錄到 Docker。登入後,請執行下列命令,以及必要的替代項目。推送容器映像中的其他資訊區段。這將上傳用於執行程式碼掃描的 Docker 容器映像。上傳完成後,請在 Amazon ECR 存放庫中複製最新版本的 URL。

開發人員,AWS 系統管理員
任務描述所需技能
建立 CodeCommit 儲存庫。

若要建立新的 AWS CodeCommit 儲存庫,請在建立程式碼提交存放庫中的其他資訊區段。

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

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

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

若要建立 Amazon ECS 叢集和 Fargate 任務定義,請在建立叢集和工作中的其他資訊區段。確保在運行 shell 腳本時將正確的 VPC ID 和 Amazon ECR 存儲庫 URI 作為參數傳入。該腳本創建一個指向 Docker 映像的 Fargate 任務定義(負責掃描)。然後命令檔會建立工作和相關的執行角色。

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

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

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

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

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

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

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

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

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

如果您將任何 AWS 敏感資訊簽入 CodeCommit 存放庫,則應該啟動 Lambda 函數。Lambda 函數會啟動 Fargate 工作,此工作會掃描程式碼並將掃描結果傳送到電子郵件通知中。

開發人員,AWS 系統管理員

其他資訊

推送容器映像

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

建立程式碼提交存放庫

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>>

Attachments

attachment.zip