使用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来更新默认规则,步骤如下:
- 定义一个Lambda函数,作为自定义资源的后端,调用XRay的
UpdateSamplingRuleAPI修改默认规则。 - 在CDK中创建自定义资源,关联该Lambda并传入更新参数。
- 定义一个Lambda函数,作为自定义资源的后端,调用XRay的
示例代码
// 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
相关产品推荐
相关产品推荐

