├── 10_backend_for_frontend
├── README.md
├── module_focus.png
└── task.md
├── 1_cloud_introduction
├── README.md
└── task.md
├── 2_serving_spa
├── README.md
├── module_focus.png
└── task.md
├── 3_serverless_api
├── README.md
├── module_focus.png
└── task.md
├── 4_integration_with_nosql_database
├── README.md
├── module_focus.png
└── task.md
├── 5_integration_with_s3
├── README.md
├── module_focus.png
└── task.md
├── 6_async_microservices_communication
├── README.md
├── module_focus.png
└── task.md
├── 7_authorization
├── README.md
├── module_focus.png
└── task.md
├── 8_integration_with_sql_database
├── README.md
├── module_focus.png
└── task.md
├── 9_containerization
├── README.md
├── module_focus.png
└── task.md
├── Architecture.pdf
└── README.md
/10_backend_for_frontend/README.md:
--------------------------------------------------------------------------------
1 | # Backend For Frontend
2 |
3 | # Goal
4 |
5 | - Learn what AWS Elastic Beanstalk is all about
6 | - Explore different AWS Elastic Beanstalk configuration details.
7 | - Set up a new AWS Elastic Beanstalk environment
8 |
9 | # Topics
10 |
11 | - Backend for Frontend overview
12 | - BFF as Pattern
13 | - API Gateway as BFF
14 | - AWS Elastic Beanstalk configuration
15 |
16 | # Materials
17 |
18 | ## Video
19 |
20 |
21 | Must Watch
22 |
23 | The following content provides enough info to complete the task.
24 |
25 |
26 |
27 |
28 | In English
29 |
30 |
31 |
32 | - [TBD](https://videoportal.epam.com/), ~0 mins
33 |
34 |
35 |
36 |
37 | In Russian
38 |
39 |
40 |
41 | - [RU Introduction](https://videoportal.epam.com/video/MRwdYoVdkwMXOOXNa3bL), ~1 mins
42 | - [RU Theory and concepts](https://videoportal.epam.com/video/9w0kaE2kl6xxezp5YeLn), ~16 mins
43 | - [RU Elastic Beanstalk](https://videoportal.epam.com/video/59pZaAyDzMrVM49yaNzq), ~7 mins
44 | - [RU Demo](https://videoportal.epam.com/video/njDdYP6ERkrdkG6872Xb), ~15 mins
45 | - [RU Deploy and delete an application with AWS Elastic Beanstalk](https://videoportal.epam.com/video/9w0kaEMkgADoxK5aeLnD), ~55mins
46 | - [RU Questions](https://videoportal.epam.com/video/nDBqYL4xgvk00oZdYXER), ~7 mins
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | Additional
56 |
57 | The following content provides more info for further studies.
58 |
59 |
60 |
61 | - [Backends For Frontends Pattern](https://www.youtube.com/watch?v=wgD9t3R3x-w), ~12 mins
62 | - [Why Backend for Frontend Is Key to Your Microservices Journey](https://www.youtube.com/watch?v=PwgQZ8eCGxA), ~43 mins
63 | - [Deploy your code, scale, and lower cloud costs using Elastic Beanstalk](https://www.youtube.com/watch?v=o4clRJuH9xU), ~56 mins
64 | - [Microservices on AWS: Lambda VS Elastic Beanstalk](https://www.youtube.com/watch?v=UknlE_OMobY), ~64 mins
65 |
66 |
67 |
68 |
69 | ## Reading
70 |
71 |
72 | Must Read
73 |
74 | The following content provides enough info to complete the task.
75 |
76 |
77 |
78 | - [Service roles, instance profiles, and user policies](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts-roles.html)
79 | - [Managing environments](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.html)
80 | - [Deploying Node.js applications to Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.html)
81 |
82 |
83 |
84 |
85 |
86 | Additional
87 |
88 | The following content provides more info for further studies.
89 |
90 |
91 |
92 | - [Deploying an Express application to Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html)
93 | - [Basic health reporting](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.healthstatus.html)
94 | - [AWS Elastic Beanstalk security](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/security.html)
95 |
96 |
97 |
98 |
99 | # Assignments
100 |
101 | [Backend For Frontend](./task.md)
102 |
--------------------------------------------------------------------------------
/10_backend_for_frontend/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/10_backend_for_frontend/module_focus.png
--------------------------------------------------------------------------------
/10_backend_for_frontend/task.md:
--------------------------------------------------------------------------------
1 | # Task 10 (Backend For Frontend)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | - The task is a continuation of Homework 8
8 | - The task should be done in the backend repo - the same repo with `product-service` and `import-service` services
9 | - Product Service and Cart Service services should exist and work in your application
10 |
11 | ## Architecture
12 |
13 | Find the entire program architecture: [here](../Architecture.pdf).
14 |
15 |
16 | Task Focus
17 |
18 | The following image provides more info about task focus.
19 |
20 |
21 |
22 |
23 |
24 | ## Tasks
25 |
26 | ---
27 |
28 | ### Task 10.1
29 |
30 | 1. Create a new service called `bff-service` at the same level as Product Service and Import Service. The backend project structure should look like this:
31 |
32 | ```
33 | backend-repository
34 | product-service
35 | import-service
36 | bff-service
37 | ```
38 |
39 | 2. Create an `Express` application in this folder, that listens for all requests and redirects those requests to the appropriate services based on variables provided by the `.env` file.
40 |
41 | 3. Here's the workflow example that BFF Service should support:
42 |
43 | - Make requests to BFF Service with URL in the following format: `{bff-service-url}/{recipient-service-name}?var1=someValue`
44 |
45 | - `{bff-service-url}` - for example, http://localhost:3000
46 | - `{recipient-service-name}` - "cart" or "product" (you can use any other mapping of your choice)
47 | - `?var1=someValue` - query string
48 |
49 | - Get `recipientURL` from the env variables using `{recipient-service-name}` as a key
50 | - Get request `method` (GET, POST, etc.)
51 | - Make a new request to the needed service using the appropriate `method` and `recipientURL`
52 | - BFF Service should return the result of the recipient’s request
53 |
54 | 4. If BFF Service cannot find `recipientURL` by the `{recipient-service-name}`, return a "Cannot process request" error message with status 502.
55 | 5. BFF Service should return the same status code and error message that the recipient service returns to the BFF Service in case of any error on the recipient service side.
56 |
57 | ### Task 10.2
58 |
59 | 1. Deploy BFF Service with Elastic Beanstalk.
60 |
61 | - Platform should be _Node.js_
62 | - Application name must follow the following convention `{yours_github_account_login}-bff-api`
63 | - Use the `--cname` option `{yours_github_account_login}-bff-api-{environment_name}`
64 | - Use the `--single` option
65 |
66 | 2. BFF Service should work only with requests from the Product Service and Cart Service.
67 | 3. All Product Service and Cart Service methods should work correctly if requested via BFF Service
68 |
69 | ### Task 10.3
70 |
71 | 1. Commit all your work to separate branch (e.g. `task-9` from the latest `master`) in your own repository.
72 | 2. Create a pull request to the `master` branch.
73 | 3. Submit the link to the pull request for crosscheck
74 |
75 | ## Evaluation criteria (70 points for covering all criteria)
76 |
77 | ---
78 |
79 | Provide your reviewers with the following information:
80 |
81 | - link to the repo
82 | - Product Service API URL
83 | - Cart Service API URL
84 | - BFF Service API URL
85 | - example of how to call `createProduct` labmda with all needed information: URL, payload, headers, etc.
86 | - example how to call Product Service and Cart Service via BFF Service URL
87 |
88 | ---
89 |
90 | - A working and correct `Express` application should be in the `bff-service` folder. Reviewer can start this application locally with any valid configuration in the `.env` file and this application should works as described in the Task 9.1
91 | - The BFF Service should be deployed with Elastic Beanstalk. The BFF Service call should be redirected to the appropriate service : Product Service or Cart Service. The response from the BFF Service should be the same as if Product Service or Cart Service services were called directly.
92 |
93 | ## Application Functionality (**MUST HAVE**)
94 |
95 | ---
96 |
97 | By this point your application must be able to do:
98 |
99 | 1. Products representation on Home page should be based on Product Service API.
100 | 2. Products are coming from Product DB.
101 | 3. Product images are not randomly generated on client side. Product image, same as another product model information should be stored on BE side in Product DB.
102 | 4. Products might be created through CSV product file import from client side.
103 | 5. Cart might be created with appropriate product set.
104 | 6. Auth logic should be in place
105 |
106 | ## Additional (optional) tasks
107 |
108 | ---
109 |
110 | - **+15** - Add a cache at the BFF Service level for a request to the `getProductsList` lambda function of the Product Service. The cache should expire in 2 minutes.
111 | How to test:
112 | - Get products list
113 | - Create new product
114 | - Get products list - result shouldn’t have new product
115 | - Wait more than 2 minutes
116 | - Get products list - result should have new product
117 | - **+15g** - Use `NestJS` to create BFF Service instead of `Express`
118 |
119 | ## Description Template for PRs
120 |
121 | ---
122 |
123 | The follwoing should be present in PR's description field:
124 |
125 | 1. What was done?
126 |
127 | Example:
128 |
129 | ```
130 | Service is done, but FE is not working...
131 |
132 | Additional scope - webpack, swagger, unit tests
133 | ```
134 |
135 | 2. Link to BFF Service API - .....
136 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
137 |
138 | 4. In case SWAGGER file is not provided - please provide product schema in PR description
139 |
--------------------------------------------------------------------------------
/1_cloud_introduction/README.md:
--------------------------------------------------------------------------------
1 | # Cloud Introduction
2 |
3 | # Goal
4 |
5 | - Learn what Cloud Development is all about
6 | - Explore different Cloud Sevice Models and architecture approaches
7 | - Set up AWS account and development environment
8 |
9 | # Topics
10 |
11 | - Fundamental Theory about Cloud Computing
12 | - Cloud Service Models, Cloud Deployment Models, Infrastructure-as-Code
13 | - Monolith vs Microservices vs Serverless
14 | - AWS Intro, Registration, Cloud Watch, IAM
15 | - Repository structure
16 |
17 | # Materials
18 |
19 | ## Video
20 |
21 |
22 | Must Watch
23 |
24 | The following content provides enough info to complete the task.
25 |
26 |
27 |
28 |
29 | In English
30 |
31 |
32 |
33 | - [Introduction - part1](https://videoportal.epam.com/video/MNnV7g03KrNAqdMva0b3), ~1 mins
34 | - [Introduction - part2](https://videoportal.epam.com/video/4MNVYj1Exvx2dmv5a0eE), ~1 mins
35 | - [Introduction - part3](https://videoportal.epam.com/video/gkXbYq1XdKdxNOABYelw), ~2 mins
36 | - [Introduction - part4 - AWS essentials](https://videoportal.epam.com/video/VKQwJWkPqVqXRvEqJ1EW), ~1 mins
37 | - [Introduction - part5](https://videoportal.epam.com/video/2qOL7xxLPEPGq9dx7483), ~3 mins
38 | - [Introduction - part6](https://videoportal.epam.com/video/1g5mYRkg2pyRwK10JWoD), ~2 mins
39 | - [Introduction - part7 - hometask overview](https://videoportal.epam.com/video/vbdGYloMlrdgLVXEaWqy), ~3 mins
40 | - [Introduction - part8 - SPA boilerplate overview](https://videoportal.epam.com/video/MRwdYoVgQm6A58pZa3bL), ~1 mins
41 | - [Introduction - part9 - registration in AWS](https://videoportal.epam.com/video/XmRlaydZ0Qwy5Ex67jno), ~2 mins
42 | - [Introduction - part10 - registration in AWS](https://videoportal.epam.com/video/286VYGZzDpKKOr6Eav1E), ~1 mins
43 | - [Introduction - part11 - registration issues overview](https://videoportal.epam.com/video/4MNVYj1ExvQ0r3vga0eE), ~1 mins
44 | - [Introduction - part12 - AWS support case for registration](https://videoportal.epam.com/video/XmRlaydZ0QwjZ63R7jno), ~1 mins
45 | - [Introduction - part13 - configuring budget alert](https://videoportal.epam.com/video/1g5mYRkg2pyD2gdPJWoD), ~4 mins
46 | - [Introduction - part14 - IAM and module 1 summary](https://videoportal.epam.com/video/6g2qJXQ0qpbQmQwg7wbz), ~2 mins
47 |
48 |
49 |
50 |
51 | In Russian
52 |
53 |
54 |
55 | - [RU Basic Part](https://videoportal.epam.com/video/lNZRYplXZ6knZbkdYyXQ), ~40 mins
56 | - [RU Advanced Part](https://videoportal.epam.com/video/59pZaAyL6Aw1B16laNzq), ~20 mins
57 | - [RU Practical Part](https://videoportal.epam.com/video/vbdGYlod08Wg11pbaWqy), ~24 mins
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | Additional
67 |
68 | The following content provides more info for further studies.
69 |
70 |
71 |
72 | - [AWS IAM Core Concepts](https://www.youtube.com/watch?v=_ZCTvmaPgao), ~21 mins
73 | - [AWS IAM Hands-On Tutorial](https://www.youtube.com/watch?v=UqKWHZ36yEM), ~46 mins
74 | - [AWS IAM Best Practices](https://www.youtube.com/watch?v=_wiGpBQGCjU), ~53 mins
75 | - [Getting Started with the IAM Policy Simulator](https://www.youtube.com/watch?v=1IIhVcXhvcE), ~6 mins
76 |
77 |
78 |
79 |
80 | ## Reading
81 |
82 |
83 | Must Read
84 |
85 | The following content provides enough info to complete the task.
86 |
87 |
88 |
89 | - [AWS Fundamentals. Core Concepts](https://aws.amazon.com/getting-started/fundamentals-core-concepts)
90 | - [How do I create and activate a new AWS account?](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)
91 | - [Using the AWS Free Tier](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-free-tier.html)
92 | - [What is IAM?](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)
93 | - [AWS account root user credentials and IAM user credentials](https://docs.aws.amazon.com/general/latest/gr/root-vs-iam.html)
94 |
95 |
96 |
97 |
98 |
99 | Additional
100 |
101 | The following content provides more info for further studies.
102 |
103 |
104 |
105 | - [Security best practices in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)
106 | - [Policies and permissions in IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)
107 | - [AWS IAM FAQs](https://aws.amazon.com/iam/faqs/)
108 | - [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)
109 | - [Named profiles for the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)
110 |
111 |
112 |
113 |
114 | # Assignments
115 |
116 | [Cloud Introduction](./task.md)
117 |
--------------------------------------------------------------------------------
/1_cloud_introduction/task.md:
--------------------------------------------------------------------------------
1 | # Task 1 (Cloud Introduction)
2 |
3 | ## Application Functionality (**MUST HAVE**)
4 |
5 | ---
6 |
7 | By the end of the program your application must be able to do:
8 |
9 | 1. Products representation on Home page should be based on Product Service API.
10 | 2. Products are coming from Product DB.
11 | 3. Product images are not randomly generated on client side. Product image, same as another product model information should be stored on BE side in Product DB.
12 | 4. Products might be created through CSV product file import from client side.
13 | 5. Cart might be created with appropriate product set.
14 | 6. Auth logic should be in place
15 |
16 | ## Tasks
17 |
18 | ---
19 |
20 | ### Task 1.1
21 |
22 | 1. Join our communication channel
23 |
24 | - [CloudX AWS Practitioner for JS](https://teams.microsoft.com/l/channel/19%3a73dafd02206d421896229364386d7bd2%40thread.skype/CloudX%2520AWS%2520Practitioner%2520for%2520JS?groupId=a91a4b92-98b1-4d0d-9e21-bd706bd68ed5&tenantId=b41b72d0-4e9f-4c26-8a69-f949f367c91d)
25 |
26 | ### Task 1.2
27 |
28 | 1. Revise:
29 |
30 | - What is REST; what are the main principles of it.
31 | - How to create a basic REST API service using Express.
32 |
33 | 2. Read about (if you would like to learn beyond the curriculum):
34 |
35 | - On-Premise architecture
36 | - Cloud Architecture
37 | - Cloud benefits
38 | - What do the region, availability zone, IAM mean?
39 | - How to use cloud solutions (Read about possible showcases)?
40 | - What is a serverless architecture?
41 |
42 | ### Task 1.3
43 |
44 | 1. Decide which FE framework will be used:
45 |
46 | - [React Front app](https://github.com/EPAM-JS-Competency-center/shop-react-redux-cloudfront).
47 | - [Angular Front app](https://github.com/EPAM-JS-Competency-center/shop-angular-cloudfront).
48 | - [Vue Front app](https://github.com/EPAM-JS-Competency-center/shop-vue-vuex-cloudfront).
49 |
50 | 2. Clone the selected repo, install dependencies, run the app and check if everything is okay
51 |
52 | - Check `package.json` and/or `README.md` for additional details.
53 |
54 | 3. Since you're going to be building an E-Commerce solution, decide which commodities will be sold in your shop.
55 |
56 | - Mixed, Games, Toys, Electronic devices, etc - you name it!
57 |
58 | ### Task 1.4
59 |
60 | 1. Register in AWS following best practices.
61 |
62 | - Do be careful with your root credentials and make sure to protect it properly.
63 |
64 | 2. Create an IAM user and assign AdministratorAccess policy to it.
65 | 3. Using CLI, connect to your AWS account and get the created IAM user information
66 |
67 | - Do remember about AWS credentials setup on your local machine
68 | - Command example that needs to work from your terminal: `aws iam get-user --user-name=MyUser`
69 |
70 | 4. Wait for the next task to be announced and help others in the chat if they have any issues
71 |
--------------------------------------------------------------------------------
/2_serving_spa/README.md:
--------------------------------------------------------------------------------
1 | # Serving SPA in AWS
2 |
3 | # Goal
4 |
5 | - Learn what serving an SPA is all about
6 | - Explore different hosting related concepts like object storage, CDN, etc.
7 | - Set up a static website hosting via AWS S3
8 |
9 | # Topics
10 |
11 | - AWS Simple Storage Service overview
12 | - Services & Tools overview
13 | - AWS CloudFront overview
14 | - Basic overview of deployment process to CloudFront and S3
15 | - Serverless Framework overview
16 | - AWS CLI overview
17 |
18 | # Materials
19 |
20 | ## Video
21 |
22 |
23 | Must Watch
24 |
25 | The following content provides enough info to complete the task.
26 |
27 |
28 |
29 |
30 | In English
31 |
32 |
33 |
34 | - [AWS Simple storage service (S3) - part1. Introduction](https://videoportal.epam.com/video/GoPjaNyQqBlvyn1d76AN), ~1 mins
35 | - [AWS Simple storage service (S3) - part2. Basic theory](https://videoportal.epam.com/video/wPQe73OQkA2XOln7Aqnr), ~11 mins
36 | - [AWS Simple storage service (S3) - part3. Advanced features](https://videoportal.epam.com/video/MRwdYoVgQmdAWB84a3bL), ~13 mins
37 | - [Website hosting with S3 and CloudFront - part 1](https://videoportal.epam.com/video/lNdwY9xWNBgG96kbay2G), ~4 mins
38 | - [Website hosting with S3 and CloudFront - part 2. Using AWS Cloud Development Kit (CDK)](https://videoportal.epam.com/video/59pZaAyWXBDLD29laNzq), ~5 mins
39 |
40 |
41 |
42 |
43 | In Russian
44 |
45 |
46 |
47 | - [RU Introduction](https://videoportal.epam.com/video/1g5mYRkyL8KMd4oPJWoD), ~3 mins
48 | - [RU S3 Intro](https://videoportal.epam.com/video/wPQe73vEnLBglxqOJAqn), ~2 mins
49 | - [RU CloudFront Intro](https://videoportal.epam.com/video/MNnV7g033NDoBklWa0b3), ~4 mins
50 | - [RU Serverless Framework Intro](https://videoportal.epam.com/video/4MNVYj1EEMm3Lgv5a0eE), ~2 mins
51 | - [RU Manual Deployment to S3](https://videoportal.epam.com/video/MRwdYoVggXxDNDr4a3bL), ~16 mins
52 | - [RU Deploy to S3 with serverless](https://videoportal.epam.com/video/elN67KVllzb99gb3JVZz), ~32 mins
53 | - [RU AWS CLI Intro](https://videoportal.epam.com/video/Dj6qaB2WWGqqk06ragPW), ~1 mins
54 | - [RU Serverless & CloudFront](https://videoportal.epam.com/video/B9Ry76DWWwVng509Y8xq), ~20 mins
55 | - [RU Homework](https://videoportal.epam.com/video/Vr9Q7zywwrmgVG9mJMpG), ~3 mins
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | Additional
65 |
66 | The following content provides more info for further studies.
67 |
68 |
69 |
70 | - [Free and Easy guide how to host website on AWS Cloud in 5 minutes](https://youtu.be/4AYF_Vo36sU), ~4mins
71 | - [AWS S3 Core Concepts](https://www.youtube.com/watch?v=tfU0JEZjcsg), 27 mins
72 | - [AWS S3 Hands-On Tutorial](https://www.youtube.com/watch?v=XGcoeEyt2UM), ~45 mins
73 | - [AWS CloudFront Hands-On Tutorial](https://www.youtube.com/watch?v=Vr4N_ZA-uGo), ~15 mins
74 | - [React App on AWS S3 with Static Hosting + Cloudfront](https://www.youtube.com/watch?v=mls8tiiI3uc), ~35 mins
75 | - [Getting Started with Serverless Framework](https://www.youtube.com/watch?v=KQRGM9_eqIw), ~20mins
76 |
77 |
78 |
79 |
80 | ## Reading
81 |
82 |
83 | Must Read
84 |
85 | The following content provides enough info to complete the task.
86 |
87 |
88 |
89 | - [What is Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)
90 | - [Getting started with Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)
91 | - [AWS S3 FAQs](https://aws.amazon.com/s3/faqs/)
92 | - [Setting Up Serverless Framework With AWS](https://www.serverless.com/framework/docs/getting-started)
93 | - [Serverless Framework Concepts](https://www.serverless.com/framework/docs/providers/aws/guide/intro)
94 |
95 |
96 |
97 |
98 |
99 | Additional
100 |
101 | The following content provides more info for further studies.
102 |
103 |
104 |
105 | - [Tutorial: Configuring a static website on Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html)
106 | - [What AWS service should you use to publish a web site](https://adrianhall.github.io/cloud/2019/01/31/which-aws-service-for-hosting/)
107 | - [Tutorial: Your First Serverless Framework Project](https://www.serverless.com/framework/docs/tutorial)
108 | - [AWS S3 Buckets Overview](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)
109 | - [Pseudo Parameters Reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html)
110 | - [What is the AWS CDK?](https://docs.aws.amazon.com/cdk/v2/guide/home.html)
111 | - [Example of deploying static site with AWS CDK](https://github.com/EPAM-JS-Competency-center/nodejs-aws-cdk-starter)
112 |
113 |
114 |
115 |
116 | # Assignments
117 |
118 | [Serve SPA in AWS S3 and Cloudfront Services](./task.md)
119 |
--------------------------------------------------------------------------------
/2_serving_spa/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/2_serving_spa/module_focus.png
--------------------------------------------------------------------------------
/2_serving_spa/task.md:
--------------------------------------------------------------------------------
1 | # Task 2 (Serve SPA in AWS S3 and Cloudfront Services)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | _NOTE: This should have already been done in Task 1, but as a reminder._
8 |
9 | - **Install** the latest version of Serverless Framework (https://www.serverless.com/).
10 | - **Configure** credentials for AWS to make them accessible by Serverless.
11 | - **Fork** Any (React, Angular, Vue) Shop single page app from https://github.com/EPAM-JS-Competency-center
12 | - **Install** dependencies…
13 | - **Check** if everything works for you...
14 |
15 | ## Architecture
16 |
17 | Find the entire program architecture: [here](../Architecture.pdf).
18 |
19 |
20 | Task Focus
21 |
22 | The following image provides more info about task focus.
23 |
24 |
25 |
26 |
27 |
28 | ## Tasks
29 |
30 | ---
31 |
32 | ### Task 2.1
33 |
34 | **Manual Deployment**
35 |
36 | 1. In the AWS Console **create** and **configure** an S3 bucket where you will host your app (follow instructions in training materials).
37 | 2. **Build** and **manually upload** the MyShop! app to the created S3 bucket. **Check** if the app is available through the Internet over `http://{your-bucket-name}.s3-website-{aws-region}.amazonaws.com` .
38 | 3. **Create** a CloudFront distribution for your app as it was described in training materials. **Check** your S3 bucket policy changes. **Check** if the app is available through the Internet over given CloudFront URL.
39 | 4. **Make** some minor but visible changes in the app, **build** and **upload** them to your bucket, and create CloudFront distribution invalidation.
40 |
41 | ### Task 2.2
42 |
43 | **Automated Deployment**
44 |
45 | 1. **Add** and **configure** _serverless_ and _serverless-finch_ plugin. Add necessary npm script(s) to build and deploy your app from your machine in an automated way. **Check** if everything works correctly for you.
46 | Here's a [Demo repo](https://github.com/boale/serverlessTestApp) as an example.
47 |
48 | _NOTE: After uploading an application's build to the S3 bucket you need to manually create a CloudFront invalidation._
49 |
50 | 2. **Destroy** the created AWS infrastructure (S3 bucket and CloudFront distribution) from the previous part and steps. **Make sure** nothing is left.
51 | 3. **Add** and **configure** `serverless-single-page-app-plugin` as it is implemented in the demo repository. **Add** necessary npm script(s) to build, upload to your S3 bucket, and invalidate CloudFront cache from your machine in an automated way. **Check** if everything works fine and all changes appear on the Web.
52 |
53 | _NOTE: Now that you have this plugin you don’t need to manually create CloudFront invalidations any more._
54 |
55 | ### Task 2.3
56 |
57 | 1. Store the links to CloudFront URL and S3-website in README.md file.
58 | 2. Commit all your work to separate branch (e.g. `task-2` from the latest `master`) in your own repository.
59 | 3. Create a pull request to the `master` branch.
60 | 4. Submit the link to the pull request for crosscheck
61 |
62 | ## Evaluation criteria (70 points for covering all criteria)
63 |
64 | ---
65 | - S3 bucket has been created and configured properly. The app has been uploaded to the bucket and is available though the Internet. Nothing else has been done.
66 | _(Link to S3 bucket/website is provided. There is no Pull Request in the YOUR OWN frontend repository.)_
67 | - In addition to the previous work a CloudFront distribution is created and configured properly and the site is served now with CloudFront and is available through the Internet over CloudFront URL, not S3-website link (due to changes in bucket’s policy...).
68 | _(Link to CloudFront website is provided. S3-website shows 403 Access Denied error. There is no Pull Request in the YOUR OWN frontend repository.)_
69 |
70 | ## Additional (optional) tasks
71 |
72 | ---
73 | - **30** - `Serverless-finch` and `serverless-single-page-app` plugins are added and configured. The app can be built and deployed by running npm script command.
74 | _(Link to CloudFront website is provided. PR with all changes is submitted in the YOUR OWN frontend repository and its link is provided for review.)_
75 |
76 | NOTE: YOU SHOULD WORK IN YOUR OWN FORKED REPOSITORY, NOT IN COMMON
77 |
78 | ## Description Template for PRs
79 |
80 | ---
81 |
82 | The follwoing should be present in PR's description field:
83 |
84 | 1. What was done?
85 |
86 | Example:
87 |
88 | ```
89 | Service is done, but FE is not working...
90 |
91 | Additional scope - webpack, swagger, unit tests
92 | ```
93 |
94 | 2. Link to FE PR (YOUR OWN REPOSITORY) - ...
95 |
--------------------------------------------------------------------------------
/3_serverless_api/README.md:
--------------------------------------------------------------------------------
1 | # Serverless API
2 |
3 | # Goal
4 |
5 | - Learn what Serverless is all about
6 | - Explore different serverless related services like Lambda, API Gateway, etc.
7 | - Set up an API Gateway and Lambda based architecture
8 |
9 | # Topics
10 |
11 | - AWS Lambda Overview
12 | - Serverless Framework and Lambda
13 | - Introduction to Collecting logs with AWS CloudWatch
14 | - Lambda Advanced Features and Configuration
15 |
16 | # Materials
17 |
18 | ## Video
19 |
20 |
21 | Must Watch
22 |
23 | The following content provides enough info to complete the task.
24 |
25 |
26 |
27 |
28 | In English
29 |
30 |
31 |
32 | - [AWS Lambda & API Gateway - part 1. Basics](https://videoportal.epam.com/video/4MNVYj1Exvl0On3Da0eE), ~15 mins
33 | - [AWS Lambda & API Gateway - part2. Practice](https://videoportal.epam.com/video/VN2Qa1XWm83E0PQn7kwG), ~21 mins
34 | - [AWS Lambda & API Gateway - part3 . Practice continued](https://videoportal.epam.com/video/VKQwJWkPqVXRmRNGJ1EW), ~15 mins
35 | - [AWS Lambda & API Gateway - part4. Advanced Lambda](https://videoportal.epam.com/video/oybzJ0oWebWXLqX4Y4dG), ~11 mins
36 | - [AWS Lambda & API Gateway - part 5. Advanced practice](https://videoportal.epam.com/video/v0Aba28WRBWvZwejJkz9), ~17 mins
37 | - [AWS Lambda & API Gateway - part 6. Advanced practice continued](https://videoportal.epam.com/video/vbdGYloMlrMKpq4naWqy), ~14 mins
38 | - [AWS Lambda & API Gateway - part7. Hometask review](https://videoportal.epam.com/video/Dj6qaBMwxW5k1P87gPWA), ~5 mins
39 |
40 |
41 |
42 |
43 | In Russian
44 |
45 |
46 |
47 | - [RU Lambda Intro](https://videoportal.epam.com/video/elN67KV30zeZvdl0JVZz), ~20 mins
48 | - [RU Basic practice in AWS](https://videoportal.epam.com/video/lNdwY9x6pwOnwgvpay2G), ~27 mins
49 | - [RU Advanced Theory](https://videoportal.epam.com/video/XmRlaydwkn94NzNR7jno), ~11 mins
50 | - [RU How to create Rest API using Serverless framework and Lambda](https://videoportal.epam.com/video/lNZRYplXNbrx8LA1YyXQ), ~34 mins
51 | - [RU Homework](https://videoportal.epam.com/video/9w0kaE2mNwKn6w6GYeLn), ~27 mins
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Additional
61 |
62 | The following content provides more info for further studies.
63 |
64 |
65 |
66 | - [How I spent 400$ on lambdas in just one evening ](https://youtu.be/58M6g4BhSxU), ~8mins
67 | - [AWS Lambda Core Concepts](https://www.youtube.com/watch?v=iUIWG0h2D84), ~7 mins
68 | - [Introduction to AWS Lambda & Serverless Applications](https://www.youtube.com/watch?v=EBSdyoO3goc), ~56 mins
69 | - [Building APIs with Amazon API Gateway](https://www.youtube.com/watch?v=XwfpPEFHKtQ), ~43 mins
70 | - [Top 5 Use Cases For AWS Lambda](https://www.youtube.com/watch?v=K-nnzpgrzwM), ~13 mins
71 |
72 |
73 |
74 |
75 | ## Reading
76 |
77 |
78 | Must Read
79 |
80 | The following content provides enough info to complete the task.
81 |
82 |
83 |
84 | - [What is AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
85 | - [Getting started with Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)
86 | - [AWS Lambda Features](https://aws.amazon.com/lambda/features/)
87 | - [AWS Lambda FAQs](https://aws.amazon.com/lambda/faqs/)
88 | - [What is Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)
89 | - [Serverless Framework: Deploying to AWS](https://www.serverless.com/framework/docs/providers/aws/guide/deploying)
90 | - [Serverless Framework: AWS Lambda Functions](https://www.serverless.com/framework/docs/providers/aws/guide/functions)
91 | - [Serverless Framework: AWS Lambda Events](https://www.serverless.com/framework/docs/providers/aws/guide/events)
92 |
93 |
94 |
95 |
96 |
97 | Additional
98 |
99 | The following content provides more info for further studies.
100 |
101 |
102 |
103 | - [Best practices for working with AWS Lambda functions](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)
104 | - [AWS Lambda Pricing](https://aws.amazon.com/lambda/pricing/)
105 | - [Amazon API Gateway concepts](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-basic-concept.html)
106 | - [Tutorial: Build a Hello World REST API with Lambda proxy integration](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html)
107 | - [Enabling CORS for a REST API resource](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html)
108 | - [Serverless Framework: CORS and API Gateway Survival Guide](https://www.serverless.com/blog/cors-api-gateway-survival-guide)
109 | - [Serverless.yml Reference](https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml)
110 |
111 |
112 |
113 |
114 | # Assignments
115 |
116 | [First API with AWS API Gateway and AWS Lambda](./task.md)
117 |
--------------------------------------------------------------------------------
/3_serverless_api/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/3_serverless_api/module_focus.png
--------------------------------------------------------------------------------
/3_serverless_api/task.md:
--------------------------------------------------------------------------------
1 | # Task 3 (First API with AWS API Gateway and AWS Lambda)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | - **Install** the latest version of Serverless Framework (https://www.serverless.com/).
8 | - **Configure** credentials for AWS to make them accessible by Serverless.
9 | - **Create** your **own public Github repository** for all future backend work (you might call it how you would like). You will have 2 repos - 1 for frontend, 1 for backend till the end of course.
10 |
11 | _NOTE: You should create branch from master and work in branch (f.e. branch name - task-3) in BE (backend) and in FE (frontend) repositories._
12 |
13 | _NOTE: Don't forget to add dynamic product representation on FE side._
14 |
15 | _NOTE: This microservice needs to be created using Serverless Framework, AWS API Gateway, AWS Lambda._
16 |
17 | ## Architecture
18 |
19 | Find the entire program architecture: [here](../Architecture.pdf).
20 |
21 |
22 | Task Focus
23 |
24 | The following image provides more info about task focus.
25 |
26 |
27 |
28 |
29 |
30 | ## Tasks
31 |
32 | ---
33 |
34 | ### Task 3.1
35 |
36 | 1. Create a lambda function called `getProductsList` under the same Serverless config file (i.e. `serverless.yaml`) of Product Service which will be triggered by the HTTP GET method.
37 | 2. The requested URL should be `/products`.
38 | 3. The response from the lambda should be a _full_ array of products (mock data should be used - this mock data should be stored in Product Service).
39 | 4. This endpoint should be integrated with Frontend app for _PLP_ (Product List Page) representation.
40 |
41 | ### Task 3.2
42 |
43 | 1. Create a lambda function called `getProductsById` under the same Serverless config file (i.e. `serverless.yaml`) of Product Service which will be triggered by the HTTP GET method.
44 | 2. The requested URL should be `/products/{productId}` (what `productId` is in your application is up to you - productName, UUID, etc.).
45 | 3. The response from the lambda should be 1 searched product from an array of products (mock data should be used - this mock data should be stored in Product Service).
46 | 4. This endpoint is not needed to be integrated with Frontend right now.
47 |
48 | ### Task 3.3
49 |
50 | 1. Commit all your work to separate branch (e.g. `task-3` from the latest `master`) in your own repository.
51 | 2. Create a pull request to the `master` branch.
52 | 3. Submit the link to the pull request for crosscheck
53 |
54 | ## Evaluation criteria (70 points for covering all criteria)
55 |
56 | ---
57 |
58 | Reviewers should verify the lambda functions by invoking them through provided URLs.
59 |
60 | - Product Service Serverless config contains configuration for 2 lambda functions, API is not working at all, but YAML configuration is correct
61 | - The `getProductsList` OR `getProductsById` lambda function returns a correct response (POINT1)
62 | - The `getProductsById` AND `getProductsList` lambda functions return a correct response code (POINT2)
63 | - Your own Frontend application is integrated with Product Service (`/products` API) and products from Product Service are represented on Frontend. AND POINT1 and POINT2 are done.
64 |
65 | ## Additional (optional) tasks
66 |
67 | ---
68 |
69 | - **+5** - Async/await is used in lambda functions
70 | - **+5** - ES6 modules are used for Product Service implementation
71 | - **+4** - Custom Webpack/ESBuild/etc is manually configured for Product Service. Not applicable for preconfigured/built-in bundlers that come with templates, plugins, etc.
72 | - **+4** **(All languages)** - SWAGGER documentation is created for Product Service
73 | - **+4** **(All languages)** - Lambda handlers are covered by basic UNIT tests (NO infrastructure logic is needed to be covered)
74 | - **+4** **(All languages)** - Lambda handlers (`getProductsList`, `getProductsById`) code is written not in 1 single module (file) and separated in codebase.
75 | - **+4** **(All languages)** - Main error scenarios are handled by API ("Product not found" error).
76 |
77 | ## Description Teamplate for PRs
78 |
79 | ---
80 |
81 | The following should be present in PR's description field:
82 |
83 | 1. What was done?
84 |
85 | Example:
86 |
87 | ```
88 | Service is done, but FE is not working...
89 |
90 | Additional scope - webpack, swagger, unit tests
91 | ```
92 |
93 | 2. Link to Product Service API - .....
94 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
95 |
96 | 4. In case SWAGGER file is not provided - please provide product schema in PR description
97 |
--------------------------------------------------------------------------------
/4_integration_with_nosql_database/README.md:
--------------------------------------------------------------------------------
1 | # Integration with DynamoDB
2 |
3 | # Goal
4 |
5 | - Explore different database concepts and services
6 | - Set up an integration with DynamoDB
7 |
8 | # Topics
9 |
10 | - Easy way to store data in Cloud
11 | - AWS DynamoDB and how to use it
12 |
13 | # Materials
14 |
15 | ## Video
16 |
17 |
18 | Must Watch
19 |
20 | The following content provides enough info to complete the task.
21 |
22 |
23 |
24 |
25 | In English
26 |
27 |
28 |
29 | - [AWS Cloud Databases - part1. Creating DynamoDB table](https://videoportal.epam.com/video/GoPjaNyQq3Q3Zb9r76AN), ~4 mins
30 | - [AWS Cloud Databases - part2. Manipulating Data in DynamoDB Table](https://videoportal.epam.com/video/QDNRY5V9oB9Kbp3lJo2O), ~5 mins
31 | - [AWS Cloud Databases - part3. Accessing Data from Lambda](https://videoportal.epam.com/video/MNnV7g03KryZqMrNa0b3), ~4 mins
32 |
33 |
34 |
35 |
36 | In Russian
37 |
38 |
39 |
40 | - [RU Databases Intro](https://videoportal.epam.com/video/EKz1JeNKNODrw0vZ7v5Q), ~55 mins
41 | - [RU Databases in AWS](https://videoportal.epam.com/video/pZWva8oyobZWbRwB71m3), ~26 mins
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | Additional
51 |
52 | The following content provides more info for further studies.
53 |
54 |
55 |
56 | - [Journey to the Cloud - The Why](https://youtu.be/ot7joOiUG3o), ~24mins
57 | - [SQL vs NoSQL Explained](https://www.youtube.com/watch?v=ruz-vK8IesE), ~12 mins
58 | - [How to Choose a Database on AWS](https://www.youtube.com/watch?v=eK_umMYxZfM), ~7 mins
59 |
60 |
61 |
62 |
63 | ## Reading
64 |
65 |
66 | Must Read
67 |
68 | The following content provides enough info to complete the task.
69 |
70 |
71 |
72 | - [What is AWS Dynamo DB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)
73 | - [Setting up DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SettingUp.html)
74 | - [AWS DynamoDB FAQs](https://aws.amazon.com/ru/dynamodb/faqs/)
75 |
76 |
77 |
78 |
79 |
80 | Additional
81 |
82 | The following content provides more info for further studies.
83 |
84 |
85 |
86 | - [Best practices for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html)
87 | - [Using Amazon RDS with Amazon VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.html)
88 | - [A guide to understanding database scaling patterns](https://www.freecodecamp.org/news/understanding-database-scaling-patterns/)
89 |
90 |
91 |
92 |
93 | # Assignments
94 |
95 | [Cloud Databases Overview and integration with Database](./task.md)
96 |
--------------------------------------------------------------------------------
/4_integration_with_nosql_database/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/4_integration_with_nosql_database/module_focus.png
--------------------------------------------------------------------------------
/4_integration_with_nosql_database/task.md:
--------------------------------------------------------------------------------
1 | # Task 4 (Integration with NoSQL Database)
2 |
3 | ## Architecture
4 |
5 | Find the entire program architecture: [here](../Architecture.pdf).
6 |
7 |
8 | Task Focus
9 |
10 | The following image provides more info about task focus.
11 |
12 |
13 |
14 |
15 |
16 | ## Tasks
17 |
18 | ---
19 |
20 | ### Task 4.1
21 |
22 | 1. Use AWS Console to create two database tables in DynamoDB. Expected schemas for products and stock:
23 |
24 | Product model:
25 |
26 | ```
27 | products:
28 | id - uuid (Primary key)
29 | title - text, not null
30 | description - text
31 | price - integer
32 | ```
33 |
34 | Stock model:
35 |
36 | ```
37 | stock:
38 | product_id - uuid (Foreign key from products.id)
39 | count - integer (Total number of products in stock, can't be exceeded)
40 | ```
41 |
42 | 2. Write a script to fill tables with test examples. Store it in your Github repository. Execute it for your DB to fill data.
43 |
44 | ### Task 4.2
45 |
46 | 1. Extend your `serverless.yml` file with data about your database table and pass it to lambda’s environment variables section.
47 | 2. Integrate the `getProductsList` lambda to return via GET `/products` request a list of products from the database (joined stock and products tables).
48 | 3. Implement a Product model on FE side as a joined model of product and stock by `productId`. For example:
49 |
50 | _BE: Separate tables in DynamoDB_
51 |
52 | ```
53 | Stock model example in DB:
54 | {
55 | product_id: '19ba3d6a-f8ed-491b-a192-0a33b71b38c4',
56 | count: 2
57 | }
58 |
59 |
60 | Product model example in DB:
61 | {
62 | id: '19ba3d6a-f8ed-491b-a192-0a33b71b38c4'
63 | title: 'Product Title',
64 | description: 'This product ...',
65 | price: 200
66 | }
67 | ```
68 |
69 | _FE: One product model as a result of BE models join (product and it's stock)_
70 |
71 | ```
72 | Product model example on Frontend side:
73 | {
74 | id: '19ba3d6a-f8ed-491b-a192-0a33b71b38c4',
75 | count: 2
76 | price: 200,
77 | title: ‘Product Title’,
78 | description: ‘This product ...’
79 | }
80 | ```
81 |
82 | _NOTE: This setup means User cannot buy more than `product.count` (no more items in stock) - but this is future functionality on FE side._
83 |
84 | 4. Integrate the `getProductsById` lambda to return via GET `/products/{productId}` request a single product from the database.
85 |
86 | ### Task 4.3
87 |
88 | 1. Create a lambda function called `createProduct` under the same Serverless config file (i.e. `serverless.yaml`) of Product Service which will be triggered by the HTTP POST method.
89 | 2. The requested URL should be `/products`.
90 | 3. Implement its logic so it will be creating a new item in a Products table.
91 | 4. Save the URL (API Gateway URL) to execute the implemented lambda functions for later - you'll need to provide it in the PR (e.g in PR's description) when submitting the task.
92 |
93 | ### Task 4.4
94 |
95 | 1. Commit all your work to separate branch (e.g. `task-4` from the latest `master`) in BE (backend) and if needed in FE (frontend) repositories.
96 | 2. Create a pull request to the `master` branch.
97 | 3. Submit the link to the pull request for crosscheck
98 |
99 | ## Evaluation criteria (70 points for covering all criteria)
100 |
101 | ---
102 |
103 | Reviewers should verify the lambda functions by invoking them through provided URLs.
104 |
105 | - Task 4.1 is implemented
106 | - Task 4.2 is implemented lambda links are provided and returns data
107 | - Task 4.3 is implemented lambda links are provided and products is stored in DB (call Task 4.2 to see the product)
108 | - Your own Frontend application is integrated with Product Service (`/products` API) and products from Product Service are represented on Frontend. Link to a working Frontend application is provided for cross-check reviewer.
109 |
110 | ## Additional (optional) tasks
111 |
112 | ---
113 |
114 | - **+6** **(All languages)** - POST `/products` lambda functions returns error 400 status code if product data is invalid
115 | - **+6** **(All languages)** - All lambdas return error 500 status code on any error (DB connection, any unhandled error in code)
116 | - **+6** **(All languages)** - All lambdas do `console.log` for each incoming requests and their arguments
117 | - **+6** **(All languages)** - Use RDS instance instead fo DynamoDB tables. **Do not commit your environment variables in serverless.yml to github!**
118 | - **+6** **(All languages)** - Transaction based creation of product (in case stock creation is failed then related to this stock product is not created and not ready to be used by the end user and vice versa) (https://devcenter.kinvey.com/nodejs/tutorials/bl-transactional-support, https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html)
119 |
120 | ## Description Template for PRs
121 |
122 | ---
123 |
124 | The following should be present in PR's description field:
125 |
126 | 1. What was done?
127 |
128 | Example:
129 |
130 | ```
131 | Service is done, but FE is not working...
132 |
133 | Additional scope - logger, swagger, unit tests, transaction
134 | ```
135 |
136 | 2. Link to Product Service API - .....
137 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
138 | 4. In case SWAGGER file is not provided - please provide product schema in PR description
139 |
--------------------------------------------------------------------------------
/5_integration_with_s3/README.md:
--------------------------------------------------------------------------------
1 | # Integration with S3
2 |
3 | # Goal
4 |
5 | - Learn what Simple Storage Service is all about
6 | - Explore different S3 related concepts like storage classes, object lifecycle, etc.
7 | - Set up an integration with AWS S3 and AWS Lambda
8 |
9 | # Topics
10 |
11 | - AWS S3 In-depth Introduction
12 | - S3 Storage Classes and their Use Cases
13 | - S3 Access Control & Encryption
14 | - S3 Versioning, Lifecycle Management & Events
15 | - Integration with S3 and Lambda Overview
16 |
17 | # Materials
18 |
19 | ## Video
20 |
21 |
22 | Must Watch
23 |
24 | The following content provides enough info to complete the task.
25 |
26 |
27 |
28 |
29 | In English
30 |
31 |
32 |
33 | - [AWS S3 & Lambda. Practical task overview](https://videoportal.epam.com/video/lNZRYpl6MR6RAv0dYyXQ), ~2 mins
34 | - [AWS S3 & Lambda - part2. Practice](https://videoportal.epam.com/video/G0XV7rxbyzb2Gg1zYnmo), ~24 mins
35 | - [AWS S3 & Lambda - part3. Serverless configuration](https://videoportal.epam.com/video/430e7n2yEey0BdwQ76PM), ~3 mins
36 | - [AWS S3 & Lambda - part4. Hometask review](https://videoportal.epam.com/video/GoPjaNWobQNQ9o5Y6ANz), ~5 mins
37 |
38 |
39 |
40 |
41 | In Russian
42 |
43 |
44 |
45 | - [RU Introduction](https://videoportal.epam.com/video/PoBNYOZMMlgLxBjma4Gn), ~1 mins
46 | - [RU Task and Lecture Goal](https://videoportal.epam.com/video/GoPjaNyQQ34eo3vj76AN), ~2 mins
47 | - [RU Basic Theory](https://videoportal.epam.com/video/elN67KVllz52pyOmJVZz), ~13 mins
48 | - [RU Theory of S3 Advanced Features](https://videoportal.epam.com/video/9w0kaEMOOprd0b2aeLnD), ~15 mins
49 | - [RU Live Practice](https://videoportal.epam.com/video/zXWOJMdEEx1Aqxw2YnDv), ~30 mins
50 | - [RU Needed configurations (Serverless configuration)](https://videoportal.epam.com/video/elN67KVllz5K2PomJVZz), ~3 mins
51 | - [RU Homework](https://videoportal.epam.com/video/qQB2JwKWWZ1QvyGJMwGk), ~8 mins
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Additional
61 |
62 | The following content provides more info for further studies.
63 |
64 |
65 |
66 | - [Journey to the Cloud - The How](https://youtu.be/meIIRwq5sjc), 49mins
67 | - [AWS S3 Best Practices](https://www.youtube.com/watch?v=rHeTn9pHNKo), ~62 mins
68 | - [AWS S3 APIs Walkthrough](https://www.youtube.com/watch?v=AAOJ0BAJVJs), ~22 mins
69 | - [AWS S3 Lifecycle Rules](https://www.youtube.com/watch?v=CPUjRhrsMiI), ~5 mins
70 | - [Deep dive on Amazon S3](https://www.youtube.com/watch?v=FJJxcwSfWYg), ~47 mins
71 | - [AWS S3 File Upload + Lambda Trigger Tutorial](https://www.youtube.com/watch?v=OJrxbr9ebDE), 13mins
72 | - [AWS S3 Signed URL Visual Explanation](https://www.youtube.com/watch?v=cog0r-PvGM4), 6mins
73 | - [Serverless Framework and AWS S3 Signed URL with](https://www.youtube.com/watch?v=rIQM30rz_0c), 16mins
74 |
75 |
76 |
77 |
78 | ## Reading
79 |
80 |
81 | Must Read
82 |
83 | The following content provides enough info to complete the task.
84 |
85 |
86 |
87 | - [AWS IAM in AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)
88 | - [Amazon S3 Storage Classes](https://aws.amazon.com/s3/storage-classes/)
89 | - [Managing your storage lifecycle](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)
90 | - [Tutorial: Transforming data for your application with S3 Object Lambda](https://docs.aws.amazon.com/AmazonS3/latest/userguide/tutorial-s3-object-lambda-uppercase.html)
91 | - [Using presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)
92 |
93 |
94 |
95 |
96 |
97 | Additional
98 |
99 | The following content provides more info for further studies.
100 |
101 |
102 |
103 | - [Security Best Practices](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html)
104 | - [Protecting data using encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)
105 | - [Monitoring tools](https://docs.aws.amazon.com/AmazonS3/latest/userguide/monitoring-automated-manual.html)
106 | - [Amazon S3 Event Notifications](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html)
107 | - [AWS S3 and CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cors.html)
108 | - [Generating a presigned URL to upload an object](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html)
109 |
110 |
111 |
112 |
113 | # Assignments
114 |
115 | [AWS Simple Storage Service - S3](./task.md)
116 |
--------------------------------------------------------------------------------
/5_integration_with_s3/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/5_integration_with_s3/module_focus.png
--------------------------------------------------------------------------------
/5_integration_with_s3/task.md:
--------------------------------------------------------------------------------
1 | # Task 5 (Integration with S3)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | - The task is a continuation of Homework 4 and should be done in the same repos
8 | - **(for JS only)** Install the latest version of AWS SDK (https://aws.amazon.com/ru/sdk-for-node-js/)
9 | - **(for JS only)** Install the CSV parser package (https://www.npmjs.com/package/csv-parser)
10 |
11 | ## Architecture
12 |
13 | Find the entire program architecture: [here](../Architecture.pdf).
14 |
15 |
16 | Task Focus
17 |
18 | The following image provides more info about task focus.
19 |
20 |
21 |
22 |
23 |
24 | ## Tasks
25 |
26 | ---
27 |
28 | ### Task 5.1
29 |
30 | 1. Create a new service called `import-service` at the same level as Product Service with a its own `serverless.yml` file. The backend project structure should look like this:
31 |
32 | ```
33 | backend-repository
34 | product-service
35 | import-service
36 | ```
37 |
38 | 2. In the AWS Console **create** and **configure** a new S3 bucket with a folder called `uploaded`.
39 |
40 | ### Task 5.2
41 |
42 | 1. Create a lambda function called `importProductsFile` under the same Serverless config file (i.e. `serverless.yaml`) of the Import Service which will be triggered by the HTTP GET method.
43 | 2. The requested URL should be `/import`.
44 | 3. Implement its logic so it will be expecting a request with a name of CSV file with products and creating a new **Signed URL** with the following key: `uploaded/${fileName}`.
45 | 4. The name will be passed in a _query string_ as a `name` parameter and should be described in the `serverless.yml` file as a _request parameter_.
46 | 5. Update `serverless.yml` with policies to allow lambda functions to interact with S3.
47 | 6. The response from the lambda should be the created **Signed URL**.
48 | 7. The lambda endpoint should be integrated with the frontend by updating `import` property of the API paths configuration.
49 |
50 | ### Task 5.3
51 |
52 | 1. Create a lambda function called `importFileParser` under the same `serverless.yml` file which will be triggered by an S3 event.
53 | 2. The event should be `s3:ObjectCreated:*`
54 | 3. Configure the event to be fired only by changes in the `uploaded` folder in S3.
55 | 4. The lambda function should use a _readable stream_ to get an object from S3, parse it using `csv-parser` package and log each record to be shown in CloudWatch.
56 |
57 | ### Task 5.4
58 |
59 | 1. Commit all your work to separate branch (e.g. `task-5` from the latest `master`) in your own repository.
60 | 2. Create a pull request to the `master` branch.
61 | 3. Submit the link to the pull request for crosscheck
62 |
63 | ## Evaluation criteria (70 points for covering all criteria)
64 |
65 | ---
66 |
67 | Reviewers should verify the lambda functions by invoking them through provided URLs.
68 |
69 | - File `serverless.yml` contains configuration for `importProductsFile` function
70 | - The `importProductsFile` lambda function returns a correct response which can be used to upload a file into the S3 bucket
71 | - Frontend application is integrated with `importProductsFile` lambda
72 | - The `importFileParser` lambda function is implemented and `serverless.yml` contains configuration for the lambda
73 |
74 | ## Additional (optional) tasks
75 |
76 | ---
77 |
78 | - **+10** **(for JS only)** - **async/await** is used in lambda functions
79 | - **+10** **(All languages)** - `importProductsFile` lambda is covered by _unit tests_.
80 | (for JS only) [aws-sdk-mock](https://www.npmjs.com/package/aws-sdk-mock) can be used to mock S3 methods
81 | - **+10** **(All languages)** - At the end of the stream the lambda function should move the file from the `uploaded` folder into the `parsed` folder (`move the file` means that file should be copied into a new folder in the same bucket called `parsed`, and then deleted from `uploaded` folder)
82 |
83 | ## Description Teamplate for PRs
84 |
85 | ---
86 |
87 | The follwoing should be present in PR's description field:
88 |
89 | 1. What was done?
90 |
91 | Example:
92 |
93 | ```
94 | Service is done, but FE is not working...
95 |
96 | Additional scope - webpack, swagger, unit tests
97 | ```
98 |
99 | 2. Link to Import Service API - .....
100 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
101 |
102 | 4. In case SWAGGER file is not provided - please provide product schema in PR description
103 |
--------------------------------------------------------------------------------
/6_async_microservices_communication/README.md:
--------------------------------------------------------------------------------
1 | # SQS & SNS, Async Microservices Communication
2 |
3 | # Goal
4 |
5 | - Learn what async microservices communication is all about
6 | - Explore different async services like SNS, SQS, etc.
7 | - Set up an integration with AWS SNS and AWS SQS
8 |
9 | # Topics
10 |
11 | - Async Messaging Overview
12 | - AWS SQS Overview
13 | - AWS SNS Overview
14 | - Integration with SQS, SNS and Lambda Overview
15 |
16 | # Materials
17 |
18 | ## Video
19 |
20 |
21 | Must Watch
22 |
23 | The following content provides enough info to complete the task.
24 |
25 |
26 |
27 |
28 | In English
29 |
30 |
31 |
32 | - [Async Microservices Communication](https://videoportal.epam.com/video/qYLd4wYX), ~1 hour 32 mins
33 |
34 |
35 |
36 |
37 | In Russian
38 |
39 |
40 |
41 | - [RU Message Queue Introduction](https://videoportal.epam.com/video/VKQwJWkXoMG6yEL3J1EW), ~11 mins
42 | - [RU SQS Introduction](https://videoportal.epam.com/video/Vr9Q7zyL5l9KA4KmJMpG), ~11 mins
43 | - [RU Basic Practice (manual integration)](https://videoportal.epam.com/video/MRwdYoVdZ9pEN09Da3bL), ~18 mins
44 | - [RU Practice (Using Serverless framework)](https://videoportal.epam.com/video/zXWOJMd35Dj9NgnLYnDv), ~29 mins
45 | - [RU Homework](https://videoportal.epam.com/video/Vr9Q7zyL5lMAWMV8JMpG), ~6 mins
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Additional
55 |
56 | The following content provides more info for further studies.
57 |
58 |
59 |
60 | - [AWS SQS Overview](https://www.youtube.com/watch?v=CyYZ3adwboc), ~29 mins
61 | - [AWS SNS Overview](https://www.youtube.com/watch?v=bktTomENEX8), ~17 mins
62 | - [SNS vs SQS Comparison](https://www.youtube.com/watch?v=mXk0MNjlO7A), ~11 mins
63 | - [AWS SQS to Lambda Hands-On Tutorial](https://www.youtube.com/watch?v=JJQrVBRzlPg), ~30 mins
64 | - [Choosing the Right Messaging Service for Your Distributed App](https://www.youtube.com/watch?v=4-JmX6MIDDI), ~53 mins
65 | - [Build High-Throughput, Bursty Data Apps with Amazon SQS, SNS, & Lambda](https://www.youtube.com/watch?v=YwHxvKhBQ_g), ~55 mins
66 |
67 |
68 |
69 |
70 | ## Reading
71 |
72 |
73 | Must Read
74 |
75 | The following content provides enough info to complete the task.
76 |
77 |
78 |
79 | - [What is Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)
80 | - [Getting started with Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html)
81 | - [Common Amazon SNS scenarios](https://docs.aws.amazon.com/sns/latest/dg/sns-common-scenarios.html)
82 | - [AWS SNS FAQs](https://aws.amazon.com/sns/faqs/)
83 | - [What is Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)
84 | - [Getting started with Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.html)
85 |
86 |
87 |
88 |
89 |
90 | Additional
91 |
92 | The following content provides more info for further studies.
93 |
94 |
95 |
96 | - [Basic Amazon SQS architecture](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-basic-architecture.html)
97 | - [AWS SQS FAQs](https://aws.amazon.com/sqs/faqs/)
98 | - [Configuring a queue to trigger an AWS Lambda function](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-lambda-function-trigger.html)
99 | - [Using Amazon SNS for application-to-person (A2P) messaging](https://docs.aws.amazon.com/sns/latest/dg/sns-user-notifications.html)
100 | - [Serverless Framework: SQS](https://www.serverless.com/framework/docs/providers/aws/events/sqs)
101 | - [Serverless Framework: SNS](https://www.serverless.com/framework/docs/providers/aws/events/sns)
102 |
103 |
104 |
105 |
106 | # Assignments
107 |
108 | [AWS SQS/SNS](./task.md)
109 |
--------------------------------------------------------------------------------
/6_async_microservices_communication/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/6_async_microservices_communication/module_focus.png
--------------------------------------------------------------------------------
/6_async_microservices_communication/task.md:
--------------------------------------------------------------------------------
1 | # Task 6 (SQS & SNS, Async Microservices Communication)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | - The task is a continuation of Homework 5 and should be done in the same repo
8 | - Task goal is to create a service to be able to save products which were provided in csv file in database.
9 |
10 | ## Architecture
11 |
12 | Find the entire program architecture: [here](../Architecture.pdf).
13 |
14 |
15 | Task Focus
16 |
17 | The following image provides more info about task focus.
18 |
19 |
20 |
21 |
22 |
23 | ## Tasks
24 |
25 | ---
26 |
27 | ### Task 6.1
28 |
29 | 1. Create a lambda function called `catalogBatchProcess` under the same Serverless config file (i.e. `serverless.yaml`) of the Product Service which will be triggered by an SQS event.
30 | 2. Create an SQS queue called `catalogItemsQueue`, in the resources section of the same `serverless.yml` file.
31 | 3. Configure the SQS to trigger lambda `catalogBatchProcess` with _5 messages_ at once via `batchSize` property.
32 | 4. The lambda function should iterate over all SQS messages and create corresponding products in the products table.
33 |
34 | ### Task 6.2
35 |
36 | 1. Update the `importFileParser` lambda function in the Import Service to send each CSV record into SQS.
37 | 2. It should no longer log entries from the _readable stream_ to CloudWatch.
38 |
39 | ### Task 6.3
40 |
41 | 1. Create an SNS topic `createProductTopic` and email subscription in the resources section in `serverless.yml` of the Product Service.
42 | 2. Create a subscription for this SNS topic with an `email` endpoint type with your own email in there.
43 | 3. Update the `catalogBatchProcess` lambda function in the Product Service to send an event to the SNS topic once it creates products.
44 |
45 | ### Task 6.4
46 |
47 | 1. Commit all your work to separate branch (e.g. `task-6` from the latest `master`) in your own repository.
48 | 2. Create a pull request to the `master` branch.
49 | 3. Submit the link to the pull request for crosscheck
50 |
51 | ## Evaluation criteria (70 points for covering all criteria)
52 |
53 | ---
54 |
55 | Reviewers should verify the lambda functions, SQS and SNS topic and subscription in PR.
56 |
57 | - File `serverless.yml` contains configuration for `catalogBatchProcess` function
58 | - File `serverless.yml` contains policies to allow lambda `catalogBatchProcess` function to interact with SNS and SQS
59 | - File `serverless.yml` contains configuration for SQS `catalogItemsQueue`
60 | - File `serverless.yml` contains configuration for SNS Topic `createProductTopic` and email subscription
61 |
62 | ## Additional (optional) tasks
63 |
64 | ---
65 |
66 | - **+15** **(All languages)** - `catalogBatchProcess` lambda is covered by **unit** tests
67 | - **+15** **(All languages)** - set a Filter Policy for SNS `createProductTopic` in `serverless.yml` and create an additional email subscription to distribute messages to different emails depending on the filter for any product attribute
68 |
69 | ## Description Teamplate for PRs
70 |
71 | ---
72 |
73 | The follwoing should be present in PR's description field:
74 |
75 | 1. What was done?
76 |
77 | Example:
78 |
79 | ```
80 | Service is done, but FE is not working...
81 |
82 | Additional scope - webpack, swagger, unit tests
83 | ```
84 |
85 | 2. Link to Product Service and Import Service APIs - .....
86 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
87 |
88 | 4. In case SWAGGER file is not provided - please provide product schema in PR description
89 |
--------------------------------------------------------------------------------
/7_authorization/README.md:
--------------------------------------------------------------------------------
1 | # Authorization
2 |
3 | # Goal
4 |
5 | - Learn what authorization in AWS is all about
6 | - Explore different authorization concepts and services like Cognito, user pool, etc.
7 | - Set up an authorization via AWS Lambda and AWS Cognito
8 |
9 | # Topics
10 |
11 | - Authentication & Authorization overview
12 | - Lambda Authorizer & API Gateway
13 | - AWS Cognito overview
14 | - Cognito User Pool
15 | - Cognito Identity Pool
16 |
17 | # Materials
18 |
19 | ## Video
20 |
21 |
22 | Must Watch
23 |
24 | The following content provides enough info to complete the task.
25 |
26 |
27 |
28 |
29 | In English
30 |
31 |
32 |
33 | - [Authorization](https://videoportal.epam.com/video/mYQroEJp), ~93 mins
34 |
35 |
36 |
37 |
38 | In Russian
39 |
40 |
41 |
42 | - [RU Introduction](https://videoportal.epam.com/video/vbdGYloE9zAppoZDaWqy), ~2 mins
43 | - [RU Authorization Process in General](https://videoportal.epam.com/video/lNdwY9MyyQelBepYy2Gk), ~24 mins
44 | - [RU Lambda Authorization](https://videoportal.epam.com/video/njDdYP6E9eQ0o8Vz72Xb), ~3 mins
45 | - [RU Lambda Authorization Practice](https://videoportal.epam.com/video/59pZaAyDpPzPmPv6aNzq), ~28 mins
46 | - [RU Hometask](https://videoportal.epam.com/video/wPQe73vNZg0qAXW6JAqn), ~16 mins
47 | - [RU Cognito Authorization](https://videoportal.epam.com/video/1g5mYRWy2OQNg6jJWoDG), ~8 mins
48 | - [RU Cognito Authorization Practice](https://videoportal.epam.com/video/MRwdYoVdbPkXv65Wa3bL), ~22 mins
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | Additional
58 |
59 | The following content provides more info for further studies.
60 |
61 |
62 |
63 | - [Secure your API Gateway with Amazon Cognito User Pools](https://www.youtube.com/watch?v=oFSU6rhFETk), ~31 mins
64 | - [Secure your API Gateway with Lambda Authorizer](https://www.youtube.com/watch?v=al5I9v5Y-kA), ~25 mins
65 | - [Beyond authentication: Guide to secure Amazon Cognito applications](https://www.youtube.com/watch?v=QDR-pX7Ho8k), ~26 mins
66 | - [Fine-grained Access Control with Amazon Cognito Identity Pools](https://www.youtube.com/watch?v=tAUmz94O2Qo), ~20 mins
67 | - [Serverless Authentication and Authorization](https://www.youtube.com/watch?v=VZqG7HjT2AQ), 53mins
68 |
69 |
70 |
71 |
72 | ## Reading
73 |
74 |
75 | Must Read
76 |
77 | The following content provides enough info to complete the task.
78 |
79 |
80 |
81 | - [What is Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)
82 | - [Getting started with Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-getting-started.html)
83 | - [Amazon Cognito user pools](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html)
84 |
85 |
86 |
87 |
88 |
89 | Additional
90 |
91 | The following content provides more info for further studies.
92 |
93 |
94 |
95 | - [Customizing user pool workflows with Lambda triggers](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html)
96 | - [Use API Gateway Lambda authorizers](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)
97 | - [Control access to a REST API using Amazon Cognito user pools as authorizer](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)
98 |
99 |
100 |
101 |
102 | # Assignments
103 |
104 | [Lambda Authorizer + Cognito Authorization](./task.md)
105 |
--------------------------------------------------------------------------------
/7_authorization/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/7_authorization/module_focus.png
--------------------------------------------------------------------------------
/7_authorization/task.md:
--------------------------------------------------------------------------------
1 | # Task 7 (Authorization)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | - The task is a continuation of Homework 6 and should be done in the same repo.
8 |
9 | ## Architecture
10 |
11 | Find the entire program architecture: [here](../Architecture.pdf).
12 |
13 |
14 | Task Focus
15 |
16 | The following image provides more info about task focus.
17 |
18 |
19 |
20 |
21 |
22 | ## Tasks
23 |
24 | ---
25 |
26 | ### Task 7.1
27 |
28 | 1. Create a new service called `authorization-service` at the same level as Product and Import services with its own `serverless.yml` file. The backend project structure should look like this:
29 |
30 | ```
31 | backend-repository
32 | product-service
33 | import-service
34 | authorization-service
35 | ```
36 |
37 | 2. Create a lambda function called `basicAuthorizer` under the same Serverless config file (i.e. `serverless.yaml`) of the Authorization Service.
38 | 3. This lambda should have at least one environment variable with the following credentials:
39 |
40 | ```
41 | {yours_github_account_login}=TEST_PASSWORD
42 | ```
43 |
44 | - `{yours_github_account_login}` - your GitHub account name. Login for test user should be your GitHub account name
45 | - `TEST_PASSWORD` - password string. Password for test user must be "TEST_PASSWORD"
46 | - example: `johndoe=TEST_PASSWORD`
47 |
48 | 3. This `basicAuthorizer` lambda should take _Basic Authorization_ token, decode it and check that credentials provided by token exist in the lambda environment variable.
49 | 4. This lambda should return 403 HTTP status if access is denied for this user (invalid `authorization_token`) and 401 HTTP status if Authorization header is not provided.
50 |
51 | _NOTE: Do not send your credentials to the GitHub. Use `.env` file and `serverless-dotenv-plugin` serverless plugin to add environment variables to the lambda. Add `.env` file to `.gitignore` file._
52 |
53 | ```
54 | .env file example:
55 | vasiapupkin=TEST_PASSWORD
56 | ```
57 |
58 | ### Task 7.2
59 |
60 | 1. Add Lambda authorization to the `/import` path of the Import Service API Gateway.
61 | 2. Use your `basicAuthorizer` lambda as the Lambda authorizer
62 |
63 | ### Task 7.3
64 |
65 | 1. Request from the client application to the `/import` path of the Import Service should have _Basic Authorization_ header:
66 |
67 | ```
68 | Authorization: Basic {authorization_token}
69 | ```
70 |
71 | - `{authorization_token}` is a base64-encoded `{yours_github_account_login}:TEST_PASSWORD`
72 | - example: `Authorization: Basic sGLzdRxvZmw0ZXs0UGFzcw==`
73 |
74 | 2. Client should get `authorization_token` value from browser [localStorage](https://developer.mozilla.org/ru/docs/Web/API/Window/localStorage)
75 |
76 | ```
77 | const authorization_token = localStorage.getItem('authorization_token')
78 | ```
79 |
80 | ### Task 7.4
81 |
82 | 1. Commit all your work to separate branch (e.g. `task-7` from the latest `master`) in your own repository.
83 | 2. Create a pull request to the `master` branch.
84 | 3. Submit the link to the pull request for crosscheck
85 |
86 | ## Evaluation criteria (70 points for covering all criteria)
87 |
88 | ---
89 |
90 | Provide your reviewers with the link to the repo, client application and URLs to execute the `/import` path of the Import Service`
91 |
92 | - `authorization-service` is added to the repo, has correct `basicAuthorizer` lambda and correct `serverless.yaml` file
93 | - Import Service `serverless.yaml` file has authorizer configuration for the `importProductsFile` lambda. Request to the `importProductsFile` lambda should work only with correct `authorization_token` being decoded and checked by `basicAuthorizer` lambda. Response should be in 403 HTTP status if access is denied for this user (invalid `authorization_token`) and in 401 HTTP status if Authorization header is not provided.
94 | - Client application is updated to send "Authorization: Basic `authorization_token`" header on import. Client should get `authorization_token` value from browser [localStorage](https://developer.mozilla.org/ru/docs/Web/API/Window/localStorage)
95 |
96 | ## Additional (optional) tasks
97 |
98 | ---
99 |
100 | _NOTE: Recommended for personal growth and further interviews, but this part would not be evauated on cross-check._
101 |
102 | - **+30** - Client application should display alerts for the responses in 401 and 403 HTTP statuses. This behavior should be added to the `nodejs-aws-fe-main/src/index.tsx` file.
103 | - **Just Practice, No Evaluation** - Add Login page and protect `getProductsList` lambda by the Cognito Authorizer
104 | - Create Cognito User Pool using a demo from the lecture. Leave `email` in a list of standard required attributes. Checkbox `Allow users to sign themselves up` should be checked. Also, set `email` as an attribute that you want to verify.
105 | - Add `App Client` to the User Pool
106 | - In the `App Client Settings` section select all `Identity Providers`. Fill the `Callback URL(s)` field with your Client Application URL (i.e. `http://localhost:3000/`). Allow only `Authorization code grant` OAuth Flow. Allow all `OAuth Scopes`
107 | - Create Domain name
108 | - After all of these manipulations, you can open your `Login Page` by clicking on the `Launch Hosted UI` link in the `App Client Settings`
109 | - Provide this link to your reviewers. The reviewer can just confirm that everything works for him too.
110 | - Add Cognito authorizer to the `getProductsList` lambda. Use `Authorization` as a `Token Source`
111 | - How to make sure that everything works as expected:
112 | - Open Login Page and `Sign Up` a new user. Use a real email address to create this user
113 | - Verify user using code from the email
114 | - After verification and after every login you will be redirected to the Client application. URL should contain `id_token` which can be used to access the `getProductsList` lambda
115 | - Call `getProductsList` lambda using `id_token` as a value for the `Authorization` header
116 | - Remove authorization from the `getProductsList` after your task will be checked
117 |
--------------------------------------------------------------------------------
/8_integration_with_sql_database/README.md:
--------------------------------------------------------------------------------
1 | # Integration with RDS
2 |
3 | # Goal
4 |
5 | - Explore different database concepts and services
6 | - Set up an integration with AWS RDS
7 |
8 | # Topics
9 |
10 | - Relational Databases Theory
11 | - SQL Overview
12 | - Overview of AWS database offering
13 | - AWS RDS and its engines
14 | - Serveless functions & AWS RDS
15 |
16 | # Materials
17 |
18 | ## Video
19 |
20 |
21 | Must Watch
22 |
23 | The following content provides enough info to complete the task.
24 |
25 |
26 |
27 |
28 | In English
29 |
30 |
31 |
32 | - [AWS Cloud Databases - part4. Creating RDS instance](https://videoportal.epam.com/video/5dVAaZODqrm2ANBWY9vo), ~5 mins
33 | - [AWS Cloud Databases - part5. Data manipulation with DBeaver and PSQL](https://videoportal.epam.com/video/wPQe73vAKB1oE1bgJAqn), ~16 mins
34 | - [AWS Cloud Databases - part6. Using database from nest.js application](https://videoportal.epam.com/video/EKz1JeNomrMvmy9Q7v5Q), ~17 mins
35 |
36 |
37 |
38 |
39 | In Russian
40 |
41 |
42 |
43 | - [RU Databases Intro](https://videoportal.epam.com/video/EKz1JeNKNODrw0vZ7v5Q), ~55 mins
44 | - [RU Databases in AWS](https://videoportal.epam.com/video/pZWva8oyobZWbRwB71m3), ~26 mins
45 | - [RU AWS Practice with Databases](https://videoportal.epam.com/video/VKQwJWzqPLl4MnAY1EWv), ~46 mins
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Additional
55 |
56 | The following content provides more info for further studies.
57 |
58 |
59 |
60 | - [Journey to the Cloud - The Why](https://youtu.be/ot7joOiUG3o), ~24mins
61 | - [What is Amazon RDS and How It Works](https://www.youtube.com/watch?v=tLp8pPNdDXQ), ~13 mins
62 | - [Amazon Relational Database Service (Amazon RDS)](https://www.youtube.com/watch?v=igRfulrrYCo), ~63 mins
63 | - [SQL vs NoSQL Explained](https://www.youtube.com/watch?v=ruz-vK8IesE), ~12 mins
64 | - [How to Choose a Database on AWS](https://www.youtube.com/watch?v=eK_umMYxZfM), ~7 mins
65 |
66 |
67 |
68 |
69 | ## Reading
70 |
71 |
72 | Must Read
73 |
74 | The following content provides enough info to complete the task.
75 |
76 |
77 |
78 | - [What is AWS RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)
79 | - [Getting started with Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.html)
80 | - [AWS RDS FAQs](https://aws.amazon.com/rds/faqs/)
81 |
82 |
83 |
84 |
85 |
86 | Additional
87 |
88 | The following content provides more info for further studies.
89 |
90 |
91 |
92 | - [Best practices for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html)
93 | - [Using Amazon RDS with Amazon VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.html)
94 | - [A guide to understanding database scaling patterns](https://www.freecodecamp.org/news/understanding-database-scaling-patterns/)
95 |
96 |
97 |
98 |
99 | # Assignments
100 |
101 | [Cloud Databases Overview and integration with Database](./task.md)
102 |
--------------------------------------------------------------------------------
/8_integration_with_sql_database/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/8_integration_with_sql_database/module_focus.png
--------------------------------------------------------------------------------
/8_integration_with_sql_database/task.md:
--------------------------------------------------------------------------------
1 | # Task 8 (Integration with SQL Database)
2 |
3 | ## Architecture
4 |
5 | Find the entire program architecture: [here](../Architecture.pdf).
6 |
7 |
8 | Task Focus
9 |
10 | The following image provides more info about task focus.
11 |
12 |
13 |
14 |
15 |
16 | ## Tasks
17 |
18 | ---
19 |
20 | ### Task 8.1
21 |
22 | 1. Fork a copy of [Cart Service template repository](https://github.com/boale/rs-cart-api)
23 | 2. Use the guide (https://docs.nestjs.com/faq/serverless) to integrate Nest.js application with serverless.
24 | 3. Deploy your code to AWS Lambda
25 |
26 | _Actually, it's not recommended having routing inside AWS Lambda, since it can be done by other services such as API Gateway.
27 | But it's the easiest way to deploy application, and it's done only for educational approaches._
28 |
29 |
30 | ### Task 8.2
31 |
32 | 1. Use AWS Console to create a database instance in RDS with PostgreSQL and default configuration.
33 | 2. Connect to database instance via a tool called [DBeaver](https://dbeaver.io/download/) or any other similar tools like DataGrip/PgAdmin
34 | 3. Create the following tables:
35 |
36 | Cart model:
37 |
38 | ```
39 | carts:
40 | id - uuid (Primary key)
41 | user_id - uuid, not null (It's not Foreign key, because there is no user entity in DB)
42 | created_at - date, not null
43 | updated_at - date, not null
44 | status - enum ("OPEN", "ORDERED")
45 |
46 | ```
47 |
48 | Cart Item model:
49 |
50 | ```
51 | cart_items:
52 | cart_id - uuid (Foreign key from carts.id)
53 | product_id - uuid
54 | count - integer (Number of items in a cart)
55 | ```
56 |
57 |
58 | 4. Write SQL script to fill tables with test examples. Store it in your Github repository. Execute it for your DB to fill data.
59 |
60 | ### Task 8.3
61 |
62 | 1. Update source code in the application to use PostgreSQL instead of memory storage.
63 | - [Here](https://github.com/nestjs/nest/tree/master/sample/07-sequelize) you can find example of itegration with typeorm.
64 | - Or you can use a simpler library such as [pg](https://www.npmjs.com/package/pg).
65 | 2. Integrate with RDS
66 | 3. Extend your `serverless.yml` file with credentials to your database instance and pass it to lambda’s environment variables section.
67 |
68 |
69 | ### Task 8.4
70 |
71 | 1. Commit all your work to separate branch (e.g. `task-8` from the latest `master`) in your new repository.
72 | 2. Create a pull request to the `master` branch.
73 | 3. Submit the link to the pull request for crosscheck
74 |
75 |
76 | ## Evaluation criteria (70 points for covering all criteria)
77 |
78 | ---
79 |
80 | Reviewers should verify the lambda functions by invoking them through provided URLs.
81 |
82 | - Task 8.1 is implemented
83 | - Task 8.2 is implemented
84 | - Task 8.3 is implemented lambda links are provided and cart's data is stored in DB
85 |
86 | ## Additional (optional) tasks
87 |
88 | ---
89 |
90 | - **+20** **(All languages)** - Create orders table and integrated with it
91 | Order model:
92 | ```
93 | orders:
94 | id - uuid
95 | user_id - uuid
96 | cart_id - uuid (Foreign key from carts.id)
97 | payment - JSON
98 | delivery - JSON
99 | comments - text
100 | status - ENUM or text
101 | total - number
102 | ```
103 | Set `status` to 'ORDERED' after checkout instead of cart deletion.
104 | - **+4** **(All languages)** - Create users table and integrate with it
105 | - **+3** **(All languages)** - Transaction based creation of checkout
106 | - **+3** **(All languages)** - Integrate Cart service with FE repository
107 |
108 | ## Description Template for PRs
109 |
110 | ---
111 |
112 | The following should be present in PR's description field:
113 |
114 | 1. What was done?
115 |
116 | Example:
117 |
118 | ```
119 | Service is done, but creation is not working...
120 |
121 | Additional scope - transaction, FE
122 | ```
123 |
124 | 2. Link to Cart Service API - .....
125 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
126 |
--------------------------------------------------------------------------------
/9_containerization/README.md:
--------------------------------------------------------------------------------
1 | # Containerization
2 |
3 | # Goal
4 |
5 | - Learn what Docker is all about
6 | - Explore different Docker related concepts and AWS Elastic Beanstalk service.
7 | - Set up a Dockerfile and an integration with AWS Elastic Beanstalk
8 |
9 | # Topics
10 |
11 | - Docker overview
12 | - Dockerfiles & Images
13 | - Containers & VMs
14 | - Docker Build Optimizations
15 | - AWS Elastic Beanstalk overview
16 | - AWS EB CLI
17 |
18 | # Materials
19 |
20 | ## Video
21 |
22 |
23 | Must Watch
24 |
25 | The following content provides enough info to complete the task.
26 |
27 |
28 |
29 |
30 | In English
31 |
32 |
33 |
34 | - [TBD](https://videoportal.epam.com/), ~0 mins
35 |
36 |
37 |
38 |
39 | In Russian
40 |
41 |
42 |
43 | - [RU Introduction](https://videoportal.epam.com/video/zXWOJMdEVE9OVpbkYnDv), ~3 mins
44 | - [RU Docker is for Everyone](https://videoportal.epam.com/video/PoBNYOZMnM5nZ4Rra4Gn), ~6 mins
45 | - [RU Docker Ecosystem](https://videoportal.epam.com/video/nDBqYL4NON01E6OxYXER), ~32 mins
46 | - [RU Advanced Dockerfile Techniques](https://videoportal.epam.com/video/elN67KVlplQ5q6lWJVZz), ~12 mins
47 | - [RU Dockerizing a Simple Application](https://videoportal.epam.com/video/4MNVYj1EbEd099b1a0eE), ~3 mins
48 | - [RU Introduction to AWS Elastic Beanstalk](https://videoportal.epam.com/video/lNdwY9xWEWK3R5jQay2G), ~6 mins
49 | - [RU Deploy and Delete an Application with AWS Elastic Beanstalk](https://videoportal.epam.com/video/9w0kaEMkgADoxK5aeLnD), ~55 mins
50 | - [RU Homework](https://videoportal.epam.com/video/430e7n2y1y9LEbQX76PM), ~6 mins
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | Additional
60 |
61 | The following content provides more info for further studies.
62 |
63 |
64 |
65 | - [Docker Containers 101](https://www.youtube.com/watch?v=eGz9DS-aIeY), ~23 mins
66 | - [AWS Elastic Beanstalk Hands-On Tutorial](https://www.youtube.com/watch?v=jnMUp2c9AzA), ~29 mins
67 | - [PaaS – From Code to Running Application using AWS Elastic Beanstalk](https://www.youtube.com/watch?v=lmT7QI8IIiM), ~54 mins
68 | - [Elastic Beanstalk Features & Config](https://www.youtube.com/watch?v=PKjbuxnispM), ~19 mins
69 |
70 |
71 |
72 |
73 | ## Reading
74 |
75 |
76 | Must Read
77 |
78 | The following content provides enough info to complete the task.
79 |
80 |
81 |
82 | - [What is AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/Welcome.html)
83 | - [Getting started using Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/GettingStarted.html)
84 | - [Elastic Beanstalk concepts](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.html)
85 |
86 |
87 |
88 |
89 |
90 | Additional
91 |
92 | The following content provides more info for further studies.
93 |
94 |
95 |
96 | - [Configuring your development machine for use with Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/chapter-devenv.html)
97 | - [Learning Containers From The Bottom Up](https://iximiuz.com/en/posts/container-learning-path/)
98 | - [Web application Development with AWS Elastic Beanstalk](https://aws-elastic-beanstalk-webapp.workshop.aws)
99 |
100 |
101 |
102 |
103 | # Assignments
104 |
105 | [Docker. AWS Elastic Beanstalk](./task.md)
106 |
--------------------------------------------------------------------------------
/9_containerization/module_focus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/9_containerization/module_focus.png
--------------------------------------------------------------------------------
/9_containerization/task.md:
--------------------------------------------------------------------------------
1 | # Task 9 (Docker and AWS Elastic Beanstalk)
2 |
3 | ## Prerequisites
4 |
5 | ---
6 |
7 | - [AWS EB CLI](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html) must be installed
8 | - [Docker](https://docs.docker.com/get-docker/) must be installed
9 |
10 | ## Architecture
11 |
12 | Find the entire program architecture: [here](../Architecture.pdf).
13 |
14 |
15 | Task Focus
16 |
17 | The following image provides more info about task focus.
18 |
19 |
20 |
21 |
22 |
23 | ## Tasks
24 |
25 | ---
26 |
27 | ### Task 8.1
28 |
29 | 1. Fork a copy of [Cart Service template repository](https://github.com/boale/rs-cart-api)
30 |
31 | 2. **Create** Dockerfile that will build a docker image to run the Cart Service.
32 |
33 | 3. Make sure to perform the following steps:
34 |
35 | - Add `.dockerignore` file to minimize build context.
36 | - Files and folders generated by the application or npm should be excluded.
37 | - Provide explanations to why the folder was ignored.
38 |
39 | 3. **Optimize** your image/container
40 |
41 | - Minimize docker image size to be `less than 500 MB`.
42 | - Optimize image build times. Dockerfile commands that run npm install should not depend on typescript files.
43 | - _OPTIONAL: add more folders to `.dockerignore` with explanations_
44 | - _OPTIONAL: Minimize docker image size to `about 100 MB`._
45 | - _OPTIONAL: Optimize build times by utilizing multistage builds._
46 | - _OPTIONAL: Lint Dockerfile._
47 |
48 | ### Task 8.2
49 |
50 | 1. Prepare Cart Service infrastructure with Elastic Beanstalk.
51 |
52 | - **Use** a `Dockerfile` from previous subtask to deploy your Cart Service using AWS Beanstalk CLI.
53 | - **Initiate** an Elastic Beanstalk application using the `eb init` command. Application name must follow the following convention `{yours_github_account_login}-cart-api`.
54 | - **Create** a new environment using the `eb create` command. An environment name must be short _but not less then four signs_ (e.g _develop_, _test_, _prod_, etc). Use the `--cname` option `{yours_github_account_login}-cart-api-{environment_name}` so that Elastic Beanstalk will use it to create a proper domain name. Use the `--single` option to not use any Load Balancer for this environment.
55 |
56 | 2. Deploy Cart Service with Elastic Beanstalk
57 |
58 | - **Investigate** AWS Elastic Beanstalk service in the AWS Console.
59 | - **Walk through** EC2 resources that were created by Elastic Beanstalk
60 | - **Update** the app and deploy changes using the `eb deploy` command.
61 |
62 | 3. Update FE app
63 |
64 | - **Pull** the latest version of the app from repo
65 | - **Replace** Cart Service placeholder in `src/constants/apiPaths.ts` using a Cart Service API URL you get after successful deployment.
66 | - **Make sure** your app starts to call Cart Service API when you add or remove items.
67 |
68 | _NOTE: Now after page refresh cart’s content might remain the same._
69 |
70 | ### Task 8.3
71 |
72 | 1. Commit all your work to separate branch (e.g. `task-8` from the latest `master`) in your own repository.
73 | 2. Create a pull request to the `master` branch.
74 | 3. Submit the link to the pull request for crosscheck
75 |
76 | ## Evaluation criteria (70 points for covering all criteria)
77 |
78 | ---
79 |
80 | - `Dockerfile` is prepared, image is building. Image size is minimized to be less than 500 MB.
81 | - `Dockerfile` is optimized. Files that change more often and commands that depend on them should be included later, files and commands that change less should be at the top.
82 | - Folders are added to .dockerignore, with explanations. At least 2 big directories should be excluded from build context. Elastic Beanstalk application is initialized.
83 |
84 | ## Additional (optional) tasks
85 |
86 | ---
87 | - **15** - Environment is created and the app is deployed to the AWS cloud. You must provide a link to your GitHub repo with Cart Service API or PR with created `Dockerfile` and related configurations.
88 | - **15** - FE application is updated with Cart API endpoint. You must provide a PR with updates in your FE repository and OPTIONALLY link to deployed front-end app which makes proper API calls to your Cart Service.
89 |
90 | ## Description Teamplate for PRs
91 |
92 | ---
93 |
94 | The follwoing should be present in PR's description field:
95 |
96 | 1. What was done?
97 |
98 | Example:
99 |
100 | ```
101 | Service is done, but FE is not working...
102 |
103 | Additional scope - webpack, swagger, unit tests
104 | ```
105 |
106 | 2. Link to Cart Service API - .....
107 | 3. Link to FE PR (YOUR OWN REPOSITORY) - ...
108 |
109 | 4. In case SWAGGER file is not provided - please provide product schema in PR description
110 |
--------------------------------------------------------------------------------
/Architecture.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EPAM-JS-Competency-center/cloud-development-course-initial/de4fca15051f0d2cdd72502288e39430db80a389/Architecture.pdf
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AWS JavaScript Developer
2 | First steps in modern cloud development with Node.js
3 |
4 | ## Description
5 |
6 | Cross-country global mentoring program which aims at improving corresponding hands-on skills of full-stack development with a main focus on NodeJS in AWS Cloud from e2e application perspective.
7 |
8 | The program consists of more than 10 step-by-step practice tasks that will result in practical experience working with Node.js artifacts implementing partials of RESTful API web server and relevant components, deploying and hosting micro-service application in AWS Cloud, and hands-on experience working with Cloud Databases.
9 |
10 | ## What you should know before starting
11 |
12 | ### Required before the start
13 |
14 | - Good knowledge of HTML, CSS, Javascript is highly recommended before starting the course.
15 | - Basic knowledge of Git, GitHub, Typescript is highly recommended before starting the course.
16 | - Basic computer science theory (data structures, algorithms, maths) is recommended before starting the course.
17 | - English language level: Intermediate (B1) and up.
18 | - Being able to spend **at least 20 hours** per week studing
19 |
20 | ### What to do if you lack base knowledge
21 |
22 | - Take a course in [Computer Science](https://rkhaslarov.github.io/computer-science-introduction).
23 | - Read a good [Javascript tutorial](https://javascript.info/).
24 | - Use [Codewars platform](https://www.codewars.com/kata/search/javascript) to solve practical tasks. You can start with [simple ones](https://www.codewars.com/kata/search/javascript?q=&r%5B%5D=-8&beta=false).
25 | - Take free online courses:
26 | - [Learn the Command Line](https://www.codecademy.com/learn/learn-the-command-line)
27 | - [Learn Git](https://www.codecademy.com/learn/learn-git)
28 | - [Intro to Computer Science](https://www.udacity.com/course/cs101)
29 | - [Algorithms](https://www.coursera.org/course/algs4partI)
30 | - Believe in your strength!
31 |
32 | ## Course Goal
33 |
34 | By completing this program a participant will be able to:
35 |
36 | 1. Get hands-on experience in e2e application development (full-stack)
37 | 2. Get hands-on experience with AWS (S3, SNS, SQS, and so on) and NodeJS
38 | 3. Obtain intermediate knowledge about micro-service architecture, serverless architecture, etc.
39 |
40 | ## Course Architecture
41 |
42 | This program covers a wide range of topics according to the following [architecture](./Architecture.pdf).
43 |
44 | ## Course Curriculum
45 |
46 | This program will have theory and practice on the following topics:
47 |
48 | ### Module 1 - [Cloud Introduction](./1_cloud_introduction/README.md)
49 | - Fundamental Theory about Cloud Computing
50 | - Cloud Service Models, Cloud Deployment Models, Infrastructure-as-Code
51 | - Monolith vs Microservices vs Serverless
52 | - AWS Intro, Registration, Cloud Watch, IAM
53 | - Repository structure
54 |
55 | ### Module 2 - [Serving SPA](./2_serving_spa/README.md)
56 | - AWS Simple Storage Service overview
57 | - Services & Tools overview
58 | - AWS CloudFront overview
59 | - Basic overview of deployment process to CloudFront and S3
60 | - Serverless Framework overview
61 | - AWS CLI overview
62 |
63 | ### Module 3 - [Serverless API](./3_serverless_api/README.md)
64 | - AWS Lambda Overview
65 | - Serverless Framework and Lambda
66 | - Introduction to Collecting logs with AWS CloudWatch
67 | - Lambda Advanced Features and Configuration
68 |
69 | ### Module 4 - [Integration with Database](4_integration_with_nosql_database/README.md)
70 | - Relational Databases Theory
71 | - SQL Overview
72 | - Overview of AWS database offering
73 | - AWS RDS and its engines
74 | - Serveless functions & AWS RDS
75 |
76 | ### Module 5 - [Integration with S3](./5_integration_with_s3/README.md)
77 | - AWS S3 In-depth Introduction
78 | - S3 Storage Classes and their Use Cases
79 | - S3 Access Control & Encryption
80 | - S3 Versioning, Lifecycle Management & Events
81 | - Integration with S3 and Lambda Overview
82 |
83 | ### Module 6 - [Async Microservices Communication](./6_async_microservices_communication/README.md)
84 | - Async Messaging Overview
85 | - AWS SQS Overview
86 | - AWS SNS Overview
87 | - Integration with SQS, SNS and Lambda Overview
88 |
89 | ### Module 7 - [Authorization](./7_authorization/README.md)
90 | - Authentication & Authorization overview
91 | - Lambda Authorizer & API Gateway
92 | - AWS Cognito overview
93 | - Cognito User Pool
94 | - Cognito Identity Pool
95 |
96 | ### Module 8 - [Containerization](9_containerization/README.md)
97 | - Docker overview
98 | - Dockerfiles & Images
99 | - Containers & VMs
100 | - Docker Build Optimizations
101 | - AWS Elastic Beanstalk overview
102 | - AWS EB CLI
103 |
104 | ### Module 9 - [Backend For Frontend](10_backend_for_frontend/README.md)
105 | - Backend for Frontend overview
106 | - BFF as Pattern
107 | - API Gateway as BFF
108 | - AWS Elastic Beanstalk configuration
109 |
--------------------------------------------------------------------------------