# Whizlabs là gì
Là website để cung cấp các bài thực hành & học AWS
Mỗi lab ở whizlabs, khi click **Start Lab**, system sẽ init một IAM với Permission vừa đủ cho bài lab và sẽ drop IAM này khi hết giờ hoặc khi User bấm **End Lab**.
User sẽ thực hành bằng cách Login vào AWS sử dụng IAM được cấp
---
# CloudWatch - Creating a CloudWatch Dashboard for EC2 Instance
> Link: https://www.whizlabs.com/labs/creating-a-cloudwatch-dashboard-for-ec2-instance
Desc: Tạo Cloudwatch follow thông số của Instance EC2
# ELB - Introduction to AWS Elastic Load Balancing
> Link: https://www.whizlabs.com/labs/introduction-to-aws-elastic-load-balancing
Desc: Open 1 cái Load Balancing đê serve cho 2 con Instance EC2
# CloudFront - Use Amazon CloudFront for dynamic Websites 25/11/2022
> Link: https://www.whizlabs.com/labs/use-amazon-cloudfront-for-dynamic-websites

Desc: Tạo 2 instance > tạo LB để load 2 instance > Tạo CloudFont để cache cái LB > DONE
# VPC - Creating a VPC Networking Environment for the Cafe 28/11
> Link https://www.whizlabs.com/labs/creating-a-vpc-networking-environment-for-the-cafe

Desc: Tạo 2 con EC2, 1 con để làm Bastion Host đặt ở Public Subnet, con còn lại đặt ở Private Subnet. Muốn SSH vào con ở private thì phải đi qua con Bastion Host, ngoài ra con ec2 ở private có thể access internet qua con Bastion Host
# VPC - How to setup a free VPN server in AWS
> Link https://www.whizlabs.com/labs/how-to-setup-a-free-vpn-server-in-aws
Lauch 1 con instance EC2, sử dụng AMI OpenVPN

Setup các thứ ở admin sau khi lauch con EC2, cuối cùng connect đến server qua tool OpenVPN ==> Done
# S3 - Generate S3 presign URL using CloudShell
> Link https://www.whizlabs.com/labs/generate-s3-presign-url-using-cloudshell
**Overview**
Upload image lên S3, dùng CloudShell để gõ lệnh generate ra S3 presign URL
**Note**
Image upload lên S3 bị chặn theo policy, lệnh này sẽ generate ra token có expired 60s, lúc đấy có thể truy cập đc image
`$ aws s3 presign [S3 URI] --expires-in 60`
S3 URI có dạng `s3://mywhizbucket1th12/smily.jpg`
# S3 - AWS S3 Multipart Upload using AWS CLI
> Link https://www.whizlabs.com/labs/aws-s3-multipart-upload-using-aws-cli
**Overview**
Chia 1 file thành nhiều file nhỏ, mỗi khi upload file thì có 1 id, cuối cùng tổng hợp list ID đấy vào 1 file và ghép vào
**Note**
Split một file thành nhiều file nhỏ
```
$ split [options] [filename] # split -b 40M video.mp4
```
Step 1. Tạo 1 multipath upload ==> lấy Upload-id
```
$ aws s3api create-multipart-upload --bucket [Bucket name] --key [original file name]
```
Step2. Upload chunk
```
$ aws s3api upload-part --bucket [bucketname] --key [filename] --part-number [number] --body [chunk file name] --upload-id [id]
```
Step3. Ghép các id vào 1 file
```
$ nano list.json
## Nội dung file
{
"Parts": [
{
"PartNumber": 1,
"ETag": "\"2771bc3662b381da1259fdf39904045a\""
},
{
"PartNumber": 2,
"ETag": "\"9fdc79d796e33027565ac06358af966d\""
},
{
"PartNumber": 3,
"ETag": "\"eb9311b12d3c23b7543f08364bfe079b\""
},
{
"PartNumber": 4,
"ETag": "\"327c0ca55097aea8cb65c8bc8eee8b4f\""
}
]
}
```
Step 4. Complete multipath-upload
```
$ aws s3api complete-multipart-upload --multipart-upload [json file link] --bucket [upload bucket name] --key [original file name] --upload-id [upload id]
```
# S3 - Creating and Subscribing to SNS Topics, Adding SNS event for S3 bucket
> Link https://www.whizlabs.com/labs/creating-and-subscribing-to-sns-topics-adding-sns-event-for-s3-bucket
Kết quả nè

