---
# System prepended metadata

title: AWS 介紹
tags: [' AWS', 人工智慧與智能應用培訓班]

---

---
title: AWS 介紹
tags: 人工智慧與智能應用培訓班, AWS
---

# AWS introduction

>講義：人工智慧與智能應用培訓班(II)

## 🍩What's the Cloud? And Why?
>透過網路遠端取得IT資源

1. **固定機房on-premise**
    - expensive capital cost
    - it costs money to maintain the server and keep it up to date
    - low flexibility：擴展率較低
    - crash will result in downtime
2. **雲端cloud computing**
    > 無伺服器：還是有實體機器，但交由別人管理
    - no capital expenditure
    - on-demand：隨需及用
    - elastic and scalable
    - pay as you go and only for what you actually used
    - allow you to focus on the function of service instead of infrastructure
### 架設雲端方式
- **All-in Cloud**：100%雲端(新興產業)
- **Hybrid**：50%機房，50%雲端(較久的產業，以前已有機房)
</br>

## 🍩AWS Background(Amazon Web Service)
- 證照期限3年(一張150鎂)
- AWS的<a href="https://www.slideshare.net/AmazonWebServices">投影片</a>
    - 最基礎的證照(foundation)：AWS Cloud Practitioner Essentials
    - <a href="https://aws.amazon.com/tw/certification/?nc2=sb_ce_co">證照說明</a>
- **lots of domain**：application integration, analytics, compute, quantum technologies, network, security, game tech, database, IoT, AR&VR, mobile, block chain, customer engagement...
</br>

## 🍩What AWS Can Do?
- DNS(Domain Name System)
    > 轉換domain name和IP
    - IP：電腦世界的名牌(ex:196.16.x.x)
    - domain name：給人看的URL (ex:www.google.com)
    - 介紹網路的<a href="https://www.youtube.com/channel/UCJQJ4GjTiq5lmn8czf8oo0Q">youtube</a>(尤其是DNS講很好)
    - 用圖片講解網路基本概念的<a href="https://www.youtube.com/channel/UCEdvq5WbYGHmHKBK5Tej98w">youtube</a>
- 應用在Airbnb
    - EC2 for servers
    - ELB for balancing traffic
    - RDS for database
    - Route53 for DNS
</br>
## 🍩AWS Global Infrastructure (AWS基礎設施)
### Data Center
- collection of servers(機房)
- around 50000~80000 servers
- customized equipments(選擇喜歡的類型當底層機器)
    - ex：x86 or ARM
    - 但無法選擇機房
- all data centers are online, no "Cold" servers
### Availability Zone(AZ)
- 多個data center組合而成
- 獨立的水電、網路、連接設備
- each AZ is within 60 miles
- 所以 AZ 之間不會互相影響
- 使用者可選擇的最小單位
- highly available, fault tolerant, and scalable
    - 高可用性：把同一個系統放在多個不同AZ，其中一個AZ壞掉時系統仍不會崩潰
- interconnected by a dedicated fiber network with high bandwidth and low latency
    - 不會有太高的延遲性(AZ距離控制在60miles以內)
### Region
- 選擇region很重要
- physical location in the world (實際的地理位置)
- have multiple AZs
- completely isolated from the other Amazon Regions (regions資源是分開的)
    - 導致不同region之間溝通較慢
    - 要換region只能重開，不能直接搬過去(慎重選擇region)
- 如何選擇region
    - 符合Global Compliance(國際規範)
        - global norms, national law, company policy
        - ex:金融資料、個資不能離開本地端
    - cost
        - 每個功能在不同地區價格都不一樣
        - 試算：service pricing
    - latency
        - 距離短，傳輸時間短
        - 試算：CloudPing.info(測試本電腦跟不同region的latency)
    - support service
        - region table
        - 想使用的功能在此region不支援
        - 新服務會先放在大的region

# Amazon S3 (Simple Storage Service)

## ❤ 基本介紹
- provide secure, durable, highly-scalable object storage
- store files in any format
- 可架設static website (只有 AWS 可)
    - 網址為 http://\<bucketname>.s3-website-us-east-1.amazonaws.com
    - 動態網頁用 EC2
- 使用時機
    - media(ex:Netflix)
    - Data Lake(數據分析的database)
    - backup tool 資料備份

### ⭐Durability and Availability *p.8*
- 會複寫到3個 AZ 以上
- 有將近100%的可靠性(99.999999999%)11個9

### ⭐Bucket
- container for objects stored
- S3 is a URL, bucket names must be unique globally

### ⭐Region *p.14*
- 選擇放哪個 region 的因素
    - 延遲
    - 成本
    - 法規要求

### ⭐Objects *p.10*
>存放在 S3 Bucket 裡的東西都稱為 Object
- 上傳成功的code：HTTP200
- http://{==demo==|bucket}.s3.amazonaws.com/{==2019-04-12/home.html==|object/key}
- Object 組成：
    - **Key** 檔名－the name of the object (不能跟 bucket 其他 object 重複)
    - **Version ID**－key 和 version 識別出每個object不同的版本
    - **Value**－資料內容
    - **Metadata** 詳細資訊－data about data you are storing
    - **Subresources**－定義 bucket 與 object關係
    - **Access Control Information**－控制 object 存取權限
