From 8fae98eb4adcf671ac31d1b80ea97e17b89f3fe5 Mon Sep 17 00:00:00 2001 From: SharonLeviDevops Date: Tue, 18 Oct 2022 10:21:29 +0300 Subject: [PATCH 1/7] done --- Dockerfile | 6 +++--- app.py | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index ac0a3bb..fc3f85b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.8.12-slim-buster -# YOUR COMMANDS HERE -# .... -# .... +WORKDIR /TelegramAI +COPY . . +RUN pip install -r requirements.txt CMD ["python3", "app.py"] \ No newline at end of file diff --git a/app.py b/app.py index 27b5161..51bd794 100644 --- a/app.py +++ b/app.py @@ -32,7 +32,7 @@ def send_text_with_quote(self, text, message_id): self.bot.send_message(self.current_msg.chat.id, text, reply_to_message_id=message_id) def is_current_msg_photo(self): - return self.current_msg['content_type'] != 'photo' + return self.current_msg.content_type == 'photo' def download_user_photo(self, quality=0): """ @@ -40,13 +40,15 @@ def download_user_photo(self, quality=0): :param quality: integer representing the file quality. Allowed values are [0, 1, 2, 3] :return: """ - if self.current_msg['content_type'] != 'photo': + if self.current_msg.content_type != 'photo': raise RuntimeError(f'Message content of type \'photo\' expected, but got {self.current_msg["content_type"]}') file_info = self.bot.get_file(self.current_msg.photo[quality].file_id) data = self.bot.download_file(file_info.file_path) + with open(file_info.file_path,'wb') as p: + p.write(data) + - # TODO save `data` as a photo in `file_info.file_path` path def handle_message(self, message): """Bot Main message handler""" @@ -61,14 +63,18 @@ def handle_message(self, message): class YoutubeBot(Bot): - pass + def handle_message(self, message): + if self.is_current_msg_photo(): + self.download_user_photo(quality=3) + return + + video = search_download_youtube_video(message.text) + self.send_text(video[0].get("url")) if __name__ == '__main__': with open('.telegramToken') as f: _token = f.read() - my_bot = QuoteBot(_token) + my_bot = YoutubeBot(_token) my_bot.start() - - From e6a99ffcdd1a9d57ca0e9539f99263e42b682124 Mon Sep 17 00:00:00 2001 From: SharonLeviDevops <106589153+SharonLeviDevops@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:40:45 +0200 Subject: [PATCH 2/7] Add files via upload --- aws_ex1.md | 3139 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3139 insertions(+) create mode 100644 aws_ex1.md diff --git a/aws_ex1.md b/aws_ex1.md new file mode 100644 index 0000000..684a21f --- /dev/null +++ b/aws_ex1.md @@ -0,0 +1,3139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DevOpsMay22/aws_ex1.md at main · alonitac/DevOpsMay22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ +
+ + + + alonitac  /   + DevOpsMay22  /   + +
+
+ + + +
+ + +
+
+ Clear Command Palette +
+
+ + + +
+
+ Tip: + Type # to search pull requests +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type # to search issues +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type # to search discussions +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type ! to search projects +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type @ to search teams +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type @ to search people and organizations +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type > to activate command mode +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Go to your accessibility settings to change your keyboard shortcuts +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type author:@me to search your content +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:pr to filter to pull requests +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:issue to filter to issues +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:project to filter to projects +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:open to filter to open content +
+
+ Type ? for help and tips +
+
+
+ +
+ +
+
+ We’ve encountered an error and some results aren't available at this time. Type a new search or try again later. +
+
+ + No results matched your search + + + + + + + + + + +
+ + + + + Search for issues and pull requests + + # + + + + Search for issues, pull requests, discussions, and projects + + # + + + + Search for organizations, repositories, and users + + @ + + + + Search for projects + + ! + + + + Search for files + + / + + + + Activate command mode + + > + + + + Search your issues, pull requests, and discussions + + # author:@me + + + + Search your issues, pull requests, and discussions + + # author:@me + + + + Filter to pull requests + + # is:pr + + + + Filter to issues + + # is:issue + + + + Filter to discussions + + # is:discussion + + + + Filter to projects + + # is:project + + + + Filter to open issues, pull requests, and discussions + + # is:open + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + + / + + DevOpsMay22 + + + Public +
+ + +
+ +
    + + + +
  • + +
    + + + + + + + Watch + + + 6 + + + +
    +
    +

    Notifications

    + +
    + +
    +
    + + + + + + + + +
    + + +
    + + + + + Get push notifications on iOS or Android. + +
    +
    +
    +
    + + + + +
    +
    +
    + + + +
  • + +
  • +
    +
    + Fork + 5 + Fork your own copy of alonitac/DevOpsMay22 +
    +
    + + + +
    + +
    +
    + + + + + + + +
    + +
    +
    +
    +
    +
  • + +
  • + + +
    +
    +
    + + +
    + + + +
    + +
    +
    + + + + + + + +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + + + +
    + +
    +
    + + + + + + + +
    + +
    +
    +
    +
    +
    +
  • + + + +
