<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hands-On Software Design in AWS</title>
    <link>https://design.lambdapeople.pl/</link>
    <description>Recent content on Hands-On Software Design in AWS</description>
    <generator>Hugo</generator>
    <language>pl-pl</language>
    <lastBuildDate>Sun, 20 Oct 2024 12:33:13 +0200</lastBuildDate>
    <atom:link href="https://design.lambdapeople.pl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Additional Tasks</title>
      <link>https://design.lambdapeople.pl/facilitator-advanced/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/facilitator-advanced/</guid>
      <description>&lt;h1 id=&#34;task-4-link-tracking&#34;&gt;Task 4. Link tracking&lt;/h1&gt;&#xA;&lt;h2 id=&#34;common-solution&#34;&gt;Common solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;cognito.jpg&#34; alt=&#34;Cognito&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;edge-solution&#34;&gt;Edge solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;cloudfront.jpg&#34; alt=&#34;Cloudfront&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;data-table---simple-counter&#34;&gt;Data table - simple counter&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;PK&lt;/th&gt;&#xA;          &lt;th&gt;GSI1_PK&lt;/th&gt;&#xA;          &lt;th&gt;GSI1_SK&lt;/th&gt;&#xA;          &lt;th&gt;Link&lt;/th&gt;&#xA;          &lt;th&gt;Clicks&lt;/th&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;client_id#001&lt;/td&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;workshop.lambdapeople.pl&lt;/td&gt;&#xA;          &lt;td&gt;21&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#def&lt;/td&gt;&#xA;          &lt;td&gt;client_id#002&lt;/td&gt;&#xA;          &lt;td&gt;short_id#def&lt;/td&gt;&#xA;          &lt;td&gt;aws.amazon.com&lt;/td&gt;&#xA;          &lt;td&gt;37&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;data-table---detailed-tracking&#34;&gt;Data table - detailed tracking&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;PK&lt;/th&gt;&#xA;          &lt;th&gt;GSI1_PK&lt;/th&gt;&#xA;          &lt;th&gt;GSI1_SK&lt;/th&gt;&#xA;          &lt;th&gt;Link&lt;/th&gt;&#xA;          &lt;th&gt;Clicks&lt;/th&gt;&#xA;          &lt;th&gt;ClickMeta&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;client_id#001&lt;/td&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;workshop.lambdapeople.pl&lt;/td&gt;&#xA;          &lt;td&gt;21&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;client_id#001&lt;/td&gt;&#xA;          &lt;td&gt;short_id#abc#click_id#001&lt;/td&gt;&#xA;          &lt;td&gt;workshop.lambdapeople.pl&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;{&amp;hellip;}&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;client_id#001&lt;/td&gt;&#xA;          &lt;td&gt;short_id#abc#click_id#002&lt;/td&gt;&#xA;          &lt;td&gt;workshop.lambdapeople.pl&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;{&amp;hellip;}&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;solution-ideas&#34;&gt;Solution ideas&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Lambda@Edge with CloudFront&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use CloudFront with the &lt;strong&gt;Lambda@Edge&lt;/strong&gt; function to monitor each request and update the click counter without the need for an intermediary page.&lt;/li&gt;&#xA;&lt;li&gt;Lambda@Edge runs globally, ensuring fast processing and can simultaneously redirect users to the correct URL.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;API Gateway with HTTP 301/302 Redirect&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Base Task</title>
      <link>https://design.lambdapeople.pl/base/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/base/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;Your task in this part of the workshop is to extend the existing solution to allow logged-in users to manage their shortened links. The system should enable users to add, view, and delete their own shortened links. Each of these actions requires the user to be logged in. Links are associated with user accounts, and each user has access only to their own links.&lt;/p&gt;&#xA;&lt;h2 id=&#34;requirements-summary&#34;&gt;Requirements Summary&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The system must support user login via &lt;strong&gt;Cognito&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;li&gt;After logging in, the user must be able to:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Add new links.&lt;/li&gt;&#xA;&lt;li&gt;View the history of their shortened links.&lt;/li&gt;&#xA;&lt;li&gt;Delete their links.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Links added by one user must not be visible to other users.&lt;/li&gt;&#xA;&lt;li&gt;The user must be logged in to add, view, or delete their links. Adding links without login is not allowed.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;technical-requirements&#34;&gt;Technical Requirements&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Login&lt;/strong&gt; – Use &lt;strong&gt;Cognito&lt;/strong&gt; to enable user login. Each user has their own unique account where their links are stored.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Data Management&lt;/strong&gt; – Each link must be associated with the logged-in user, and access to links should only be available to the owner.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;API&lt;/strong&gt; – The system will continue to operate as an API, and each operation (adding, viewing, deleting links) must be authorized based on the user’s account.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serverless&lt;/strong&gt; – The solution should be based on serverless architecture, preferring AWS services already used in the company, such as Cognito.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;task&#34;&gt;Task&lt;/h2&gt;&#xA;&lt;p&gt;Draw your solution on paper using AWS service icons provided. Your solution should include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Base Task</title>
      <link>https://design.lambdapeople.pl/facilitator-base/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/facilitator-base/</guid>
      <description>&lt;h2 id=&#34;common-solution&#34;&gt;Common solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;cognito.jpg&#34; alt=&#34;Random image&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;data-table&#34;&gt;Data table&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;PK&lt;/th&gt;&#xA;          &lt;th&gt;GSI1_PK&lt;/th&gt;&#xA;          &lt;th&gt;GSI1_SK&lt;/th&gt;&#xA;          &lt;th&gt;Link&lt;/th&gt;&#xA;          &lt;th&gt;ClientId&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;client_id#001&lt;/td&gt;&#xA;          &lt;td&gt;short_id#abc&lt;/td&gt;&#xA;          &lt;td&gt;workshop.lambdapeople.pl&lt;/td&gt;&#xA;          &lt;td&gt;001&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;short_id#def&lt;/td&gt;&#xA;          &lt;td&gt;client_id#002&lt;/td&gt;&#xA;          &lt;td&gt;short_id#def&lt;/td&gt;&#xA;          &lt;td&gt;aws.amazon.com&lt;/td&gt;&#xA;          &lt;td&gt;002&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;functionless-solution&#34;&gt;Functionless solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;cognito-functionless.jpg&#34; alt=&#34;Random image&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contact Information</title>
      <link>https://design.lambdapeople.pl/contact/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/contact/</guid>
      <description>&lt;h1 id=&#34;contact-information&#34;&gt;Contact Information&lt;/h1&gt;&#xA;&lt;p&gt;Here are the contact details for our key facilitators. You can connect with them via their LinkedIn profiles using the provided QR codes.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;michał-górski&#34;&gt;Michał Górski&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/michal-gorski/&#34;&gt;MG LinkedIn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;mateusz-boś&#34;&gt;Mateusz Boś&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/mateuszbos/&#34;&gt;Bosiu LinkedIn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;bogusław-buszydlik&#34;&gt;Bogusław Buszydlik&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/boguslawbuszydlik/&#34;&gt;Bogus LinkedIn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;jakub-barczyk&#34;&gt;Jakub Barczyk&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/jakub-barczyk/&#34;&gt;Kuba LinkedIn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Connect with us on LinkedIn!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Correct Solution</title>
      <link>https://design.lambdapeople.pl/correct-solution/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/correct-solution/</guid>
      <description>&lt;h2 id=&#34;correct-solution&#34;&gt;Correct Solution&lt;/h2&gt;&#xA;&lt;h3 id=&#34;frontend-aws-honeycode&#34;&gt;Frontend: AWS Honeycode&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Instead of a traditional web app or API Gateway, use AWS Honeycode, AWS’s no-code platform. Create a small app with an input field for the long URL and a button that triggers the backend. Users access the service via a mobile app interface. Not the most efficient, but certainly unexpected!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;url-expiry-and-housekeeping-aws-deepracer&#34;&gt;URL Expiry and Housekeeping: AWS DeepRacer&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;For automated URL expiration (e.g., delete short URLs after a certain time), program AWS DeepRacer to race around the database and delete expired entries. The miniature car, trained with reinforcement learning, will randomly navigate QLDB records and clean up old data, providing both entertainment and a surprising way to handle housekeeping.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;url-shortening-logic-aws-glue&#34;&gt;URL Shortening Logic: AWS Glue&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use AWS Glue, typically for data processing, to handle URL shortening. Define an ETL job where the transformation step generates the shortened URL by slicing the original one and appending it to a base domain. This is absurdly over-engineered for such a task, making it an interesting challenge.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;short-url-storage-aws-qldb-quantum-ledger-database&#34;&gt;Short URL Storage: AWS QLDB (Quantum Ledger Database)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Store the shortened URL and its mapping to the original URL in Amazon QLDB. While typically used for immutable ledger-like use cases, here it will act as the service’s core database, ensuring that every URL mapping is cryptographically verifiable. Why use a traditional database when you can use a ledger?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;short-url-redirect-aws-app-runner&#34;&gt;Short URL Redirect: AWS App Runner&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Deploy a small redirect service using AWS App Runner, which is designed to run containerized web apps. Each request hitting a short URL will be routed to App Runner, which will query QLDB for the original URL and return a 302 redirect. Definitely overkill, but an uncommon choice for such a small service.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;metrics-and-analytics-aws-ground-station&#34;&gt;Metrics and Analytics: AWS Ground Station&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;For tracking metrics (e.g., the number of clicks per short link), use AWS Ground Station, a satellite communications service. To be clear, Ground Station will not have any direct relevance to the link shortening process. Instead, we’ll humorously claim that we use “satellite tracking” to ensure accurate data collection for our URL redirects. It’s the epitome of unnecessary complexity.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;cache-layer-aws-snowball-edge&#34;&gt;Cache Layer: AWS Snowball Edge&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Instead of using a typical in-memory cache like Redis or ElastiCache, let’s offload frequently accessed short URLs to an AWS Snowball Edge device. These portable edge devices, designed for large data transfers, will act as a cache server. It can sit in your office or data center, ensuring quick local resolution of your shortened URLs—because why use cloud storage when you can use a literal box of servers?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;monitoring-amazon-monitron&#34;&gt;Monitoring: Amazon Monitron&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Instead of relying on CloudWatch for monitoring system health and performance, use Amazon Monitron, a machine learning-powered service designed for equipment monitoring in industrial applications. Set up IoT sensors to track the physical Snowball Edge and DeepRacer, and repurpose the alerts to signal URL shortening service anomalies.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;security-and-authentication-aws-macie&#34;&gt;Security and Authentication: AWS Macie&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Secure the service by running AWS Macie on the short URLs and logs to ensure that no sensitive data is exposed. This service, primarily used for S3 data, will scan your QLDB records for PII, even though URLs are public, ensuring that no personal data gets accidentally shortened.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>For Facilitators</title>
      <link>https://design.lambdapeople.pl/facilitator/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/facilitator/</guid>
      <description>&lt;h1 id=&#34;reference-solutions&#34;&gt;Reference Solutions&lt;/h1&gt;&#xA;&lt;h2 id=&#34;first-part&#34;&gt;First part&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://design.lambdapeople.pl/facilitator-initial&#34;&gt;Hackathon (20 minut)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;second-part&#34;&gt;Second part&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://design.lambdapeople.pl/facilitator-base&#34;&gt;Base task (20 minut)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://design.lambdapeople.pl/facilitator-advanced&#34;&gt;Additional tasks (40 minut)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Hackathon</title>
      <link>https://design.lambdapeople.pl/initial/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/initial/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;During this part of the workshop, you will focus on designing a minimal link management system (link shortener). Your task is to design a simple solution that allows a user to submit a full URL and get a shortened version, as well as retrieve the full address based on the shortened link.&lt;/p&gt;&#xA;&lt;p&gt;No authorization or authentication is required.&#xA;The goal is to create a basic version (MVP) that works, is quick to deploy, and performs its core functions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Icons</title>
      <link>https://design.lambdapeople.pl/icons/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/icons/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;icons1.png&#34; alt=&#34;Icons1&#34;&gt;&#xA;&lt;img src=&#34;icons2.png&#34; alt=&#34;Icons2&#34;&gt;&#xA;&lt;img src=&#34;icons3.png&#34; alt=&#34;Icons3&#34;&gt;&#xA;&lt;img src=&#34;icons4.png&#34; alt=&#34;Icons4&#34;&gt;&#xA;&lt;img src=&#34;icons5.png&#34; alt=&#34;Icons5&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;icons.pdf&#34;&gt;icons.pdf&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Initial Task</title>
      <link>https://design.lambdapeople.pl/facilitator-initial/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/facilitator-initial/</guid>
      <description>&lt;h2 id=&#34;common-solution&#34;&gt;Common solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;lambda.jpg&#34; alt=&#34;Random image&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;data-table&#34;&gt;Data table&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;PK&lt;/th&gt;&#xA;          &lt;th&gt;Link&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;abc&lt;/td&gt;&#xA;          &lt;td&gt;workshop.lambdapeople.pl&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;def&lt;/td&gt;&#xA;          &lt;td&gt;aws.amazon.com&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;functionless-solution&#34;&gt;Functionless solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/compute/building-a-serverless-url-shortener-app-without-lambda-part-1/&#34;&gt;Blog Post&lt;/a&gt;&#xA;&lt;img src=&#34;functionless.jpg&#34; alt=&#34;Random image&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;cost-optimized-solution&#34;&gt;Cost optimized solution&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ApplexusLabs/aws-url-shortner&#34;&gt;Blog Post&lt;/a&gt;&#xA;&lt;img src=&#34;s3-redirects.jpg&#34; alt=&#34;Random image&#34;&gt;&#xA;&lt;img src=&#34;s3-redirects-ddb.jpg&#34; alt=&#34;Random image&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>MVP (20 minut)</title>
      <link>https://design.lambdapeople.pl/mvp/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/mvp/</guid>
      <description>&lt;h1 id=&#34;welcome-to-my-random-page&#34;&gt;Welcome to My Random Page&lt;/h1&gt;&#xA;&lt;p&gt;This is a &lt;strong&gt;test&lt;/strong&gt; page created to explore the capabilities of Hugo. Below are some random sections and content blocks to help you get a feel for how your site might look.&lt;/p&gt;&#xA;&lt;h2 id=&#34;section-1-a-list-of-things&#34;&gt;Section 1: A List of Things&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Coffee&lt;/li&gt;&#xA;&lt;li&gt;Music&lt;/li&gt;&#xA;&lt;li&gt;Hiking&lt;/li&gt;&#xA;&lt;li&gt;Technology&lt;/li&gt;&#xA;&lt;li&gt;Travel&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;section-2-code-snippet&#34;&gt;Section 2: Code Snippet&lt;/h2&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s an example of a simple Go function:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello, Hugo!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;section-3-a-blockquote&#34;&gt;Section 3: A Blockquote&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;The best way to predict the future is to create it.&amp;rdquo;&lt;br&gt;&#xA;– Abraham Lincoln&lt;/p&gt;</description>
    </item>
    <item>
      <title>Performance</title>
      <link>https://design.lambdapeople.pl/performance/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/performance/</guid>
      <description>&lt;h1 id=&#34;zapewnij-wydajność&#34;&gt;Zapewnij wydajność&lt;/h1&gt;&#xA;&lt;h2 id=&#34;dlaczego-wydajność-jest-ważna&#34;&gt;Dlaczego wydajność jest ważna?&lt;/h2&gt;&#xA;&lt;p&gt;Wydajność to pojęcie, które dotyczy zarówno ludzi, jak i maszyn, procesów oraz organizacji. Jest ona kluczowym czynnikiem wpływającym na sukces w wielu dziedzinach życia, od pracy zawodowej, przez edukację, po technologię i zarządzanie zasobami. Wydajność można określić jako zdolność do osiągania pożądanych rezultatów w sposób optymalny – z jak najmniejszym zużyciem czasu, energii i zasobów. W niniejszej rozprawce przedstawię, dlaczego wydajność jest tak istotna oraz jakie konsekwencje wynikają z jej braku.&lt;/p&gt;</description>
    </item>
    <item>
      <title>QR code</title>
      <link>https://design.lambdapeople.pl/qr/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/qr/</guid>
      <description>&lt;h2 id=&#34;tasks&#34;&gt;Tasks&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://api.qrserver.com/v1/create-qr-code/?size=250x250&amp;amp;data=https://workshop.lambdapeople.pl&#34; alt=&#34;Image&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;solutions&#34;&gt;Solutions&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://api.qrserver.com/v1/create-qr-code/?size=250x250&amp;amp;data=https://workshop.lambdapeople.pl/facilitator&#34; alt=&#34;Image&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Task 1: Scanning Link Content</title>
      <link>https://design.lambdapeople.pl/ads/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/ads/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;In this task, your system must be extended to ensure that every added link is scanned for inappropriate content. To perform this, an external API will be used:&lt;br&gt;&#xA;&lt;code&gt;api.scan-link/v1/scan?url={url}&amp;amp;callback={url2}&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;The external service does not provide an immediate response. Instead, it sends a &lt;strong&gt;POST&lt;/strong&gt; request to the callback URL within 2 hours. The response will contain a JSON object with the following format:&lt;br&gt;&#xA;&lt;code&gt;{isFine: true/false}&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;If the scan result indicates that the link is not appropriate (&lt;code&gt;isFine: false&lt;/code&gt;), the link should be blocked and no longer accessible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Task 2: Domain Blocking</title>
      <link>https://design.lambdapeople.pl/block/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/block/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;In this task, your goal is to implement the ability to block redirections to specific domains and links containing certain keywords. For example, the police may request that no shortened links redirect to the domain &amp;ldquo;danger.com&amp;rdquo; or to links containing the word &amp;ldquo;porn.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;The blocks may differ based on data type, so consider two use cases:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Blocking a specific domain (e.g., &lt;code&gt;danger.com&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Blocking links containing certain keywords (e.g., &amp;ldquo;porn&amp;rdquo;).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;requirements-summary&#34;&gt;Requirements Summary&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The system should allow blocking entire domains (e.g., &lt;code&gt;danger.com&lt;/code&gt;), preventing redirection to any page within that domain.&lt;/li&gt;&#xA;&lt;li&gt;The system should block links containing specific keywords (e.g., &amp;ldquo;porn&amp;rdquo;) in any part of the URL.&lt;/li&gt;&#xA;&lt;li&gt;Blocked links should not be shortened or redirected.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;technical-requirements&#34;&gt;Technical Requirements&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Domain Blocking&lt;/strong&gt; – The system must check the full URL and prevent shortening or redirecting if the URL belongs to a blocked domain (e.g., &lt;code&gt;danger.com&lt;/code&gt;). The block should apply to the main domain and all its subpages.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Keyword Blocking&lt;/strong&gt; – The system must check for specific keywords (e.g., &amp;ldquo;porn&amp;rdquo;) in the URL and prevent redirecting or shortening such links.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serverless&lt;/strong&gt; – Prefer serverless-based solutions.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;task&#34;&gt;Task&lt;/h2&gt;&#xA;&lt;p&gt;Draw your solution on paper using AWS service icons provided. Your solution should include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Task 3: Sending an Email on Link Click</title>
      <link>https://design.lambdapeople.pl/qr-gen/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/qr-gen/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;In this task, your system needs to be extended to send an email notification to the creator of a shortened link every time someone clicks on it. The creator&amp;rsquo;s email address is stored in &lt;strong&gt;Cognito&lt;/strong&gt;, and there is a property in Cognito called &lt;code&gt;shouldRecieveNotifications&lt;/code&gt; (boolean). Emails should only be sent if this property is set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;However, keep in mind that &lt;strong&gt;Amazon SES&lt;/strong&gt; (Simple Email Service) has limits on how many emails can be sent within a short period of time. You must ensure that your system does not exceed these limits and manages email sending appropriately to avoid throttling or blocking by SES.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Task 4: Link Tracking</title>
      <link>https://design.lambdapeople.pl/tracking/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/tracking/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;Your task in this part of the workshop is to extend the system with the ability to track how many times each shortened link has been opened. The system should collect data on the number of clicks for each shortened link, and this data should be accessible to the link owner.&lt;/p&gt;&#xA;&lt;h2 id=&#34;requirements-summary&#34;&gt;Requirements Summary&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The system should track the number of clicks for each shortened link.&lt;/li&gt;&#xA;&lt;li&gt;Click data should be assigned to the correct link and visible to its owner.&lt;/li&gt;&#xA;&lt;li&gt;The click count must be updated in real-time or each time the link is opened.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;technical-requirements&#34;&gt;Technical Requirements&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Click Tracking&lt;/strong&gt; – The system must update the click count for each shortened link upon each opening. This data should be stored in a database and easily accessible to the user.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;API&lt;/strong&gt; – When a link is opened, the system should increase the click counter. The link owner should access this information via the API.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serverless&lt;/strong&gt; – The system should be based on serverless architecture.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;task&#34;&gt;Task&lt;/h2&gt;&#xA;&lt;p&gt;Draw your solution on paper using AWS service icons provided. Your solution should include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Task 5: Link Expiration Time</title>
      <link>https://design.lambdapeople.pl/ttl/</link>
      <pubDate>Sun, 20 Oct 2024 12:33:13 +0200</pubDate>
      <guid>https://design.lambdapeople.pl/ttl/</guid>
      <description>&lt;h2 id=&#34;task-description&#34;&gt;Task Description&lt;/h2&gt;&#xA;&lt;p&gt;Your task in this part of the workshop is to extend the system with the ability to set expiration times for shortened links. Each shortened link should have the option to specify how long it will remain active (e.g., 3 hours, 2 weeks, and 3 days). After this time, the link should no longer work and should not redirect to the target URL.&lt;/p&gt;&#xA;&lt;h2 id=&#34;requirements-summary&#34;&gt;Requirements Summary&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The system must allow setting different expiration times for each shortened link (e.g., 3 hours, 2 weeks, and 3 days).&lt;/li&gt;&#xA;&lt;li&gt;After the expiration time, the shortened link must stop working and should not redirect to the target URL.&lt;/li&gt;&#xA;&lt;li&gt;After expiration, the link should return a message indicating it has expired or that it is inactive.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;technical-requirements&#34;&gt;Technical Requirements&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Setting Expiration Time&lt;/strong&gt; – The system must allow the user to set an expiration time for each shortened link during its creation.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;API&lt;/strong&gt; – Links must be checked for validity during each request. The system must return expiration information after the link’s validity has expired.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serverless&lt;/strong&gt; – The solution should follow serverless architecture.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;task&#34;&gt;Task&lt;/h2&gt;&#xA;&lt;p&gt;Draw your solution on paper using AWS service icons provided. Your solution should include:&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://design.lambdapeople.pl/advanced/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://design.lambdapeople.pl/advanced/</guid>
      <description>&lt;h2 id=&#34;additional-tasks&#34;&gt;Additional Tasks&lt;/h2&gt;&#xA;&lt;h3 id=&#34;general-assumptions&#34;&gt;General Assumptions&lt;/h3&gt;&#xA;&lt;p&gt;The following additional tasks allow for extending the system&amp;rsquo;s functionality and further developing it with new elements. You can choose one or more tasks independently.&lt;/p&gt;&#xA;&lt;h3 id=&#34;tasks&#34;&gt;Tasks&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://design.lambdapeople.pl/ads/&#34;&gt;Task 1: Scanning&lt;/a&gt;&lt;br&gt;&#xA;URL must be scanned in order to be used.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://design.lambdapeople.pl/block/&#34;&gt;Task 2: Domain Blocking&lt;/a&gt;&lt;br&gt;&#xA;Ability to block redirection to specific domains or links containing keywords.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://design.lambdapeople.pl/qr-gen/&#34;&gt;Task 3: Mails&lt;/a&gt;&lt;br&gt;&#xA;Sending mails to author or URL.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://design.lambdapeople.pl/tracking/&#34;&gt;Task 4: Link Tracking&lt;/a&gt;&lt;br&gt;&#xA;Track the number of times shortened links are opened.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