**Overview**
- Tạo SNS topic > Tạo Subscriptions > Confirm Subscriptions
- Tạo S3
- Vào SNS topic > Sửa Access policy để follow SourceArn = S3 vừa tạo
- Vào S3 > Property > Event notifications > Chọn event PUT > Destination: chọn SNS topic vừa tạo
- Save lại rồi test bằng cách Upload 1 file lên S3
- DONE
**Note**
- có thể có nhiều Subscriptions cho 1 topic
# S3 - Comparing Data Transfer Speeds with S3 Transfer Acceleration
> Link https://www.whizlabs.com/labs/comparing-data-transfer-speeds-with-s3-transfer-acceleration
**Overview**
Bật Transfer Acceleration ở Bucket > properties > Transfer acceleration > Enabled
Kết quả là upload nhanh hơn
# S3 - Encrypt an S3 bucket using AWS KMS and monitor the activities with CloudTrail
> Link https://www.whizlabs.com/labs/how-to-encrypt-an-s3-bucket-using-aws-kms-and-monitor-the-activities-with-cloudtrail

**Overview**
Tạo KMS để encrypt object trong S3
**Gán KMS vào object** bằng cách vào Object detail > Server-side encryption settings > Edit > Server-side encryption = Enable; chọn Choose from your AWS KMS keys rồi gán vào

**Gán CloudTrail** vào AWS bằng cách tạo 1 Trail, Edit ở Management events và Data events (chọn S3)

**Note**
Các Object bị encrypt phải sử dụng token mới có thể get được, kể cả có public thì cũng không thể đọc được
# EC2 - Elastic Network Interface - Multiple IPs on an EC2
> Link https://www.whizlabs.com/labs/create-elastic-network-interface-multiple-ips-on-an-ec2
**Overview**
Tạo 1 con EC2 > 2 cái Security group > 1 cái attach vào con EC2, 1 cái attach vào ELP > Gán ELP vào EC2 > EC2 có 2 IP

**Note**
Có thể attach nhiều Network Interface vào 1 EC2
# EC2 - Mount Elastic File System (EFS) on EC2
> Link https://www.whizlabs.com/labs/mount-elastic-file-system-efs-on-ec2
**Overview**
Tạo 2 con EC2, tạo 1 cái EFS và assign cho nó sử dụng cùng SG với 2 con EC2
=> vào con EC2 rồi bấm cài amazon-efs-utils.
`$ yum install -y amazon-efs-utils`
=> vào con EFS mới tạo bấm vào Attach > copy command hiển thị để chạy trên EC2
```
$ sudo mount -t efs -o tls fs-0476c76ca57137e28:/ efs
```

=> vào 2 con EC2 check, tạo thử 1 file ở trong efs folder, nếu con EC2 còn lại vẫn hiện là ok
**Note**
Architech Design

# VPC - Access S3 from Private EC2 instance using VPC Endpoint
> Link https://www.whizlabs.com/labs/access-s3-from-private-ec2-instance-using-vpc-endpoint

**Overview**
=> Tạo mới 1 VPC = MyVPC
=> Tạo 1 con Internet Gateway
==> Tạo 2 subnet trong đó, 1 cái private, 1 cái public
==> Tạo 2 Route Table, 1 cái public thì gán 0.0.0.0 vào ig public, cái private thì không gán gì hết, đặt tên là **RT for Private subnet**
==> Tạo 2 Security Group, Cái 1: SG = Bastion-SG allow SSH, HTTP, HTTPS, cái còn lại SG = Endpoint-SG chỉ allow SSH từ thằng Bastion-SG
==> Tạo EC2 tên Bastion gán cho nó subnet public, Bastion-SG
==> Tạo private EC2 gán cho nó subnet public, Bastion-SG
=====> SSH vào con private EC2 qua con Bastion
=======> **Tạo VPC Endpoint** for S3 Gán VPC = **MyVPC**; Route table = **RT for Private subnet**; Service thì gán S3 Gateway
=========> SSH vào con EC2 private, gõ `aws configure` để setup key AWS, sau đó gõ `aws ls s3` để check thử có call đc đến S3 không. DONE
**Note**
**VPC Endpoint** cho phép tạo kết nối private (sử dụng hạ tầng của AWS) tới các dịch vụ của AWS thay vì đi qua kết nối Internet
# RDS - How to Query into RDS MySQL Using AWS Lambda
> Link https://www.whizlabs.com/labs/how-to-query-into-rds-mysql-using-aws-lambda
**Overview**
Dựng 1 con RDS lên > Build AWS lamda func để query trong con RDS đấy
**Note**
Cần học thêm về lambda func
Có thể import code lên Lambda bằng file .zip

Khi tạo code mới thì cần phải Deploy rồi bấm test

