WireMock对接DynamoDB自定义逻辑实现及Dockerfile修改指引
WireMock调用DynamoDB的实现方案及Docker配置修改
实现思路
1. 编写WireMock自定义扩展
WireMock支持通过Java扩展实现自定义逻辑,我们需要实现ResponseDefinitionTransformer接口来拦截匹配的请求并调用DynamoDB:
- 创建Java类,实现
ResponseDefinitionTransformer,重写transform方法,在方法内添加DynamoDB调用逻辑(比如写入请求数据、查询结果后返回)。 - 引入AWS SDK依赖,配置DynamoDB客户端(K8s环境中可通过IAM角色或环境变量配置AWS凭证)。
- 给扩展类添加
@Extension注解,指定扩展名称,方便在映射配置中引用。
示例代码:
import com.github.tomakehurst.wiremock.common.FileSource; import com.github.tomakehurst.wiremock.extension.Extension; import com.github.tomakehurst.wiremock.extension.ResponseDefinitionTransformer; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.ResponseDefinition; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.PutItemRequest; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import java.util.Map; @Extension(name = "dynamodb-invoker") public class DynamoDbInvokerTransformer extends ResponseDefinitionTransformer { private final DynamoDbClient dynamoDbClient; public DynamoDbInvokerTransformer() { // 初始化DynamoDB客户端,K8s中可通过IAM角色自动获取凭证 this.dynamoDbClient = DynamoDbClient.builder() .region(Region.US_EAST_1) // 根据实际区域修改 .credentialsProvider(DefaultCredentialsProvider.create()) .build(); } @Override public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files) { // 调用DynamoDB,示例:写入请求数据到表中 String tableName = System.getenv("DYNAMODB_TABLE_NAME"); // 从环境变量取表名 Map<String, AttributeValue> item = Map.of( "requestId", AttributeValue.fromString(java.util.UUID.randomUUID().toString()), "path", AttributeValue.fromString(request.getUrl()), "body", AttributeValue.fromString(request.getBodyAsString()) ); PutItemRequest putItemRequest = PutItemRequest.builder() .tableName(tableName) .item(item) .build(); dynamoDbClient.putItem(putItemRequest); // 原响应不变,可根据DynamoDB结果修改响应内容 return responseDefinition; } @Override public boolean applyGlobally() { return false; // 仅在指定映射中启用 } }
2. 调整WireMock映射配置
修改原映射文件,添加transformers字段指定使用自定义扩展:
{ "request": { "method": "POST", "urlPattern": "/v1/queue/*" }, "response": { "status": 200, "headers": { "Content-Type": "application/json" }, "body": "{\"id\":\"GR3e9g\",\"partition\":4,\"time\":07448}", "transformers": ["dynamodb-invoker"] } }
3. 编译扩展为可执行JAR
将上述代码编译为包含所有依赖的Fat Jar(比如使用Maven Shade插件),确保AWS SDK和WireMock依赖都被打包进去。
Dockerfile修改方案
修改原Dockerfile,将自定义扩展JAR复制到WireMock的扩展目录,并配置必要环境变量:
FROM wiremock/wiremock:latest # 复制自定义扩展JAR到WireMock扩展目录 COPY dynamodb-invoker-extension.jar /home/wiremock/extensions/ # 复制映射配置 COPY stubs /home/wiremock # 设置环境变量,按需修改 ENV DYNAMODB_TABLE_NAME="your-queue-table" ENV AWS_REGION="us-east-1" EXPOSE 8080
K8s部署补充说明
- 使用IAM角色授权:给Pod绑定具备DynamoDB读写权限的IAM Role(通过IRSA机制),避免硬编码凭证。
- 网络配置:确保Pod所在网络能访问DynamoDB服务(VPC内可配置VPC端点,公网环境需确保出站网络正常)。
内容的提问来源于stack exchange,提问作者Sai Krishna
相关产品推荐
相关产品推荐

