---
title: "AWS IoT Core (MQTT Broker) Integration Guide"
slug: "aws-iot-core-mqtt-broker-integration-guide"
updated: 2025-11-14T15:34:17Z
published: 2025-11-14T15:34:17Z
canonical: "support.tulip.co/aws-iot-core-mqtt-broker-integration-guide"
---

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

# AWS IoT Core (MQTT Broker) Integration Guide

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tulip Interface to AWS IoT Core Integration - AWS Console Guide</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            line-height: 1.6;
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
            color: #333;
        }
        h1 {
            color: #232F3E;
            border-bottom: 3px solid #FF9900;
            padding-bottom: 10px;
        }
        h2 {
            color: #232F3E;
            border-bottom: 1px solid #ddd;
            padding-bottom: 5px;
            margin-top: 30px;
        }
        h3 {
            color: #0073bb;
            margin-top: 25px;
        }
        h4 {
            color: #666;
        }
        code {
            background-color: #f4f4f4;
            padding: 2px 4px;
            border-radius: 3px;
            font-family: 'Monaco', 'Consolas', monospace;
        }
        pre {
            background-color: #f8f8f8;
            border: 1px solid #ddd;
            border-radius: 5px;
            padding: 15px;
            overflow-x: auto;
        }
        pre code {
            background-color: transparent;
            padding: 0;
        }
        table {
            border-collapse: collapse;
            width: 100%;
            margin: 20px 0;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 12px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
            font-weight: bold;
        }
        .success {
            background-color: #d4edda;
            border: 1px solid #c3e6cb;
            color: #155724;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
        }
        .warning {
            background-color: #fff3cd;
            border: 1px solid #ffeaa7;
            color: #856404;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
        }
        .error {
            background-color: #f8d7da;
            border: 1px solid #f5c6cb;
            color: #721c24;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
        }
        .info {
            background-color: #d1ecf1;
            border: 1px solid #bee5eb;
            color: #0c5460;
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
        }
        a {
            color: #0073bb;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        ol, ul {
            margin: 10px 0;
            padding-left: 30px;
        }
        li {
            margin: 5px 0;
        }
        blockquote {
            border-left: 4px solid #FF9900;
            margin: 20px 0;
            padding: 10px 20px;
            background-color: #f9f9f9;
        }
        .toc {
            background-color: #f8f9fa;
            border: 1px solid #dee2e6;
            border-radius: 5px;
            padding: 20px;
            margin: 20px 0;
        }
        .step-number {
            background-color: #FF9900;
            color: white;
            border-radius: 50%;
            width: 30px;
            height: 30px;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            margin-right: 10px;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <h1>Tulip Interface to AWS IoT Core Integration - AWS Console Guide</h1>
<h2>Overview</h2>
<p>This guide shows how to connect your Tulip Interface to AWS IoT Core using <strong>only the AWS Console</strong> - no command line required!</p>
<h2>Prerequisites</h2>
<ul>
<li>AWS Console access with IoT permissions</li>
<li>Access to Tulip Interface with MQTT connector capability</li>
<li>Web browser</li>
</ul>
<hr />
<h2>Step 1: Create IoT Thing</h2>
<h3>1.1 Navigate to AWS IoT Console</h3>
<ol>
<li>Go to <a href="https://console.aws.amazon.com/iot/">AWS IoT Console</a></li>
<li>In the left sidebar, click <strong>Manage</strong> → <strong>Things</strong></li>
</ol>
<h3>1.2 Create New Thing</h3>
<ol>
<li>Click <strong>Create things</strong></li>
<li>Select <strong>Create single thing</strong></li>
<li>Click <strong>Next</strong></li>
<li>Enter Thing name: <code>tulip-interface-client</code></li>
<li>Leave other fields as default</li>
<li>Click <strong>Next</strong></li>
</ol>
<hr />
<h2>Step 2: Create Device Certificate</h2>
<h3>2.1 Certificate Configuration</h3>
<ol>
<li>Select <strong>Auto-generate a new certificate</strong></li>
<li>Click <strong>Next</strong></li>
</ol>
<h3>2.2 Create IoT Policy</h3>
<ol>
<li>Click <strong>Create policy</strong></li>
<li>In the new tab that opens:</li>
<li><strong>Policy name</strong>: <code>TulipMQTTPolicy</code></li>
<li><strong>Policy document</strong>: Click <strong>JSON</strong> tab and paste:
   <code>json
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "iot:*"
         ],
         "Resource": "*"
       }
     ]
   }</code></li>
