> ## Documentation Index
> Fetch the complete documentation index at: https://sequinstream.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get started with AWS SNS

> Learn how to stream rows and changes from Postgres to Amazon SNS in minutes. Use Sequin to stream Postgres to Lambdas, Kinesis, SQS, and more via SNS.

In this quickstart, you'll create a real-time data pipeline that streams changes from a Postgres database to an Amazon SNS topic. You'll:

* Boot Sequin
* Connect to a sample playground database
* Create an SNS topic and subscription
* Set up a sink to sync changes to SNS
* See your changes flow in real-time

By the end, you'll have hands-on experience setting up Postgres change data capture (CDC) with Sequin and SNS. This same pattern can be used to setup your own Postgres CDC pipeline with SNS.

<Tip>
  This is the quickstart for streaming Postgres to SNS. See the [how-to guide](/how-to/stream-postgres-to-sns) for an explanation of how to use the SNS sink or the [reference](/reference/sinks/sns) for details on all configuration options.
</Tip>

<Steps titleSize="h2">
  <Step title="Run Sequin" icon="server">
    The easiest way to get started with Sequin is with our [Docker Compose file](https://github.com/sequinstream/sequin/blob/main/docker/docker-compose.yaml). This file starts a Postgres database, Redis instance, and Sequin server.

    <Steps>
      <Step title="Create directory and start services">
        1. Download [sequin-docker-compose.zip](https://github.com/sequinstream/sequin/releases/latest/download/sequin-docker-compose.zip).
        2. Unzip the file.
        3. Navigate to the unzipped directory and start the services:

        ```bash theme={null}
        cd sequin-docker-compose && docker compose up -d
        ```

        <AccordionGroup>
          <Accordion title="Alternative: Download with curl">
            ```bash theme={null}
            curl -L https://github.com/sequinstream/sequin/releases/latest/download/sequin-docker-compose.zip -o sequin-docker-compose.zip \
              && unzip sequin-docker-compose.zip && rm sequin-docker-compose.zip
            cd sequin-docker-compose && docker compose up -d
            ```
          </Accordion>

          <Accordion title="Alternative: Clone the repository">
            ```bash theme={null}
            git clone git@github.com:sequinstream/sequin.git
            cd sequin/docker
            docker compose up -d
            ```
          </Accordion>
        </AccordionGroup>
      </Step>

      <Step title="Verify services are running">
        Check that Sequin is running using `docker ps`:

        ```bash theme={null}
        docker ps
        ```

        You should see output like the following:

        ```
        CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                    PORTS                              NAMES
        bd5c458cabde   sequin/sequin:latest            "/scripts/start_comm…"   11 seconds ago   Up 9 seconds              4000/tcp, 0.0.0.0:7376->7376/tcp   sequin-sequin-1
        3bacd89765e7   grafana/grafana                 "/run.sh"                11 seconds ago   Up 11 seconds             0.0.0.0:3000->3000/tcp             sequin-sequin_grafana-1
        3ad41319a66c   postgres:16                     "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds (healthy)   0.0.0.0:7377->5432/tcp             sequin-sequin_postgres-1
        6139a5fc4e80   redis:7                         "docker-entrypoint.s…"   11 seconds ago   Up 11 seconds             0.0.0.0:7378->6379/tcp             sequin-sequin_redis-1
        7e07a5b052de   prom/prometheus                 "/bin/prometheus --c…"   11 seconds ago   Up 11 seconds             0.0.0.0:9090->9090/tcp             sequin-sequin_prometheus-1
        ```

        <Check>
          Sequin, Postgres, Redis, Prometheus, and Grafana should be up and running (status: `Up`).
        </Check>
      </Step>
    </Steps>
  </Step>

  <Step title="Login" icon="key">
    The Docker Compose file automatically configures Sequin with an admin user and a playground database.

    Let's log in to the Sequin web console:

    <Steps>
      <Step title="Open the web console">
        After starting the Docker Compose services, open the Sequin web console at [http://localhost:7376](http://localhost:7376):

        <Frame>
          <img src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/login-page.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=c5d90b34f56560570696a71370f7e39b" alt="Sequin login page, allowing login with default credentials" width="2070" height="1696" data-path="images/quickstart/login-page.png" />
        </Frame>
      </Step>

      <Step title="Login with default credentials">
        Use the following default credentials to login:

        * Email:

        ```
        admin@sequinstream.com
        ```

        * Password:

        ```
        sequinpassword!
        ```
      </Step>
    </Steps>
  </Step>

  <Step title="View the playground database" icon="database">
    To get you started quickly, Sequin's Docker Compose file creates a logical database called `sequin_playground` with a sample dataset in the `public.products` table.

    Let's take a look:

    <Steps>
      <Step title="Navigate to Databases">
        In the Sequin web console, click **Databases** in the sidebar.
      </Step>

      <Step title="Select playground database">
        Click on the pre-configured `sequin-playground` database:

        <Frame>
          <img src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/playground-database.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=01ac1cbf4506cad22c270adb66c0b171" alt="Playground database" width="3376" height="2020" data-path="images/quickstart/playground-database.png" />
        </Frame>

        <Check>
          The database "Health" should be green.
        </Check>
      </Step>

      <Step title="View contents of the products table">
        Let's get a sense of what's in the `products` table. Run the following command:

        ```bash theme={null}
        docker exec -i sequin-sequin_postgres-1 \
          psql -U postgres -d sequin_playground -c \
          "select id, name, price from products;"
        ```

        <Info>
          This command connects to the running Postgres container and runs a `psql` command.
        </Info>

        You should see a list of the rows in the `products` table:

        ```
          id |         name          | price 
        ----+-----------------------+-------
          1 | Avocados (3 pack)     |  5.99
          2 | Flank Steak (1 lb)    |  8.99
          3 | Salmon Fillet (12 oz) | 14.99
          4 | Baby Spinach (16 oz)  |  4.99
          5 | Sourdough Bread       |  6.99
          6 | Blueberries (6 oz)    |  3.99
        (6 rows)
        ```

        We'll make modifications to this table in a bit.
      </Step>
    </Steps>
  </Step>

  <Step title="Create an SNS topic" icon="database">
    We'll start by creating an Amazon SNS topic that will receive change events from Sequin.

    <Steps>
      <Step title="Open the SNS console">
        Sign in to the <a href="https://console.aws.amazon.com/sns/v3/home" target="_blank" rel="noopener noreferrer">Amazon SNS console</a>. Make sure you're in the AWS region where you want to create your topic.
      </Step>

      <Step title="Create the topic">
        Click "Create topic".

        For the type, select "Standard". For name, enter <code>products-updates</code>.

        Leave the rest of the defaults and click "Create topic".
      </Step>
    </Steps>
  </Step>

  <Step title="Create a subscription" icon="envelope">
    We'll create an email subscription so you can see notifications arrive in your inbox:

    <Steps>
      <Step title="Subscribe an email endpoint">
        On the topic overview page click "Create subscription".

        Set "Protocol" to "Email" and enter your email address in the "Endpoint" field.

        Click "Create Subscription".
      </Step>

      <Step title="Confirm the subscription">
        Check your email inbox for a message from Amazon SNS and click the "Confirm subscription" link.

        Once confirmed, the subscription's <i>Status</i> will change to <code>Confirmed</code> in the SNS console.

        <Note>
          If you don't see the confirmation email, check your spam folder.

          You can re-send the confirmation email by clicking "Request confirmation" in the SNS console.
        </Note>
      </Step>
    </Steps>
  </Step>

  <Step title="Create an SNS Sink" icon="plug">
    With the playground database connected and your SNS topic ready, you can create a [sink](/reference/sinks/overview) in Sequin. This sink will send changes from the <code>products</code> table to your SNS topic:

    <Steps>
      <Step title="Navigate to Sinks">
        In Sequin, click "Sinks" in the sidebar navigation, then click "Create Sink".
      </Step>

      <Step title="Select sink type">
        Select "Amazon SNS" as the sink type and click "Continue".
      </Step>

      <Step title="Note &#x22;Source&#x22; configuration">
        In the "Source" card, note that the `sequin-playground` database is selected and all schemas and tables are included. Leave these defaults:

        <Frame>
          <img style={{ maxWidth: '500px' }} src="https://mintcdn.com/sequinstream/I2Yx_f_pmUFGglUP/images/quickstart/source-card.png?fit=max&auto=format&n=I2Yx_f_pmUFGglUP&q=85&s=a1ba47d0e4698d439d64db0d582f0951" alt="Source card showing the sequin_playground database and products table" width="1640" height="778" data-path="images/quickstart/source-card.png" />
        </Frame>
      </Step>

      <Step title="Setup a backfill">
        In the `Inital backfill` card, select the `public.products` table to initate a backfill when the sink is created.

        <Frame>
          <img style={{ maxWidth: '700px' }} src="https://mintcdn.com/sequinstream/drUA755uMUeIaCSH/images/quickstart/backfill-card.png?fit=max&auto=format&n=drUA755uMUeIaCSH&q=85&s=2a41931bc2d650f7467f3c7ae92b5b0a" alt="Initial backfill card with public.products table selected" width="1606" height="570" data-path="images/quickstart/backfill-card.png" />
        </Frame>
      </Step>

      <Step title="Configure SNS">
        In the SNS card, enter your configuration:

        * Topic ARN: the ARN of the SNS topic you created earlier
        * AWS Access Key ID / Secret Access Key: credentials that have permission to publish to the topic

        <Note>
          If you don't have credentials, you can create a new user for Sequin with [write permissions to SNS](/reference/sinks/sns#iam-user-permissions).
        </Note>

        <Frame>
          <img src="https://mintcdn.com/sequinstream/I2Yx_f_pmUFGglUP/images/quickstart/sns/config-card.png?fit=max&auto=format&n=I2Yx_f_pmUFGglUP&q=85&s=457cd94f7ad72bb0ca1443b19871b937" alt="SNS configuration card" width="1594" height="662" data-path="images/quickstart/sns/config-card.png" />
        </Frame>
      </Step>

      <Step title="Create the sink">
        Give your sink a name, like <code>products-sns</code>, and click "Create Sink".

        Sequin will first backfill the rows in the `products` table, then stream every change in real‑time to your SNS topic.
      </Step>
    </Steps>
  </Step>

  <Step title="See backfill messages in Sequin" icon="waveform-lines">
    With our initial backfill complete, click the "Messages" tab to see the status of backfill messages. All messages will be marked as "Delivered":

    <Frame>
      <img src="https://mintcdn.com/sequinstream/I2Yx_f_pmUFGglUP/images/quickstart/sns/messages-tab.png?fit=max&auto=format&n=I2Yx_f_pmUFGglUP&q=85&s=5237d877637642eb85ce5245dac7ffef" alt="Backfill messages in Sequin" width="1788" height="980" data-path="images/quickstart/sns/messages-tab.png" />
    </Frame>
  </Step>

  <Step title="See backfill notifications in your email" icon="waveform-lines">
    Check your email inbox. You should see an email for each backfill message. The email contains a JSON payload with the backfilled data. Sequin's message is under the `Message` field.
  </Step>

  <Step title="See changes flow to SNS" icon="waveform-lines">
    Now, see how changes flow to SNS in real-time:

    <Steps>
      <Step title="Make some changes">
        In your terminal insert a new row into the `products` table:

        ```bash theme={null}
        docker exec -i sequin-sequin_postgres-1 \
          psql -U postgres -d sequin_playground -c \
          "insert into products (name, price) values ('Organic Honey (16 oz)', 12.99);"
        ```

        The change should flow through SNS to your email inbox in a few seconds.

        Feel free to try other changes:

        <AccordionGroup>
          <Accordion title="Update a product's price">
            ```bash theme={null}
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "update products set price = 7.99 where name = 'Avocados (3 pack)';"
            ```
          </Accordion>

          <Accordion title="Change a product's name">
            ```bash theme={null}
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "update products set name = 'Organic Avocados (3 pack)' where name = 'Avocados (3 pack)';"
            ```
          </Accordion>

          <Accordion title="Delete a product">
            ```bash theme={null}
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "delete from products where name = 'Blueberries (6 oz)';"
            ```
          </Accordion>
        </AccordionGroup>

        Each change will be forwarded to your email inbox via SNS within a few seconds.
      </Step>
    </Steps>
  </Step>
</Steps>

<Check>
  Great work!
</Check>

You've successfully:

* Created an SNS topic and confirmed an email subscription
* Loaded existing data through a backfill
* Made changes to the `products` table
* Verified notifications are flowing to SNS (and landing in your inbox)
* Set up a complete Postgres change data capture pipeline

## Ready to stream

Now you're ready to connect your own database to Sequin and start streaming changes:

<CardGroup cols={2}>
  <Card title="Guide: Connect Postgres" icon="elephant" href="/connect-postgres">
    Connect your Postgres database to Sequin.
  </Card>

  <Card title="Guide: Setting up an SNS sink" icon="plug" href="/how-to/stream-postgres-to-sns">
    Set up an SNS sink to bring CDC events to AWS.
  </Card>
</CardGroup>
