You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:42:45