+ +
+ +
+
+ + + + +
+ + + + + + +
+ Open in github.dev + Open in a new github.dev tab + + + + + +
+ + +
+ + + + + + + +Permalink + +
+ +
+
+ + + main + + + + +
+
+
+ Switch branches/tags + +
+ + + +
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+ +
+ + +
+ +
+
+
+

Name already in use

+
+
+ +
+
+
+
+ +
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch? +
+ +
+
+ + +
+
+ + + + Go to file + +
+ + + + +
+
+
+ + + + + + + + + +
+ +
+
+
 
+
+ +
+
 
+ Cannot retrieve contributors at this time +
+
+ + + + + + + + + + + + + + +
+ +
+ + + + +
+ + 158 lines (101 sloc) + + 10.7 KB +
+ +
+ + + + + +
+ +
+
+
+
+ +
+ +
+
+
+ + + +
+ + + + + + + + + +
+ + +
+ +
+
+ +
+ +
+
+ + +
+

AWS Ex1 - Provision the TelegramAI app in AWS

+

Can be done in pairs (highly recommended).

+

Never commit (and push) AWS credentials! No credentials file is needed to be placed in the repo directory.

+

Background

+

Your goal is to provision the TelegramAI chat app as a scalable, micro-services architecture in AWS.

+

Here is a high level diagram of the architecture:

+

+

Scaling the app

+

When end-users send a message via Telegram app (1-black), the messages are served by the Bot service (run as a Docker container in the Telegram Bot EC2 instance). +The Bot service doesn't download the video from YouTube itself, otherwise, all it does is sending a "job" to an SQS queue (2-black), and return the end-user a message like "your video is being downloaded...". +So, the Bot service is a very lightweight app that can serve hundreds requests per seconds. +In the other side, there are Worker service (run as a Docker container in the Worker EC2 instance) consumes jobs from the SQS queue (3-black) and does the hard work - to download the video from YouTube and upload it to S3 (4-black). When the Worker done with current job, it asks the SQS queue if it has another job for him. As long as there are jobs pending in the queue, a free Worker will consume and perform the job. In such way the Bot service pushes jobs to the SQS queue, making it "full", while the Worker service consumes jobs from the queue, making it "empty".

+

But what if the rate in which the Bot service is pushing jobs to the queue is much higher than the rate the Worker completing jobs? In such case the queue will overflow... +To solve that, we will create multiple workers that together consume jobs from the queue. How many workers? we will deploy a dynamic model that auto-scale the number of workers depending on the number of messages in the queue. +When there are a lot of jobs in the queue, the autoscaler will provision many workers. +When there are only a few jobs in the queue, the autoscaler will provision fewer workers. +The Workers are part of an AutoScaling group, which is scaled in and out by a custom metric that the Metric Sender service (run as a Docker container as well, on the same VM as the Bot service) writes to CloudWatch every 1 minute (1-blue). CloudWatch will trigger an autoscale event (2-blue) when needed, which results in provisioning of another Worker instance, or terminate a redundant Worker instance (3-blue).

+

The metric sent to CloudWatch can be called BacklogPerInstance, as it represents the number of jobs in the queue (jobs that was not consumed yet) per Worker instance. +For example, assuming you have 5 workers up and running, and 100 messages in the queue, thus BacklogPerInstance equals 20, since each Worker instance has to consume ~20 messages to get the queue empty. For more information, read here.

+

In the TelegramAI repo, review microservices branch. This branch contains the code for the above services, you don't need to bring your own code from the previous exercise.

+

Merge the branch to your forked repo

+

Execute the following steps from the root directory of your forked TelegramAI repo.

+
    +
  1. Add the following Git remote under the name upstream:
  2. +
+
git remote add upstream https://github.com/alonitac/TelegramAI.git
+
    +
  1. Pull the branches from the new added remote:
  2. +