- 無法做到分層資料夾，但可以 Key 的字首及分隔符號做結構
    - ex : Dev/example1.xlsx 會在Dev/結構下
- Prefix *p.15*
    - object keys in S3 are partitioned by **prefix**
    - 資料集中放在S3的一小塊區塊，那個區塊比較容易損壞(存取速度變慢等等)，所以需要 prefix 幫忙把資料分開(hash)
    - prefix 數量無限制
    - 不會影響到存取速度，因為request效能會隨著數量自動擴展，每個 prefix 每秒至少可實現 3500 個 PUT/POST/DELETE 和 5500 個 GET 請求

</br>

---

## ❤移動資料

### ⭐Data Consistency Model *p.17*
- strong read after write consistency：有人正在 write 就會等他 write 完再讓 user read (目前只有AWS使用)
- eventually consistent read：可能會讀取到舊的東西

</br>

### ⭐Moving data to S3
- 上傳到 API 的三種方式
    - Console
    - CLI ( 需要輸入憑證 )
    - SDKs ( 需要輸入憑證 )
- Multipart Upload
    - 檔案切成多個封包一起傳，S3 會自動把他組起來
    - 解決網速不夠的問題(太佔網路頻寬)
    - 若網路斷掉，則要重新上傳所有封包(解決方法：Transfer acceleration)
    - 用 CLI 或 Lifecycle 才能把失敗的資料處理掉

</br>

### ⭐Transfer Acceleration *p.37*
>解決網路不穩的狀況(不一定比較快，但會防止斷線)
    <a href="https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html">速度比較工具</a>
- 透過 CloudFront 在世界各地的 Edge Location，在 AWS 內部的骨幹網路傳輸到放置在外國的 bucket
- 使用時機
    - 從各地集中上傳至一個 S3 Bucket
    - 定期跨 Region 傳送大量資料
    - 不想用網路上傳到 S3
- \> Properties > 進階設定 > Transfer Accerleration > Enable > 上傳到他給的 endpoint

</br>

### ⭐Snow Family *p.54*
>將**大量資料**移入或移出 S3
- Snowcone－硬體大小最小(衛生紙盒)，資料搬遷及邊緣運算，8TB
- Snowball Edge－邊緣運算最強，可搭配AWS Lambda、EC2、IoT等等，100TB，100Gbps
- Snowmobile－硬體大小最大(貨櫃車)，可雲端部屬同時on-work(公司不能停止運作)，可搬遷整個資料庫甚至data center，100PB，500Gbps

</br>

---
## ❤權限

