###### tags: `AWS`,`雲端`,`2023` {%hackmd BJrTq20hE %} # AWS (Amazon Web Services) Amazon是全球雲端運算平台提供商之一, AWS平台提供了運算用的EC2,儲存資料用的S3,可用來作CDN加快網頁瀏覽速度的CloudFront, 幫忙處理付款機制的FPS,以及其他更多的服務。 以下列舉幾個常見服務: ## Elastic Compute Cloud(EC2) EC2是一個虛擬伺服器。使用者可依需求設定這台虛擬機使用的作業系統、CPU、記憶體、儲存容量、IP位址、防火牆、虛擬網路等。 可設定自動擴展(auto scaling)依負載狀況自動增減EC2執行個體數量,確保在需求高峰期能動態增長以保持性能,也可以在需求低峰期主動縮減,達到降低成本的目的。 使用者可將軟體及應用程式部署並運行在EC2,且能隨時啟動,停止或關閉,並根據EC2的運算能力,運算量、儲存量來支付費用給AWS。 ## Relational Database Service (RDS) 關聯式資料庫,目前支援下列引擎: 1. MySQL 1. MariaDB 1. PostgreSQL 1. Oracle 1. Microsoft SQL Server ## Amazon Simple Storage Service (Amazon S3) 物件檔案儲存服務,用key-value方式(有版本的觀念)儲存和保護任意數量的資料。可以上傳、下載、複製、刪除物件並可託管靜態網頁。 可以將任何檔案類型 (影像、備份、資料、影片等) 上傳至 S3 儲存貯體。 使用 Amazon S3 主控台可上傳的檔案大小上限為 160 GB。 若要上傳大於 160 GB 的檔案,要使用 AWS CLI、AWS SDK 或 Amazon S3 REST API。 ### 創建 Bucket 首先創建一個 Bucket 放置各式物件。 創建時碰到的選項說明: **1. Block Public Access settings for this bucket:** 預設 Block all oublic access: 一開始可以預設阻 擋全部權限,如果已經知道檔案公開邏輯,可以不用勾選。 **2. Bucket Versioning** 預設為 Disable,不做版本控制。 如果想針對一樣檔名的物件做版本控制,選擇 **Enable** 到檔案目錄主控台,開啟 **Show version**,就可以看到版本ID #### 公開存取物件的方法 1. 手動到檔案目錄主控台,點選想公開存取的物件,Actions -> Make Public 2. 撰寫Policy,可以針對資料夾或檔案,全開權限操作 **3. Even notification** S3 Bucket Even支援以下服務: * Amazon Simple Notification Service (Amazon SNS) * Amazon Simple Queue Service (Amazon SQS) * AWS Lambda 1. 點選 Create Even notification 2. General Configuration:幫事件取名、選擇檔案夾下的類型檔案(ex:.jpg) 3. Even type: 什麼動作需要發送事件 (ex:post、update、delete) 4. Destination : 要做什麼通知服務 5. Save changes ## CDN Content delivery network (內容分發網絡): 可以將網站上的靜態內容(例如.html文件、.jpg圖片) 和動態內容(例如數據庫查詢)緩存到CDN提供商位於全球各地的多個伺服器上。 這樣當全世界不同訪客訪問這個網站的時候,就不再需要通過網站所在伺服器讀取這些內容, 而是可以從就近的CDN緩存伺服器上讀取,因此內容的讀取速度更快,直接影響就是網頁的加載速度更快。 ## Amazon CloudFront: 是一個內容分發網絡,該服務可以很容易地將內容傳送到終端用戶,具有低延遲、高數據傳輸速率等特點。簡單來說就是使用CDN進行網絡加速。 ## Amazon CloudWatch: 即時監控AWS上的資源及執行的應用程式。可以包含多個 region 的監控資訊,來自不同 AWS 帳號也可以 --- 開通AWS服務時,要準備好 Email 和信用卡,到 AWS 申辦帳號,作為 Root Account 透過 IAM 服務把 root 權限切分成多個使用者與群組。 (因為 AWS 的 Root 權限非常大,建議少用。) # AWS 經典架構 ![AWS 經典架構圖](https://i.imgur.com/JRlG1oo.png) 1. 使用者發送封包存取提供網域名的 Route 53 2. Route 53 轉發給作為伺服器的 EC2 (Elastic Compute Cloud),並轉發給後方的 EC2。 3. 後方的 EC2 跟資料庫服務 RDS 拿資料或從 S3 拿大型檔案 4. 處理完成後,回傳給使用者 5. 權限管理服務 IAM 可管理內部使用者權限 6. CloudTrail 進行使用者的行為監控 7. CloudWatch 進行系統監控 EC2 、 Route 53 等資源狀態 # IAM > **處理認證、權限規範和授權的 WEB 服務** AWS Identity and Access Management (IAM) 是一種 Web 服務,能夠*安全*地控制對 *AWS 資源的存取*。 可以使用 IAM 來控制能通過**身分驗證** (登入) 和**授權使用資源**的 (具有許可) 的人員。 ![IAM 安全架構設計圖](https://i.imgur.com/KZKGj0w.png) 上圖中,如果使用者是從網頁操作 AWS 就需要帳號密碼。如果是程式要操作 AWS 那就需要存取暫時性的憑證。 IAM 是操作 AWS 最核心的一環。依照專案情境,可以分為設置、開發和生產三階段。 設置 : 透過 Group、User、Policy 先把權限設定好,打造一個安全的開發環境。 開發 : 依照需求,去寫多個 Policy。 生產 : 應用程式部屬到 EC2 等服務上,如果有互相調用資源的需求,必須用到 Role 的機制,才可以資源互通。 ## 角色 值得注意的是角色(Role)的身分,他和使用者相似,具有特定的權限,目的是讓任何人都可以帶入而不是單獨與某個人有關聯。 Role 是一個可以跨帳號、跨服務、跨使用者的設定,需要用到它來委派AWS資源的存取。兩個服務之間也需要透過角色來做溝通,它也會提供一個臨時性的安全登入資料。 ![角色取用 AWS 服務](https://i.imgur.com/trKlmOe.png) ## Policy IAM 雖然有提供一些 Policy 可以使用,但是有時候並不實用。所以可以自己擴寫 Policy。 Policy 為 JSON 格式,官方有 Visual Editor 介面可以提供編輯,自動產生 JSON 不用自己寫。 寫完後利用 Policy Similator 測試自己寫的是否正確。 通過測試後,再把 Policy 放到 IAM 的 Group 或是 Role 身上就完成用戶權限設定。 AWS 也有提供 最小權限管理(Least Provilege) 當使用者只需要用到 EC2 的時候,那就不需要給他 S3 等權限。 Policy 組成分為 : * Effect(影響) : 允許/拒絕存取。預設為拒絕存取。 * Principal(委託人/主體): 受約束的對象。EX: IAM User、S3 Bucket。 * Condition(條件): 需要有的條件才能生效。 EX: User 使用特定 IP 時或使用多重驗證才能存取特定的S3儲存體。 * Action(動作): AWS服務的動作。EX: 允許 User 【呼叫】S3 ListBucket。 * Resource(資源): 允許執行動作的資源。 EX: 允許 User 在特定的 S3 執行動作。 ## Federating Exist User 如果需要和外部資源做互動的情境,就叫 Federating Exist User,分為三個情境: * AWS 帳號之間的串接: 如果專案規模龐大,同時有好幾個產品,每一個產品就使用一個 AWS 帳號。但有時候需要做資源串接,就可以設定讓多個 AWS 帳號串在一起。 * 本地系統串 AWS 帳號: 利用公司內部的員工帳號來做 AWS 登入與資源取用。必須遵照 SAML 2.0 機制。 * 社群帳換串 AWS 帳號: Facebool、Google等遵循OpenID機制的帳號。 --- 外部帳號系統用戶透過 AWS 的機制認可後,就可以用外部系統的帳密來存取了。 以下為第三方取用 AWS 流程: ![第三方 AWS 流程](https://i.imgur.com/V9CWUkO.png) 1. 客戶端程式 向 入口網站/ 身分驗證主機 IdP (Portal/ IDentity provider) 發出請求 2. IdP 向 LDAP資料庫 確認用戶 3. IdP 傳送給客戶端 SAML 認證 4. 客戶端程式 呼叫 SAML 的 AssunmeRole ,經過 Security Token Service 到 IAM 系統通過一系列驗證 5. AWS 回應一個**暫時性**的安全憑證 # EC2 ``` mermaid graph LR; AMI_Marget --> AMI --> Instance --> UserData --> EBS --> Tag --> Security_Group --> Key-Pair; ``` AMI (Amazon Machine Images):供執行個體使用的預設範本,封裝伺服器所需要的元件。屬於 Region級別,不能跨Region共享 連到其他Region 的 Instance --> 可以透過 Snapshot 複製一樣的 AMI 到另一個Region' UserData : 一段script,開機時執行的指令。 EBS (Elastic Block Store): 持久性儲存磁碟區,資料不會因為EC2關機而消失,可選擇SSD 或一般硬碟。 Tag : AWS 帳號成本與權限的管理。 # VPC (Virtual Private Cloud) VPC 內可以設定多個 Subnet,Subnet 有防火牆的配置,稱作 NACL (Network Access Control List) NACL 為靜態防火牆,每次進出都需要審核。 * 私有網段可連外網 - NAT Gateway 可以將私有網路流量轉道外網,讓私有網段可以連外而不被外網所認得。 * VPC 以內網方式操作AWS服務 - 利用 VPC Endpoint 可以讓VPC內的機器(EX:S3)用內網的方式與AWS服務串接。(預設情況是VPC內的伺服器跟AWS進行連線要從外網進行存取) * VPC 串 VPC - 兩個VPC 可以藉由 Peering Connection 透過內網存取其他AWS VPC。(公司若有多個產品,需要資料共享,預設是透過外部網路進行溝通,但可以用Peering Connectiont串接,這樣兩個VPC可以用對方的私有IP溝通) * 監控 VPC 的網路流量 - VPC Flow Logs # 高併發架構 ``` mermaid graph LR; CloudFront --> ELB --> AutoScaling --> instance1 --> SQS--> instance --> DynamoDB; AutoScaling --> instance2--> SQS--> instance4--> DynamoDB; AutoScaling --> instance3--> SQS--> instance5--> DynamoDB; instance1 --> ElasticCache --> instance; ``` ##### Reference * 大話 AWS 雲端架構 * [AWS 官網](https://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html) * [CloudWatch](http://www.tts.bz/archives/480)