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

在JsPolicy中使用AWS-SDK遇setTimeout未定义错误的排查求助

JsPolicy使用AWS-SDK报错setTimeout未定义的原因与解决办法

错误原因

JsPolicy的运行环境是受限的V8沙箱,没有提供Node.js或浏览器环境中的全局API(比如setTimeout、process等)。而AWS-SDK依赖这些全局API处理异步请求、超时逻辑等,导入后直接触发了未定义错误。

解决办法

1. 使用轻量化AWS客户端或手动实现API调用

放弃完整的AWS-SDK,改用不依赖Node.js全局API的轻量化实现,或者直接手动调用ECR的REST API,利用JsPolicy内置的同步HTTP工具完成请求:

# policy.yaml
apiVersion: policy.jspolicy.com/v1beta1
kind: JsPolicy
metadata:
  name: "deny-default-namespace-with-ecr-check.company.tld"
spec:
  operations: ["CREATE"]
  resources: ["pods"]
  scope: Namespaced
  javascript: |
    // 提取镜像信息
    const container = request.object.spec.containers[0];
    if (!container?.image) {
      deny("Pod must specify an image");
    }
    const [imageName, tag] = container.image.split(':');
    const [accountId, repo] = imageName.split('/');
    const region = 'us-east-1'; // 替换为你的ECR区域

    // 调用ECR API验证镜像存在
    try {
      // 使用JsPolicy内置的同步HTTP请求+自动AWS签名
      const manifestResponse = http.get(`https://${accountId}.dkr.ecr.${region}.amazonaws.com/v2/${repo}/manifests/${tag}`, {
        awsSign: {
          service: 'ecr',
          region: region
        }
      });

      if (manifestResponse.status !== 200) {
        deny(`ECR image ${container.image} does not exist or is inaccessible`);
      }
    } catch (err) {
      deny(`Failed to validate ECR image: ${err.message}`);
    }

    // 原有的default命名空间校验
    if (request.namespace === "default") {
      deny("Creation of resources within the default namespace is not allowed!");
    }

说明:这里利用JsPolicy的awsSign自动处理AWS签名,无需手动实现签名逻辑,同时使用同步HTTP请求避免依赖异步API。

2. 将验证逻辑移出JsPolicy

把ECR镜像验证放到独立的外部服务中,JsPolicy通过调用该服务完成校验:

  • 搭建一个简单的HTTP服务,负责调用AWS-SDK查询ECR镜像;
  • 在JsPolicy中使用内置HTTP工具同步请求该服务,根据返回结果判断是否允许资源创建。

这种方式适合复杂的验证逻辑,避免在沙箱环境中处理依赖问题。

内容的提问来源于stack exchange,提问作者Ayush Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:07:41