Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

This repository contains the full source code that is used in the blog post Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Solution Overview

Diagram

The diagram shows the architecture that is defined by the CDK code in this repository.

You can choose if you want to connect via REST or Websocket:

REST API

After you connect to the API Gateway you request is forwarded to the RequestHandler Lambda which includes the serverless Apollo GraphQL Server. Apollo evaluates the mutation or query and generates an answer with the provided resolver. The resolver puts the message in EventBridge. Subscriptions are not support via REST.

Websocket API

When you connect to the Websocket API the ConnectionHandler Lambda preserves the state of the connection in the ConnectionMap Dynamo Table. Mutation, query and subscription requests are handled via the Apollo GraphQL server. Subscription details are stored in the ConnectionMap table - the connection ID and the subscription chatId. As an example for an integration with an AWS service two different lambdas are invoked as soon as the EventBridge rule is triggered. They translate the content of the message into German and French via Amazon Translate and put them back into EventBridge. Another rule is triggered which invokes the Lambda ResponseHandler. The Lambda queries for all active subscriptions of a certain topic (in this example the chatId) in the ConnectionMap table and forwards the content of the event to those connections.

Getting started

Prerequisites

  • AWS account
  • Node.js v16
  • git

1. Complete the prerequisites and clone this repo

git clone git@URL

2. Open the repository in your preferred IDE and familiarize yourself with the structure of the project.

.
├── cdk CDK code that defines the environment
├── img Images used in this README
└── src
└── lambda Handler code of the Lambda functions

3. Install dependencies

node.js dependencies are declared in a package.json. This project contains a package.json file in two different folders:

  • cdk: Dependencies required to deploy your stack with the CDK
  • src: Dependencies that support app development, i.e. TypeScript types for the AWS SDK for JavaScript

Navigate to each folder and run npm install

4. Ensure AWS credentials are configured

5. Deploy your app

Navigate to the cdk folder and run the following commands

npx cdk bootstrap
npx cdk deploy

6. Try out

Subscribe to the chat with chatId: chat by sending the following message to WebSocketApiEndpoint via websocket.

{"query":"subscription Subscription { chat(chatId: \"chat\")
}","variables":{}}

After that, send a new message to the REST API via GraphQL mutation by running the following cURL command.

curl --location --request POST '<YOUR_REST_API_ENDPOINT>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation postMessage {\n putEvent(message: \"Good Morning!\", chatId: \"chat\") { Entries { EventId } }\n}","variables":{}}'

Your messages will be translated to French and German and pushed backed to you over the websocket connection.

Cleaning up

When you are done, make sure to clean everything up.

Run the following command to shut down the resources created in this workshop.

npx cdk destroy

Security

See CONTRIBUTING for more information.

License

This project is licensed under the MIT-0 License. See the LICENSE file.

About

Using Apollo Server on AWS Lambda with Amazon EventBridge for real-time, event-driven streaming

Resources

Code of conduct

Contributing

Security policy

Stars

25 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages