- 来源从其他服务接入日志并写入数据流。CloudWatch Logs 由 MoleSignal 定时拉取;Amazon Data Firehose、Cloudflare Logpush、Heroku 把日志推送给 MoleSignal。
- 目标接收定时流水线的产出:Amazon S3 及 S3 兼容存储、Apache Kafka,以及任意 HTTP 端点。
创建连接器
1
打开连接器页面
进入 流水线 → 连接器。页面分 来源 和 目标 两部分列出连接器。
2
选择类型
点击 新建连接器,选择要连接到哪里。
3
填写设置
填写在组织内唯一的 名称,填写读取或投递的位置,并选择 认证方式。
4
测试并创建
点击 测试连接,在保存前试用当前设置,然后点击 创建连接器。推送来源没有可连接的对象,不提供测试。
name、kind 和 config_json 组成,config_json 的键随 kind 而定。config_json 中的 auth 指定认证方式,每种方式有各自的键。无法生效的设置在保存时返回 400:缺少必填的键、成对的凭据只填了一半,或填了所选 auth 用不到的键。
密钥
config_json 中以下键保存的是密钥:
密钥不会通过 API 返回。响应中密钥显示为
***,secret_keys 列出已保存了值的密钥:
- 更新时原样传回
***表示保留已保存的值。因此重命名、停用连接器或修改投递位置时,不必重新填写凭据。界面上留空的已保存密钥同样保持不变。 - 更新时没有带上的密钥会被删除。
- 更新时改变了
kind,已保存的密钥一个都不保留。
MS_CIPHER_KEY 中的根密钥(AES-256-GCM)把密钥与其余设置分开封存,不以明文保存任何密钥。推送来源按其 Token 的 SHA-256 查找。轮换根密钥时,molesignal rewrap-kek 会把连接器密钥与其他密文一起重新封存,参见生产检查清单。
来源
推送来源
三种推送来源共用一套模型:创建带push_token 和 target_stream 的连接器,再把平台指向对应的端点。这些端点不使用 JWT,请求以推送 Token 鉴权,按平台允许的方式传入:
界面在创建连接器时生成 Token,并连同要交给平台的端点只显示一次,之后无法再读取。生成新令牌 会在保存连接器时取代当前 Token。通过 API 创建时,自行提供至少 16 个字符的
push_token。一个 Token 只对应同一 kind 的一个连接器:已被使用的 Token 返回 409。缺少或无法识别 Token 的请求,以及发给已停用连接器的请求,都返回 401。没有 Token 的连接器不接受任何推送。
带 Content-Encoding: gzip 的请求体会被自动解压。事件走与其他接入相同的路径:schema-on-write、流水线、脱敏一并生效。
- Amazon Data Firehose
- Cloudflare Logpush
- Heroku
用
kind: "aws_kinesis_firehose" 创建连接器,然后为 Firehose 流选择 HTTP endpoint 目标:- HTTP endpoint URL:
https://molesignal.example.com/api/v1/_kinesis_firehose - Access key:推送 Token。Firehose 以
X-Amz-Firehose-Access-Key发送它。
message 字段。MoleSignal 返回 Firehose 所要求的 200 确认。CloudWatch Logs
CloudWatch Logs 是拉取来源:MoleSignal 每 30 秒调用一次FilterLogEvents,而不是等待推送。首次运行读取最近 5 分钟。之后每次运行从上一次成功运行结束的位置开始,因此没能读取或写入的事件会在下一次运行时重新读取。
同一时刻只有一个节点轮询某个连接器。
alert 节点之间按连接器分工,节点先认领连接器再轮询,参见 alert 节点之间的分工。每条事件成为一条带 message、log_stream、log_group 的日志。已停用的连接器不会被轮询。
目标
目标接收定时流水线经过各步骤后的全部事件。用 添加目标 → 连接器 把连接器加入流程的 目标。投递失败时在本次运行内重试,连接器仍然没有收下的事件写入死信数据流,参见重试与死信。 已停用的目标不会收到任何事件。每次运行都会跳过该连接器,并在运行的warning 中写明。被跳过的事件不计为失败,不写入死信,重新启用连接器后也不会补发。编辑器中已停用的连接器标有 停用。
Amazon S3
s3 也可以投递到 MinIO、Cloudflare R2、阿里云 OSS 等 S3 兼容存储。在界面上打开 S3 兼容存储 即可填写端点。
Apache Kafka
TLS 与 SASL 可以组合:基于 TLS 的 SCRAM 以
SASL_SSL 连接。
HTTP / Webhook
自定义请求头不能是投递本身设置的请求头:
Host、Content-Type、Content-Length、Content-Encoding、Transfer-Encoding、Connection、X-MoleSignal-Timestamp、X-MoleSignal-Signature。
投递遵循以下规则:
- 大于 4 MiB 的批次拆成多个请求发送。单条事件超过这个大小时单独占一个请求。
- 任何
2xx状态码都算投递成功。其他状态码都算投递失败,重定向也一样:投递不跟随重定向。 - 每个请求 30 秒超时。
- MoleSignal 在请求前解析主机,只连接解析得到的地址。云元数据服务所在的地址一律拒绝,无论写在地址中还是由 DNS 解析得到:
169.254.0.0/16、fe80::/10、fd00:ec2::254、100.100.100.200。其他私有地址可以使用。
校验 HMAC 签名
auth 为 hmac 时,每个请求带两个请求头:
校验请求时,用同一密钥对时间戳、一个
. 和原始请求体字节计算 HMAC-SHA256,再与签名做常量时间比较。拒绝超过几分钟的时间戳,使截获的请求无法在之后重放。
AWS 认证
S3 与 CloudWatch Logs 以下列五种方式之一向 AWS 认证:
不带
auth 时按已填的键判断:有访问密钥即 access_key,有 role_arn 即 assume_role,两者都没有即 node_role。role_arn 的格式为 arn:aws:iam::<account>:role/<name>。
节点身份
node_role 使用 AWS SDK 在节点上能找到的身份:EKS 的服务账号 IAM 角色(IRSA)或 EKS Pod Identity、ECS 任务角色,或 EC2 实例配置文件。节点环境中的静态密钥(如 AWS_ACCESS_KEY_ID)不会用于连接器。
扮演角色
assume_role 向 AWS STS 申请该角色有效期一小时的密钥,并在过期前 5 分钟更换。扮演角色所用的基础凭据是节点身份。部署不在 AWS 上运行时,勾选 用访问密钥扮演,不用节点身份,并填写一个 IAM 用户的密钥。
每个组织都以自己的外部 ID molesignal-<组织 ID> 扮演角色,该值无法修改。表单在 外部 ID 处显示它,GET /api/v1/connectors/aws-external-id 也会返回它。请在角色的信任策略中要求该外部 ID,这样其他组织即使知道角色的 ARN 也无法扮演:
molesignal-<连接器 ID>,在 AWS CloudTrail 中以此名称出现。请求发往连接器 region 所在区域的 STS 端点:区域为空时为 us-east-1,中国区域使用 amazonaws.com.cn 域名。
Web Identity
web_identity 用节点 AWS_WEB_IDENTITY_TOKEN_FILE 给出路径的 Web Identity Token 扮演角色,例如 EKS 为 IRSA 投射的服务账号 Token。连接器无法指定其他文件。角色的信任策略需要信任签发该 Token 的 OIDC 提供方。节点没有设置 AWS_WEB_IDENTITY_TOKEN_FILE 时,连接器拿不到凭据。
Token 在连接器 region 所在区域的 STS 端点兑换;节点环境设置了 AWS_ENDPOINT_URL_STS 时改用该端点。来自 IRSA 的节点身份同样如此。
测试连接
测试连接 在保存前试用表单中当前的设置,留空的密钥使用已保存的值。每种类型只做足以证明投递或拉取可行的最少操作:
测试在 25 秒后放弃。通过 API 测试时,
POST /api/v1/connectors/test 接收要试用的 kind 与 config_json。带上同一 kind 的已保存连接器的 id 时,*** 代表该连接器保存的密钥。无法生效的设置与保存时一样返回 400。
elapsed_ms 是测试用时。测试失败时,code 指出原因,detail 带上对方的原话,最多 600 个字符:
API
连接器的读取结果包含
id、name、kind、密钥已掩码的 config_json、secret_keys、enabled、last_run_at_micros、created_at_micros 与 updated_at_micros。
权限
pipelines.read 用于列出和查看连接器,以及读取外部 ID。pipelines.edit 用于创建、更新、删除和测试连接器。测试需要 pipelines.edit,因为它会使用已保存的密钥,并代替调用方连接其他系统。推送接收端点以推送 Token 鉴权,不能用普通登录 JWT 替代。
接入 API
Amazon Data Firehose、Cloudflare、Heroku 推送接收端点的细节。