# Terraform - Launch an EC2 Instance
> Link https://www.whizlabs.com/labs/launch-an-ec2-instance-as-a-web-server-using-terraform
**Overview**
Build source code để dựng EC2 từ code terraform
**Note**
```
$ terraform init # để init từ file main.tf
$ terraform plan # để xem code nó làm những gì
$ terraform apply # để thực thi code
```
# Deploying a Highly Available Web Application and Bastion Host in AWS
> Link https://www.whizlabs.com/labs/deploying-a-highly-available-web-application-and-bastion-host-in-aws

**Overview**
Dựng LB để load 2 con EC2 private. Ngoài ra dựng Bastion host để còn ssh được vào 2 con EC2 private đấy
**Note**
Nhớ tạo Target group để dựng LB
---
# Các bài thực hành khác
# Dựng website wordpress trên AWS
## Step1: Dựng RDS
- Chọn RDS loại Aurora

- Instance thì chọn t3.small
- Chọn luôn initial database cho tiện lợi
## Step2: Run EC2 + cài Wordpress
- Chọn instance loại t2.small
- Security Group thì Create new 1 SG với thông số: open all cho SSH, HTTP, HTTPS
- Cài wordpress bằng cách cài apache, php, php-fpm, php-zip... & pull file về
```
$ sudo yum install -y wget httpd
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
$ sudo amazon-linux-extras install -y php7.2
$ sudo yum install php php-{pear,cgi,common,curl,mbstring,gd,mysqlnd,gettext,bcmath,json,xml,fpm,intl,zip,imap}
$ sudo systemctl restart php-fpm
$ wget https://wordpress.org/latest.tar.gz
```
giải nén và cập nhật lại cấu hình follow theo https://devopsvn.tech/xay-dung-ha-tang-phuc-vu-hang-trieu-nguoi-dung-tren-aws/bai-0-chuan-bi
- Check các kiểu, mở đc trang cấu hình wordpress ra là ok, sau đó mới đi copy file wp-config và cấu hình trỏ đến DB theo các thông số ở DB Type = writer instance
## Tạo S3 và cấu hình connect tới S3
- Tạo ra 1 cái S3 với buket policy là public. Sử dụng role sau trong Bucket Policy
```
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::<your-bucket-name>/*"
}
]
}
```
- Cài plugin **WP Offload Media Lite for Amazon S3** để kết nối tới S3, thực hiện cấu hình key các kiểu
- Xong rồi, check lại project thôi
# Dựng Auto Scaling cho website wordpress
- Tạo AMI từ EC2 đang chạy (check site wp chạy ổn định đã rồi mới tạo AMI)
- Tạo Auto Scaling Group với AMI vừa tạo ở trên. Chú ý cấu hình các thông số Desired capacity; Minimum capacity; Maximum capacity và Security Group
- Sau khi tạo xong Auto Scaling => check xem instance mới đã được tạo chưa, nếu tạo rồi thì thử truy cập vào IP xem vào đc chưa
- Tạo đến Load Balancer, ở đây Create New: Target Group = Auto Scaling Group vừa tạo ở trên
- Cuối cùng vào thử từ domain của Load balancer xem được chưa. OK xong. Mô hình vừa tạo nó sẽ giống cái bên dưới.

*Note: Chỗ này thiếu là phải cho đống EC2 kia vào trong private subnet*
# Tạo Lambda function resize image mới Upload lên S3
Link bài lab https://000078.awsstudygroup.com/vi/2-resize-image-function/
## Tạo function resize image
- Thêm trigger để run lambda function bằng cách bấm Add trigger ở màn hình chính

- Ngoài ra cần add permission để Lambda có quyền đọc, ghi object (vào Configuration > Permission > Click vào role để add permission)
## Tạo function insert DynamoDB
- Nhớ thêm permission DynamoDBFullAccess để thực thi thôi
# Viết frontend gọi API gateway
Link bài lab https://000079.awsstudygroup.com/vi/1-introduction/
Thành quả bài lab ra 1 cái web xịn

Trong quá trình làm bài lab
- Lamda function book_list cần có quyền đọc DynamoDB
- Lamda function book_create cần có quyền PutObject lên S3 > Bucket book-image-store
- Lamda function book_delete cần có quyền DeleteObject ở S3 > Bucket book-image-resize-store
- Lamda function resize image cần có quyền ReadObject & DeleteObject ở Bucket book-image-store, quyền PutObject ở Bucket book-image-resize-store
- Có thể check lại log của API dựa trên **CloudWatch**, check vào phần show all if error
