AWS Resources

This is just a reference for the minimum requirements for certain AWS Resources. Please modify for your purposes.

In this example we will be using botocore to create all the necessary resources.

import botocore.session
session = botocore.session.get_session()

sqs = session.create_client('sqs')

sns = session.create_client('sns')

1. A SNS Topic

No separate settings required for setting up a SNS Topic.

create_topic_response = sns.create_topic(Name='development-global')

2. A SQS Queue

No separate settings required for setting up a SQS Queue.

create_queue_response = sqs.create_queue(QueueName='iniesta-development-example')

# This request is need to get your queue arn. We need this to subscribe later.
queue_attributes = sqs.get_queue_attributes(
    QueueUrl=create_queue_response["QueueUrl"], AttributeNames=["QueueArn"]
)

3. Subscribe SQS to SNS

Make sure you get your filter policies.

# as an example if
filter_policy = {
        "iniesta_pass": [
            "hello.iniesta",
            {"prefix": "Request."},
        ]
    }

subscribe_response = sns.subscribe(
        TopicArn=create_topic_response["TopicArn"],
        Protocol="sqs",
        Endpoint=queue_attributes["Attributes"]["QueueArn"],
        Attributes={
            "FilterPolicy": json.dumps(filter_policy),
            "RawMessageDelivery": "true",
        },
    )

4. Set up permissions

response = sqs.set_queue_attributes(
            QueueUrl=create_queue_response["QueueUrl"],
            Attributes={
                "Policy": json.dumps(
                    {
                        "Version": "2012-10-17",
                        "Id": f"{queue_attributes['Attributes']['QueueArn']}/SQSDefaultPolicy",
                        "Statement": [
                            {
                                "Sid": "Sid1552456721343",
                                "Effect": "Allow",
                                "Principal": "*",
                                "Action": "SQS:SendMessage",
                                "Resource": queue_attributes["Attributes"][
                                    "QueueArn"
                                ],
                                "Condition": {
                                    "ArnEquals": {
                                        "aws:SourceArn": create_topic_response[
                                            "TopicArn"
                                        ]
                                    }
                                },
                            }
                        ],
                    }
                )
            },
        )

5. Run

You should be able to run EVENT_POLLING with these resources created.