從本機 Windows 連線至 AWS EC2 的 Linux Instance (筆記)

陳小痘
10 min readDec 4, 2019

--

因為筆者工作所需,所以會把新學習的事物給記錄下來,如果能多少幫助到讀者的話,就實在是太好了!接續之前的,我們已經可以成功透過 WebSocket 跟 Jupyter Notebook Server API 溝通了,也使用了 Flask 完成 Web API。但這些東西目前都還放在本機端,所以這篇主要是寫如何放到雲端供他人連線取用。

首先,我要挑選一個雲端服務平台,而筆者選擇了:亞馬遜雲端運算服務( 英語:Amazon Web Services,縮寫為 AWS )。由亞馬遜公司所建立的雲端運算平台,提供許多遠端 Web 服務。Amazon EC2 與 Amazon S3 都架構在這個平台上。在這邊筆者選用了 Amazon EC2,因為公司已經替我申請好了一個空間,所以可能要麻煩讀者自行申請,有免費12個月可以試用,詳情請見官網:Amazon EC2 — AWS

接著我們要如何從本機的 Windows 連線至 AWS EC2 的 Linux Instance 呢?答案是選用『PuTTY』。PuTTY 是一款整合虛擬終端、系統控制台和網路檔案傳輸為一體的自由及開放原始碼的程式。它支援多種網路協定,包括SCP,SSH,Telnet,rlogin 和原始的通訊端連接。它也可以連接到序列埠。

而這邊筆者選擇了 SSH 方式去跟通訊端連接。SSH 全名:Secure Shell ( 安全外殼協定 ) 是一種加密的網路傳輸協定,可在不安全的網路中為網路服務提供安全的傳輸環境。

那麼開始來準備實作,但筆者會以自己的方式去操作,過程中較為簡單但也比較缺乏完整性。如果讀者想要詳細的操作步驟,可以參考底下的
官方教學:使用 PuTTY 從 Windows 連線至您的 Linux 執行個體

安裝 PuTTY

我們先到 PuTTY 最新版的安裝頁面:Download PuTTY: latest release
筆者是下載:MSI 的 64 bit 版本, 並安裝起來。大部分的使用者使用預設安裝選項即可。

轉換私有金鑰格式

PuTTY 是不支援 SSH 金鑰的私有金鑰格式 ( .pem )。但 PuTTY 提供一套工具:PuTTYgen,它可以將金鑰轉換為 PuTTY 所需的格式 ( .ppk )。所以我們要先轉換好格式,才能使用 PuTTY 連線至 AWS EC2 的 Linux Instance。

首先, 點選(開始)功能表,接著直接打字:PuTTYgen,我們就可以搜尋到 PuTTYgen 的應用程式,點選它開啟。

在 Type of key to generate 下,選擇 RSA。接著按下 Load。

根據預設只會顯示 ( .ppk ) 檔案。所以我們要改為:All Files (*.*),顯示所有類型的檔案後才可以選到 ( .pem ) 檔案。選好檔案並按下(開啟)。

開啟後就會跳出視窗,告知我們已成功匯入外部金鑰,並指示接下來要選擇 Save private key 存成 PuTTY 可以使用的金鑰格式。我們照著指示操作,會跳出 PuTTYgen Warning:顯示有關未以複雜密碼儲存金鑰的警告。選擇 (是),最後打好檔名,存檔,即完成 PuTTY 可以使用的金鑰。

設定 PuTTY 配置

接下來我們要設定好 PuTTY 配置,好讓我們可以使用 PuTTY 連線到 AWS EC2 的 Linux Instance。

第一步,開啟 PuTTY 應用程式。接著在 Session 類別,輸入正確的 Host Name ( 筆者這邊是填寫公司提供 AWS EC2 的外部 IP 位址 ),Port 值為 22,Connection Type 選擇 SSH。

第二步,在 Connection 類別,點開 SSH 並點選其分支 Auth。接著我們按下 Browse...。

選擇我們之前轉換私有金鑰格式 ( .ppk ) 檔案,然後選擇(開啟)。

第四步,基本上 PuTTY 配置已設定完成了。但讀者應該不會想每次進來都要再設定一次吧!所以現在我們要把目前的 PuTTY 配置存下來。先再回到 Session 類別,在 Saved Sessions 中輸入PuTTY 配置的名稱,然後選擇 Save ,即會出現我們之前設定的 PuTTY 配置名稱。未來只要 Load 此 PuTTY 配置,在點擊 Open 即可連線至 AWS EC2 的 Linux Instance。

傳輸檔案到 Linux Instance

因為接下來筆者想要在 AWS EC2 的 Linux Instance 執行上一篇:使用 Flask 創建 Web API (筆記),所撰寫的 Web API。所以需要先把 Web API 檔案傳輸過去,先放置好 AWS EC2 的 Linux Instance 上。

