---
# System prepended metadata

title: AWS Practise Note
tags: [aws, practise]

---

# 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

![](https://i.imgur.com/fTrK2TZ.png)

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

![](https://i.imgur.com/vfq86hX.png)

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
![](https://i.imgur.com/XVBiTBp.png)
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è
![](https://i.imgur.com/Gmcjs7Q.png)

**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

![](https://i.imgur.com/h0OdRmq.png)


**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
![](https://i.imgur.com/cg7xK0b.png)

**Gán CloudTrail** vào AWS bằng cách tạo 1 Trail, Edit ở Management events và Data events (chọn S3)
![](https://i.imgur.com/jAfurg5.png)


**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
![](https://i.imgur.com/mNrnpnm.png)

**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
```
![](https://i.imgur.com/lnhL4zE.png)

=> 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

![](https://i.imgur.com/0u6ol7p.png)





# 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

![](https://i.imgur.com/v3RiV8Q.png)

**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
![](https://i.imgur.com/AfXICyS.png)

Khi tạo code mới thì cần phải Deploy rồi bấm test
![](https://i.imgur.com/qYDaNU6.png)





# 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

![](https://i.imgur.com/MS8BO8W.png)

**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
![](https://i.imgur.com/eOlyoEa.png)
- 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.
![](https://i.imgur.com/Uu1La0Y.png)  
*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
![](https://i.imgur.com/tl6hSzb.png)
- 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
![](https://i.imgur.com/bIBByBw.jpg)

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
![](https://i.imgur.com/zU8knLL.png)

