{"id":22530,"date":"2022-02-28T22:53:52","date_gmt":"2022-02-28T21:53:52","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=22530"},"modified":"2023-06-18T17:42:19","modified_gmt":"2023-06-18T15:42:19","slug":"discord-monitoring-system-with-amplify-and-ec2","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/","title":{"rendered":"Discord Monitoring System with Amplify and EC2"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Abstract<\/strong><\/p>\n\n\n\n<p>Discord was once just a tool for gamers to communicate and socialize with each other, but since the pandemic started, discord gained a lot of popularity and is now used by so many other people, me included, who don&#8217;t necessarily have any interest in video gaming. So after exploring the various channels on discord, I found that most of them have some kind of rules that users have to adhere to. But with channels that have more than 100 members, moderating becomes really tedious. The idea behind this project, which is a part of the lecture Software Development for Cloud Computing, is to automate this process by creating a discord monitoring system.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Features<\/strong><\/p>\n\n\n\n<p>With this system, an admin can add words that they want to be prohibited in the chat. These words are then used to delete messages that don&#8217;t adhere to the rules or to flag these messages for an admin to review when the system is not 100% certain that the message contains harmful content.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Architecture<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/data-workflow.png\"><img loading=\"lazy\" decoding=\"async\" width=\"681\" height=\"301\" data-attachment-id=\"22535\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/data-workflow\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/data-workflow.png\" data-orig-size=\"681,301\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"data-workflow\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/data-workflow.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/data-workflow.png\" alt=\"\" class=\"wp-image-22535\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/data-workflow.png 681w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/data-workflow-300x133.png 300w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Frontend<\/strong><\/p>\n\n\n\n<p>The client side is fairly simple, it is built with React.js and only has two sections. The first is flagged messages, where a moderator is able to review messages the system has flagged.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"22536\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/image-16-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16.png\" data-orig-size=\"1872,398\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-16\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16-1024x218.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16-1024x218.png\" alt=\"\" class=\"wp-image-22536\" width=\"428\" height=\"90\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16-1024x218.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16-300x64.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16-768x163.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16-1536x327.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-16.png 1872w\" sizes=\"auto, (max-width: 428px) 100vw, 428px\" \/><\/a><\/figure>\n\n\n\n<p>The second is where a moderator can add or remove censored words as shown below.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"22537\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/image-17-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17.png\" data-orig-size=\"1130,456\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-17\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17-1024x413.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17-1024x413.png\" alt=\"\" class=\"wp-image-22537\" width=\"425\" height=\"171\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17-1024x413.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17-300x121.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17-768x310.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-17.png 1130w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Backend<\/strong><\/p>\n\n\n\n<p>The server side of this monitoring system is built using express.js. The library discord.js was used to communicate with the discord api, and for the database I used dynamoDB.<\/p>\n\n\n\n<p>The main part of the app is the following code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">discord.client.on(&quot;ready&quot;, () =&gt; {\n  console.log(`Logged in as ${discord.client.user?.tag}!`);\n  discord.client.on(&quot;message&quot;, (msg) =&gt; {\n    const status = monitorSys.getScannedMessageStatus(msg.content);\n    if (status === &quot;FLAG&quot;) {\n      flaggedMessagesController.addFlaggedMessage(msg);\n    } else if (status === &quot;HARMFUL&quot;) {\n      messagesController.deleteHarmfulMessage(msg.id);\n    } else {\n      console.log(&quot;SAFE&quot;);\n    }\n  });\n});\nstart();\ndiscord.client.login(process.env.DISCORD_KEY);<\/code><\/pre>\n\n\n\n<p>Here the bot goes online and starts scanning every message that goes into the chat. With a helper method the system then either flags a message or deletes it right away if it contains harmful content.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>EC2<\/strong><\/p>\n\n\n\n<p>The backend is deployed on an ec2 instance that is based on an Amazon Linux image. When creating this instance we add a script, as shown below, to install the CodeDeploy Agent that we are going to use later for the CI\/CD.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">#!\/bin\/bash\nsudo yum -y update\nsudo yum -y install ruby\nsudo yum -y install wget\ncd \/home\/ec2-user\nwget https:\/\/aws-codedeploy-us-east-1.s3.amazonaws.com\/latest\/install\nsudo chmod +x .\/install\nsudo .\/install auto<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"22541\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/image-18-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18.png\" data-orig-size=\"1504,570\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-18\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18-1024x388.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18-1024x388.png\" alt=\"\" class=\"wp-image-22541\" width=\"494\" height=\"187\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18-1024x388.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18-300x114.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18-768x291.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-18.png 1504w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/a><\/figure>\n\n\n\n<p>Then we need to add these rules as shown below. The one with port 80 is necessary to be able to download data from the internet and the one with port 3000 is for the client to have access to our server.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"231\" data-attachment-id=\"22546\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/image-20-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20.png\" data-orig-size=\"2498,564\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-20\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-1024x231.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-1024x231.png\" alt=\"\" class=\"wp-image-22546\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-1024x231.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-300x68.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-768x173.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-1536x347.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-20-2048x462.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>CI\/CD<\/strong><\/p>\n\n\n\n<p><strong>Frontend<\/strong><\/p>\n\n\n\n<p>CI\/CD On the frontend was done using GitHub actions and amplify. With GitHub I created an action that runs whenever a branch gets pushed. This pipeline runs our tests first and checks if all succeed. If one or more tests fail, this branch can&#8217;t be merged to main. This restrictions can be activated directly from the settings of our repository on GitHub. To create this action, create a file .\/.github\/workflows\/tests.yml with the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">name: Node.js CI\non:\n  pull_request:\n    branches: &#091; main ]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: &#091;16.x]\n    steps:\n    - uses: actions\/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions\/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: npm ci\n    - run: npm install\n    - run: npm test<\/code><\/pre>\n\n\n\n<p>After a branch gets merged with main, Amplify builds the new version and deploys the app when the build is ready. Amplify provides a really straightforward way to deploy a React app. We just have to create a new app on Amplify and connects it with a specific branch on GitHub.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"22542\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/28\/discord-monitoring-system-with-amplify-and-ec2\/image-19-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19.png\" data-orig-size=\"1440,966\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-19\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19-1024x687.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19-1024x687.png\" alt=\"\" class=\"wp-image-22542\" width=\"442\" height=\"296\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19-1024x687.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19-300x201.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19-768x515.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/image-19.png 1440w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/a><\/figure>\n\n\n\n<p>Amplify then detects the Javascript library that&#8217;s being used e.g. React, Vue or Angular and adjust the settings accordingly. Environments variables can be added directly on Amplify.<\/p>\n\n\n\n<p><strong>Backend<\/strong><\/p>\n\n\n\n<p>Here I used CodeDeploy to deploy the newest version of our backend whenever it&#8217;s pushed to the main branch. To achieve this, we need to first create a pipeline on CodeDeploy and connect it to our repository on GitHub, which is similar to what we did on Amplify. After that we need to add some scripts to our project for CodeDeploy. These files should be stored inside of .\/scripts.<\/p>\n\n\n\n<p>The first script file we need is called before_install.sh<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">#!\/bin\/bash\n\ncurl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.34.0\/install.sh | bash\n. ~\/.nvm\/nvm.sh\nnvm install node\n\nDIR=&quot;\/home\/ec2-user\/discord-monitoring-server&quot;\nif &#091; -d &quot;$DIR&quot; ]; then\n  echo &quot;${DIR} exists&quot;\nelse\n  echo &quot;Creating ${DIR} directory&quot;\n  mkdir ${DIR}\nfi<\/code><\/pre>\n\n\n\n<p>With that we first download node and npm and then we create a working directory if it does not already exist.<\/p>\n\n\n\n<p>Then we create a file called application_start.sh<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">#!\/bin\/bash\n#give permission for everything in the discord-monitoring-server directory\nsudo chmod -R 777 \/home\/ec2-user\/discord-monitoring-server\n#navigate into our working directory where we have all our github files\ncd \/home\/ec2-user\/discord-monitoring-server\n#add npm and node to path\nexport NVM_DIR=&quot;$HOME\/.nvm&quot; \n&#091; -s &quot;$NVM_DIR\/nvm.sh&quot; ] &amp;&amp; \\. &quot;$NVM_DIR\/nvm.sh&quot;  # loads nvm \n&#091; -s &quot;$NVM_DIR\/bash_completion&quot; ] &amp;&amp; \\. &quot;$NVM_DIR\/bash_completion&quot;  # loads nvm bash_completion (node is in path now)\n#install node modules\nnpm install\n#start our node app in the background\nnpm start &gt; app.out.log 2&gt; app.err.log &lt; \/dev\/null &amp;<\/code><\/pre>\n\n\n\n<p>And lastly, we have application_stop.sh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">#!\/bin\/bash\n#Stopping existing node servers\necho &quot;Stopping any existing node servers&quot;\npkill node<\/code><\/pre>\n\n\n\n<p>After creating these scripts we also need to add the appspec.yml file, which specifies the target folder in our ec2 instance and 3 hooks, each with its respective script file we created earlier.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">version: 0.0\nos: linux\nfiles:\n  - source: \/\n    destination: \/home\/ec2-user\/discord-monitoring-server\nhooks:\n  ApplicationStop:\n    - location: scripts\/application_stop.sh\n      timeout: 300\n      runas: ec2-user\n  BeforeInstall:\n    - location: scripts\/before_install.sh\n      timeout: 300\n      runas: ec2-user\n  ApplicationStart:\n    - location: scripts\/application_start.sh\n      timeout: 300\n      runas: ec2-user<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Conclusion<\/strong><\/p>\n\n\n\n<p>During the Software Development for Cloud Computing lecture, we learned a lot of theory about cloud computing and the different services Amazon and IBM provides. We also got to see some examples on the different subjects that were discussed during the semester. But with this project I was only able to implement and work on some of these topics. The first and main one was deploying the app on Amplify and EC2 and the second, which I personally found very interesting, is continuous integration and continuous delivery. This lecture gave me a really good overview on what can be achieved with cloud computing and I am hoping to learn way more about the topic in the near future.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Abstract Discord was once just a tool for gamers to communicate and socialize with each other, but since the pandemic started, discord gained a lot of popularity and is now used by so many other people, me included, who don&#8217;t necessarily have any interest in video gaming. So after exploring the various channels on discord, [&hellip;]<\/p>\n","protected":false},"author":1061,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,120,650],"tags":[84,150,7],"ppma_author":[869],"class_list":["post-22530","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-cloud-technologies","category-scalable-systems","tag-aws","tag-ci-cd","tag-cloud"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":27914,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/08\/27\/how-to-develop-an-aws-hosted-discord-bot\/","url_meta":{"origin":22530,"position":0},"title":"How to develop an AWS hosted Discord Bot","author":"Lara Blersch","date":"27. August 2025","format":false,"excerpt":"Introduction This semester, our team set itself the goal of developing a game for a Discord bot. Taking inspiration from Hitster and Nobody's Perfect, we created Headliner.Over three rounds, players receive meta information about a newspaper article, such as what happened, who was involved, where it happened, and when. Based\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/Architecture.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/Architecture.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/Architecture.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/Architecture.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/Architecture.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/Architecture.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":28117,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/27\/how-to-develop-notification-system-for-crypto-stocks\/","url_meta":{"origin":22530,"position":1},"title":"How to Develop a Notification System for Crypto Stocks for Telegram and Discord","author":"Julia Bai","date":"27. February 2026","format":false,"excerpt":"This blog post was written for the lecture \"System Engineering & Management\" (143101a) by Julia Bai, Frederik Runge and Dominik Seitz. Introduction The cryptocurrency market never sleeps. While traditional stock exchanges close, trading in digital assets occurs 24\/7, characterized by extreme volatility where minutes decide between profit and loss. A\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Shift-Left20Defect20Detection20and20Remediation_5.gif?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Shift-Left20Defect20Detection20and20Remediation_5.gif?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Shift-Left20Defect20Detection20and20Remediation_5.gif?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Shift-Left20Defect20Detection20and20Remediation_5.gif?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":5104,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2019\/02\/26\/end-to-end-monitoring-of-modern-cloud-applications\/","url_meta":{"origin":22530,"position":2},"title":"End-to-end Monitoring of Modern Cloud Applications","author":"je052","date":"26. February 2019","format":false,"excerpt":"During the last semester and as part of my Master's thesis, I worked at an automotive company on the development of a vehicle connectivity platform. Within my team I was assigned the task of monitoring, which turned out to be a lot more interesting but at the same time way\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/diagram-1024x540.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/diagram-1024x540.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/diagram-1024x540.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":25560,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/08\/07\/high-availability-and-reliability-in-cloud-computing-ensuring-seamless-operation-despite-the-threat-of-black-swan-events\/","url_meta":{"origin":22530,"position":3},"title":"High Availability and Reliability in Cloud Computing: Ensuring Seamless Operation Despite the Threat of Black Swan Events","author":"mk306","date":"7. August 2023","format":false,"excerpt":"Introduction Nowadays cloud computing has become the backbone of many businesses, offering unparalleled flexibility, scalability and cost-effectiveness. According to O\u2019Reilly\u2019s Cloud Adoption report from 2021, more than 90% of organizations rely on the cloud to run their critical applications and services\u00a0[1]. High availability and reliability of cloud computing systems has\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/CrossRegion.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/CrossRegion.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/CrossRegion.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/CrossRegion.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":4190,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/08\/31\/yourtube-a-simple-video-platform-in-you-personal-amazon-cloud\/","url_meta":{"origin":22530,"position":4},"title":"YourTube &#8211; A simple video platform in you personal amazon cloud","author":"nk078","date":"31. August 2018","format":false,"excerpt":"During the Dev4Cloud Levture i created a simple static webpage that uses Amazons S3 service for Hosting and video storage and amazons cognito for user authentification and role managemant. Design considerations. The platform was designed with simplicity in mind and there for i decided to go with as few services\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":26160,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/29\/why-system-monitoring-is-important-and-how-we-approached-it\/","url_meta":{"origin":22530,"position":5},"title":"Why system monitoring is important and how we approached it","author":"Michelle Becher","date":"29. February 2024","format":false,"excerpt":"Introduction Imagine building a service that aims to generate as much user traffic as possible to be as profitable as possible. The infrastructure of your service usually includes some kind of backend, a server and other frameworks. One day, something is not working as it should and you can't seem\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/monitoring.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/monitoring.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/monitoring.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/monitoring.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":869,"user_id":1061,"is_guest":0,"slug":"mk322","display_name":"mk322","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/59a39f7a7bb1a65f3b9e0ad55f50624d63b9c270b65df9060b4673dcd1b68d7a?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1061"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=22530"}],"version-history":[{"count":6,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22530\/revisions"}],"predecessor-version":[{"id":22548,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22530\/revisions\/22548"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=22530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=22530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=22530"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=22530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}