### ⭐Block Public Access 存取權限 *p.26*
> 是否可透過URL存取object
- 預設：不允許公開存取 block all public access on
- public：創建 bucket 時要把block all public access off![](https://i.imgur.com/pQPbo4h.png)
- 選擇讓哪些 object public(方法如下)
    - 對單個object make public
    - Bucket Policy(能設定的最多)
    - ACL
- Bucket Policy：決定存取的權限(用 Json 寫)
    - Resources－對哪些資源操作
    - Actions－user 能對 S3 資源做什麼
    - Effect－allow 或 deny 操作
    - Principal(委託人)－指定這個 bucket 能夠被誰使用
    - Condition－讓 policy 生效的條件
    - 可設定只能用某個網路的ip存取
    ```json=
    {
        "Version":"2012-10-17",
        "Statement":[
            {
                "Sid":"PublicRead",
                "Effect":"Allow",
                "Principal": "*",
                // *:所有人
                //"Principal":{
                //    "AWS":"arn:aws:iam::Account-ID:user/Dave"
                //}
                "Action":["s3:GetObject"],
                "Resource":["arn:aws:s3:::examplebucket"] 
                // ARN:每個object都會有的id number(可在object overview找到)
            }
        ]
    }
    ```
    - bucket名稱>permissions
    - ![](https://i.imgur.com/mqUdwKl.png)

- **Access Control List (ACL)**
    |許可|在 Bucket 上| 在 Object 上|
    |-|-|-|
    |READ|允許列出 Bucket 中的 object|允許讀取 object data 及其 metadata|
    |WRITE|允許建立、覆寫、刪除 Bucket 中的 object|不適用|
    |READ_ACP|允許讀取 Bucket ACL|允許讀取 object ACL|
    |WRITE_ACP|允許寫入 Bucket ACL|允許寫入 object ACL|
    |FULL_CONTROL|以上皆可|以上皆可|
    
    upload objects時設定
    ![](https://i.imgur.com/oQ5QLvQ.png)


</br>

### ⭐CORS (Cross-Origin Resource Sharing 跨源資源共享) *p.30*
- 瀏覽器和伺服器間確認是否互相信任並同意跨源請求(Cross-Origin Requests)
- 範例：用 S3 架設靜態網站提供使用者觀看影片，但影片在其他 Bucket 中 ，此時可在 hosting 網站的 S3 Bucket 上設定 CORS，才能從另一個 Bucket 拿取需要的影片及圖片
- \> Permissions > CORS configuration

```json=
{
    "AllowedHeaders":[
        "*"
    ],
    "AllowedMethods":[
        "PUT",
        "POST",
        "DELETE"
    ],
    "AllowedOrigins":[
        "http://www.example1.com"
    ],
    "ExposeHeaders:[]"
}
```
- bucket名稱>permissions
 ![](https://i.imgur.com/3FH32ZK.png)

- Pre-signed URL
    - 不公開，不用登入也可以上傳至 Bucket
    - 只在設定的期限內才有效
    - create方法：
        - AWS CLI: $ aws s3 presign --expires-in <Expire Time/Second> s3://BucketName/ObjectKey
        - AWS SDK: Java, .NET, Ruby, Python...

---
## ❤資料保護

### ⭐Versioning 版本控制 *p.25*
- keep multiple version of an object in the same bucket
- 打開就無法關掉，只可暫停
- 回到之前的版本，可復原刪除或覆寫的物件

- 建bucket時選擇
    ![](https://i.imgur.com/5HuGn33.png)

</br>

### ⭐MFA Delete
- 輸入一個 token 才能刪除東西 (root user 才能開)
- change the versioning state of your bucket
- permanently delete an object version
- configure MFA Delete on a bucket to ensure that data in your bucket cannot be accidentally deleted

### ⭐Protecting Data Using Encryption 資料加密 *p.34*
- in Transit: use SSL/TLS or by using client-side encryption
- Server Side Encryption(Server端加密、對稱式加密) ==會考以下縮寫==
    - **SSE-S3**(Amazon S3-Managed Keys)：每個 object 都會用唯一的金鑰加密，由 S3 管理這把金鑰，會定期輪換並提供額外保護
    - **SSE-KMS**(AWS Key Management Service)：安全提供雲端進行擴展的金鑰管理系統，使用 AWS KMS CMK 來加密 object
    - **SSE-C**(Customer-Provided Keys)：用自己提供的金鑰來加密
    - 對稱式加密：傳送人、被傳送人同時有相同的金鑰，傳送人傳送的資料會被加密處理，被傳送人可用金鑰解密
- Client Side Encryption：encrypt objects before upload

- 建bucket時選擇
    ![](https://i.imgur.com/vGcxz81.png)


</br>

### ⭐S3 Replication 複寫、備份 *p.42*
- 以==非同步==方式複寫到指定的 Bucket 中，不限同一個 AWS 帳號
- **CRR**(Cross-Region replication 跨區域複寫)
    - reduce latency－降低不同 Region 使用者的延遲 (在離 user 最近的 Region 建立複本)
    - compliance－某些合規要求將備份資料存放距離更遠
    - increase operational efficiency－不同 region 分析相同物件群，可在這些 region 保存複本
- **SRR**(Same-Region replication 同區域複寫)
    - Multi-Account using the same data
    - collect data for analysis
    - abide by data sovereignty laws
---
## ❤價格

### ⭐Storage Classes ==會考== *p.18*
- 針對每個object從最常存取至不常存取的方案排列，儲存費用最貴到最便宜，存取費用最便宜到最貴
- **Standard**－預設
- **RRS**(Reduced Redundancy Storage)－容易遺失，不建議使用
- **Intelligent-Tiering**－自動化常存取與不常存取
    - 經常存取層(frequent access tier)：30天沒存取移至不常存取層
    - 不常存取層(infrequent access tier)：資料成本較低，一被存取就移至常存取層
- **Standard IA**－針對存活時間長且不常存取的資料(較重要的資料)
    - 會存在多個AZ
- **One Zone IA**－針對存活時間長且不常存取的資料(可重建的資料)
    - 只會存在一個AZ
- **Glacier**－低成本且不常存取的資料，與standard有相同的耐用性和彈性
    - 最低儲存時間90天(不到90天就刪除也是一樣費用)
    - 存取時需3~5小時才可回覆物件，快速存取需額外付費
    - 儲存費用最便宜，存取費用最貴
- **Glacier Deep Archive**－低成本且不常存取的資料，與standard有相同的耐用性和彈性
    - 最低儲存時間180天(不到180天就刪除也是一樣費用)
    - 存取時需12小時才可回覆物件
    - 可選擇在48小時內擷取大量資料

- upload objects時設定
    ![](https://i.imgur.com/paEJUi4.png)


</br>

### ⭐生命週期規則(Lifecycle Policy) *p.23*
- 讓每個object隨著設定好的週期自動移轉到其他儲存方案
- 管理儲存方案，管理版本控制(Versioning)
- Transition actions(轉換動作)－定義何時轉成另一個儲存方案
- Expiration actions(過期動作)－定義過期時間，代替使用者刪除過期物件


## 統整
- 依照 data type, storage format... 決定要用 Amazon EBS 或 Amazon S3 儲存資料
- 傳送資料可用：AWS Snowball, AWS Snowmobile, Amazon Storage Gateway *p.57*
- 讓 S3 當作 EC2 的儲存空間*p.59*(非官方)
官方是 EBS 當 EC2 儲存空間
- 說服別人用 S3
    - cheap 
    - 11個9的可靠度 
    - 儲存大小沒有限制
    - read after write
    - 存放3個以上不同 AZ
    - static website
- upload data
    - transfer accerleration：解決網路不穩
    - snow family：大量資料
    - multipart upload：頻寬不夠
    - storage gateway
- access control
    - block public access(人的權限)
        - bucket policy
        - make public
        - ACL
    - CORS：別人想 import 你網頁的物件(網頁的權限)
    - Pre-signed URL：user 不用識別就可上傳資料(有期限)
- protect
    - SSE-SS, SSE-KMS, SSE-C
    - versioning
    - MFA delete
    - SRR, CRR
<br>

# AWS EC2
- Virtual Server(Virtual Machine) in the Cloud(虛擬機)
- Web hosting Enterprise apps, Authentication, Database Analytics applications, just like a server
- 跟自己的電腦區隔，不會把自己的電腦用亂
- 可架動態網站
- 用到中毒就再開一台就好，不怕懲罰
- 非託管的服務：可靠性需要靠自己，不會自動幫你放多個 AC

## ⭐AMIs(Amazon Machine Images) *p.61*
- EC2 的作業系統
- Linux, Windows, macOS 等等
- 取得 AMI 方法
    - 去 Marketplace 買廠商上架的 AMI
    - create your own
    - AWS內建
    - 開源者分享
- 選 AMI 種類(效能)
    - CPU
    - Memory
    - Instant Storage
        - EBS only(要買EBS才能使用)
        - SSD(內建就有SSD儲存空間)
    - Network
- launch EC2 with user data(以 root 身分執行)：將安裝好的套件寫在 user data 中，發生錯誤可看 system log 來 debug
- 要快速建立很多一樣軟體資源的 instance：用客製 AMI 創建

## ⭐Instance Type決定效能 *p.62*
- i3.xlarge
    - i3：instance family&generation
    - xlarge：instance size
- **instance family**
    - 加強此虛擬機的哪個功能(開頭字母)
    - T－burstable, C－CPU, M－general purpose, D－dense storage, R－memory intensive, X－large memory, I－high I/O...
- **instance size**
    - 依據cpu,記憶體,儲存及網路效能差異，每個類型有大小之分
    - 越大效果越好

## ⭐EC2 的 Metadata(詳細資訊)
- you can use to configure or manage the running instance
- retrieving information about your EC2 instance with instance metadata using CLI v2

## ⭐Spread *p.66*
- 一組各放在不同機架上的 instance
- 一個 AZ 最多放7個 Instance 再 Spread 群組
- 分開保存，降低同時故障的危險

## ⭐tag instance *p.70*
- 管理、分類 instance 資源
- key and value 組成
- 每個 instance 可擁有一個以上的標籤

## ⭐Elastic Load Balancer
- 不同 instance 間的流量分配

## ⭐EC2 Lifecycle *p.72*
- pending: 對 instance 做 health check，通過則進入 running
- running: instnace 運行中且可供使用
- rebooting: 需要維護時用 reboot 更新，instance 維持 running狀態
- stopping: instance 準備停止或停止休眠
- stopped: 已關閉且無法使用，可隨時啟動
- shutting-down: 準備終止
- terminated: 永久刪除且無法啟動，先評估要不要備份

||terminated|stopped|
|-|-|-|
|private & public IP|None|1. keep the same private IP 2. get a new public IP|
|root volume(EBS)|deleted by default|volume is preserved|
|RAM|None(不會儲存資料)|None(不會儲存資料)|
|instance store(SSD儲存空間)|None(不會儲存資料)|None(不會儲存資料)|
- private IP : 同個 VPC 中不同 subnets 直接溝通(不通過外網)
- Elastic IPs : 固定 IP(不會因為關機就換 IP)，使用中就免費


    
## ⭐價格方案 *p.75*
- **on-demand**：隨需及用(用多少算多少)
    - 適用測試應用程式使用
- **spot instance**：90%off，用 AWS 剩餘資源降價給消費者使用，隨時會被收回
    - 適用在業務中斷不會有太大影響
    - 通知2分鐘就收
    - Windows AMI 以小時為單位(1分鐘也算1小時的錢)，Linux AMI 以分鐘為單位
- **reserved instances**：簽合約，一次買"一年"或"三年"(購買單位為EC2數目)，跟on-demand 比起來打了25折(75% off)，用不完的合約可轉售
- **EC2 instance savings plans**：簽合約，一次買"一年"或"三年"(購買單位為用量capacity，有可能可開更多的EC2)，72% off
- **dedicated instance**：單一user的EC2 instance會在主機硬體level與其他user實體隔離(單一user怕被其他user攻擊)，同一時間只會運行他的EC2
- **dedicate host**：可使用現有所有的軟體licenses，可降低成本，租整個機櫃

## ⭐EBS種類(Amazon Elastic Block Store) *p.68* ==會考==
>EC2的硬碟
>功能：
>block storage 區塊儲存 
>persistent storage 永久儲存
>snapshot 快照(備份)

- 跟 S3 比較
    - S3 不用先選擇資料大小
    - S3 不是 block
    
Volume type
SSD:固態硬碟，HDD:傳統硬碟
- **gp3** (general purpose SSD)
    - 第二貴
    - 讀取速度較快 (low latency)
    - recommended for most workloads
    - development and test environments
    - 16000IOPS
    - throughput : 250 MB/s(gp2), 1000 MB/s(gp3)
    - throughput (每秒傳輸的資料量)，IOPS (input/output per second：找資料的速度)
- **io2** (provisioned IOPS SSD)
    - 最貴
    - IOPS較高
    - 256000 IOPS
    - 4000 MB/s
    - 99.999% durability
    - ideal for critical applications&databases with sustained IOPS or more than 1600IOPS (適用重要的應用程式)
- **st1** (Throughput Provisioned:HDD)
    - throughput較高
    - 500 MB/s
    - 適用在寫入資料有順序性(ex:big data, data warehouse, log processing)
- **sc1** (Cold HDD)
    - 最便宜
    - 250 MB/s
    - 適用在不常讀取的資料

- EBS Snapshot 
    - EBS 備份、複寫
    - 存放在 S3 裡 (可存放在其他 AZ 或 Region)
    - 可加密
    - 可 snapshot 放在不同 EC2 (複製EBS)

## ⭐EFS、FSx
> 多台 EC2 取用相同資源
- EFS(Linux workloads)
- FSx(Windows workloads)
- shared across
    - VPCs
    - AZ
    - Regions
    - Account

<br>

# Database
- 對結構化資訊、組織性資料的收集存放處
- 資料庫系統組成：DBMS(資料庫管理系統)、Database(資料庫)、相關的應用程式

### ⭐建資料庫作法 *p.80*
- on-premise
    - local server 自己建資料庫、準備運算資源
    - 優：客製化程度高
    - 缺：維護、容錯、備份都自己來
- hosted：
    - 用 EC2 當 sever ，在 EC2 建資料庫
    - 優：無須維護底層主機 (AWS管理)，有點客製化
    - 缺：維護、容錯、備份自己來
- managed：
    - 用 AWS 的資料庫服務建資料庫
    - 優：底層運算，資料庫環境都幫你用好
    - 缺：客製化程度低(?

### ⭐資料庫種類 *p.81*

- SQL DB (關聯式資料庫)
    - 結構化資料
    - 用 tables 來儲存資料
    - ex：Microsoft SQL Server, Oracle DB, MariaDB, MySQL, PostgreSQL...
    - 要擴展只能把機器換大
- No-SQL DB (Not only SQL 非關聯式資料庫)：
    - 非結構化資料
    - 用 JSON 儲存資料
    - 可以很彈性在任何地方存資料，不限資料形式(Key的資料形式是固定的)
    - Key-Value DB、In-memory DB、File DB、Graph DB
    - ex：MongoDB, Cassandra, Redis
    - 水平擴展，要多少就多放多少資料
    
||Relational/SQL|NoSQL|
|-|-|-|
||data storage rows and columns|key value, document, and graphs|
|schemas|fixed|dynamics|
|querying|sql-based querying|focused on collection of documents|
|scalability|vertical|horizontal|

## ❤AWS Database 種類 *p.83*

### ⭐RDS (Relational Database Service)
- 全託管的關聯式資料庫
- 支援多種資料庫引擎
    - Oracle：要授權費
    - Microsoft SQL Server：要授權費
    - MySQL
    - PostgreSQL
    - MariaDB
    - Amazon Aurora
- DB Instance Type
    - 選擇機器的種類、大小

### ⭐DynamoDB
- 全託管的 NoSQL 資料庫
- 資料分布在不同服務器上，再根據 hash 找尋資料
- event-driven programming (serverless computing) 事件驅動程式
- extreme horizontal scaling capability 水平擴展
- on-demand read/write capacity

### ⭐DocumentDB
- 與 MongoDB 相容的全託管文件資料庫
- 適合 user 在 local 使用 MongoDB 之後搬遷至雲端資料庫 DocumentDB
- DMS (Database Migration Service)
    - 搬遷資料庫工具

### ⭐ElastiCache
- 緩存服務
- Redis 與 Memcached 兩種塊取引擎
- 用來儲存大量讀取繁重的資料 (減輕後端資料庫的負擔) ex: 遊戲、Netflix...

### ⭐Redshift
- 全託管的資料倉儲(Data Warehouse)服務
- 處理大規模數據分析
- 比 RDS 更能處理巨量 SQL 的分析工作
- 支援大多數應用程式使用 ODBC 和 JDBC 建立連接
    - ODBC (Open Database Connectivity)：提供 API 存取 DBMS(資料庫管理系統)，主要利用 SQL 來完成
    - JDBC (Java Database Connectivity)：用 Java 規範客戶端如何存取資料庫的應用程式介面，像查詢、更新資料庫的資料

### ⭐Neptune
- 全託管的**圖形**資料庫(節點與節點的關係)
- 支援圖形模型 Property Graph，W3C 的 RDF，Gremlin，SPARQL
- 圖形資料庫應用：推薦引擎、詐欺偵測、知識結構圖、藥品探索、網路安全等

### ⭐QLDB
- 全託管的總帳資料庫(交易)
- 應用：私有的(限制存取者)資料庫，但所有的存改都須被完整記錄，不想自己建區塊鏈

## ❤RDS (Relational Database Service)
- on demand capacity (容量要用多大就用多大)
- easy to administer
- secure & compliant
- available & durable


### ⭐RDS Storage Type *p.88*
- 一般用途 SSD
    - 適合大多數的工作負載
    - 每 GB 可提供 3 IOPS，最低 100 IOPS
    - 磁碟區越大效能越好
    - 不同資料庫引擎有不同容量可使用
    - MariaDB、MySQL、Oracle、PostgreSQL：20 GiB ~ 64 TiB
    - SQLserver 的 Enterprise、Standard、Web、Express：20 GiB ~ 16 TiB
- 佈建容量 IOPS SSD
    - 適合 I/O 密集的工作負載，低延遲的應用程式
    - |資料庫引擎|佈建的IOPS範圍|儲存體範圍|
        |-|-|-|
        |MariaDB|1000~80000 IOPS|100 GiB~64 TiB|
        |SQL Server Enterprise、Standard 和 Web Edition|1000~64000 IOPS|20 GiB~16 TiB|
        |SQL Server Express Editon|1000~64000 IOPS|100 GiB~16 TiB|
        |MySQL|1000~80000 IOPS|100 GiB~64 TiB|
        |Oracle|1000~80000 IOPS|100 GiB~64 TiB|
        |PostgreSQL|1000~80000 IOPS|100 GiB~64 TiB|
- 磁性儲存體
    - 磁帶儲存方式
    - 新的應用程式不建議使用
- RDS instance type： AWS 會自動幫你選最適合的

### ⭐Multi-AZ *p.89*
- failover initiated by automation or through RDS API
- redirection to the new primary instance is provided through DNS
- this detects infrastructure issues, not database engine problems
- 開啟此功能(要先開好 subnet groups)，AWS 會自動在另一個 AZ 開一台 standby DB (跨 AZ 的備份 2個 instance 的價錢)
- 若 primary DB 不可用，AWS 會**自動**將流量導到 standby DB
- standby DB：只對 primary DB 的資料進行同步，不 read/write
- primary(master) DB：主要的 DB，可做 read/write
- 設subnet group，才能開啟 multi-AZ
    - two different AZ in the AWS Region
    - the CIDR blocks of subnets 要夠大 to accommodate spare IP addresses for Amazon RDS

### ⭐read replica (唯獨副本) *p.90*
- relieve pressure on your source database with additional read capacity
- RDS 對 primary 創建 snapshot，從 snapshot 創建唯讀副本
- primary 數據變動，會用非同步複製方法更新唯讀副本 (有可能會讀到舊的資料)
- 可升級(promote)為 primary，成為獨立個體 (幫助災難復原)
- 可跨 region(跟 primary 不同 region)
- 一個 RDS 最多 5 個 replica

### Backup Widows
- 功能：備份
- 不會中斷
- 不能跟 maintenance windows 時間重疊

### Maintenance windows
- 功能：維護
- 會中斷



### ⭐開啟RDS *p.92*
1. 選擇**啟用方法**
    - standard create：提供較多選項給使用者用，客製化程度高
    - easy create：大部分默認為預設值，適合測試環境
2. 選擇**資料庫引擎**與**資料庫版本**
3. 設定資料庫**名稱與密碼**(日後身分驗證用)
4. 選擇**DB Instance**大小(依應用決定)
5. 選擇**儲存空間**大小
6. 選擇**網路環境 (VPC)**，選**subnet groups**(multi-AZ)
7. 創建一個 DB 專用的 Security Group，取名為**DB-SG**方便查詢
8. 需 5~10 分鐘佈建(**Status**為available)

- 建立 subnet groups
    1. create VPC (private IP/16)
    2. create subnet(AZ放不同地方) (private IP/24)

### ⭐與 RDS 互動方法
1. 用 workbench 連線至 RDS
    - 限制：選用的資料庫引擎有提供客戶端連線的軟體才可使用
    - 用視覺化的介面操作資料庫
2. 透過 CLI 連線至 RDS
    - 不須額外安裝軟體，但須下指令才能操作
- 開一台 EC2 與 RDS 互動 (同一個 VPC)，在 EC2 架設簡單網頁對 RDS 進行 CRUD 的操作
    - **AMI**：Amazon Linux AMI
    - **Instance Type**：t2.micro
    - **Network**：和 RDS 選擇相同的 VPC
    - **Auto-assign Public IP**：Enable
    - **Userdata**：
    - **Security Group**：允許 HTTP 80 anywhere 的流量進入
- 複製 EC2 Public IP 在瀏覽器貼上，則可看到 EC2 上架設的網頁
- 輸入資料庫資訊便可連至該資料庫 (可直接複製RDS頁面的資訊)

## ❤DynamoDB *p.98*
- 全託管
- 水平擴展－不用指定大小 (AWS 會自動幫你擴展)
- On-Demand Read/Write capacity (依R/W收費)

### ⭐創建 DynamoDB
- 設定 Primary key
    - 靠 primary key 找到資料
    - 設的好，找資料更快
    - partition key(user ID) + sort key(name)

### ⭐Consistency *p.102*
- Strong consistency：不會讀取到舊的資料
    - DB會一次儲存到3個不同的AZ
    - 一個 request 耗費 2 個 RCU (read capacity unit)
    - 收費依據 RCU & WCU(write capacity unit)
        - on-demand：流量上升或下降到任何一個先前曾到達的流量時，立刻調整 RCU/WCU(用在無法確認流量)
        - Provisioned(佈建模式)：user 指定應用程式需要的 RCU/WCU，也可啟用 auto-scaling 自動調整資料表的 RCU/WCU，有上限與下限值(用在可預期且平穩的流量)

- Eventual consistency：有可能讀取到舊資料
    - 只耗費一個RCU
    - 較便宜

### ⭐輔助索引 *p.101*
- GSI(Global Secondary Indexes 全域次索引):跨所有資料表的索引
- LSI(Local Secondary Indexes 本機次要索引)：只能索引此資料表，可用相同 partition key 但不同 sort key 的索引，索引大小不得超過 10 GB

### ⭐Global Table *p.106*
- 可在各個 Region 創建相同 table (同步複寫)

<br>

# IAM (AWS Identity and Access Management)
- 控管身分驗證與存取權限的服務
- 定義**誰**可以對**什麼**進行什麼**動作**

## Identity Management *p.114*
- Root user：付錢的那個人
    - full access to all AWS resources
    - billing information
    - permission can't be limited
    - 權限大，建議 user 不要以 root 身分登入處理日常作業(被盜就完了)
- IAM user
    - 透過 root user 建立 IAM user
    - 用 account ID, IAM user name, password 登入
    - perform specific AWS actions based on their permissions(不要給他太多權限)
    - no default permissions and credentials (好好保護憑證)
    - 更安全：MFA(多重因素驗證碼)
    - IAM user可做的事
        - manage account password policy：制定密碼需要的長度強度和 password reset(重設密碼)
        - create/revoke user (給權限，ban權限)
        - add tags to user
- MFA (Multi-factor authentication 多重因素驗證碼)
    - 綁定 MFA 後，登入時除了帳密外，還須從 AWS 支援的 MFA 機制提供為依的身分驗證(有時效性的 token)
    - types：
        - hardware (Gemalto, YubiKey)
        - virtual (ex: Authy, Google Authenticator)


- 存取 AWS 資源 IAM Credentials

    |access methods|credentials|
    |-|-|
    |AWS management console|user name/password|
    |AWS command line interface(CLI)|access key/secret access key|
    |AWS software development kits(SDKs)|access key/secret access key|
    |AWS APIs|access key/secret access key|
    
    run "$aws configure" to setup defalt credential
<br>
## Set permissions   
- IAM Group *p.123*
    - 多個 IAM 管理，只要設定 Group 權限，把人加進 Group 就會有那些權限
    - 一個 IAM 可以屬於多個 Group，但權限可能會衝突，解決方法以下
        - deny -> deny
        - allow & no deny -> allow
        - no allow -> deny

- IAM Policy *p.126*
    - grant permissions to AWS services
    - JSON (可用 <a href="https://awspolicygen.s3.amazonaws.com/policygen.html">policy generator</a> 產生，用 <a href="https://policysim.aws.amazon.com/">policy simulator</a> 測試)
    ```JSON=
    {
        "Version":"2012-10-17",
        "Statement":[
            {
                "Sid":"AllowS3CreateDelete",
                "Effect":"Allow",
                "Action":[
                    "s3:CreateBucket",
                    "s3:DeleteBucket"
                ],
                "Resource":"arn:aws:s3:::<bucket name>/<key name>"
            }
        ]
    }
    ```
    
    - attach to identity or resources
    - Identity policy：attach 在 user/group 上的權限
    - Resourse policy：attach 在 資源上的權限(ex：EC2 想跟 S3 用內網溝通)

- IAM Role *p.134*
    - 需臨時給權限時使用
    - temporary security credentials：工地帽(有時效性的權限)
    - 通常用在資源上

- STS (Security Token Service)
    - 提供 access key ID, secret access key, session token, expiration 產生 IAM Role
    - 設終止時間

</br>

# Serverless

- 每一個 function 放在一個 server -> 高可用性 (不會每個 fuction 都一起壞掉)
- Virtual Machine -> Container -> Serverless
    - VM 虛擬主機 (EC2)
        - 在主機上實現多個網站或服務的技術
        - VM 間完全獨立，有自己的作業系統 (浪費資源)
    - Container 容器 
        - 啟動 Container 不用跟 VM 一樣重開機器 (速度較快)
        - 作業系統層虛擬化 (每個容器共用同一個作業系統)
    - Serverless 無伺服器
        - 解決以上兩個須要維護底層主機的問題 (底層主機壞掉，上面開的 VM、Container 就壞了)
        - 雲端幫使用者託管基礎設施 (without managing servers 不用維護伺服器)
        - 不用硬體，可實現一個 function 放在一個 server
        - 缺：Lambda 接到 request 才會做事 (小延遲)

## AWS Lambda
- 全託管 (不用做任何設定) 的計算服務
- run code on a schedule or in response to events
    (e.g. changes to data in an S3 bucket or DynamoDB table)
- 依使用量付費 (function 的請求數量和程式碼執行期間)
- 可在 edge 執行
- 優點
    - no infrastructure to manage：不用 EC2
    - Automatic Scaling：伺服器池中的計算資源量（通常根據有效的伺服器數量來衡量）會根據伺服器池中的負載進行動態伸縮
    - Fine-grained pricing：便宜
### Lambda 適用情況
- 處理無狀態(stateless)的請求
    - 每個請求都是獨立的
    - 執行結果不會受到之前的執行影響
- 事件驅動 (event-triggered)
    - 有事件才啟動，平常休眠
    - Lambda 通常透過其他服務觸發，服務之間的橋樑
    - 一個需求最多跑 15 分鐘
    - ex：從 HTTP 請求、 S3 Bucket、DynamoDB、SNS、SQS、CloudWatch、IoT、ALB、Scheduled...
- 簡單的動作
    - 像寫程式函數盡量單純且快速
    - 長時間運行建議用 EC2 或 Container
- 可安全的存取資料庫的功能
- 最佳實踐
    - 版本控制 to manage AWS Lambda deployment
    - stateless：沒辦法暫存狀態在 Lambda (ex：紀錄某人已登入)
    - memory size 跟 CPU power 成正比 (更快更便宜)
    - 用 CloudWatch 監測他
    - 沒辦法 retry (15 分鐘 timeout 就 timeout 了)
    - 可以設定 IAM Role
### Lambda 組成
- Dependency
    - Source Code 需使用的相依性套件 ex：AWS SDK for Python
    - Lamdba 有依些預設的套件
    - 若不是預設套件則將 Library 打包成壓縮檔上傳至 Layers
- Source Code
    - 主要程式碼編輯區
    - 建議在習慣的編譯器完成且除錯再貼上來測試
- Configurations
    - 其他相關設定 ex：權限、環境變數、逾時設定、記憶體大小．．．
### Lambda Container
- 已購買 container 工具進行開發，想將工具實作在 Lambda 上
- user 可將 Container Image 打包並推送 ECR (Amazon Elastic Container Registry)後，部屬在 Lambda 上
- 優：可輕鬆建立更多相依性套件的大型工作負載
- Lambda Runtime
    - 對一些程式語言提供了基礎映像
    - 可輕鬆加入程式碼和相依性套件進行打包，再部屬在 Lambda
- Lambda Runtime Interface Emulator
    - user 能對容器映像執行本地測試

# API 
- HTTP 協定定義的服務請求方法
    - POST
    - GET
    - DELETE
    - PUT
    - PATCH
## API 種類 (Application Programming Interface 應用程式介面)
### REST API (Representational State Transfer 表現層狀態轉移)
- 將 POST/GET/PUT/DELETE 一起完成
- 用 JSON 讓網路的計算系統之間，彼此資源可互動使用的協作性質
- 組成元件
    - 定義資源位置的 URL
    - 定義資源要做的動作
    - 資源呈現方式 (最常用 JSON)
### WebSocket API
- 只需伺服器和瀏覽器通過 HTTP 協議進行一次動作
- 可單獨建立 TCP 連線進行資料傳送
- 讓伺服器主動傳送資料給瀏覽器，不需等待瀏覽器送出請求才能回覆

## API Gateway
- manage your REST endpoints
- flask 的 route 概念
- create API that as front end for application
- DDoS protection
- Authenticate and authorize requests
- 可透過 API Gateway 建立 API，以存取 AWS 或其他 Web 服務以及 AWS 所存放資料
    - RESTful API (Stateless)
    - HTTP API (Stateless)
        - 功能支援性較 RESTful 差，但較便宜
    - WebSocket API
        - 支援用戶端與伺服器之間啟用全雙工通訊
- user <-> WAF <-> API Gateway <-> Lambda

