143 lines
5.5 KiB
Markdown
143 lines
5.5 KiB
Markdown
# EventBridge Pipes
|
|
|
|
**Protocol:** REST-JSON
|
|
**Endpoint:** `POST http://localhost:4566/`
|
|
|
|
## Supported Actions
|
|
|
|
| Action | Description |
|
|
|---|---|
|
|
| `CreatePipe` | Create a new pipe with source, target, and optional enrichment |
|
|
| `DescribePipe` | Get pipe details including state and configuration |
|
|
| `UpdatePipe` | Update pipe configuration (source, target, role, enrichment, desired state) |
|
|
| `DeletePipe` | Delete a pipe |
|
|
| `ListPipes` | List all pipes with optional filtering by state and prefix |
|
|
| `StartPipe` | Start a stopped pipe |
|
|
| `StopPipe` | Stop a running pipe |
|
|
|
|
## Configuration
|
|
|
|
| Variable | Default | Description |
|
|
|---|---|---|
|
|
| `FLOCI_SERVICES_PIPES_ENABLED` | `true` | Enable or disable the service |
|
|
| `FLOCI_SERVICES_PIPES_KAFKA_REST_BRIDGE_DEFAULT_IMAGE` | `ghcr.io/aiven-open/karapace:latest` | Docker image for the Karapace REST Proxy sidecar a Kafka-sourced pipe starts on demand |
|
|
| `FLOCI_SERVICES_PIPES_KAFKA_REST_BRIDGE_HOST_PORT_BASE` | `9500` | Start of the host port range allocated to Karapace sidecars |
|
|
| `FLOCI_SERVICES_PIPES_KAFKA_REST_BRIDGE_HOST_PORT_MAX` | `9599` | End of the host port range allocated to Karapace sidecars |
|
|
|
|
A pipe with a Kafka source (MSK or self-managed via `smk://`) starts a Karapace REST Proxy sidecar container on first use, one per distinct `bootstrap.servers` target shared across every pipe reading it, so Docker is required for those pipes even though it is not for the others.
|
|
|
|
## Examples
|
|
|
|
```bash
|
|
export AWS_ENDPOINT_URL=http://localhost:4566
|
|
|
|
# Create a pipe (SQS to Lambda)
|
|
aws pipes create-pipe \
|
|
--name my-pipe \
|
|
--source "arn:aws:sqs:us-east-1:000000000000:source-queue" \
|
|
--target "arn:aws:lambda:us-east-1:000000000000:function:my-function" \
|
|
--role-arn "arn:aws:iam::000000000000:role/pipe-role" \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
|
|
# Describe a pipe
|
|
aws pipes describe-pipe \
|
|
--name my-pipe \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
|
|
# List all pipes
|
|
aws pipes list-pipes \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
|
|
# Start a pipe
|
|
aws pipes start-pipe \
|
|
--name my-pipe \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
|
|
# Stop a pipe
|
|
aws pipes stop-pipe \
|
|
--name my-pipe \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
|
|
# Update a pipe
|
|
aws pipes update-pipe \
|
|
--name my-pipe \
|
|
--target "arn:aws:lambda:us-east-1:000000000000:function:new-function" \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
|
|
# Delete a pipe
|
|
aws pipes delete-pipe \
|
|
--name my-pipe \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
```
|
|
|
|
## Pipe States
|
|
|
|
- `STARTING` - Pipe is being started
|
|
- `RUNNING` - Pipe is actively processing events
|
|
- `STOPPING` - Pipe is being stopped
|
|
- `STOPPED` - Pipe is stopped and not processing events
|
|
- `DELETED` - Pipe has been deleted
|
|
|
|
## Supported Sources and Targets
|
|
|
|
Floci emulates EventBridge Pipes with the following supported source and target types:
|
|
|
|
**Sources:**
|
|
- Amazon SQS queues
|
|
- Amazon Kinesis streams
|
|
- Amazon DynamoDB streams
|
|
- Kafka topics (MSK and self-managed via `smk://`)
|
|
|
|
**Targets:**
|
|
- Lambda functions
|
|
- SQS queues
|
|
- SNS topics
|
|
- Kinesis streams
|
|
- Step Functions state machines
|
|
|
|
## ParallelizationFactor
|
|
|
|
`CreatePipe` and `UpdatePipe` accept a `ParallelizationFactor` integer between 1 and 10 on the
|
|
`KinesisStreamParameters` and `DynamoDBStreamParameters` source blocks, matching the AWS wire
|
|
format. `DescribePipe` echoes it back as part of `SourceParameters`. `ListPipes` returns pipe
|
|
summaries only and omits `SourceParameters` entirely, matching AWS.
|
|
|
|
```bash
|
|
aws pipes create-pipe \
|
|
--name kinesis-pipe \
|
|
--source "arn:aws:kinesis:us-east-1:000000000000:stream/events" \
|
|
--target "arn:aws:lambda:us-east-1:000000000000:function:my-function" \
|
|
--role-arn "arn:aws:iam::000000000000:role/pipe-role" \
|
|
--source-parameters '{"KinesisStreamParameters":{"StartingPosition":"TRIM_HORIZON","ParallelizationFactor":4}}' \
|
|
--endpoint-url $AWS_ENDPOINT_URL
|
|
```
|
|
|
|
Validation mirrors AWS: values outside 1 to 10 are rejected with `ValidationException`, and so is
|
|
the field on a source its parameter block does not describe, for example
|
|
`KinesisStreamParameters.ParallelizationFactor` on an SQS source.
|
|
|
|
!!! note "Enforcement status"
|
|
The configured `ParallelizationFactor` is persisted and returned on the wire, but the poller
|
|
does not yet process concurrent batches per shard. Floci opens an iterator on a single shard
|
|
(`shardId-000000000000`) per Kinesis or DynamoDB Streams pipe and delivers one batch at a time
|
|
regardless of the configured value. Multi-shard polling and real per-shard concurrency are
|
|
tracked as follow-ups.
|
|
|
|
## Enrichment
|
|
|
|
A pipe's optional enrichment step (`source → filter → enrichment → target`) is emulated for
|
|
**Lambda** enrichments: the filtered batch is invoked synchronously (`RequestResponse`) and the
|
|
response becomes the target input.
|
|
|
|
- **Empty responses skip the target**, matching AWS: an empty body, `null`, `{}`, or `[]` consumes
|
|
the source records without invoking the target. A non-empty array such as `[{}]` still invokes the
|
|
target (with an empty-payload element).
|
|
- **A Lambda enrichment `FunctionError` fails the batch** — the source records are routed to the
|
|
pipe's dead-letter queue rather than silently consumed.
|
|
- **Non-Lambda enrichment types** (API destinations, API Gateway, Step Functions Express) are valid
|
|
on AWS but not emulated; a pipe configured with one fails the batch to the DLQ rather than
|
|
delivering the unenriched payload.
|
|
- **Enrichment is currently applied only on the SQS source path.** Kinesis, DynamoDB Streams and
|
|
Kafka sources deliver filtered records straight to the target; an enrichment configured on those
|
|
sources is not yet applied.
|