Bash + AWS CLI + K6 实现自动化压测

一键式压测:用 Bash + AWS CLI + K6 + 自定义 AMI 自动化你的性能测试流程

想要跑一次全面的性能压测,却还要手动配置环境、部署脚本、收集结果?不如一键搞定。

本文将分享如何用一个 Bash 脚本,结合 AWS CLI 与 K6,自定义 AMI 自动完成以下压测流程:

  1. 启动预置 K6 的 EC2 实例
  2. 初始化 DynamoDB 表
  3. 上传 K6 测试脚本
  4. 远程执行压测(输出 HTML 报告)
  5. 下载压测结果
  6. 销毁测试资源

🧰 使用到的工具

  • AWS CLI:资源管理
  • Bash 脚本:串联所有逻辑
  • K6:负载测试
  • 自定义 AMI:预装 K6 与依赖
  • SSM:远程命令执行(无需 SSH)
  • S3:脚本与测试结果传输
  • jq:辅助解析 AWS CLI 返回结果

📦 目录结构(简单)

bash 复制代码
loadtest.sh              # 主 Bash 脚本
k6/
├── test-api.js          # 示例压测脚本

🚀 主 Bash 脚本:loadtest.sh

bash 复制代码
#!/bin/bash
set -e

### === 配置 === ###
AWS_PROFILE="default"
AWS_REGION="us-west-2"
AMI_ID="ami-0a1b2c3d4e5f6g7h8"        # 预装了 k6 + nodejs + reporters 的 AMI
INSTANCE_TYPE="t3.medium"
KEY_NAME="loadtest-key"
SECURITY_GROUP_ID="sg-xxxxxxxx"
INSTANCE_NAME="k6-loadtest"
TEMP_BUCKET="k6-loadtest-bucket-$(date +%s)"
DYNAMO_TABLE="TestData"
K6_SCRIPT="test-api.js"
REPORT_NAME="report.html"
SSM_ROLE="AmazonEC2RoleforSSM"

### === 步骤 1:创建 S3 bucket === ###
echo "Creating temporary S3 bucket: $TEMP_BUCKET"
aws s3 mb s3://$TEMP_BUCKET --region $AWS_REGION

### === 步骤 2:上传 K6 脚本到 S3 === ###
echo "Uploading K6 script..."
aws s3 cp ./k6/$K6_SCRIPT s3://$TEMP_BUCKET/ --region $AWS_REGION

### === 步骤 3:创建 DynamoDB 表 === ###
echo "Resetting DynamoDB table..."
aws dynamodb delete-table --table-name $DYNAMO_TABLE --region $AWS_REGION || true
aws dynamodb wait table-not-exists --table-name $DYNAMO_TABLE --region $AWS_REGION
aws dynamodb create-table \
  --table-name $DYNAMO_TABLE \
  --attribute-definitions AttributeName=Id,AttributeType=S \
  --key-schema AttributeName=Id,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
  --region $AWS_REGION
aws dynamodb wait table-exists --table-name $DYNAMO_TABLE --region $AWS_REGION

### === 步骤 4:启动 EC2 === ###
echo "Launching EC2 instance..."
INSTANCE_ID=$(aws ec2 run-instances \
  --image-id $AMI_ID \
  --instance-type $INSTANCE_TYPE \
  --key-name $KEY_NAME \
  --security-group-ids $SECURITY_GROUP_ID \
  --iam-instance-profile Name=$SSM_ROLE \
  --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=$INSTANCE_NAME}]" \
  --query "Instances[0].InstanceId" \
  --output text \
  --region $AWS_REGION)

echo "Instance ID: $INSTANCE_ID"
aws ec2 wait instance-status-ok --instance-ids $INSTANCE_ID --region $AWS_REGION

### === 步骤 5:远程执行压测 === ###
echo "Running K6 test on EC2..."

RUN_COMMAND=$(cat <<EOF
cd /home/ec2-user
aws s3 cp s3://$TEMP_BUCKET/$K6_SCRIPT .
k6 run $K6_SCRIPT --out html=$REPORT_NAME
aws s3 cp $REPORT_NAME s3://$TEMP_BUCKET/
EOF
)

aws ssm send-command \
  --document-name "AWS-RunShellScript" \
  --targets "Key=tag:Name,Values=$INSTANCE_NAME" \
  --parameters commands="$RUN_COMMAND" \
  --region $AWS_REGION \
  --comment "Run K6 performance test"

echo "Waiting for test to complete..."
sleep 60

### === 步骤 6:下载报告 === ###
echo "Downloading test report..."
mkdir -p results
aws s3 cp s3://$TEMP_BUCKET/$REPORT_NAME ./results/$REPORT_NAME --region $AWS_REGION

### === 步骤 7:清理资源 === ###
echo "Cleaning up resources..."

aws ec2 terminate-instances --instance-ids $INSTANCE_ID --region $AWS_REGION
aws ec2 wait instance-terminated --instance-ids $INSTANCE_ID --region $AWS_REGION
aws dynamodb delete-table --table-name $DYNAMO_TABLE --region $AWS_REGION
aws s3 rb s3://$TEMP_BUCKET --force --region $AWS_REGION

echo "✅ All done! Report saved at ./results/$REPORT_NAME"

📜 示例 K6 脚本:k6/test-api.js

javascript 复制代码
import http from 'k6/http';
import { check } from 'k6';
import { htmlReport } from 'https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js';

export const options = {
  vus: 50,
  duration: '1m',
};

export default function () {
  const res = http.get('https://your-api.com/endpoint');
  check(res, {
    'status is 200': (r) => r.status === 200,
  });
}

export function handleSummary(data) {
  return {
    'report.html': htmlReport(data),
  };
}

✅ 总结

这个一键 Bash 脚本压测方案带来:

  • 无手动配置:所有依赖打包进 AMI
  • 可重复压测:干净环境 + 自动上传下载
  • 结构清晰:便于集成 CI/CD
  • 结果可视化:HTML 报告一目了然

只需:

bash 复制代码
bash loadtest.sh

即可触发完整流程!


相关推荐
拾忆,想起12 分钟前
Redis发布订阅:实时消息系统的极简解决方案
java·开发语言·数据库·redis·后端·缓存·性能优化
SimonKing41 分钟前
想搭建知识库?Dify、MaxKB、Pandawiki 到底哪家强?
java·后端·程序员
程序员清风1 小时前
为什么Tomcat可以把线程数设置为200,而不是2N?
java·后端·面试
MrSYJ1 小时前
nimbus-jose-jwt你都会吗?
java·后端·微服务
Bug生产工厂1 小时前
AI 驱动支付路由(下篇):代码实践与系统优化
后端
用户2707912938181 小时前
JDK 7 和 JDK 8 中的 HashMap 有什么不同?
java·后端
程序员小富1 小时前
令牌桶VS漏桶:谁才是流量控制的“最优解”?
java·后端·算法
xuejianxinokok1 小时前
图解 OAuth,为什么这样设计?
后端
计算机学姐1 小时前
基于SpringBoot的老年人健康数据远程监控管理系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·mybatis
kakaZhou7191 小时前
apisix硬核介绍
后端·架构