natricine-aws
AWS SQS and SNS pub/sub implementation.
Installation
pip install natricine-aws
SQS (Simple Queue)
Direct queue messaging with competing consumers.
import asyncio
import aioboto3
from natricine.pubsub import Message
from natricine_aws import SQSPublisher, SQSSubscriber, SQSConfig
async def main():
session = aioboto3.Session()
async with SQSPublisher(session) as publisher:
async with SQSSubscriber(session, SQSConfig()) as subscriber:
# Publish
await publisher.publish("my-queue", Message(payload=b'{"order": 1}'))
# Subscribe
async for msg in subscriber.subscribe("my-queue"):
print(f"Received: {msg.payload}")
await msg.ack() # Deletes from queue
break
asyncio.run(main())
SQS IAM Permissions
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:ChangeMessageVisibility",
"sqs:GetQueueUrl",
"sqs:GetQueueAttributes",
"sqs:CreateQueue"
],
"Resource": "arn:aws:sqs:*:*:my-queue"
}
]
}
Remove sqs:CreateQueue if create_queue_if_missing=False.
SNS+SQS (Fan-out)
Pub/sub with fan-out to multiple consumer groups.
from natricine_aws import SNSPublisher, SNSSubscriber, SNSConfig
async def main():
session = aioboto3.Session()
async with SNSPublisher(session) as publisher:
# Two consumer groups - each gets all messages
config_a = SNSConfig(consumer_group="email-service")
config_b = SNSConfig(consumer_group="analytics")
async with SNSSubscriber(session, config_a) as email_sub:
async with SNSSubscriber(session, config_b) as analytics_sub:
# Both subscribers receive this message
await publisher.publish("user-events", Message(payload=b"new signup"))
SNS+SQS IAM Permissions
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish",
"sns:CreateTopic",
"sns:Subscribe",
"sns:ListTopics"
],
"Resource": "arn:aws:sns:*:*:user-events"
},
{
"Effect": "Allow",
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:ChangeMessageVisibility",
"sqs:GetQueueUrl",
"sqs:GetQueueAttributes",
"sqs:CreateQueue",
"sqs:SetQueueAttributes"
],
"Resource": "arn:aws:sqs:*:*:user-events-*"
}
]
}
Remove sns:CreateTopic, sns:Subscribe, sqs:CreateQueue, sqs:SetQueueAttributes if create_resources=False.
Configuration
SQSConfig(
wait_time_s=20, # Long polling (max 20)
visibility_timeout_s=30, # Redelivery timeout
max_messages=10, # Messages per poll (max 10)
create_queue_if_missing=True,
)
SNSConfig(
consumer_group="my-service", # Queue name: {topic}-{consumer_group}
create_resources=True, # Auto-create topic, queue, subscription
sqs_config=SQSConfig(), # SQS settings for the subscriber
)
Localstack Testing
async with SQSPublisher(
session,
endpoint_url="http://localhost:4566",
) as publisher:
...
With CQRS
from natricine.cqrs import CommandBus, PydanticMarshaler
command_bus = CommandBus(
publisher=SQSPublisher(session),
subscriber=SQSSubscriber(session, SQSConfig()),
marshaler=PydanticMarshaler(),
)
Metadata
Release files for natricine-aws 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| natricine_aws-0.1.0.tar.gz | 6.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| natricine_aws-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.6 kB
Release files / natricine_aws-0.1.0.tar.gz
| Download URL | natricine_aws-0.1.0.tar.gz |
|---|---|
| Size | 6.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
67f4443bd4e6ccc31c25d4a0c51d6bd6be5bf7496a92b5f73033e3d4a2032bc8
|
|
BLAKE2b-256 checksum How to use checksums |
8e36dbcf9abd4008a8234d3f9b553700d1677ab80e392e14ff5fb71240f8e882
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 24, 2025.
Transparency logRelease files / natricine_aws-0.1.0-py3-none-any.whl
| Download URL | natricine_aws-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
77c0098826826c7b41f2e7363e05e6f038173c3514e86eba1601a54a70de99f4
|
|
BLAKE2b-256 checksum How to use checksums |
53971a3ac6876e2656ba0e9e70e7db83cc063c4416ecf208d41e73cf8d79ab2f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 24, 2025.
Transparency log