+
git pull upstream
+
    +
  1. Checkout upstream/microservices into a local branch microservices:
  2. +
+
git checkout -b microservices upstream/microservices
+

From now on, throughout the exercise you should work on your microservices branch.

+

The TelegramAI repo structure

+

The repository structure is divided into services - each service under its own directory, while all services are sharing common files (config.json and utils.py) under the root directory of the repo.

+
    +
  1. bot/app.py - The Telegram bot code, similar to what you've implemented in the previous exercise. But this time, the bot doesn't download the videos itself, but sends a "job" to an SQS queue.
  2. +
  3. worker/app.py - The Worker service continuously reads messages from the SQS queue and process them, which means download the video from YouTube and store it in a dedicated S3 bucket.
  4. +
  5. metric-sender/app.py - The Metric Sender service calculates the backlog_per_instance metric and send it to CloudWatch.
  6. +
+

Each service has its own Dockerfile under the service's directory.

+

Note: the services should be run from the root directory of the repo (PyCharm usually run applications from the directory the Python file is located, e.g. the Bot app will be run from TelegramAI/bot/ dir instead of TelegramAI/). +For your convenience, in branch microservices, the run configurations of each service is already there:

+

+

Just choose the service and click "run".

+

Guidelines

+

AWS resources

+
    +
  1. +

    Create a VPC with at least 2 public subnets (no need to create a private subnet).

    +
  2. +
  3. +

    Create an S3 bucket which will store the uploaded YouTube videos.

    +
  4. +
  5. +

    Create an SQS standard queue. Jobs that was not processed yet should reside in the queue for a maximum period of 4 days. The worker has a maximum period of 30 minutes to process a single job.

    +
  6. +
  7. +

    Create a Launch Template and an AutoScaling Group. Keep the default configurations, we will change it later. The Minimum and Desired capacity of the ASG should be 0.

    +
  8. +
  9. +

    Create a secret in Secret Manager containing your Telegram token. Under Secret type choose Other type of secret and enter the secret content in the following format:

    +
  10. +
+

+

The Code

+
    +
  1. +

    Change config.json according to your resources in AWS. This file is being used by the different services, hence it is located under in the repo root directory.

    +
  2. +
  3. +

    You are given most of the code for the Bot, Worker and Metric-sender services. Complete the following TODOs:

    +
      +
    1. In worker/app.py complete the implementation of process_msg() function such that the downloaded videos will be uploaded to S3 (you can delete them from the disk afterwards).
    2. +
    3. In bot/app.py complete get_telegram_token_secret() such that this function returns the value of your Telegram token.
    4. +
    5. In metric-sender/app.py complete main() such that the value of variable backlog_per_instance will be sent as a metric to CloudWatch.
    6. +
    +
  4. +
+

Except the above changes, you don't need to change the code (unless you want to add more functionality to the service).

+

Test your app locally

+
    +
  1. After you've implemented the code changes, it is good idea to test everything locally. Run the bot/app.py service and a single worker worker/app.py. Make sure that when you send a message via Telegram, the Bot service produces a message to the SQS queue, and the Worker consumes the message, downloads the YouTube video and uploads it to S3.
  2. +
+

Deploy the app in AWS

+
    +
  1. +

    As mentioned above, all services are running as a Docker containers. Complete the Dockerfile of each service (except lambda.Dockerfile which is already implemented).

    +
  2. +
  3. +

    Deploy the Worker service to an EC2 instance

    +
      +
    1. Create an Amazon Linux EC2 instance.
    2. +
    3. Install Docker.
    4. +
    5. Get your repo code there (install Git if needed).
    6. +
    7. Build the Worker image by (note that the build command should be run from the root directory of the repo, also note the -f option which helps when the Dockefile is located in a different dir than the build context): +
      docker build -t worker:1.0 -f worker/Dockerfile . 
      +
    8. +
    9. Run the container such that it starts automatically when the EC2 is launches: +
      docker run -d --name worker --restart always worker:1.0  
      +
    10. +
    11. Create an AMI from that instance and base your Launch Template on that AMI, such that when a new instance is created from the launch template, the Worker app will be up and running automatically.
    12. +
    +
  4. +
  5. +

    Deploy the Bot and the Metric-sender services on a single EC2 instance (those services are not part of the autoscaling group). It should be similar to Worker deployment - each service in a separate Docker container that restarts automatically on OS reboot.

    +
  6. +
  7. +

    Use AWS cli to create a target tracking scaling policy in your Autoscaling Group. MetricName and Namespace should correspond to the metric your Bot service is firing to CloudWatch. Give the TargetValue some value that you can test later (e.g. 10, which means if there are more than 10 messages per worker in the SQS queue, a scale up event will trigger).

    +
  8. +
  9. +

    Make sure your services are given the right IAM role permissions.

    +
  10. +
  11. +

    Test your application and make sure the autoscalig group react under load increase/decrease.

    +
  12. +
