Integrations
Cloud integrations and SIEM log destinations for Relay.
Integrations connect a workspace to external services. Open Integrations in a workspace to see the catalog and add one.
Available: AWS IAM role
The AWS integration (AWS IAM Role Access) delegates access to your AWS account through an IAM role that Relay assumes. Relay uses it for:
- Backup export — copying a cluster's backups to an S3 bucket you own.
- Log streaming — streaming audit, activity, and cluster logs to your S3 bucket.
Set it up
- In the workspace, open Integrations → Add integration and choose AWS.
- In the AWS IAM console choose Create role → Custom trust policy and paste the trust policy Relay shows. It lets only Relay's AWS account assume the role, and only with your organization's External ID.
- Add the permissions policy Relay shows as an inline policy. Replace
YOUR_BUCKETwith each bucket you will export to; you can add more later. - Paste the Role ARN (for example
arn:aws:iam::123456789012:role/relay-access) and a name, then connect. Relay callssts:AssumeRolewith your External ID to confirm the trust policy. Bucket permissions are checked later, when you pick a bucket in an export.
Creating, changing, and removing integrations needs the
org.cloud_integrations.* permissions (admin and owner); member and
viewer can view them. See RBAC.
Log destinations (SIEM streaming)
Log destinations push the audit and activity streams to your SIEM as events happen, instead of in one-minute batches to S3. Open Audit or Activity in a workspace and choose Destinations. Each destination receives the streams you pick (audit, activity, or both).
| Destination | What you provide | How events arrive |
|---|---|---|
| HTTPS webhook | URL, optional signing secret | POST of NDJSON batches, signed with HMAC-SHA256 |
| Splunk HEC | HEC URL, HEC token, optional index and sourcetype | /services/collector/event, one HEC event per log line |
| Datadog Logs | Site, API key, optional service and tags | Logs intake API, ddsource:relay, tag kind:audit or kind:activity |
| Syslog | Host, port (default 6514), facility (default 13) | RFC 5424 over TCP with TLS, octet-counted framing |
How delivery works:
- Latency. Relay polls every 2 seconds; an event normally lands within about 5 seconds.
- At least once. Relay keeps a cursor per destination and stream and only moves
it after the destination accepted the batch, so a restart or an outage never
skips events. A batch can arrive twice: deduplicate on the event
id. - Retries. Network errors, timeouts,
408,429and5xxresponses are retried with backoff (up to 5 minutes between attempts) and the events wait. When the destination rejects an event as invalid (400,413,422) while accepting the rest, that event is skipped and counted as skipped; a destination that rejects everything stops the stream and shows the error instead. - Batches hold up to 500 events or 1 MiB. Requests time out after 10 seconds.
- Integrity. Events keep the hash-chain fields (
chain_seq,prev_hash,row_hash) where the trail is chained (Relay Agent Edition), so the SIEM can check continuity. - Secrets (signing secret, HEC token, API key) are encrypted at rest and never shown again after you save them.
Each destination has a Test action that sends one synthetic event
(schema: relay.test.v1) and reports the result, and shows its health: the last
successful delivery, the last error, how far behind it is (lag), and the counts
of delivered and skipped events.
Webhook signatures
Every webhook request carries:
| Header | Value |
|---|---|
X-Relay-Timestamp | Unix time in seconds when the request was signed |
X-Relay-Signature | v1= followed by the hex HMAC-SHA256 of <timestamp>.<body> with your signing secret |
X-Relay-Delivery | Batch ID, the same on every retry of the batch |
X-Relay-Event-Kind | audit, activity, or test |
X-Relay-Event-Count | Number of lines in the body |
To verify a request, recompute the HMAC over the timestamp, a ., and the raw
body, compare it in constant time with the v1 value, and reject requests whose
timestamp is more than 5 minutes from your clock (this stops replays). If you leave
the signing secret empty, Relay generates one and shows it once.
import hashlib, hmac, time
def verify(secret: bytes, headers, body: bytes, window=300) -> bool:
ts = headers["X-Relay-Timestamp"]
if abs(time.time() - int(ts)) > window:
return False
want = hmac.new(secret, ts.encode() + b"." + body, hashlib.sha256).hexdigest()
got = [p.split("=", 1)[1] for p in headers["X-Relay-Signature"].split(",") if p.startswith("v1=")]
return any(hmac.compare_digest(want, g) for g in got)Network rules
In Relay Cloud, destinations must be public: https only, and Relay refuses
private, loopback, link-local, carrier-grade NAT and cloud metadata addresses. The
check runs on the address the hostname resolves to, at connection time, and
redirects are not followed. In Relay Agent Edition the control plane runs in your
network, so private addresses and plain http are allowed and the standard
HTTPS_PROXY settings apply. For an endpoint whose certificate comes from a
private CA, paste the CA in Custom CA (PEM).
Availability and permissions
- Relay Cloud: log destinations are being rolled out; contact support to enable them for your organization.
- Relay Agent Edition: included when your license has the
siem_exportfeature (the same feature as the/audit/exportendpoint).
Viewing destinations needs org.cloud_integrations.read. Creating, changing,
testing and removing them need org.cloud_integrations.create, .update and
.delete; creating and changing also need permission to read the audit log.
Not yet available
These appear in the catalog but cannot be connected yet: Azure, Google Cloud, Slack, Microsoft Teams, PagerDuty, and Prometheus. Datadog Logs and HTTPS webhooks are available as log destinations.