Notification Connectors¶
Arca delivers S3 bucket event notifications through a modular connector layer. Each destination in a bucket notification configuration is bound to a connector type that dictates how the JSON event is delivered — as an HTTP POST, a Kafka record, an AMQP message, an e-mail, and so on. This guide lists every connector shipped with Arca, the URL form it accepts, and the properties it honors.
All connectors share a common anatomy:
- The destination URL goes into the
Topic,Queue, orCloudFunctionelement of theNotificationConfigurationXML. - A
<ConnectorType>element selects the connector (webhook,kafka,grpc, …). - Zero or more
<Property><Name>…</Name><Value>…</Value></Property>entries carry connector-specific options. - An operational timeout for each connector type is tuned via the
[notifications]section of the server config (webhook_timeout_seconds,kafka_timeout_seconds, …).
The Arca Console exposes the same knobs through a per-bucket form. The examples below show the raw XML — any tool that speaks the S3 PutBucketNotificationConfiguration API can install them.
Webhook (HTTP POST)¶
The original Phase 25 connector. Delivers the S3 event JSON as an application/json HTTP POST.
- URL format:
http://host[:port]/pathorhttps://host[:port]/path - Properties:
auth_token— optional Bearer token sent in theAuthorizationheader.
<TopicConfiguration>
<Id>alerts-webhook</Id>
<Topic>https://ops.example.com/s3-events</Topic>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>webhook</ConnectorType>
<Property><Name>auth_token</Name><Value>abc123</Value></Property>
</TopicConfiguration>
Kafka¶
Produces events to a Kafka topic via librdkafka.
- URL format:
hostname:9092(bootstrap server; comma-separated list supported). - Properties:
topic— Kafka topic name (defaultarca-notifications).security_protocol—PLAINTEXT,SSL,SASL_PLAINTEXT,SASL_SSL.sasl_username,sasl_password— SASL/PLAIN credentials.
<QueueConfiguration>
<Id>kafka-events</Id>
<Queue>kafka-broker:9092</Queue>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>kafka</ConnectorType>
<Property><Name>topic</Name><Value>s3-events</Value></Property>
</QueueConfiguration>
AMQP (RabbitMQ)¶
Publishes events via lapin (pure-Rust AMQP 0-9-1).
- URL format:
amqp://user:pass@host:5672oramqps://… - Properties:
exchange— AMQP exchange (default empty = default exchange).routing_key— routing key (defaultarca.notifications).durable—true/falseto declare a durable queue.
<QueueConfiguration>
<Id>rabbitmq-events</Id>
<Queue>amqp://guest:guest@rabbitmq:5672/%2f</Queue>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>amqp</ConnectorType>
<Property><Name>routing_key</Name><Value>arca.object.created</Value></Property>
</QueueConfiguration>
Redis Pub/Sub¶
Publishes the event JSON to a Redis channel via redis-rs.
- URL format:
redis://[user:pass@]host:6379[/db] - Properties:
channel— channel name (defaultarca:notifications).password— Redis AUTH password (overrides the URL).
<QueueConfiguration>
<Id>redis-events</Id>
<Queue>redis://redis-server:6379</Queue>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>redis</ConnectorType>
<Property><Name>channel</Name><Value>s3-events</Value></Property>
</QueueConfiguration>
NATS¶
Publishes to a NATS subject via async-nats.
- URL format:
nats://host:4222 - Properties:
subject— NATS subject (defaultarca.notifications).token— NATS auth token.user,password— user/password authentication.
<QueueConfiguration>
<Id>nats-events</Id>
<Queue>nats://nats:4222</Queue>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>nats</ConnectorType>
<Property><Name>subject</Name><Value>s3.events</Value></Property>
</QueueConfiguration>
MQTT¶
Publishes to an MQTT topic via rumqttc.
- URL format:
mqtt://host:1883 - Properties:
topic— MQTT topic (defaultarca/notifications).user,password— optional authentication.
<QueueConfiguration>
<Id>mqtt-events</Id>
<Queue>mqtt://mqtt-broker:1883</Queue>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>mqtt</ConnectorType>
<Property><Name>topic</Name><Value>arca/events</Value></Property>
</QueueConfiguration>
PostgreSQL¶
Inserts a row per event into a configurable table.
- URL format:
postgresql://user:pass@host:5432/dbname - Properties:
table— table name (defaultarca_notifications).schema— PostgreSQL schema (defaultpublic).
<TopicConfiguration>
<Id>pg-events</Id>
<Topic>postgresql://arca:arca@db:5432/arca</Topic>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>postgresql</ConnectorType>
<Property><Name>table</Name><Value>s3_audit_log</Value></Property>
</TopicConfiguration>
MySQL / MariaDB¶
Inserts a row per event via sqlx-mysql.
- URL format:
mysql://user:pass@host:3306/dbname - Properties:
table— table name (defaultarca_notifications).
<TopicConfiguration>
<Id>mysql-events</Id>
<Topic>mysql://arca:arca@db:3306/arca</Topic>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>mysql</ConnectorType>
<Property><Name>table</Name><Value>s3_audit_log</Value></Property>
</TopicConfiguration>
MongoDB¶
Inserts a document per event via the official mongodb driver.
- URL format:
mongodb://host:27017 - Properties:
database— database name (defaultarca).collection— collection name (defaultarca_notifications).
<TopicConfiguration>
<Id>mongo-events</Id>
<Topic>mongodb://mongo:27017</Topic>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>mongodb</ConnectorType>
<Property><Name>collection</Name><Value>s3-events</Value></Property>
</TopicConfiguration>
Elasticsearch¶
Indexes each event as a document via the Elasticsearch REST API.
- URL format:
http://host:9200orhttps://host:9200 - Properties:
index— index name (defaultarca-notifications).user,password— optional basic authentication.
<TopicConfiguration>
<Id>es-events</Id>
<Topic>http://elasticsearch:9200</Topic>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>elasticsearch</ConnectorType>
<Property><Name>index</Name><Value>s3-events</Value></Property>
</TopicConfiguration>
Syslog (RFC 5424)¶
Sends each event as an RFC 5424 syslog message over UDP or TCP.
- URL format:
udp://host:514ortcp://host:1514 - Properties:
facility— one ofkern,user,daemon,auth,syslog,local0–local7(defaultlocal0).severity—emergency,alert,critical,error,warning,notice,informational,debug(defaultinformational).app_name— the APP-NAME field in the syslog header (defaultarca).
<CloudFunctionConfiguration>
<Id>syslog-events</Id>
<CloudFunction>udp://siem.example.com:514</CloudFunction>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>syslog</ConnectorType>
<Property><Name>facility</Name><Value>local4</Value></Property>
</CloudFunctionConfiguration>
SMTP¶
Sends each event as an e-mail message via lettre over SMTP (cleartext with optional STARTTLS) or SMTPS (implicit TLS on port 465).
- URL format:
smtp://host[:port]orsmtps://host[:port]. Default ports are 25 (SMTP) and 465 (SMTPS). - Properties:
to— recipient e-mail address (required).from— sender address (defaultarca@localhost).subject— custom subject line. When absent, the subject is generated asArca S3 Notification: <eventName>.username,password— optional PLAIN authentication.starttls— set totrueonsmtp://endpoints to force STARTTLS upgrade.
The message body is the same S3 event JSON that the webhook connector posts.
<CloudFunctionConfiguration>
<Id>smtp-alerts</Id>
<CloudFunction>smtp://mail.example.com:587</CloudFunction>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>smtp</ConnectorType>
<Property><Name>to</Name><Value>ops@example.com</Value></Property>
<Property><Name>from</Name><Value>arca@example.com</Value></Property>
<Property><Name>starttls</Name><Value>true</Value></Property>
<Property><Name>username</Name><Value>arca</Value></Property>
<Property><Name>password</Name><Value>s3cret</Value></Property>
<Property><Name>subject</Name><Value>[Arca] New object uploaded</Value></Property>
</CloudFunctionConfiguration>
The SMTP timeout is controlled by notifications.smtp_timeout_seconds (default 15 s).
gRPC¶
Delivers each event as a unary arca.notifications.v1.NotificationService/Notify call. Any server that implements this tiny proto contract receives the same S3 event JSON the webhook connector would post.
- URL format:
http://host:portfor HTTP/2 cleartext (h2c) orhttps://host:portfor HTTP/2 over TLS. - Properties:
auth_token— optional Bearer token forwarded as theauthorizationgRPC metadata header.ca_certificate— optional PEM-encoded CA certificate used to trust servers presenting self-signed certs.domain_name— override the TLS SNI / domain name used for certificate validation.insecure— set totrueto accept invalid TLS certificates (test only).- Any other property key/value is forwarded to the server in the proto
metadatamap so custom backends can route by tenant, channel, …
The proto contract (see crates/arca-server/proto/arca_notifications.proto):
syntax = "proto3";
package arca.notifications.v1;
service NotificationService {
rpc Notify(NotificationRequest) returns (NotificationResponse);
}
message NotificationRequest {
string event_payload = 1;
string connector_id = 2;
map<string, string> metadata = 3;
}
message NotificationResponse {
bool success = 1;
string message = 2;
}
<TopicConfiguration>
<Id>grpc-events</Id>
<Topic>https://grpc.example.com:50051</Topic>
<Event>s3:ObjectCreated:*</Event>
<ConnectorType>grpc</ConnectorType>
<Property><Name>auth_token</Name><Value>secret</Value></Property>
<Property><Name>tenant</Name><Value>acme</Value></Property>
</TopicConfiguration>
The gRPC timeout is controlled by notifications.grpc_timeout_seconds (default 10 s).
Testing a connector¶
Every connector type can be probed without persisting an event:
curl -X POST http://localhost:9000/admin/notifications/test-connector \
-H 'Content-Type: application/json' \
--data '{"connector_type":"smtp","url":"smtp://mail.example.com:25","properties":{}}'
The Arca Console exposes the same probe as a Test connection button next to every destination form.
Tuning timeouts¶
All connector operations inherit a per-connector timeout from [notifications]:
[notifications]
webhook_timeout_seconds = 10
kafka_timeout_seconds = 10
amqp_timeout_seconds = 5
redis_timeout_seconds = 5
nats_timeout_seconds = 5
mqtt_timeout_seconds = 5
postgresql_timeout_seconds = 5
mysql_timeout_seconds = 5
mongodb_timeout_seconds = 5
elasticsearch_timeout_seconds = 5
syslog_timeout_seconds = 5
smtp_timeout_seconds = 15
grpc_timeout_seconds = 10
Raise these on high-latency networks; lower them when you want fast-fail behavior behind a retry strategy.