昨天建立好 EC2,今天來用金鑰登入主機,存個檔案,再關機重開看看
對照下面這張圖,今天要從自己的電腦連到綠色的 EC2,再把檔案存進紫色的 EBS
SSH 可以讓我們透過網路登入遠端主機、執行指令。登入前,終端機操作的是自己的電腦;登入後,操作的就是 AWS 上那台 Ubuntu(官方說明)
這裡沿用昨天的 my-web-server
到東京 Asia Pacific (Tokyo) → EC2 → Instances,找到 my-web-server。如果昨天有先關機,現在就按 Instance state → Start instance,等 Running 與狀態檢查通過
複製 Details → Public IPv4 address,等一下 SSH 會用到。自動分配的公有 IP 在 Stop 時會釋出,所以開機後要重新確認
如果昨天在公司,今天換回家裡,上網的公有 IP 可能不同,SG 的 SSH 來源也要跟著改
到 Security → 點 SG → Edit inbound rules,確認 SSH、TCP 22 的來源是自己目前上網的公有 IP /32。一般直接上網可以選 My IP;如果有 VPN 或代理,要確認瀏覽器跟 SSH 的出口是否相同
| IP | 要放在哪裡? |
|---|---|
| EC2 目前的公有 IP | SSH 指令,告訴電腦要連哪台主機 |
自己上網的公有 IP /32 |
SG 的 SSH 來源,允許自己從這個 IP 連進來 |
這裡用 Mac 的 Terminal 示範。先在自己電腦打開終端機,假設 my-web-key.pem 放在下載資料夾,就執行:
cd ~/Downloads
chmod 400 my-web-key.pem
第一行切到下載資料夾,第二行讓私鑰只有擁有者能讀取。如果檔案權限太寬鬆,SSH 可能會拒絕使用
接著把 EC2_PUBLIC_IP 換成剛才複製的 EC2 公有 IP:
ssh -i "my-web-key.pem" ubuntu@EC2_PUBLIC_IP
-i 指定私鑰的位置,ubuntu 是 Ubuntu 主機裡的使用者,不是 IAM 名稱。私鑰放在其他資料夾,就要改路徑;留在自己電腦就好,不要上傳或交給別人
如果怕打錯,也可以在 Console 選這台主機,按 Connect → SSH client,對照 AWS 提供的連線指令
Windows 則可以用有安裝 OpenSSH 的 PowerShell,切到私鑰所在資料夾,執行同一行 ssh。檔案權限不用打 chmod,改在 .pem 按右鍵,進入 內容 → 安全性 → 進階,停用繼承,只保留目前使用者的存取權~
第一次連線會詢問是否信任這台主機,並顯示 fingerprint(指紋),要先確認是不是自己的主機
在 Console 選同一台 EC2,按 Actions → Monitor and troubleshoot → Get system log,找 BEGIN SSH HOST KEY FINGERPRINTS,比對相同類型的指紋。一致後再輸入 yes 繼續
登入後可以打這兩行,看看現在的使用者跟所在資料夾:
whoami
pwd
應該會分別看到 ubuntu 跟 /home/ubuntu
如果登入時卡住,也可以先從訊息判斷:
| 訊息 | 先看哪裡? |
|---|---|
No such file or directory,找不到私鑰 |
自己電腦的資料夾、檔名有沒有對 |
UNPROTECTED PRIVATE KEY FILE |
私鑰的檔案權限 |
Connection timed out |
主機有沒有開、IP、SG 來源、路由與本機網路限制 |
Permission denied (publickey) |
ubuntu 使用者名稱、金鑰有沒有拿對 |
金鑰拿錯,改 SG 也沒用,先照錯誤訊息找原因就好~
昨天選的 EBS 是保存系統與檔案的磁碟,一般 Stop 關機會保留磁碟與裡面的檔案
我們來存個檔案試試。在已經登入 EC2 的終端機執行:
mkdir -p ~/ec2-practice
date -Iseconds > ~/ec2-practice/before-stop.txt
cat ~/ec2-practice/before-stop.txt
這三行會建立資料夾、把現在的時間存進 before-stop.txt,再顯示內容。記下這個時間,等一下開機後拿來比對
輸入 exit 登出 SSH,再回 Console 關機。要注意登出不會關機,主機還在收費嘿~
關機前記下 Instance ID、公有 IPv4,以及 Storage → Volume ID,用來確認開機後是不是同一台主機、同一顆磁碟
然後按 Instance state → Stop instance,這次維持正常關機,不勾 Skip OS shutdown。等狀態變成 Stopped,再按 Start instance,等 Running 與狀態檢查通過
注意這裡是 Stop 再 Start,不是 Reboot,後面會一起比較差異
沿用昨天的設定、沒有另外設定固定 IP 的話,開機後應該會看到:Instance ID、Volume ID 一樣,自動公有 IP 重新分配
複製目前的公有 IP,再用 SSH 登入;如果問主機指紋,一樣先比對。進去後只執行下面兩行~
cat ~/ec2-practice/before-stop.txt
date -Iseconds
第一行應該還是關機前存的時間,第二行才是現在的時間,原本的檔案還在
一般 Stop 不會保留記憶體裡的內容。例如手動啟動的 Node.js,程式碼雖然還在 EBS,開機後仍要再啟動;想要自動執行,就要另外設定
要提醒一下磁碟保留下來也不等於有備份,誤刪的檔案不會因此復原,重要資料仍要備份
如果是團隊共用的測試主機,每次換 IP 就得重新通知同事。這時可以用 Elastic IP(EIP),保留一個固定的公有 IPv4
把 EIP 關聯到主機後,只要沒有改動關聯或釋出,一般 Stop/Start 會繼續用同一個位址~
圖中的 A、B 代表重新分配前後的 IP。EIP 則保留同一個位址,但主機關機時,一樣連不進去
如果有需要,可以到同一個 Region 的 EC2 → Elastic IPs → Allocate Elastic IP address 申請,再從 Actions → Associate Elastic IP address 關聯到主機
如果是自己練習,我會建議先不用申請,重新複製 IP 就好。EIP 就算沒在用,保留著也會收費
目前 AWS 提供的一般公有 IPv4,使用中或閒置都是 每個每小時 US$0.005,保留 30 天、720 小時約 US$3.60,未扣優惠、未稅。附上官方價格,也是個費用啊 XD
之後還要用主機,選 Stop;確定不要了,才選 Terminate:
| 操作 | 主機會怎樣? | 自動公有 IP | EBS 裡的檔案 |
|---|---|---|---|
| Reboot,重新啟動 | 作業系統重開,仍算運算費 | 保留 | 保留 |
| Stop → Start,關機再開 | 可以停著,之後再開 | 釋出後重新取得 | 保留 |
| Terminate,終止 | 這台確定不要了,不能再 Start | 釋出 | 看磁碟的 Delete on termination 設定 |
這張表是以今天 EBS 系統磁碟、使用自動公有 IPv4,沒有 EIP 的主機來看
昨天把系統磁碟的 Delete on termination 設為 Yes,所以 Terminate 時,這顆磁碟與裡面的檔案也會一起刪掉
實務上要先備份或搬走重要資料,再終止主機。如果選擇保留磁碟,也要有人接手管理,畢竟它會繼續收費
如果你有另外試 EIP,記得要釋放掉嘿,不然會一直算錢哦!,可以到到 Elastic IPs 先 Disassociate,再 Release Elastic IP addresses,確認清單已沒有這筆。只解除關聯還是會收費,釋出後那個 IP 也就不再是自己的了
希望這篇文章有讓你對 EC2 有更深入的瞭解
我們下篇見 :D