View a markdown version of this page

容器镜像定制 - AWS 上的分布式负载测试

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

容器镜像定制

负载测试仪图像

该解决方案使用由 AWS 管理的公共亚马逊弹性容器注册表 (Amazon ECR) 镜像存储库来存储用于运行已配置测试的镜像。您可以重建容器镜像并将其推送到自己的 AWS 账户中的 ECR 镜像存储库中。

您可以编辑默认容器镜像以满足您的需求。在构建自定义映像之前,请设置这些环境变量。

#!/bin/bash export REGION=aws-region-code # the AWS region to launch the solution (e.g. us-east-1) export BUCKET_PREFIX=my-bucket-name # prefix of the bucket name without the region code export BUCKET_NAME=$BUCKET_PREFIX-$REGION # full bucket name where the code will reside export SOLUTION_NAME=my-solution-name export VERSION=my-version # version number for the customized code export PUBLIC_ECR_REGISTRY=public.ecr.aws/awssolutions/distributed-load-testing-on-aws-load-tester # replace with the container registry and image if you want to use a different container image export PUBLIC_ECR_TAG=v3.1.0 # replace with the container image tag if you want to use a different container image

您可以在 AWS 账户的私有或公共镜像存储库中托管自定义容器镜像。图像资源位于代码库的deployment/ecr/distributed-load-testing-on-aws-load-tester目录中。

然后,您可以构建映像并将其推送到主机目的地。

创建自定义映像后,在构建自定义解决方案之前声明以下环境变量。

#!/bin/bash export PUBLIC_ECR_REGISTRY=YOUR_ECR_REGISTRY_URI # e.g. YOUR_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/YOUR_IMAGE_NAME export PUBLIC_ECR_TAG=YOUR_ECR_TAG # e.g. latest, v3.4.0

Dockerfile 定义了负载测试镜像。它建立在 Amazon Linux 基础映像的基础上,安装运行负载测试所需的语言运行时、系统包和测试工具,添加框架版本元数据文件和load-test.sh入口点脚本,并以非 root 用户身份运行。要查看 Dockerfile,请参阅存储库中的 Dockerfile 。 GitHub

每次任务启动时,load-test.sh入口点脚本都会在容器内运行。它读取测试配置和容器元数据。然后,它从 Amazon S3 下载测试定义并为运行预置选定的测试框架。该脚本等待启动信号,以便测试中的所有任务同时开始。然后,它会在配置的持续时间内运行测试,同时生成指标和日志。测试完成后,脚本收集结果并使用有关生成结果的容器的详细信息来丰富这些结果。它将结果、日志和其他项目上传到 Amazon S3。该脚本还处理终止信号,因此,如果您在测试完成之前取消测试,它会保留部分结果和日志。要查看完整脚本,请参阅 GitHub 存储库中的 load-test.sh。

Web 控制台镜像(仅限 ALB + ECS Fargate 模板)

ALB + ECS Fargate 模板在 ECS Fargate 上将 Web 控制台作为容器运行。默认情况下,该解决方案从 AWS 管理的公共 Amazon ECR 存储库中提取 Web 控制台镜像。

在限制访问公共容器注册表的环境中(例如,无法访问互联网的 VPC 或拥有 ECR 公共访问政策的账户),您必须将公共映像镜像到私有 Amazon ECR 存储库,并在 Web 控制台映像 URI 参数中提供私有镜像 URI。 CloudFormation 您也可以使用以下步骤自定义 Web 控制台镜像。

将公共镜像镜像到私有 ECR 存储库

要将 Web 控制台映像镜像到私有 ECR 存储库,请执行以下操作:

  1. 向公共 ECR 注册表进行身份验证:

    $ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
  2. 提取公共 Web 控制台镜像:

    $ docker pull public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-web-console:<version>
  3. 在您的账户中创建私有 ECR 存储库(如果尚不存在):

    $ aws ecr create-repository --repository-name <your-repo-name> --region <region> 2>/dev/null || true
  4. 向您的私有 ECR 注册表进行身份验证:

    $ aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
  5. 标记图像并将其推送到您的私有存储库:

    $ docker tag public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-web-console:<version> \ <account-id>.dkr.ecr.<region>.amazonaws.com/<your-repo-name>:<version> $ docker push <account-id>.dkr.ecr.<region>.amazonaws.com/<your-repo-name>:<version>
  6. 启动 ALB + ECS Fargate 堆栈时,在 Web 控制台镜像 URI 参数中输入私有镜像 URI:

    <account-id>.dkr.ecr.<region>.amazonaws.com/<your-repo-name>:<version>

自定义 Web 控制台镜像

您也可以自定义 Web 控制台镜像。图像资源位于GitHub 存储库中的deployment/ecr/distributed-load-testing-on-aws-web-console目录中。您可以编辑容器文件、构建本地镜像、将其推送到私有 ECR 存储库,并在 Web 控制台映像 URI 参数中提供生成的图像 URI。

Web 控制台容器镜像建立在 Nginx 基础映像基础上并安装 AWS CLI。它的 Dockerfile 复制了 Nginx 配置和入口点脚本。Dockerfile 暴露了 HTTP 端口,并将入口点脚本设置为在容器启动时运行。当容器启动时,entrypoint.sh 使用 AWS CLI 从 Amazon S3 下载 Web 控制台资产。它将它们提取到 Nginx 文档根目录中,然后在前台启动 Nginx。nginx.conf 为单页应用程序 (SPA) 提供服务,并将不匹配的路径路由回应用程序入口点。它还为应用程序负载均衡器添加了运行状况检查端点,启用 gzip 压缩,为静态资产设置长期缓存(同时禁用入口点和运行时配置的缓存),并添加了常见的安全响应标头。

