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

使用AWS CDK更新默认XRay采样规则失败:提示规则已存在

问题:无法用AWS CDK更新默认XRay采样规则

AWS默认会自动创建名为“Default”的XRay采样规则,使用AWS CDK尝试更新该规则时操作失败:CDK并未执行更新逻辑,反而试图创建新规则;但相同代码可正常更新自行创建的采样规则。

报错信息

CREATE_FAILED | AWS::XRay::SamplingRule | DefaultXraySamplingRule Resource handler returned message: "Sampling rule already exists

使用的代码

new xray.CfnSamplingRule(this, 'DefaultXraySamplingRule', {
  samplingRule: {
    ruleName: 'Default',  // 尝试更新默认规则
    priority: 9999,      // 默认规则应设为最低优先级
    fixedRate: 0.05,      // 示例:采样5%的请求
    reservoirSize: 5,     // 每秒最多允许5个请求
    serviceName: '*',     // 应用于所有服务
    serviceType: '*',     // 应用于所有服务类型
    host: '*',            // 应用于所有主机
    httpMethod: '*',      // 应用于所有HTTP方法
    urlPath: '*',         // 应用于所有URL路径
    version: 1,
    resourceArn: '*',     // 全局应用
  },
});

解决方案

  • 原因:CDK的CfnSamplingRule默认行为是创建新资源,而默认的“Default”采样规则并非由CDK管理,CDK无法识别它是已存在的资源,因此会尝试创建同名规则导致冲突报错。
  • 正确做法是通过**自定义资源(Custom Resource)**调用XRay API来更新默认规则,步骤如下:
    1. 定义一个Lambda函数,作为自定义资源的后端,调用XRay的UpdateSamplingRule API修改默认规则。
    2. 在CDK中创建自定义资源,关联该Lambda并传入更新参数。

示例代码

// 1. 创建用于更新默认采样规则的Lambda函数
const updateRuleLambda = new lambda.Function(this, 'UpdateXrayDefaultRule', {
  runtime: lambda.Runtime.NODEJS_18_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline(`
    const AWS = require('aws-sdk');
    const xray = new AWS.XRay();
    exports.handler = async (event) => {
      // 处理自定义资源的不同事件类型
      if (event.RequestType === 'Delete') {
        return { PhysicalResourceId: 'Default' };
      }
      const params = {
        SamplingRuleUpdate: {
          RuleName: 'Default',
          Priority: event.ResourceProperties.priority,
          FixedRate: event.ResourceProperties.fixedRate,
          ReservoirSize: event.ResourceProperties.reservoirSize
        }
      };
      await xray.updateSamplingRule(params).promise();
      return { PhysicalResourceId: 'Default' };
    };
  `),
});

// 2. 给Lambda添加更新采样规则的权限
updateRuleLambda.addToRolePolicy(new iam.PolicyStatement({
  actions: ['xray:UpdateSamplingRule'],
  resources: ['*'],
}));

// 3. 创建自定义资源触发更新操作
new customresources.CustomResource(this, 'UpdateDefaultXrayRule', {
  serviceToken: updateRuleLambda.functionArn,
  properties: {
    priority: 9999,
    fixedRate: 0.05,
    reservoirSize: 5,
  },
});
  • 注意:自定义资源需要处理Create/Update/Delete三种事件,示例中简化了删除逻辑,实际使用可根据需求完善;同时要确保Lambda拥有足够的XRay API调用权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:36:02