Pipelines
Configure HEC, S3, and Google Cloud Pub/Sub delivery pipelines so a target can deliver generated events.
A pipeline is a delivery destination attached to a target — where a run's generated events are sent. (The CLI configures the same destinations per invocation as sinks; on the platform they are saved, named pipelines on a target.) v1 supports three kinds:
- HEC — Splunk HTTP Event Collector.
- S3 — an Amazon S3 bucket.
- Google Cloud Pub/Sub — publish to a Pub/Sub topic (GCP Cloud Audit Logs).
Add one from the target's setup checklist (step 3 · Add pipeline) or the target's Pipelines section → Add pipeline. Pick a kind, then fill the form — required fields are shown first, with the rest under Advanced. A target can hold many pipelines.
Names and editing
- Each pipeline has a name, unique among a target's active pipelines. It is a human label; runs bind to a pipeline by its internal id, not its name.
- Pipelines are immutable. To change one, delete it and create a new one. Deleting soft-archives the pipeline, so in-flight and historical runs keep resolving the exact version they used; only active pipelines accept new runs.
- Delete from the pipeline's card — it is type-to-confirm.
HEC
Required
- Name — a label for this pipeline.
- HEC URL — your Splunk HTTP Event Collector endpoint (for example
https://http-inputs.<host>:443orhttps://splunk:8088). - HEC token — the Splunk HEC token.
Optional
- Index — target index for delivered events.
- Sourcetype — sourcetype assigned to delivered events.
Advanced
- Source / Host — override the
source/hostfields on delivered events. - Request timeout — per-request timeout as a Go duration (for example
30s). - Batch — flush controls: max events, max bytes, and max wait per batch.
- Indexer acknowledgement — enable HEC ack and set its poll interval and timeout.
- Insecure TLS — skip certificate verification (self-signed development certs only).
The HEC token is not your validator key. The HEC token authenticates to Splunk's HTTP Event Collector and is created in Splunk (Settings → Data inputs → HTTP Event Collector). It is not the
tmv_…validator key you issue in Tracemill for the TA-Tracemill add-on — see Connect Splunk.
S3
Required
- Name — a label for this pipeline.
- Bucket — the destination S3 bucket name.
- Region — the bucket's AWS region (for example
us-east-1). Region is required — Tracemill never infers it, and a region-less pipeline silently fails on its first write. Commercial AWS regions only; GovCloud, China, and ISO partitions are not supported. - Role ARN — the cross-account IAM role Tracemill assumes to write to your
bucket (see Grant S3 access). Format
arn:aws:iam::<account-id>:role/<name>.
Optional
- Prefix — key prefix events are written under (for example
tracemill/). Leave blank to write at the bucket root. The IAM wildcards*and?are not allowed. - Format —
jsonl(default),cloudtrail, orasl. Thecloudtrailformat only acceptsaws.cloudtrailevents and writes the CloudTrail object layout; theaslformat only acceptsaws.aslevents and writes OCSF parquet in Amazon Security Lake object layout (consumed by the Splunk Add-on for AWS SQS-based-S3 / Security Lake input).
Advanced
- CloudTrail org ID — organization id for the CloudTrail org-trail path layout
(only used with the
cloudtrailformat). - Batch — flush controls: max events and max wait per batch.
Grant S3 access
S3 delivery uses a cross-account IAM role: Tracemill's delivery worker calls
sts:AssumeRole on a role in your AWS account, with the ExternalId set to
your target's id and RoleSessionName = tracemill-<target id>. You never share
long-lived credentials. Trust is scoped to that single External ID, so a leaked
principal alone cannot assume the role on another target's behalf — this is
confused-deputy protection.
The Cloud UI's S3 form shows the two values you need: the delivery principal ARN (the Tracemill worker allowed to assume the role) and your target's External ID (the target id). Use the exact values shown there.
Create the role one of two ways.
CloudFormation (recommended)
- In the S3 form's Grant access section, click Launch CloudFormation stack. This opens the AWS console quick-create with the template and parameters — delivery principal, External ID, bucket, and prefix — pre-filled. Leave the principal and External ID unchanged.
- Acknowledge the IAM capability and create the stack.
- Copy the stack's
RoleArnoutput and paste it into the form's Role ARN field.
Manual (IAM console / Terraform)
Create a role with the trust policy below, substituting the delivery principal ARN and your External ID from Tracemill Cloud:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "DELIVERY_PRINCIPAL_ARN" },
"Action": "sts:AssumeRole",
"Condition": { "StringEquals": { "sts:ExternalId": "YOUR_EXTERNAL_ID" } }
}
]
}Attach this permission policy — delivery only writes objects (it never lists, reads, or deletes), scoped to your bucket and prefix:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "WriteEvents",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET/YOUR_PREFIX*"
}
]
}With no prefix, use arn:aws:s3:::YOUR_BUCKET/*. The trailing * covers every
key under the prefix — don't put * or ? in the prefix itself.
Then paste the role's ARN into the form's Role ARN field.
The IAM role is global. The pipeline's Region is your bucket's region; it also selects which regional CloudFormation console the launch button opens.
Google Cloud Pub/Sub
A gcp_pubsub pipeline publishes synthetic Google Cloud Audit Logs directly
to a Pub/Sub topic — the real entry point of the GCP → SIEM ingestion pipeline
(Cloud Logging → Log Router sink → Pub/Sub → Splunk Add-on / Dataflow). This
is a higher-fidelity option than HEC for the GCP surface: Tracemill publishes the
record at the pipeline's start and lets your own Log Router leg add the envelope
and routing, exercising your real ingestion path end to end.
Required
- Name — a label for this pipeline.
- Project ID — the GCP project that owns the topic.
- Topic — the Pub/Sub topic id to publish to.
Advanced
- Batch — flush controls: max events, max bytes, and max wait per batch.
This pipeline accepts only gcp.audit events; it publishes the bare Cloud
Audit LogEntry as the message body — exactly what a Cloud Logging Log Router
sink writes to the topic. Your consumer leg adds its own envelope.
The published shape matches your consumer leg. The Splunk Add-on for GCP (pull) wraps the record under a top-level
dataobject, so its detections readdata.protoPayload.*. The Dataflow "Pub/Sub to Splunk" template (push) delivers the bare LogEntry, so its detections readprotoPayload.*. A detection matches only the leg it was written for. The HEC pipeline reproduces the Add-on (pull) shape; this Pub/Sub pipeline delivers the bare record.
Grant publish access
Publish access uses Workload Identity Federation — Tracemill's delivery
worker federates into GCP from AWS, so there are no service-account keys to
share (the GCP analog of the S3 cross-account role). Access is scoped per
target: you grant the Pub/Sub Publisher (roles/pubsub.publisher) role on
your topic to a member that is unique to this target, so a leaked topic name
alone can't let another target publish to it — the same confused-deputy
protection as the S3 External ID.
The Add pipeline → Google Cloud Pub/Sub flow surfaces the exact member and a copy-paste grant for your project and topic:
gcloud pubsub topics add-iam-policy-binding TOPIC \
--project=PROJECT_ID \
--member='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL/attribute.target_id/TARGET_ID' \
--role='roles/pubsub.publisher'The same grant is available as a google_pubsub_topic_iam_member Terraform
resource, an "Open in Cloud Shell" link, and a console click-through. The
attribute.target_id value is this target's id; the rest of the member is a
Tracemill platform constant, shown in the guide.
Synthetic events land in your production Pub/Sub topic and index. Scope the topic and plan cleanup accordingly.