有关更多信息,请参阅《亚马逊 ECR 用户指南》中的 “将 Docker 镜像推送到亚马逊 ECR 私有存储库”。

加载测试器图像 URI

所有三个部署模板(Amazon CloudFront + S3、AWS Fargate 上的应用程序负载均衡器 (ALB) + ECS 和无头)都在部署时从亚马逊弹性容器注册表 (Amazon ECR) 公共注册表 () 中提取负载测试器容器镜像。public.ecr.aws

在限制访问公共容器注册表的环境中,将负载测试器映像镜像到私有 Amazon ECR 存储库,并在负载测试器映像 URI (LoadTesterImageUri) AWS CloudFormation 参数中提供私有镜像 URI。常见示例包括无法访问互联网的 VPC、拥有 ECR 公有访问策略的账户以及 ECS 任务无法访问公有 ECR 注册表的 AWS GovCloud (美国)区域。AWS GovCloud (美国)部署需要镜像到部署区域中的私有存储库,在其他地方则是可选的。

将负载测试器镜像镜像到私有 ECR 存储库

注意

当您提供时LoadTesterImageUri,Auto-update 容器镜像 (UseStableTagging) 参数将不再管理负载测试器镜像。要获取安全补丁,必须重新镜像更新的映像标签。

要将负载测试器映像镜像到私有 ECR 存储库,请完成以下步骤。在以下命令中,<version>替换为图像标签(例如v4.0.0)、<region>您的部署区域(例如us-gov-west-1)、您的 AWS 命令行接口 (AWS CLI) 配置文件名称以及<account-id>您的 12 位数 AWS 账户 ID。<profile>

  1. 从可以访问互联网的计算机向公共 ECR 注册表进行身份验证。

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
  2. 提取公共负载测试器镜像。

    docker pull public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:<version>
  3. 在您的账户中创建私有 ECR 存储库(如果尚不存在)。

    aws ecr create-repository --repository-name dlt-load-tester --region <region> --profile <profile> 2>/dev/null || true
  4. 向您的私有 ECR 注册表进行身份验证。

    aws ecr get-login-password --region <region> --profile <profile> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
  5. 标记图像并将其推送到您的私有存储库。

    docker tag public.ecr.aws/aws-solutions/distributed-load-testing-on-aws-load-tester:<version> \ <account-id>.dkr.ecr.<region>.amazonaws.com/dlt-load-tester:<version> docker push <account-id>.dkr.ecr.<region>.amazonaws.com/dlt-load-tester:<version>
  6. 启动堆栈时,在负载测试器镜像 URI 参数中输入私有镜像 URI。

    <account-id>.dkr.ecr.<region>.amazonaws.com/dlt-load-tester:<version>

AWS GovCloud (美国)部署示例

以下示例显示了 AWS GovCloud (美国)中每个堆栈变体所需的参数。

对于无头堆栈,LoadTesterImageUri仅需要:

aws cloudformation create-stack \ --stack-name dlt-govcloud \ --template-url https://solutions-reference-us-gov.s3.us-gov-west-1.amazonaws.com/distributed-load-testing-on-aws/latest/distributed-load-testing-on-aws-headless.template \ --parameters \ ParameterKey=AdminName,ParameterValue=admin \ ParameterKey=AdminEmail,ParameterValue=admin@example.com \ ParameterKey=LoadTesterImageUri,ParameterValue=<account-id>.dkr.ecr.us-gov-west-1.amazonaws.com/dlt-load-tester:<version> \ --capabilities CAPABILITY_IAM \ --region us-gov-west-1

对于 AWS Fargate 堆栈上的应用程序负载均衡器 (ALB) + ECS,请同时提供和LoadTesterImageUri。WebConsoleImageUriAWS GovCloud (美国)中的 ECS 任务无法访问公共 ECR 注册表 (public.ecr.aws),因此您必须镜像两个容器镜像。

aws cloudformation create-stack \ --stack-name dlt-govcloud \ --template-url https://solutions-reference-us-gov.s3.us-gov-west-1.amazonaws.com/distributed-load-testing-on-aws/latest/distributed-load-testing-on-aws-alb-ecs.template \ --parameters \ ParameterKey=AdminName,ParameterValue=admin \ ParameterKey=AdminEmail,ParameterValue=admin@example.com \ ParameterKey=ConsoleDomainName,ParameterValue=dlt.example.gov \ ParameterKey=ACMCertificateArn,ParameterValue=arn:aws-us-gov:acm:us-gov-west-1:123456789012:certificate/abcd1234-ef56-gh78-ij90-klmnopqrstuv \ ParameterKey=LoadTesterImageUri,ParameterValue=<account-id>.dkr.ecr.us-gov-west-1.amazonaws.com/dlt-load-tester:<version> \ ParameterKey=WebConsoleImageUri,ParameterValue=<account-id>.dkr.ecr.us-gov-west-1.amazonaws.com/dlt-web-console:<version> \ --capabilities CAPABILITY_IAM \ --region us-gov-west-1

有关镜像 Web 控制台镜像的说明,请参阅 Web 控制台镜像。