- 104 AWS 教育訓練 - 歐文克理夫
- 教育訓練目標
- Part2 - 2017/02/13-14
- 全球基礎設施
- 機房的分類:
- Availability Zones = 1 個以上的 IDC 以上,間隔100公里以上,因為有自有光纖所以很快。
- Regions = 2 個以上的 Availability zones 組成。
- Edge Locations = 全球68個,多數給 CDN 使用 (台灣有,但是出口太小,所以多數還是從香港出,僅有半夜從台灣。)
- 全部都是 API Service,寫程式搞定。
- Why to Cloud
- 提供什麼:
- Iaas: 提供虛擬主機,OS 以下不歸你管:如 EC2 ,廣播封包一律無法使用,如 DRBD。
- Paas: 提供服務: 如 MySQL
- SaaS: 全包,直接使用。 (還有很多沒有 Global release 的服務)
- 為何要從 IDC 上雲端:
- 利用率夠高:必須考量加機器的時間成本,在 IDC 只能有約 30% 的利用率,但雲端可以約有 90% 的利用率,在 5 分鐘搞定所有佈署工作。
- 能直接提供高效率的工作 (i.e. 運算效能),但在 IDC 無法提供這樣的規模以及時間利用。
- 能符合實際成長的期望值,降低成本浪費及超乎預期成長的風險。
- 自動化:
- AWS 提供既有的自動化工作 Auto-scaling, CI / CD, DR。
- RDS 提供 35 天內的資料狀態,利於測試可即時使用。
- 產品
- Computer
- EC2
- Container
- Elastic Beanstalk
- 整套 Total switch:EC2、ELB、VPC ... 直接 run 起來,僅計算 EC2 費用,開發只要 Push code。
- 難維護,無法知道如何 Debug and setting。
- Lambda
- serverless,提供function執行不需要開機器
- Storage
- S3
- All HTTP access ( if mount S3, use Get )
- object storage
- Glacier:磁帶
- Storage Gateway:Cont Gateway
- Database
- RDS
- 支援幾乎所有 SQL。(貴)
- DynamoDB
- SAS
- background save 3 part
- Network
- VPC
- like IDC datacenter
- Direct Connect
- 海外專線 to Commany ( Taiwan low )
- Route 53
- DNS
- CloudFront
- CDN
- Developer
- CodeCommit
- Git
- CodeBuild
- CI
- CodeDeploy
- CD to EC2
- CodePipeline
- to Data
- Management
- CloudFormation
- 用 json template (or yaml template) 架構整個 AWS service
- 設定起AWS服務的範本
- 可能會有少數服務因為太新或其他因素,無法在 CloudFormation實作,但大部份都支援
- CloudTrail
- 稽核所有 API 行為 to S3
- OpsWorks
- support Puppet, Chef
- Security
- IAM (Identity and Access Management)
- All AWS resources access manager
- Inspector
- 弱掃
- Certificate Manager
- free
- not output AWS
- Directory Service
- AD
- with connect (中斷重做)
- WAF
- 要自行寫 rule
- Analytics
- Kinesls
- 主要給 IoT,拿來收訊息。
- AI
- 直接應用 AI 服務。
- Mobile Services
- Device farm
- All device information for test
- Business Productivity
- WorkDocs
- VDI , support Windows 7, 10
- AWS elearning Labs
- Start
- IAM
- IAM user 即使 admin 也無法查看 Billing
- Create Group, Create User set Group
- Enable two-factor auth
- Login from "IAM users sign-in link"
- 建議 root and IAM user 不同的 two-factor auth,或多一個 IAM user給另一隻手機 2FA,以防手機GG時,就臨時都進不去了
- Security credentials
- 3 type
- Account / Password / MFA
- Access key ID / Secret access key
- AWS All resource default deny
- Use AccessKey + SecretKey access API resource
- 如果key沒有保存好被盜用,會被拿來開很多service,所以不能連同版控上到git上
- Key Pair
- Part2 - 2017/02/16-17
- 虛擬化的定義
全虛擬和半虛擬的差異- 全虛擬 (Full Virtualization)
- ex: Virtualbox
- 攔截Cpu指令、memory、I/O
- 效能有10~30%的耗損
- 半虛擬 (Para Virtualization)
- Hyper-V, XEN,KVM,VMware
- 效能有5~10%的耗損
- 最大的差異在IO
- AWS 底層虛擬化是 XEN
- Intel-VT, AMD-V
- AWS的硬碟IO寫入方式
- 如果EBS讀一個從來沒有寫過的block,會先寫入0,再讓你讀取
- 用意:完全避免讀取到別人的資料(類似dd的方式,先清除block)先dd寫一次整顆硬碟,之後使用效能較好) <--- 建議資料庫
- TCP/IP
OSI七層 (Open System Interconnection)- Physical Layer : Hub, 纜線
- Data Link Layer : MAC Address, switch ( 有MAC learning機制,可防止MAC查詢Flooding,現在已不保證MAC世界唯一)
- Network Layer : Internet Portocol (IP), Router
- Transport Layer : 資料傳輸, 流量管制及錯誤控制
- Session Layer : 網路連線的建立與中斷
- Presentation Layer 壓縮、加解密、格式轉換
- Application Layer : 應用層
TCP/IP- Network Access Layer : CSMA/CD , 對應 OSI 1 ~ 3
- Internet Layer : 對應OSI的Network Layer
- Transport Layer:對應OSI的Transport Layer
- Application Layer : 對應OSI的5~7
- ( TCP 使用錯誤重傳,確保順序及流量管控 )
- ( UDP ex: DNS )
DNS (Domin Name System)- Domain Name是給人看的
- Top Level是 IANA 管理,全球有13台root name server,彙整到 Whois 資料庫。
- DNS的階層架構:
- 正規的 DNS 網址為 www.104.com.tw.
- 瀏覽器幫我們把最後面的 . 自動補上。
- www.104.com.tw
- . > tw > com > 104 > www
- Record Type (在aws上常用的部分)
- A : Host Record
- CNAME:Alias
- 在 Route53 不收費
- SOA : 提供domain name的administrator, version, TTL等資訊
- NS:Name Server , 該網域的 Content DNS 位址。
- MX:Mail Exchange
Routing- IP Class:
- Class A:0.x.x.x~127.x.x.x
- Class B:128.x.x.x~191.x.x.x
- Class C:192.x.x.x~223.x.x.x
- Class D:224.x.x.x~239.x.x.x
- Class E:240.x.x.x~255.x.x.x
- CIDR : classless lnter-domain routing 把原來的class再細切割
- IP速算法:請洽 歐文(CCNA Certified)
- subnet mask: 26
- network 以 class B
- 26-16=10
- 2^10=1024
- ip numbers
- 32-26=6
- 2^6=64
- subnet mask 26
- network 以 class C
- 26-24
- 2^2
- ip numbers
- 32-26
- 2^6
- subnet mask 參考資源:
- Private Subnet : RFC1918
- 10.0.0.0/8
- 172.16.0.0/12 ~ 172.31.0.0/12
- 192.168.0.0/24 ~ 192.168.255.0/24
Gateway- 網關/閘道器,連接兩個不同的網段。
- Default Gateway:從路由表查詢沒有比對到網段,就往 Default Gateway (0.0.0.0/0) 送
Routing table- 條列式的對應方式,註明要去的目的端,要走哪個網關,如果都沒有,就會往預設的gateway送,但不保證一定送得到(如果gateway也沒有那筆路由或是被firewall擋掉)
Firewall- Networking Firewall
- 在網路邊界的 Firewall
- Host-base Firewall
- 在 Device 的 Firewall , 如 iptables。
- First Generation : packet filters,進出的方向都需要自行維護rule(aws的對應服務:nACL)
- Second Generation : stateful filter (AWS Security Group : Host-based ),只要開單向,返回的 packet 會自動 allow。
- Third Generation
- Application Firewall:應用層防火牆(WAF)
- AWS WAF:規則必須自己寫。
NAT- 簡單來說就是「換 IP」(Private IP -> Public IP)
- 是一種在 IP 封包通過路由器或防火牆時重寫來源 IP 位址或目的 IP 地址的技術。
- 僅有 NAT 並不能直接上網,必須依靠 Routing 路由到 Internet。
- LAB Part1 - EC2 and VPC
- 目標:
- 起一台 EC2 連上 SSH。
- 實作:
- region 選擇 oregon (奧勒岡),因為最便宜。
- 選不到大陸地區。
- 選在美國地區的所有權都為美國資產 (愛國條款)
- 登入 AWS console 點選「VPC」 之後,不要直接用「Start VPC Wizard」
- 有一個預設 VPC 172.31.0.0/16 千萬不能砍,會有許多服務無法使用。而且砍了救不回來
- 例如: 把 default vpc 刪了,那要 packer時就需指定vpc ,設定上變麻煩。
- 選擇「Create VPC」,每個 VPC 是虛擬獨立的。
- Name tag 命名規則。
- Tenancy 請不要選擇 Dedicated,所有的設備都會變成專用,費用會非常昂貴。
- 會因為法規無法使用虛擬機 or 共用機器所以才會使用 Dedicated。
- 建立 VPC 不會收費。
- 選擇「Create subnet」,
- subnet 不能跨 AZ,只能選一個 AZ,每個人看到的 AZ Mapping 有可能對應到不一樣的
- CIDR 無法切比 VPC 還要大的。
- 選擇「internet Gateways」> 「Create internet Gateways」>「Attact to VPC」
- 選擇「Route table」> 「Create Route table」> 「Routes」「Edit」= 0.0.0.0/0 , target 是目標 VPC
- 把 Subnet 和 Route table 關聯起來,選擇「Subnets」> 「Route Tables」>「Edit」>「change to ... VPC」。
- 完成 VPC 網路環境。
- 建立 EC2
- Resource 選擇「EC2」> 「Instances」>「Launch Instances」
- 選擇 AMI 版本:Ubuntu Server 16.04 LTS (HVM), SSD Volume Type
- 使用免費的 t2.micro
- Number of instances = 1
- Network = 目標 VPC
- Auto-assign Public IP = Enable
- 是動態的 IP,會更換。
- 使用 EIP 綁定固定 IP 在 EC2,需要收費,即使在 STOP 的狀態也會收費,約 $1000。
- 在 Cloud 上面 IP 無法作為任何判斷依據。
- Storage
- Magnetic 官網僅有說是使用 SAS。
- Delete on Termination 為刪除 EC2 時是否刪除 Volume 的依據。
- Tags
- 命名機器
- Security Group
- 命名要能一看就知道用途。
- 每張網卡最多可以attach 5個,更多需連絡AWS Support,一個 VPC最多500個 Security Group, 要更多一樣連絡 AWS Support (參考資料: aws docs )
- 一個 Security Group 可以給無限多個網卡 Attach
- Create Key
- 建立 ssh key,並 Download Key,若遺失將無法再登入。
- 正確規範在 Production 不打 Key,不允許 SSH,僅作為運算工具。
- Key Pair 不能跨 region
- 選擇 Launch
- 約等待 2~3 分鐘建立,狀態為「running」。
- 下載下來的 ssh key 權限請修改為 400,否則會出現「Permissions 0644 for 'keyname.pem' are too open」
- chmod 400 keyname.pem
- 登入 EC2
- ssh -i keyname.pem ubuntu@PublicIP
- Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-59-generic x86_64)
- ...
- ...
- ubuntu@ip-10-128-78-48:~$
- 更安全的方式為產生自己的 ssh key,用自己的 user login。
- Clean up
- 移除 EC2
- 勾選 EC2 >「Actions」>「Instance State」>「Terminate」
- 移除 VPC
- 勾選 VPC >「Actions」>「Delete VPC」
- Part3 - 2017/02/23-24
- LAB Part2 - EC2 and VPC (Private/Public Network)
- 建一次 #LAB Part1 - EC2 and VPC
- VPC CIDRs = 10.128.0.0/16
- Create Subnet
- Public Subnet
- IPv4 CIDR block = 10.128.1.0/24
- Private Subnet
- IPv4 CIDR block = 10.128.2.0/24
- Create Internet Gateway (IGW) - 讓 VPC 具有連網的能力
- 選定建好的 VPC
- 一個 IGW 只能選定一個 VPC
- Create NAT Gateway
- 選定 Public Subnet,並且產生 EIP
- 建立後必須 refresh 後才會出現,否則不會出現 NAT Gateway
- NAT Instance 與 NAT GateWay 差異
- NAT Instance 會啟一台 EC2,裡面所有的功能要使用者自行管理設定
- NAT GateWay 屬於一個 SaaS 服務,由 AWS 協助管理,費用較 NAT Instance 高
- 如果使用量較高,用 NAT GateWay 長期來說會比較便宜
- Create Route Tables
- Public Route table 指定建好的 VPC
- Edit Routes
- Add another route
- 0.0.0.0/0
- Private Route table 指定建好的 VPC
- Edit Routes
- Add another route
- 0.0.0.0/0
- 到 Subnet,修改 Public/Private 的 Subnet Route table
- Public subnet Change to Public Route table
- Private subnet Change to Private Route table
- 建立第一台 EC2 (Public)
- VPC 選擇上述已建立的 VPC
- Subnet 選擇 Public
- 給他一個 tags (i.e. user-test-bastion)
- Securty Group
- 開啟 ssh port 22
- Launch
- 用 EIP SSH 到 EC2
- 點選 Security Groups,複製 Public ssh 的 ID
- 複製用來建新的 Private Security Group
- Security Groups Role 的來源是可以另一張 Security Groups,用 ID 為的是保留彈性不鎖死 IP
- 建立第二台 (Private)
- 同第一台 EC2
- 因為是 Private 所以不需要 assign public ip
- 勾選 Protect against accidental termination,和 第一台 EC2 比較差異
- 選擇 Private security groups
- Launch
- 在自己的 PC 上用 scp 將 Private key 丟上第一台 (Public) EC2 ( 要測試用 Public ec2 連上 Private ec2 )
- 從 Public ec2 ssh 到 Private ec2
- 測試 sudo apt-get update,可以通代表網路已通。
- 移除資源
- 一定是從運算資源開始移除
- Terminate EC2 > Delete NAT Gateway > Delete VPC
- 在移除 EC2 時有勾選 Protect against accidental termination 的時候會有保護機制,所以必須解除 Protect 後才能移除,避免誤刪。
- 必須先刪除 NAT Gateway 才能在刪除 VPC
- 刪除 NAT Gateway 必須在手動刪除 EIP,否則會收費。
- 如果 EIP 中的 Instance 和 Network Interface ID 都是空的,代表沒有在使用,可以刪除。
- Part4 - 2017/03/02-03
Security (Key & Role)- IAM
- 控管 AWS Resource 的服務
- 透過 Policy來限制 Entity 存取 AWS 的 Resource
- Entity 可以是 User、Group、Role
- IAM Policy
- Json 格式,可以被套用到 IAM Entity
- IAM Entity 最多只可以 Attach 10 個 Policy
- 只要其中包含某個 resource 的 Deny,就會 Deny (預設 Deny Policy 優先)
- Deny 的優先順序 ( IAM Policy order)
- Explicit Deny
- Explicit Allow
- Default Deny
Create Policy Policy Actions- IAM > Policies > AdministratorAccess
Filter: Policy Type- Showing 252 results
Policy Name Attached Entities Creation Time Edited Time AdministratorAccess 1 2015-02-07 02:39 UTC+0800 2015-02-07 02:39 UTC+0800 AmazonAPIGatewayAdministrator 0 2015-07-10 01:34 UTC+0800 2015-07-10 01:34 UTC+0800 AmazonAPIGatewayInvokeFullAccess 0 2015-07-10 01:36 UTC+0800 2015-07-10 01:36 UTC+0800 AmazonAPIGatewayPushToCloudWatchLogs 0 2015-11-12 07:41 UTC+0800 2015-11-12 07:41 UTC+0800 AmazonAppStreamFullAccess 0 2015-02-07 02:40 UTC+0800 2015-02-07 02:40 UTC+0800 AmazonAppStreamReadOnlyAccess 0 2015-02-07 02:40 UTC+0800 2016-12-08 05:00 UTC+0800 AmazonAppStreamServiceAccess 0 2016-11-19 12:17 UTC+0800 2016-11-19 12:17 UTC+0800 AmazonAthenaFullAccess 0 2016-12-01 00:46 UTC+0800 2016-12-01 00:46 UTC+0800 AmazonCloudDirectoryFullAccess 0 2017-02-25 08:41 UTC+0800 2017-02-25 08:41 UTC+0800 AmazonCloudDirectoryReadOnlyAccess 0 2017-03-01 07:42 UTC+0800 2017-03-01 07:42 UTC+0800 AmazonCognitoDeveloperAuthenticatedIdentities 0 2015-03-25 01:22 UTC+0800 2015-03-25 01:22 UTC+0800 AmazonCognitoPowerUser 0 2015-03-25 01:14 UTC+0800 2016-06-03 00:57 UTC+0800 AmazonCognitoReadOnly 0 2015-03-25 01:06 UTC+0800 2016-06-03 01:30 UTC+0800 AmazonDMSCloudWatchLogsRole 0 2016-01-08 07:44 UTC+0800 2016-01-08 07:44 UTC+0800 AmazonDMSRedshiftS3Role 0 2016-04-21 01:05 UTC+0800 2016-04-21 01:05 UTC+0800 AmazonDMSVPCManagementRole 0 2015-11-19 00:33 UTC+0800 2016-05-24 00:29 UTC+0800 AmazonDRSVPCManagement 0 2015-09-02 08:09 UTC+0800 2015-09-02 08:09 UTC+0800 AmazonDynamoDBFullAccess 0 2015-02-07 02:40 UTC+0800 2015-11-12 10:17 UTC+0800 AmazonDynamoDBFullAccesswithDataPipeline 0 2015-02-07 02:40 UTC+0800 2015-11-12 10:17 UTC+0800 AmazonDynamoDBReadOnlyAccess 0 2015-02-07 02:40 UTC+0800 2017-02-28 01:59 UTC+0800 AmazonEC2ContainerRegistryFullAccess 0 2015-12-22 01:06 UTC+0800 2015-12-22 01:06 UTC+0800 AmazonEC2ContainerRegistryPowerUser 0 2015-12-22 01:05 UTC+0800 2016-10-12 06:28 UTC+0800 AmazonEC2ContainerRegistryReadOnly 0 2015-12-22 01:04 UTC+0800 2016-10-12 06:08 UTC+0800 AmazonEC2ContainerServiceAutoscaleRole 0 2016-05-13 07:25 UTC+0800 2016-05-13 07:25 UTC+0800 AmazonEC2ContainerServiceforEC2Role 0 2015-03-20 02:45 UTC+0800 2016-05-05 02:56 UTC+0800 IAM User and Group- 新建的 AWS User 不具有任何權限
- 使用群組的方式來 Attach Policy
- User 預設可以加入 10 個 Group
- ex:User同時在2個Group 則可被20個policy管理 (2 * 10)
Account Settings- 設定密碼原則 (IAM > console > Account setting)
- 長度,組成,期限,及重複使用限制
Lab 練習- 讓本機可以存取 S3 資源,需設定 IAM Role
- 建一個帳號,給予 IAM Role,讓其可以存取資源,使用 AWS CLI 操作時需要使用 Access key 及Secret Key (Static credential)
- service -> IAM Users -> Add user -> 給予role(選S3FullAccess)->需把access key跟secret記錄下來要給aws cli 存取時使用
將key填入搜尋aws region table找出region name,因為S3 bucket建立在Oregon,所以查表找到us-west-2- region name 查詢
- 建立aws configure之後,會在使用者根目錄產生一個.aws目錄(~/.aws),裡面會有aws設定與static credentials(security key)
- 就可列出S3 bucket
- 把key inactive後
- 賦予S3完全存取權限之後(AmazonS3FullAccess),可以將本地端檔案上傳到S3
IAM Role- 用來讓某個AWS Resource可以存取其他的AWS Resource而不需要建立帳號或是Credential
- 一般是套用給EC2,使其中的Application不需要存放Credential檔案,即可獲得存取AWS Resource的權限
- Role是給EC2用的,Key是給非EC2用的
EC2 vs Other- EC2透過Attach IAM Role來取得AWS Resource的權限
- 非EC2透過IAM User Access Key來取得AWS Resource的權限
Create Role: (用role也可以做到存取資源的做法,就不需要使用key)建立EC2時需選取Role,接到EC2後就可直接看到資源- 本機只能用key,EC2才能用Role
IAM Best Practices- 移除root account的key,只透過console做billing的作業
- 建立帳號要能mapping到特定的人,遵循最小權限原則
- 要求複雜的密碼格式並啟用MFA
- Staitc Creadentail應該要定期更換
- 使用cloudTrail來稽核AWS account的活動紀錄 (記錄所有API的活動紀錄,for Audit使用)
Security Group- Host Layer Firewall (只能設allow,不能設deny,真的要阻擋只能用iptables或Network ACL)
- Stateful的防火牆,只需設定inbound或是outbound的其中一個方向
- 只能設定allow的Rule,不能設定Deny且無優先順序
- 一筆Security group可以attach給無限多的EC2
- 一張ENI(網卡)只能套5個security groups
Introduction ACL- Subnet Layer Firewall
- Stateless Firewall,inbound和outbound需要個別設定
- 規則是透過編號順序來決定優先權,編號越低越優先
- 碰到符合的規則就會停止
- subnet只能也一定會associate一個ACL
清場順序EC2 > S3 > Role > User- Part4 - 2017/03/09-10
- Note
- 這個 LAB 會花到費用 (NAT Gateway)
- VPC 是邏輯隔離,彼此獨立的實體機房
- 會用到 4 個 Subnets。
- Subnets 不能跨 AZ(機房)。
- 實作
- 建立 VPC
- CIDR:10.128.0.0/16
- 建立四個 Subnet
- Public-2a
- SELECT VPC
- AZ:us-west-2a
- CIDR:10.128.11.0/24
- Public-2b
- SELECT VPC
- AZ:us-west-2b
- CIDR:10.128.21.0/24
- Private-2a
- SELECT VPC
- us-west-2a
- CIDR:10.128.12.0/24
- Private-2b
- SELECT VPC
- us-west-2b
- CIDR:10.128.22.0/24
- 建立三個 Gateway
- Internet Gateway (igw)
- Attach VPC
- 每個 Internet Gateway 只能 attach 一個 VPC
- NAT Gateway
- 選擇 subnets:Public-2a
- 產生 EIP
- 選擇 subnets:Public-2b
- 產生 EIP
- 寫三張 Route Tabls
- Public
- Routes edit
- Add 0.0.0.0/0 , Target:igw
- Private-2a
- Routes edit
- Add Target:0.0.0.0/0, Target:subnet Public-2a
- Private-2b
- Routes edit
- Add Target:0.0.0.0/0, Target:subnet Public-2b
- 通常不會改 Main Routing table,僅有 Local route 就好,這是為了安全機制。
- Associations Subnet
- Route tables Public 選擇 Subnet Associations
- 把 Public Subnet 2個都勾選 Save
- Route tables Private-2a 選擇 Subnet Associations
- 勾選 Private-2a,Save
- Route tables Private-2b 選擇 Subnet Associations
- 勾選 Private-2b,Save
- 網路環境建立完成。
- EC2
- 建立四張 Security Groups
- ssh
- 22 port
- Public
- Private ( source 用 Public ID 建立)
- web-lb
- 80 , 443 port
- source 0.0.0.0/0
- web-wb
- 80 , 443 port
- sources 用 web-lb 的 security groups id 建立
- 建立 EC2 Instance
- bastion
- Type = Amazon Linux
- Subnet 選擇 Public , 2a or 2b
- 開啟 Public IP
- Security Groups 選擇 Public security groups, 22 port
- $ ssh -i key ec2-user@PublicIP
- $ sudo yum update
- 若是無法登入
- 先確認 Subnet ID,查看是否對應到的是 Public subnet
- 確認 Route tables 是否有走 igw
- Security Groups 是否開啟 22 port 及 client source IP 是否正確。
- 把 key 丟上 bastion ~
- $ scp -i key key ec2-user@PublicIP:~
- web
- Type = Amazon Linux
- Subnet 選擇 Private-2a
- Disable Public IP
- Advanced Details 內 User data,可以跑 script
- 選擇 As text
- #!/bin/sh
- yum -y update
- yum -y install httpd php
- service httpd start
- chkconfig httpd on
- Security Groups
- 選擇 "ssh-private" and "web-lb"
- 從 bastion 用 key 登入 web
- ssh -i key ec2-user@PrivateIP
- ELB or ALB(CBR) 都是跑 EC2
- LB 必須將腳插進 Public subnet
- 如果你再 Public subnet 的網段切的太少,當 LB 流量過大,LB 會起動很多 EC2 來撐起流量,若 IP 不足,將會無法再增加流量。
- 建立 LB
- Class LB
- 選擇 VPC
- Create an internal load balancer 用於不讓外部連上使用,僅能做 internal 使用,只有 Private IP
- 把 Public subnet 都加入,會在你的 Public subnet 都起一台 EC2。
- Security Groups 選擇 web-lb。
- Health Check
- Ping Protocal = HTTP
- Ping Port = 80
- Ping Path 選擇 /
- 只要不是 200 都視為錯誤
- Advanced Details
- Response Timeout = 5
- Interval = 10
- Unhealthy threshold = 3
- Healthy threshold = 3
- 選擇要 LB 的 EC2 (web)
- Tags
- Key = Name
- Value = user-test
- 在 web 內加入 info.php 用來給 LB Health check
- $ cd /var/www/html
- $ sudo vi info.php
- <?php
- phpinfo()
- ?>
- 在 LB Health check
- Ping Path 改為 /info.php
- 在 Instances 的 status 會是 InService。
- 在 web 建立 stress.php 來測試 LB
- $ cd /var/www/html
- $ sudo vi stress.php
- <?php
- for($i = 0; $i < 1000000000; $i++) {
- $a += $i;
- }
- 建立 ami image
- 選擇 EC2 > Actions > image > Create image
- 建立 ami image 原有的 ec2 會重新開機。
- AMI 有分 Region,若要提供給其他 Region 使用,可以用 Copy to Region
- 建立 Instance
- 選擇 My AMIs 建立好的 ami
- Subnet 選擇 Private-2b
- Disable Public IP
- Security Groups 選擇 ssh , web-wb
- 到 LB 的 Instance 加入新的 Private-2b,並且確認 status 為 InService
- 連上 LB 的 DNS name 重新整理,System IP 應該會在兩台 web 輪流更換
- Launch Configurations 負責設定
- Create Launch Configurations
- 選擇已打好的 My AMIs
- 不需要對外 IP,選擇 Do not assign a public IP address to any instances.
- Security Groups 選擇 ssh , web-wb
- Launch Configurations 不能更改,但 Auto Scaling Groups 可以更換 Launch Configuration
- Auto Scaling Groups 負責控制增減的條件
- Start 1 instances
- 選擇 VPC
- 選擇兩個 Private 2a and 2b
- 要自動加入 LB,選擇 Load Balancing
- Classic Load Balancers 選擇你的 LB
- Health Check Type
- EC2 僅檢查虛擬機是否正常、實體機是否正常
- ELB 依照 ELB Health Check 去檢查
- 除非非常有把握,否則先選擇 EC2,不然 ELB 確認失敗會一直 loop 砍掉重建 EC2,不滿 1 hour 以 1 hour 收費。
- 先不設定 Keep this group at its initial size
- 可以加入 notification email。
- 加入 Tags: Key=Name, Value=user-web
- 確認 Instance 會自動建立 EC2
- 確認 LB Instance 會新增 EC2 並且 Status 為 InService
- 從 LB Domain 確認 info.php 顯示正常。
- 設定 Auto Scaling Groups
- Desired = 2,平均值為 2 台
- Min = 1,請勿設定為 0,若出現問題將會把所有 EC2 都砍掉。
- Max =5,最大 5 台
- 因為 Desired 設定 2 台,故 Instance EC2 會在增加為 2 台
- 清場
- Auto Scaling Groups
- Desired = 0
- Min = 0
- EC2
- bastion stop
- release EIP
- VPC
- Delete two NAT Gateway
- Part5 - 2017/03/16-17
- 還原 Part4 現場
- 重建 NAT Gateway
- 到 Route Table 把兩個 Private subnet 分別 mapping 到兩個 Public NAT Gateway
- 2a 對 2a
- 2b 對 2b
- 改 Route 的設定,把原來的 black hole mapping 到剛剛重建好的 NAT Gateway
- 重新 reload Security Groups 自己的 IP (如果 IP 有更換)
- 將 Auto Scaling Group 的 Desired 和 Min 設定成 1 (自動啟動 1 台 WEB by ami)
- 如果你的 ami 已經不存在,會無法 Auto Scaling
- 點選 Launch Configuration,點選 copy Launch Configuration,選擇老師提供的 "shared with me " ami 建立。
- 如果遇到 Security Groups 是空的,請重新選擇 "Private ssh" and "Web"。
- 在 Auto Scaling 把重建的 Launch Configuration 指回來,正常應該是 ${name}-copy
- 從 Load Balancer 的 Instances 查看狀態應該是 InService,並且從 ELB 的 Domain 查看 http://${domain}/info.php
- Auto Scaling (asg)
- Scheduled Actions:主動 Scaling,指定時段啟動機器
- Sacling Policies:定義條件做事
- Scale-out
- Add policy
- Name = scale-out
- Execute policy when
- Create new alert
- Whenever Maximum of CPU
- Is >= 70 %
- Take the action
- Add 67% when 70%
- Add least 1 instance
- Instances need 60 sec to warm
- Scale-in
- Add policy
- Name = scale-in
- Execute policy when
- Create new alert
- Whenever Maximum of CPU
- Is <= 30%
- Take the action
- remove 1 when 30%
- 準備攻擊 ELB
- 啟動 Bastion and Login
- 複製 ELB Domain A record
- 使用迴圈 stress ELB
- $ while ture; do curl http://scott-test-lb-466854070.us-west-2.elb.amazonaws.com/stress.php ; done
- 在 CloudWatch 查看出現 ALARM
- Metrics
- 每一個 Manager 都可以設定 alert
- 所有的服務都會在這
- 符合條件後 EC2 Instance 就會增長
- 確認增長成功後,可以取消攻擊指令,確認 EC2 會減少至 1 台。
- 使用 Packer 打包 AMI
- ssh 登入 bastion
- 用 wget 下載 packer (可先從 https://www.packer.io/downloads.html 複製下載連結)
- 解壓縮
- $ unzip packer_0.12.3_linux_amd64.zip
- 可先用 ./packer 看 help 說明
- $ ./packer
- 參考 https://www.packer.io/docs/builders/amazon.html 找到Using An IAM Instance Profile,複製
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "ec2:AttachVolume",
- "ec2:AuthorizeSecurityGroupIngress",
- "ec2:CopyImage",
- "ec2:CreateImage",
- "ec2:CreateKeypair",
- "ec2:CreateSecurityGroup",
- "ec2:CreateSnapshot",
- "ec2:CreateTags",
- "ec2:CreateVolume",
- "ec2:DeleteKeypair",
- "ec2:DeleteSecurityGroup",
- "ec2:DeleteSnapshot",
- "ec2:DeleteVolume",
- "ec2:DeregisterImage",
- "ec2:DescribeImageAttribute",
- "ec2:DescribeImages",
- "ec2:DescribeInstances",
- "ec2:DescribeRegions",
- "ec2:DescribeSecurityGroups",
- "ec2:DescribeSnapshots",
- "ec2:DescribeSubnets",
- "ec2:DescribeTags",
- "ec2:DescribeVolumes",
- "ec2:DetachVolume",
- "ec2:GetPasswordData",
- "ec2:ModifyImageAttribute",
- "ec2:ModifyInstanceAttribute",
- "ec2:ModifySnapshotAttribute",
- "ec2:RegisterImage",
- "ec2:RunInstances",
- "ec2:StopInstances",
- "ec2:TerminateInstances"
- ],
- "Resource": "*"
- }
- ]
- }
- 在AWS IAM console,建立policy,將剛剛的json貼上存檔
- 在AWS IAM console,建立user,並套用剛剛建立的policy (記得要先保留最後有access key和secret_key的畫面,或先copy下來)
- 參考http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-install.html , 在Bastion編輯一支packer_ami.sh,用來測試打包
- #!/bin/sh
- sudo yum -y update
- sudo yum -y install php httpd
- sudo service httpd start
- sudo chkconfig httpd on
- # auto install codedepoly agent,be careful to setting aws region
- chmod +x ./install
- sudo ./install auto
- {
- "builders": [
- {
- "type": "amazon-ebs",
- "access_key": "請用自己的",
- "secret_key": "請用自己的",
- "region": "us-west-2",
- "source_ami": "ami-f173cc91",
- "instance_type": "t2.micro",
- "ssh_username": "ec2-user",
- "ami_name": "packer {{timestamp}}"
- }
- ],
- "provisioners": [
- {
- "type": "shell",
- "script": "packer_ami.sh"
- }
- ]
- }
如果要餵參數進 sh ,可把 provisioners 改成如下 example:- "provisioners" : [
- {
- "type": "file",
- "source": "setup-packer-java.sh",
- "destination": "/tmp/setup-packer-java.sh"
- },{
- "type": "shell",
- "execute_command": "sh '{{ .Path }}'",
- "inline": [
- "bash /tmp/setup-packer-java.sh {{user `aws_s3_access_key`}} {{user `aws_s3_secret_key`}} {{user `aws_region`}}"
- ]
- }
- ]
6.存檔離開- 執行 packer build
- $ packer build packer.json
- 開始 build AMI,可以在 instance 看到會起一個新的 EC2 Instance,做完之後可以在 EC2 console 的選單列,images 看到已經打包好的AMI。
Part6 - 2017/03/23-24- Topic
- Packer
- CodeDepoly
- Github
- Codeship
- Codedeploy
上圖橘色的部分可以插Hook還原現場- VPC console確認 Internet Gateway,並建回 NAT Gateway (分別指定兩個 Public subnet )
- 還原 Route table,確認 Route 有指向 igw,修改兩個 Private subnet,分別指向兩個 NAT Gateway
- EC2 security group,確認 ssh-public 的來源 IP ,確認 ssh-private的source來源要是ssh-public。
- 建回 ELB,在Health Check確認Ping target是TCP:80,要指定兩個 Public subnet,port 先開 http,security policy 指定給之前訂好 LB 的 security policy,health check 要指定 info.php
- edit Auto Scaling Group,將剛剛設定好的 elb hostname 指定給 Auto Scaling Group,health check 要先改回 EC2,Desired 和 Min 維持 0。
- 啟動Bastion,ssh 登入,確認 shell script 和 json 存在,執行./packer build packer.json 重新打包 images
- 到EC2 console > IMAGES > AMIs確認image已經包好IP Address Type
- 複製Launch Config,確認IMAGE ID,IP設定選擇Do not assign a public IP address to any instances.
- Auto Security Group,在Detail頁籤編輯Desired和Min instance,存檔後若設定正確,會自動啟動一個Instance,當Instance狀態改變成InService後,連接ELB的Domain測試,正常啟動的話會看到Apache的首頁
CodeDeploy 參考資料CodeDeploy follow:AppSpec File Example:在Bastion建立tutorial資料夾 > cd tutorial ; mkdir -p htdoc scripts > 編輯 vi appspec.yml (檔名是固定的,一定要是appspec.yml )- version: 0.0
- os: linux
- files:
- - source: htdoc
- destination: /var/www/html
- hooks:
- ApplicationStop:
- - location: Scripts/ServiceStop.sh
- timeout: 180
- BeforeInstall:
- - location: Scripts/EraseApp.sh
- timeout: 180
- ApplicationStart:
- - location: Scripts/RunFunctionalTests.sh
- timeout: 180
請至下列網址驗證YAML格式是否正確編輯三支script和info.php[ec2-user@ip-10-128-11-59 tutorial]$ cat htdoc/info.php<?phpphpinfo();?>[ec2-user@ip-10-128-11-59 tutorial]$ cat Scripts/EraseApp.sh#!/bin/shrf -rf /var/www/html/*[ec2-user@ip-10-128-11-59 tutorial]$ cat Scripts/ServiceStop.sh#!/bin/shservice httpd stop[ec2-user@ip-10-128-11-59 tutorial]$ cat Scripts/ServiceStart.sh#!/bin/shservice httpd start檢查編寫後的檔案目錄結構是否正確:[ec2-user@ip-10-128-11-59 tutorial]$ find../htdoc./htdoc/info.php./Scripts./Scripts/EraseApp.sh./Scripts/ServiceStart.sh./Scripts/ServiceStop.sh./appspec.yml將編輯好的檔案壓縮成zip file,- cd tutorial;
- zip -r filename.zip *
- 掛載s3
到s3開bucket > 賦予packer user寫入s3的權限 (AmazonS3FullAccess) > 回到Bastion,先cat packer.json的內容 > 在Bastion執行aws configure,輸入自己的- AWS Access Key ID [None]:輸入自己的
- AWS Secret Access Key [None]:輸入自己的
- Default region name [None]:輸入自己的
- Default output format [None]:空白即可
輸入結束後,可用aws s3 mb s3://[bucket name],回到tutorial, 執行aws s3 cp filename.zip s3://[bucket name],上傳剛剛的壓縮檔到s3,上傳結束後回到頁面重整 s3 bucket, 確認檔案有沒有上傳成功- EC2需要去S3抓檔案的權限
http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html 第二個是沒限制resource的範例- AWS可以 Attach policy 的可以用 role/user/group
- EC2可以選擇用user/role,用role較簡單
- 離開AWS的環境只能用User (給key)
- Group通常都是拿來管理management console用的
建立policy,內容請參考上面的連結- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Action": [
- "s3:Get*",
- "s3:List*"
- ],
- "Effect": "Allow",
- "Resource": "arn:aws:s3:::[自己的bucket name]/*"
- }
- ]
- }
- 建立role,將role mapping到剛剛建立的policy
- 到Auto Scaling Group,修改Desired和Min的值都為0,確認已經起的Instance有被Terminate
- 到EC2 console,複製一個新的Launch Config,把IAM Instance Profile改成剛剛建好的role
- 再到Auto Scaling Group,修改Launch Configuration指定到剛剛的Launch Config
- 到IAM console,Create Role,建立一個CodeDeploy的Role,權限要AWSCodeDeployRole
- 到CodeDeploy console,點Create Application,自訂Application name和Deployment group name,Deployment type選In-place deployment,
- Add instances > Search by tags 選 Auto Scaling Group,
- Deployment configuration 選CodeDeployDefault.OneAtATime
- Service role ARN選剛建好的CodeDeploy Role
- 在Bastion裝 git,並且將 source code 丟上 github
- sudo yum -y install git
- cd tutorial
- git init
- git add .
- git commit -am "Init commit"
- git push
- 新建 git branch "next"
- git branch next
- git checkout next
- git push origin next
- 到 Codeship 將 next branch 加入 deployment 的監控,並且指定 CodeDeploy 作為 CD 佈署的方式。
- 到 AWS 建立 IAM User
- 使用 Codeship 給的 Policy 權限,必須修改 Resuorce、S3 bucketname、CodeDeploy application/deployment。
- 建立 IAM User,並且勾選 Policy 權限。
- 把 Access Key 和 Secret access Key 拿到 Codeship 的 AWS CodeDeploy deployment 填入資訊。
- 串好 Codeship 之後就到 git push 一個版本測試 CI / CD 是否正常。
Part7 - 2017/03/30-31[ EC2 Options ]On-Demand Instance- 每小時計價,用多少算多少,依照定價計費
- 不滿一小時以一小時計
Reserved Instance- 簽約(一或三年)30~70 % 折扣
- 不能跨 Region 及無法中途終止
Spot Instance- 競標(取得閒置的ec2)
- Bid Price 來設定可以接受的最高每小時價格
- 一般可省50~90 %
使用場景的優先順序:Reserved Instance (一定要存在的服務) > On-Demand Instance (可以透過auto scaling動態增減的) > Spot Instance (可有可無,不影響服務的)ap類型適用spot優先,web類型適用On-Demand優先# =====Spot Instance > 已價格高來計價 (會有危險)設定的最高價格若超過則直接回收(AWS 直接Terminate)# =====[ Storage Options ]Simple Storage Service(S3)- 無空間上限, 空間用多少算多少錢
- 每個 Object 最大5TB
- REST 及 SOAP
Elastic Block Storage (EBS)- 提供1G~16T的block level storage,依provision計價
- 同時只能被一個EC2掛載,但一個EC2可以掛好幾個EBS
Glacier (其實是用磁帶保存,適用備份)- 提供極低成本的資料存檔(Acrhive)或備份(Backup)
- 每個Archive最大40TB,計價用多少算多少
- 取檔案需等3~5個小時
# =====[ S3 Tiers / Classes ]- Standard(99.99%)(durability 99.999999999%)
- Reduced Redundancy Storage(RRS)(99.99%)(durability 99.99%)
_ 適合可以被重新產生檔案的- Infrequently Access(IA)(99.99%)(durability 99.999999999%)
_ 適合給較少存取頻率,但需要時可以快速存取RRS和IA價格會差50%,RRS較低# =====[ S3 Feature ]- Event (可設定什麼樣的事件觸發什麼樣的行為)
- Cross-Origin Resurce Sharing (允許哪些網址來reference resource)
- Versioning
- Cross-Region Replication (只能單向,自動replication到其他region的bucket)
- Lifecycle (可以設定固定幾天後搬到其他的載體保存)
- Website Hosting (可做靜態頁的網站)
- Transfer Acceleration (可作轉址的公告頁)
# =====[ Database Option ]- Relational Database Service (RDS)
- 提供Managed SQL Database Service
- 支援MySQL, MariaDB, PostgreSQL, SQL Server, Oracle, Aurora
- Write寫Master,Slave備援Master
- Read replica最多可有五份,Aurora可以到15份
- DynamoDB
- 提供Managed noSQL Database Service
- 使用SSD的儲存裝置
- ElastiCache
- 支援Memcached(支援auto discovery)及Redis兩種實作
- Redshift
- 提供Managed Petabyte-Scale Data Warehouse Server
- 採用Columner Data Storage,適合OLAP (適合BI使用)
- OLTP : 很明確的知道要哪一筆資料
- OLAP : 運算也放在Query裏,有結果再回傳
# =====- RDS Detail
- 透過套用Parameter Groups給DB instance來調整DB設定
- Multi-AZ RDS是以Active-Standby的模式運作
- Failover需要大約三分鐘來完成切換,可以手動強制執行切換
- 可避免進行snapshot或backup時,I/O進入suspend
- 每個Primary RDS支援最多5個read Replica
- 透過Async的方式,由Primary Instance產生read only的instance
- 可轉換成獨立可讀寫的RDS,但會停止原本的Replication
- Aurora支援最多15個read replica
- 可以選擇是否在特定時間做自動的Patch或Backup
- Automated Backups : 支援回復35天內,任何一秒的資料庫狀態
- Database Snapshots:手動的備份,不隨刪除instance而消失
- Encryption at rest
- dd
- CloudFront
- ss
- Simple Queue Service(SQS)
- 提供Managed message queuing service
- 主要用來將service components做decouple的實作
- Message的Order是隨機的,並不保證FIFO
- Simple Notification Service (SNS)
- 提供Managed訊息推送服務
- 沒有pull功能,susbscriber需等候publish端
# =====# =====# =====- Supplement