LinkedIn Cruise-Control对接AWS Prometheus认证失败求助
解决Cruise Control从AWS Prometheus拉取指标的403认证问题
问题根源
AWS托管Prometheus(AMP)的API调用必须使用AWS SigV4签名认证,而Cruise Control默认的Prometheus指标拉取客户端未内置该签名逻辑,导致请求因缺少认证令牌返回403错误。
解决步骤
1. 配置IAM权限
给运行Cruise Control的实体(EC2实例、EKS Pod、IAM用户)附加具备AMP查询权限的IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "aps:QueryMetrics", "Resource": "arn:aws:aps:<你的区域>:<你的账号ID>:workspace:<你的工作区ID>" } ] }
将占位符替换为你的实际AWS信息。
2. 让Cruise Control支持SigV4签名
Cruise Control基于Java开发,需通过AWS SDK为HTTP请求添加SigV4签名拦截器:
- 确保Cruise Control的classpath中包含AWS SDK依赖:
aws-java-sdk-core、aws-java-sdk-aps(匹配你使用的SDK版本)。 - 修改
cruisecontrol.properties配置文件:
若你的CC版本不支持直接配置SigV4,需自定义# 指定AMP的查询端点 metrics.reporter.prometheus.query_url=https://aps-workspaces.<你的区域>.amazonaws.com/workspaces/<你的工作区ID>/api/v1/query metrics.reporter.prometheus.query_range_url=https://aps-workspaces.<你的区域>.amazonaws.com/workspaces/<你的工作区ID>/api/v1/query_range # 设置AWS区域 metrics.reporter.prometheus.aws_region=<你的区域>MetricsFetcher类,将SigV4HttpRequestInterceptor添加到OkHttpClient中。
3. 配置AWS凭证
确保Cruise Control能获取有效AWS凭证,推荐优先级如下:
- EC2实例角色:给运行CC的EC2实例绑定步骤1中的IAM角色,无需手动配置凭证。
- EKS Pod角色:若在EKS中运行CC,通过IRSA(ServiceAccount绑定IAM角色)实现凭证关联。
- 环境变量:设置
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION三个环境变量。 - 本地凭证文件:在运行CC的用户目录下创建
~/.aws/credentials,格式如下:[default] aws_access_key_id = 你的AccessKey aws_secret_access_key = 你的SecretKey
4. 验证配置
重启Cruise Control后查看日志,确认是否还有403错误。也可通过AWS CLI手动测试AMP查询,验证凭证有效性:
aws amp query --workspace-id <你的工作区ID> --query-string 'kafka_broker_topic_messages_total{topic="test"}' --region <你的区域>
注意事项
- 旧版本CC可能需要修改代码添加拦截器,先确认所用CC版本是否支持SigV4相关配置。
- 避免将凭证硬编码到配置文件,优先使用IAM角色或环境变量管理凭证。
内容的提问来源于stack exchange,提问作者Mikhail Dubrovin
相关产品推荐
相关产品推荐