而這邊筆者選用了 WinSCP 當作傳輸的媒介,因為它有提供視覺化的介面,讓使用者操作上更為直觀。。

註:WinSCP 是 Windows 的 GUI 型檔案管理員,能讓您使用 SFTP、SCP、FTP 和 FTPS 通訊協定將檔案上傳及傳輸到遠端電腦。WinSCP 可讓您將 Windows 電腦的檔案拖放到 Linux 執行個體,或在兩個系統間同步整個目錄結構。

首先,一樣是先下載並安裝好 WinSCP,安裝選項照預設的即可。
WinSCP 下載頁面:http://winscp.net/eng/download.php

接著啟動 WinSCP。我們會先來到登入畫面,這時候主機名稱:筆者輸入公司提供 AWS EC2 的外部 IP 位址,接著 Port 為預設 22。至於使用者名稱,因為筆者是 Ubuntu AMI,所以使用了 ubuntu,不用密碼。
接著點選(進階)。

我們打開:進階站台設定,點選 SSH 底下的:身分核對。接著在私鑰檔案,選擇我們之前轉換私有金鑰 ( .ppk ) 檔案,按下(確定)即完成設定。

一樣怕麻煩,不想每一次都輸入的話,我們就儲存一份。未來只要點選它即可直接登入!

登入後,我們即可以看到左右兩個視窗:左邊是我們的本機,右邊是雲端服務平台 AWS EC2。我們只要選取要上傳的資料夾,拖拉到右邊的 AWS EC2 視窗,放開後即可完成上傳資料夾。至於資料夾內的檔案,就是啟動 Web API 的主程式。檔案我會放在文末,有興趣的讀者可以自行取用。

PuTTY 開始連線!

好的!我們終於可以開始使用 PuTTY 來連線了。再一次開啟 PuTTY 應用程式,直接點擊兩次:之前存好的 PuTTY 配置。即會開啟 Linux 操作視窗,接著我們輸入使用者名稱,就可以登入了!( 這邊筆者是使用 ubuntu )

AWS EC2 的 Linux 操作視窗

成功進入 AWS EC2 之後,我們要執行之前上傳的 Web API,所以要先到它的目錄底下:cd Web_API。最後 Web API 因為是使用 Python 語言所撰寫的,因此我們要打以下 command 去啟動 Web API:python3 api.py。看到跑出 Running ...資訊,恭喜你!我們啟動了AWS EC2 那邊的 Web API。
( 註:api.py 是跑 Web API 的主程式 )

AWS EC2 的 Linux 操作視窗

這時候我們就可以試著用本機的程式,去跟 AWS EC2 那邊的 Web API 作互動!開啟 cmd( 命令提示字元 ),並把測試檔( demo.py )直接拖拉到 cmd 視窗去執行!很高興我們能看到 Web API 傳回 JSON 資料,而 Linux 操作視窗也出現我們本機的連線記錄( 118.XX.XXX.XX 為本機的外部 IP 位址 )。

本機 cmd 視窗畫面
AWS EC2 的 Linux 操作視窗

Web API 資料夾內的 module.py

import json
import requests
# 讀取Jupyter Notebook檔案的內容
def get_content_of_notebook(notebook_path, base, headers):
url = base + '/api/contents' + notebook_path
response = requests.get(url, headers=headers)
file = json.loads(response.text)
return file['content']

Web API 資料夾內的 api.py

from flask import Flask, jsonify, request
import module
app = Flask(__name__)@app.route('/api/content', methods=['POST'])
def content_notebook():
data = request.get_json()
notebook_path = data['notebook_path']
base = data['base']
headers = data['headers']
content = module.get_content_of_notebook(notebook_path, base, headers)return jsonify(content)if __name__ == '__main__':
# 172.31.16.167為AWS EC2的本地IP位址
app.run(host = '172.31.16.167', port=5000, debug=True)

測試的 demo.py

import requestsbody = {
'notebook_path': '/work/new_file.ipynb',
'base': 'http://127.0.0.1:8888/',
'headers': {'Authorization': 'Token 1c129e97ea3cbfa139d95912587fbbea038b35abaaf247e7'}
}
url_contents = 'http://127.0.0.1:5000/api/content'contents = requests.post(url_contents, json=body)
print(contents.text)

程式部分如有不懂,讀者可以前往底下這篇文章看詳細解說哦!
傳送門:使用 Flask 創建 Web API (筆記)

以上是我的學習分享,希望對於讀者有所幫助。如果有什麼疑問,歡迎在底下留言,我們互相交流交流切磋一下^____^

--

--