<li>Click <strong>Create</strong></li>
<li>Return to the previous tab</li>
</ol>
<h3>2.3 Attach Policy</h3>
<ol>
<li>Refresh the policy list</li>
<li>Select <strong>TulipMQTTPolicy</strong></li>
<li>Click <strong>Create thing</strong></li>
</ol>
<hr />
<h2>Step 3: Download Certificate Files</h2>
<h3>3.1 Download Required Files</h3>
<div class="warning"><strong>IMPORTANT</strong>: Download these files immediately (you can't download them later):</p>
<ol>
<li><strong>Device certificate</strong> → Save as <code>certificate.pem.crt</code></li>
<li><strong>Private key file</strong> → Save as <code>private.pem.key</code></li>
<li><strong>Amazon Root CA 1</strong> → Save as <code>AmazonRootCA1.pem</code></li>
<li>Click <strong>Done</strong></li>
</ol>
<h3>3.2 Create Certificate Chain File</h3>
<ol>
<li>Open <code>certificate.pem.crt</code> in a text editor</li>
<li>Open <code>AmazonRootCA1.pem</code> in a text editor</li>
<li>Create a new file called <code>cert_chain.pem</code></li>
<li>Copy the entire contents of <code>certificate.pem.crt</code> into <code>cert_chain.pem</code></li>
<li>Add a new line at the end</li>
<li>Copy the entire contents of <code>AmazonRootCA1.pem</code> and append to <code>cert_chain.pem</code></li>
<li>Save <code>cert_chain.pem</code></li>
</ol>
<hr />
<h2>Step 4: Convert Private Key Format</h2>
<h3>4.1 Online Conversion Tool</h3>
<p>Since we're avoiding command line, use an online tool:</p>
<ol>
<li>Go to <a href="https://www.sslshopper.com/ssl-converter.html">SSL Converter</a> or similar tool</li>
<li>Select <strong>Convert from</strong>: RSA Private Key</li>
<li>Select <strong>Convert to</strong>: PKCS#8</li>
<li>Upload your <code>private.pem.key</code> file</li>
<li>Download the converted file as <code>private_pkcs8.pem</code></li>
</ol>
<div class="warning"><strong>Security Note</strong>: For production, use offline tools or command line for better security.</p>
<hr />
<h2>Step 5: Get IoT Endpoint</h2>
<h3>5.1 Find Your Endpoint</h3>
<ol>
<li>In AWS IoT Console, go to <strong>Settings</strong> (left sidebar)</li>
<li>Under <strong>Device data endpoint</strong>, copy the endpoint URL</li>
<li>It looks like: <code>a1234567890123-ats.iot.us-west-1.amazonaws.com</code></li>
<li><strong>Save this URL</strong> - you'll need it for Tulip configuration</li>
</ol>
<hr />
<h2>Step 6: Configure Tulip Interface MQTT Connector</h2>
<h3>6.1 MQTT Connection Settings</h3>
<p>In your Tulip Interface MQTT connector, configure:</p>
<ul>
<li><strong>MQTT Broker Host</strong>: <code>[Your endpoint from Step 5]</code></li>
<li><strong>Port</strong>: <code>8883</code></li>
<li><strong>Protocol</strong>: <code>MQTT over TLS</code> or <code>MQTTS</code></li>
<li><strong>Client ID</strong>: <code>tulip-interface-client</code></li>
</ul>
<h3>6.2 Certificate Configuration</h3>
<p>Upload these files to Tulip Interface:</p>
<ol>
<li><strong>Certificate File</strong>: Upload <code>cert_chain.pem</code></li>
<li><strong>Private Key File</strong>: Upload <code>private_pkcs8.pem</code></li>
<li><strong>CA Certificate File</strong>: Upload <code>AmazonRootCA1.pem</code></li>
</ol>
<h3>6.3 Topic Configuration</h3>
<ul>
<li><strong>Publish Topic</strong>: <code>tulip/data</code></li>
<li><strong>Subscribe Topic</strong>: <code>tulip/commands</code> (optional)</li>
</ul>
<hr />
<h2>Step 7: Enable CloudWatch Logging (Optional)</h2>
<h3>7.1 Create IAM Role</h3>
<ol>
<li>Go to <a href="https://console.aws.amazon.com/iam/">IAM Console</a></li>
<li>Click <strong>Roles</strong> → <strong>Create role</strong></li>
<li>Select <strong>AWS service</strong> → <strong>IoT</strong></li>
<li>Click <strong>Next</strong></li>
<li>Search and select <strong>CloudWatchLogsFullAccess</strong></li>
<li>Click <strong>Next</strong></li>
<li>Role name: <code>IoTLogsRole</code></li>
<li>Click <strong>Create role</strong></li>
</ol>
<h3>7.2 Enable IoT Logging</h3>
<ol>
<li>Return to <a href="https://console.aws.amazon.com/iot/">AWS IoT Console</a></li>
<li>Go to <strong>Settings</strong> (left sidebar)</li>
<li>Under <strong>Logs</strong>, click <strong>Edit</strong></li>
<li><strong>Level of verbosity</strong>: Info</li>
<li><strong>Set role</strong>: Select <code>IoTLogsRole</code></li>
<li>Click <strong>Update</strong></li>
</ol>
<hr />
<h2>Step 8: Test Connection</h2>
<h3>8.1 Monitor in AWS Console</h3>
<ol>
<li>Go to <strong>Test</strong> → <strong>MQTT test client</strong></li>
<li>Click <strong>Subscribe to a topic</strong></li>
<li><strong>Topic filter</strong>: <code>tulip/data</code></li>
<li>Click <strong>Subscribe</strong></li>
</ol>
<h3>8.2 Test from Tulip</h3>
<ol>
<li>Send a test message from Tulip Interface</li>
<li>You should see the message appear in the AWS MQTT test client</li>
</ol>
<h3>8.3 Check CloudWatch Logs (if enabled)</h3>
<ol>
<li>Go to <a href="https://console.aws.amazon.com/cloudwatch/">CloudWatch Console</a></li>
<li>Click <strong>Logs</strong> → <strong>Log groups</strong></li>
<li>Find <strong>AWSIotLogsV2</strong></li>
<li>Click on the log group to view connection logs</li>
</ol>
<hr />
<h2>Troubleshooting</h2>
<h3>Common Issues and Console Solutions</h3>
<h4>1. Certificate Not Working</h4>
<p><strong>Problem</strong>: Connection fails with certificate errors
<strong>Solution</strong>: 
- Ensure you're using <code>cert_chain.pem</code> (not individual certificate)
- Verify private key is in PKCS#8 format (<code>private_pkcs8.pem</code>)</p>
<h4>2. Policy Issues</h4>
<p><strong>Problem</strong>: Authorization failures in logs
<strong>Solution</strong>:
1. Go to <strong>Secure</strong> → <strong>Policies</strong>
2. Click on <strong>TulipMQTTPolicy</strong>
3. Verify the JSON policy allows <code>"iot:*"</code> on <code>"*"</code> resources</p>
<h4>3. Wrong Endpoint</h4>
<p><strong>Problem</strong>: Cannot connect to broker
<strong>Solution</strong>:
1. Go to <strong>Settings</strong> in IoT Console
2. Copy the exact endpoint URL (including <code>-ats</code> suffix)
3. Use port <code>8883</code></p>
<h4>4. Certificate Not Attached</h4>
<p><strong>Problem</strong>: Authentication failures
<strong>Solution</strong>:
1. Go to <strong>Secure</strong> → <strong>Certificates</strong>
2. Click on your certificate
3. Check <strong>Things</strong> and <strong>Policies</strong> tabs
4. Ensure <code>tulip-interface-client</code> thing and <code>TulipMQTTPolicy</code> are attached</p>
<hr />
<h2>File Summary</h2>
<p>You should have these files for Tulip configuration:</p>
<pre><code>📁 Downloaded Files
├── certificate.pem.crt      # Original device certificate
├── private.pem.key          # Original private key
├── AmazonRootCA1.pem        # Amazon Root CA
├── cert_chain.pem           # Certificate + Root CA ← Use this
└── private_pkcs8.pem        # Converted private key ← Use this
</code></pre>
<hr />
<h2>Quick Reference Card</h2>
<h3>Tulip MQTT Configuration Summary</h3>
<table>
<thead>
<tr>
<th>Setting</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Host</strong></td>
<td><code>[your-endpoint]-ats.iot.[region].amazonaws.com</code></td>
</tr>
<tr>
<td><strong>Port</strong></td>
<td><code>8883</code></td>
</tr>
<tr>
<td><strong>Client ID</strong></td>
<td><code>tulip-interface-client</code></td>
</tr>
<tr>
<td><strong>Topic</strong></td>
<td><code>tulip/data</code></td>
</tr>
<tr>
<td><strong>Certificate</strong></td>
<td><code>cert_chain.pem</code></td>
</tr>
<tr>
<td><strong>Private Key</strong></td>
<td><code>private_pkcs8.pem</code></td>
</tr>
<tr>
<td><strong>CA Certificate</strong></td>
<td><code>AmazonRootCA1.pem</code></td>
</tr>
</tbody>
</table>
<h3>AWS Console Quick Links</h3>
<ul>
<li><a href="https://console.aws.amazon.com/iot/">IoT Console</a> - Main IoT management</li>
<li><a href="https://console.aws.amazon.com/iot/home#/test">MQTT Test Client</a> - Test messages</li>
<li><a href="https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups">CloudWatch Logs</a> - View connection logs</li>
<li><a href="https://console.aws.amazon.com/iam/">IAM Console</a> - Manage roles and policies</li>
</ul>
<hr />
<h2>Success Indicators</h2>
<h3><span style="color: #28a745; font-size: 1.2em;">✅</span> Connection Successful</h3>
<ul>
<li>Tulip Interface shows "Connected" status</li>
<li>Messages appear in AWS MQTT test client when subscribed to <code>tulip/data</code></li>
<li>CloudWatch logs show successful <code>Publish-In</code> events</li>
</ul>
<h3><span style="color: #dc3545; font-size: 1.2em;">❌</span> Connection Failed</h3>
<ul>
<li>Check certificate files are correct format</li>
<li>Verify endpoint URL is exact match from AWS Console</li>
<li>Ensure port 8883 is used</li>
<li>Confirm client ID matches thing name exactly</li>
</ul>
<hr />
<h2>Security Best Practices</h2>
<ol>
<li><strong>Certificate Storage</strong>: Store certificate files securely in Tulip</li>
<li><strong>Policy Refinement</strong>: After testing, create more restrictive policies</li>
<li><strong>Monitoring</strong>: Enable CloudWatch logging for production monitoring</li>
<li><strong>Regular Rotation</strong>: Plan for certificate rotation (certificates expire in 2049)</li>
</ol>
<hr />
<h2>Support Resources</h2>
<ul>
<li><strong>AWS IoT Documentation</strong>: <a href="https://docs.aws.amazon.com/iot/">docs.aws.amazon.com/iot</a></li>
<li><strong>Tulip Support</strong>: Contact Tulip support for MQTT connector issues</li>
<li><strong>AWS Support</strong>: Use AWS Support for IoT Core issues</li>
</ul>
<hr />
<div class="info"><strong>Note</strong>: This guide uses the AWS Console exclusively. For automation or scripting, refer to the CLI-based guide.</p>
</body>
</html>
