使用 AWS Fargate 大规模运行事件驱动型和计划性工作负载 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS Fargate 大规模运行事件驱动型和计划性工作负载

创建者:HARI OHM PRASATH RAJAGOPAL(AWS)

环境:PoC 或试点

技术:现代化;无服务器;运营/操作

工作负载:开源

AWS 服务:亚马逊 EC2 容器注册表;亚马逊 ECS;AWS;AWS Fargate CodeCommit;AWS Lambda;亚马逊 SNS

Summary

此模式描述了如何使用 AWS Fargate 在 Amazon Web Services(AWS)Cloud 上大规模运行计划性和事件驱动型工作负载。

在此模式设置的用例中,每当提交拉取请求时,都会扫描代码中是否有 AWS 敏感信息,例如 Amazon Web Services account 和凭证。拉取请求会启动 Lambda 函数。Lambda 函数调用负责代码扫描的 Fargate 任务。每当提出新的拉取请求时,就会启动 Lambda。如果扫描发现任何敏感信息,亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 将通过电子邮件发送扫描结果。

这种模式在以下企业用例很有用:

  • 如果您的企业必须运行许多计划性和事件驱动型工作负载,而这些工作负载由于运行时系统(15 分钟限制)或内存限制而无法由 AWS Lambda 运行

  • 如果您希望 AWS 管理为这些工作负载预调配的实例

使用此模式时,您可以选择创建虚拟私有云(VPC)。

先决条件和限制

先决条件

  • 一个有效的 Amazon Web Services account

  • AWS CodeCommit 用于托管代码库和创建拉取请求

  • AWS 命令行界面(AWS CLI)版本 1.7 或更高版本,已在 macOS、Linux 或 Windows 上安装并配置

  • 在容器中运行的工作负载

  • 在类路径中设置的 Apache Maven 可执行文件

架构

拉取请求流程导致容器中有一个 Fargate 任务和一个发送电子邮件的 SNS 主题。

整个过程包括以下步骤。

  1. 每当在中提交新的拉取请求时 CodeCommit,就会启动 Lambda 函数。Lambda 函数通过亚马逊监听事件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)是用于管理 Amazon Web Services 的统一工具。

  • 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 允许您在名为容器的软件包中构建、测试和交付应用程序。

  • Git 客户端 – 用于查看所需构件的命令行或桌面工具

  • Maven – Apache Maven 是一款项目管理工具,用于集中管理项目的构建、报告和文档。

操作说明

任务描述所需技能

下载代码。

附件部分中,下载 .zip 文件并解压文件。

开发人员、AWS 系统管理员

设置存储库。

在根文件夹上运行 mvn clean install

开发人员、AWS 系统管理员
任务描述所需技能

创建 Amazon ECR 存储库并登录。

打开 Amazon ECR 控制台。在导航窗格中,选择存储库,然后选择创建存储库。要获取有关此操作和其他操作的帮助,请参阅相关资源部分。

开发人员、AWS 系统管理员

推送容器映像。

打开存储库并选择查看推送命令,然后登录 Docker。登录后,运行其他信息部分的推送容器映像下的命令,其中包含所需替换内容。这将上传用于执行代码扫描的 Docker 容器映像。上传完成后,将最新构建的 URL 复制到 Amazon ECR 存储库中。

开发人员、AWS 系统管理员
任务描述所需技能

创建 CodeCommit 存储库。

要创建新的 AWS CodeCommit 存储库,请运行 “其他信息” 部分的 “创建 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 控制台。在导航窗格中,选择集群,然后选择新创建的名为 Fargate-Job-Cluster 的 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