+

Lambda workers

+

We now want to examine a serverless architecture of Bot-Workers dynamic:

+

+

Instead of scaling EC2 instance with the Worker service deployed there, you will trigger Lambda functions when there are jobs in the SQS queue.

+
    +
  1. Terminate the Metric Sender services such that no metrics will be sent to CloudWatch and the ASG doesn't scale anymore.
  2. +
  3. Create a Docker based Lambda function for the Worker service. +
      +
    1. In order to do so, first you need to build and push a Docker image on Elastic Container Registry (ECR). Using the AWS console, create a private ECR.
    2. +
    3. On your local machine, build the image of the Worker (according to lambda.Dockerfile. It's already implemented, no need to touch) and push it to your ECR registry. In Amazon ECR console, select the repository that you created and choose View push commands to view the steps to build and push an image from your local machine to your new repository. You may use this command to build the image: +
      docker build -t worker:0.1 -f worker/lambda.Dockerfile . 
      +
    4. +
    5. Create a Lambda function based on your container image you've just pushed to ECR.
    6. +
    +
  4. +
  5. Define your SQS queue as a trigger that invokes your function.
  6. +
+

Test your app

+

Test the new Lambda based architecture, make sure the Lambda is triggered when you send a message to the Bot, and when the execution ends, the YouTube video is in stored in S3.

+

Note the existed bug when the Lambda code is trying to upload the downloaded YouTube video to S3. Make sure you understand the root cause and suggest a fix for this bug.

+

Submission

+

Present you work in a personal meeting (usually 20 minutes before our bi-weekly class). Final due date is 15/02/23.

+

Good Luck

+

Don't hesitate to ask any questions

+
+
+ +
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+
+ Give feedback + + + +
+ +

Provide feedback

+
+
+ + + + + + + +
+
+
+
+
+ +
+ + +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + From 5fc6f2dad6e71fd42f60cfe4857af55bbe2b9b9a Mon Sep 17 00:00:00 2001 From: SharonLeviDevops <106589153+SharonLeviDevops@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:45:49 +0200 Subject: [PATCH 3/7] Update aws_ex1.md --- aws_ex1.md | 3148 +--------------------------------------------------- 1 file changed, 22 insertions(+), 3126 deletions(-) diff --git a/aws_ex1.md b/aws_ex1.md index 684a21f..deb40f8 100644 --- a/aws_ex1.md +++ b/aws_ex1.md @@ -1,3139 +1,35 @@ +# AWS Ex1 - Provision the TelegramAI app in AWS +## Background +Your goal is to provision the TelegramAI chat app as a scalable, micro-services architecture in AWS. +Here is a high level diagram of the architecture: +![](img/botaws2.png) +## Scaling the app +When end-users send a message via Telegram app (1-black), the messages are served by the Bot service (run as a Docker container in the Telegram Bot EC2 instance). +The Bot service **doesn't** download the video from YouTube itself, otherwise, all it does is sending a "job" to an SQS queue (2-black), and return the end-user a message like "your video is being downloaded...". +So, the Bot service is a very lightweight app that can serve hundreds requests per seconds. +In the other side, there are Worker service (run as a Docker container in the Worker EC2 instance) **consumes** jobs from the SQS queue (3-black) and does the hard work - to download the video from YouTube and upload it to S3 (4-black). When the Worker done with current job, it asks the SQS queue if it has another job for him. As long as there are jobs pending in the queue, a free Worker will consume and perform the job. In such way the Bot service pushes jobs to the SQS queue, making it "full", while the Worker service consumes jobs from the queue, making it "empty". - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DevOpsMay22/aws_ex1.md at main · alonitac/DevOpsMay22 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - - - - -
- - - - - - -
- - - - - - - - - -
- - - - - - - - - - - - - - - - - -
- -
- - - - alonitac  /   - DevOpsMay22  /   - -
-
- - - -
- - -
-
- Clear Command Palette -
-
- - - -
-
- Tip: - Type # to search pull requests -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type # to search issues -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type # to search discussions -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type ! to search projects -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type @ to search teams -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type @ to search people and organizations -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type > to activate command mode -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Go to your accessibility settings to change your keyboard shortcuts -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type author:@me to search your content -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type is:pr to filter to pull requests -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type is:issue to filter to issues -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type is:project to filter to projects -
-
- Type ? for help and tips -
-
-
- -
-
- Tip: - Type is:open to filter to open content -
-
- Type ? for help and tips -
-
-
- -
- -
-
- We’ve encountered an error and some results aren't available at this time. Type a new search or try again later. -
-
- - No results matched your search - - - - - - - - - - -
- - - - - Search for issues and pull requests - - # - - - - Search for issues, pull requests, discussions, and projects - - # - - - - Search for organizations, repositories, and users - - @ - - - - Search for projects - - ! - - - - Search for files - - / - - - - Activate command mode - - > - - - - Search your issues, pull requests, and discussions - - # author:@me - - - - Search your issues, pull requests, and discussions - - # author:@me - - - - Filter to pull requests - - # is:pr - - - - Filter to issues - - # is:issue - - - - Filter to discussions - - # is:discussion - - - - Filter to projects - - # is:project - - - - Filter to open issues, pull requests, and discussions - - # is:open - - - - - - - - - - - - - - - - -
-
-
- -
- - - - - - - - - - -
- - -
-
-
- - - - - - - - - - - -
- -
- -
- -
- - - - / - - DevOpsMay22 - - - Public -
- - -
- -
    - - - -
  • - -
    - - - - - - - Watch - - - 6 - - - -
    -
    -

    Notifications

    - -
    - -
    -
    - - - - - - - - -
    - - -
    - - - - - Get push notifications on iOS or Android. - -
    -
    -
    -
    - - - - -
    -
    -
    - - - -
  • - -
  • -
    -
    - Fork - 5 - Fork your own copy of alonitac/DevOpsMay22 -
    -
    - - - -
    - -
    -
    - - - - - - - -
    - -
    -
    -
    -
    -
  • - -
  • - - -
    -
    -
    - - -
    - - - -
    - -
    -
    - - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    - -
    - - - -
    - -
    -
    - - - - - - - -
    - -
    -
    -
    -
    -
    -
  • - - - -
- -
- -
-
- - - - -
- - - - - - -
- Open in github.dev - Open in a new github.dev tab - - - - - -
- - -
- - - - - - - -Permalink - -
- -
-
- - - main - - - - -
-
-
- Switch branches/tags - -
- - - -
- -
- -
- - -
- -
- - - - - - - - - - - - - - - - - -
- - -
-
-
-
- -
- -
- - -
- -
-
-
-

Name already in use

-
-
- -
-
-
-
- -
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch? -
- -
-
- - -
-
- - - - Go to file - -
- - - - -
-
-
- - - - - - - - - -
- -
-
-
 
-
- -
-
 
- Cannot retrieve contributors at this time -
-
- - - - - - - - - - - - - - -
- -
- - - - -
- - 158 lines (101 sloc) - - 10.7 KB -
- -
- - - - - -
- -
-
-
-
- -
- -
-
-
- - - -
- - - - - - - - - -
- - -
- -
-
- -
- -
-
- - -
-

AWS Ex1 - Provision the TelegramAI app in AWS

-

Can be done in pairs (highly recommended).

-

Never commit (and push) AWS credentials! No credentials file is needed to be placed in the repo directory.

-

Background

-

Your goal is to provision the TelegramAI chat app as a scalable, micro-services architecture in AWS.

-

Here is a high level diagram of the architecture:

-

-

Scaling the app

-

When end-users send a message via Telegram app (1-black), the messages are served by the Bot service (run as a Docker container in the Telegram Bot EC2 instance). -The Bot service doesn't download the video from YouTube itself, otherwise, all it does is sending a "job" to an SQS queue (2-black), and return the end-user a message like "your video is being downloaded...". -So, the Bot service is a very lightweight app that can serve hundreds requests per seconds. -In the other side, there are Worker service (run as a Docker container in the Worker EC2 instance) consumes jobs from the SQS queue (3-black) and does the hard work - to download the video from YouTube and upload it to S3 (4-black). When the Worker done with current job, it asks the SQS queue if it has another job for him. As long as there are jobs pending in the queue, a free Worker will consume and perform the job. In such way the Bot service pushes jobs to the SQS queue, making it "full", while the Worker service consumes jobs from the queue, making it "empty".

-

But what if the rate in which the Bot service is pushing jobs to the queue is much higher than the rate the Worker completing jobs? In such case the queue will overflow... -To solve that, we will create multiple workers that together consume jobs from the queue. How many workers? we will deploy a dynamic model that auto-scale the number of workers depending on the number of messages in the queue. -When there are a lot of jobs in the queue, the autoscaler will provision many workers. +But what if the rate in which the Bot service is pushing jobs to the queue is much higher than the rate the Worker completing jobs? In such case the queue will overflow... +To solve that, we will create multiple workers that together consume jobs from the queue. How many workers? we will deploy a dynamic model **that auto-scale the number of workers** depending on the number of messages in the queue. +When there are a lot of jobs in the queue, the autoscaler will provision many workers. When there are only a few jobs in the queue, the autoscaler will provision fewer workers. -The Workers are part of an AutoScaling group, which is scaled in and out by a custom metric that the Metric Sender service (run as a Docker container as well, on the same VM as the Bot service) writes to CloudWatch every 1 minute (1-blue). CloudWatch will trigger an autoscale event (2-blue) when needed, which results in provisioning of another Worker instance, or terminate a redundant Worker instance (3-blue).

-

The metric sent to CloudWatch can be called BacklogPerInstance, as it represents the number of jobs in the queue (jobs that was not consumed yet) per Worker instance. -For example, assuming you have 5 workers up and running, and 100 messages in the queue, thus BacklogPerInstance equals 20, since each Worker instance has to consume ~20 messages to get the queue empty. For more information, read here.

-

In the TelegramAI repo, review microservices branch. This branch contains the code for the above services, you don't need to bring your own code from the previous exercise.

-

Merge the branch to your forked repo

-

Execute the following steps from the root directory of your forked TelegramAI repo.

-
    -
  1. Add the following Git remote under the name upstream:
  2. -
-
git remote add upstream https://github.com/alonitac/TelegramAI.git
-
    -
  1. Pull the branches from the new added remote:
  2. -
-
git pull upstream
-
    -
  1. Checkout upstream/microservices into a local branch microservices:
  2. -
-
git checkout -b microservices upstream/microservices
-

From now on, throughout the exercise you should work on your microservices branch.

-

The TelegramAI repo structure

-

The repository structure is divided into services - each service under its own directory, while all services are sharing common files (config.json and utils.py) under the root directory of the repo.

-
    -
  1. bot/app.py - The Telegram bot code, similar to what you've implemented in the previous exercise. But this time, the bot doesn't download the videos itself, but sends a "job" to an SQS queue.
  2. -
  3. worker/app.py - The Worker service continuously reads messages from the SQS queue and process them, which means download the video from YouTube and store it in a dedicated S3 bucket.
  4. -
  5. metric-sender/app.py - The Metric Sender service calculates the backlog_per_instance metric and send it to CloudWatch.
  6. -
-

Each service has its own Dockerfile under the service's directory.

-

Note: the services should be run from the root directory of the repo (PyCharm usually run applications from the directory the Python file is located, e.g. the Bot app will be run from TelegramAI/bot/ dir instead of TelegramAI/). -For your convenience, in branch microservices, the run configurations of each service is already there:

-

-

Just choose the service and click "run".

-

Guidelines

-

AWS resources

-
    -
  1. -

    Create a VPC with at least 2 public subnets (no need to create a private subnet).

    -
  2. -
  3. -

    Create an S3 bucket which will store the uploaded YouTube videos.

    -
  4. -
  5. -

    Create an SQS standard queue. Jobs that was not processed yet should reside in the queue for a maximum period of 4 days. The worker has a maximum period of 30 minutes to process a single job.

    -
  6. -
  7. -

    Create a Launch Template and an AutoScaling Group. Keep the default configurations, we will change it later. The Minimum and Desired capacity of the ASG should be 0.

    -
  8. -
  9. -

    Create a secret in Secret Manager containing your Telegram token. Under Secret type choose Other type of secret and enter the secret content in the following format:

    -
  10. -
-

-

The Code

-
    -
  1. -

    Change config.json according to your resources in AWS. This file is being used by the different services, hence it is located under in the repo root directory.

    -
  2. -
  3. -

    You are given most of the code for the Bot, Worker and Metric-sender services. Complete the following TODOs:

    -
      -
    1. In worker/app.py complete the implementation of process_msg() function such that the downloaded videos will be uploaded to S3 (you can delete them from the disk afterwards).
    2. -
    3. In bot/app.py complete get_telegram_token_secret() such that this function returns the value of your Telegram token.
    4. -
    5. In metric-sender/app.py complete main() such that the value of variable backlog_per_instance will be sent as a metric to CloudWatch.
    6. -
    -
  4. -
-

Except the above changes, you don't need to change the code (unless you want to add more functionality to the service).

-

Test your app locally

-
    -
  1. After you've implemented the code changes, it is good idea to test everything locally. Run the bot/app.py service and a single worker worker/app.py. Make sure that when you send a message via Telegram, the Bot service produces a message to the SQS queue, and the Worker consumes the message, downloads the YouTube video and uploads it to S3.
  2. -
-

Deploy the app in AWS

-
    -
  1. -

    As mentioned above, all services are running as a Docker containers. Complete the Dockerfile of each service (except lambda.Dockerfile which is already implemented).

    -
  2. -
  3. -

    Deploy the Worker service to an EC2 instance

    -
      -
    1. Create an Amazon Linux EC2 instance.
    2. -
    3. Install Docker.
    4. -
    5. Get your repo code there (install Git if needed).
    6. -
    7. Build the Worker image by (note that the build command should be run from the root directory of the repo, also note the -f option which helps when the Dockefile is located in a different dir than the build context): -
      docker build -t worker:1.0 -f worker/Dockerfile . 
      -
    8. -
    9. Run the container such that it starts automatically when the EC2 is launches: -
      docker run -d --name worker --restart always worker:1.0  
      -
    10. -
    11. Create an AMI from that instance and base your Launch Template on that AMI, such that when a new instance is created from the launch template, the Worker app will be up and running automatically.
    12. -
    -
  4. -
  5. -

    Deploy the Bot and the Metric-sender services on a single EC2 instance (those services are not part of the autoscaling group). It should be similar to Worker deployment - each service in a separate Docker container that restarts automatically on OS reboot.

    -
  6. -
  7. -

    Use AWS cli to create a target tracking scaling policy in your Autoscaling Group. MetricName and Namespace should correspond to the metric your Bot service is firing to CloudWatch. Give the TargetValue some value that you can test later (e.g. 10, which means if there are more than 10 messages per worker in the SQS queue, a scale up event will trigger).

    -
  8. -
  9. -

    Make sure your services are given the right IAM role permissions.

    -
  10. -
  11. -

    Test your application and make sure the autoscalig group react under load increase/decrease.

    -
  12. -
-

Lambda workers

-

We now want to examine a serverless architecture of Bot-Workers dynamic:

-

-

Instead of scaling EC2 instance with the Worker service deployed there, you will trigger Lambda functions when there are jobs in the SQS queue.

-
    -
  1. Terminate the Metric Sender services such that no metrics will be sent to CloudWatch and the ASG doesn't scale anymore.
  2. -
  3. Create a Docker based Lambda function for the Worker service. -
      -
    1. In order to do so, first you need to build and push a Docker image on Elastic Container Registry (ECR). Using the AWS console, create a private ECR.
    2. -
    3. On your local machine, build the image of the Worker (according to lambda.Dockerfile. It's already implemented, no need to touch) and push it to your ECR registry. In Amazon ECR console, select the repository that you created and choose View push commands to view the steps to build and push an image from your local machine to your new repository. You may use this command to build the image: -
      docker build -t worker:0.1 -f worker/lambda.Dockerfile . 
      -
    4. -
    5. Create a Lambda function based on your container image you've just pushed to ECR.
    6. -
    -
  4. -
  5. Define your SQS queue as a trigger that invokes your function.
  6. -
-

Test your app

-

Test the new Lambda based architecture, make sure the Lambda is triggered when you send a message to the Bot, and when the execution ends, the YouTube video is in stored in S3.

-

Note the existed bug when the Lambda code is trying to upload the downloaded YouTube video to S3. Make sure you understand the root cause and suggest a fix for this bug.

-

Submission

-

Present you work in a personal meeting (usually 20 minutes before our bi-weekly class). Final due date is 15/02/23.

-

Good Luck

-

Don't hesitate to ask any questions

-
-
- -
- -
- - - -
- - -
- - -
-
- - - -
-
- Give feedback - - - -
- -

Provide feedback

-
-
- - - - - - - -
-
-
-
-
- -
- - -
- -
- - -
-
- -
- - - - - - - - - - - - - - - +The Workers are part of an AutoScaling group, which is scaled in and out by a custom metric that the Metric Sender service (run as a Docker container as well, on the same VM as the Bot service) writes to CloudWatch every 1 minute (1-blue). CloudWatch will trigger an autoscale event (2-blue) when needed, which results in provisioning of another Worker instance, or terminate a redundant Worker instance (3-blue). - +The metric sent to CloudWatch can be called `BacklogPerInstance`, as it represents the number of jobs in the queue (jobs that was not consumed yet) per Worker instance. +For example, assuming you have 5 workers up and running, and 100 messages in the queue, thus `BacklogPerInstance` equals 20, since each Worker instance has to consume ~20 messages to get the queue empty. For more information, read [here](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-using-sqs-queue.html). +### The TelegramAI repo structure -
+The repository structure is divided into services - each service under its own directory, while all services are sharing common files (`config.json` and `utils.py`) under the root directory of the repo. -
- - +1. `bot/app.py` - The Telegram bot code, similar to what you've implemented in the previous exercise. But this time, the bot doesn't download the videos itself, but sends a "job" to an SQS queue. +2. `worker/app.py` - The Worker service continuously reads messages from the SQS queue and process them, which means download the video from YouTube and store it in a dedicated S3 bucket. +3. `metric-sender/app.py` - The Metric Sender service calculates the `backlog_per_instance` metric and send it to CloudWatch. +Each service has its own `Dockerfile` under the service's directory. From dfd2a2070438ba25d7e4e2b6a0dae0bc7bc1baf9 Mon Sep 17 00:00:00 2001 From: SharonLeviDevops <106589153+SharonLeviDevops@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:46:40 +0200 Subject: [PATCH 4/7] Add files via upload --- botaws2.png | Bin 0 -> 71821 bytes botaws3.png | Bin 0 -> 47428 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 botaws2.png create mode 100644 botaws3.png diff --git a/botaws2.png b/botaws2.png new file mode 100644 index 0000000000000000000000000000000000000000..53b6339663e0d217f3cc727c97f676b29d32bed0 GIT binary patch literal 71821 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 literal 0 HcmV?d00001 diff --git a/botaws3.png b/botaws3.png new file mode 100644 index 0000000000000000000000000000000000000000..4329d181516bf8e615796d141286d37b33245240 GIT binary patch literal 47428 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 UiMpmX0sOh8bXze`-o)?U0N>Eoxc~qF literal 0 HcmV?d00001 From f011a5f1b1b070c8496134ca236f5c2a5db95192 Mon Sep 17 00:00:00 2001 From: SharonLeviDevops <106589153+SharonLeviDevops@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:47:40 +0200 Subject: [PATCH 5/7] Update aws_ex1.md --- aws_ex1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aws_ex1.md b/aws_ex1.md index deb40f8..4a00b8c 100644 --- a/aws_ex1.md +++ b/aws_ex1.md @@ -6,7 +6,7 @@ Your goal is to provision the TelegramAI chat app as a scalable, micro-services Here is a high level diagram of the architecture: -![](img/botaws2.png) +![](botaws2.png) ## Scaling the app @@ -33,3 +33,5 @@ The repository structure is divided into services - each service under its own d 3. `metric-sender/app.py` - The Metric Sender service calculates the `backlog_per_instance` metric and send it to CloudWatch. Each service has its own `Dockerfile` under the service's directory. + +![](botaws3.png) From c34faba0b27ada919a54b26d490a40e5daee342d Mon Sep 17 00:00:00 2001 From: SharonLeviDevops <106589153+SharonLeviDevops@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:48:38 +0200 Subject: [PATCH 6/7] Update aws_ex1.md --- aws_ex1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aws_ex1.md b/aws_ex1.md index 4a00b8c..2ac0069 100644 --- a/aws_ex1.md +++ b/aws_ex1.md @@ -33,5 +33,6 @@ The repository structure is divided into services - each service under its own d 3. `metric-sender/app.py` - The Metric Sender service calculates the `backlog_per_instance` metric and send it to CloudWatch. Each service has its own `Dockerfile` under the service's directory. +## Diagram of the lambada architecture: ![](botaws3.png) From b88a51097896e8445cf39971002e9614f88bcc21 Mon Sep 17 00:00:00 2001 From: SharonLeviDevops <106589153+SharonLeviDevops@users.noreply.github.com> Date: Tue, 7 Feb 2023 15:49:27 +0200 Subject: [PATCH 7/7] Rename aws_ex1.md to README.md --- aws_ex1.md => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename aws_ex1.md => README.md (100%) diff --git a/aws_ex1.md b/README.md similarity index 100% rename from aws_ex1.md rename to README.md