iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
Cloud Native

AWS AI交易室實戰系列 第 6

Day 6 - EC2 & EC2 Instance Connect Endpoint

  • 分享至 

  • xImage
  •  

~ 我們走捷徑 ~
EC2 Instance Connect Endpoint
User connecting to private EC2 instances through an EIC Endpoint

作為 AWS 上面的 VM,EC2 一直以來提供了簡單直覺的雲端服務給廣大的使用者架構服務,網上已經有很多關於 EC2 商業化應用的架構可以參考,不過隨著IP位址越來越珍貴,AWS 也打算在2024年 2/1 開始對公有IP收費啦!
AWS 公有 IPv4 地址收費 + Public IP Insights
以往我們連進去我們的 EC2 Instance 為了兼顧安全性,都會建立一個堡壘伺服器(bastion server),來做為 ssh 連線的跳板,而我們的 EC2 Instance 會放在私有子網(private subnet)裡面,問題就在這個堡壘會需要一個公有 IP 接受外面的連線。

今天我們會介紹一個新的 AWS 服務 - EC2 Instance Connect Endpoin 讓我們透過 AWS 本身的認證授權來連到私有子網的 EC2 Instance。
我們會用 AWS CLI 跑一次建立 EC2 Instance 的流程,使用 default VPC 就可以了,接著創建一個 EIC Endpoint,接著本機端透過指令 ssh 進去,最後通過 Proxy Command + tunnel 優雅地在本地端以 scp client 管理 EC2 Instance 上面的檔案。

  • 建立 EC2 Instance 連線所需要的金鑰對(key pair),名稱為 EC2KeyPair,檔名為 EC2KeyPair.pem
  • 這邊需要使用 chmod 400 EC2KeyPair.pem 給予適當的權限(400,文件所有者只有讀取權限),不然 AWS CLI 指令會噴錯唷
# 查詢 AmiID
$ aws ec2 describe-images --owners self amazon

# 產生金鑰對
$ aws ec2 create-key-pair \
--key-name EC2KeyPair \
--query "KeyMaterial" \
--output text > EC2KeyPair.pem

# protect your key
$ chmod 400 EC2KeyPair.pem
  • 然後建立 ec2 instance 在 default VPC,名稱叫 marathon-ec2,
$ aws ec2 run-instances \
--image-id <ami-id> \
--instance-type t2.micro --count 1 \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--associate-public-ip-address \
--key-name EC2KeyPair \
--tag-specifications ResourceType=instance,Tags=[{Key=Name,Value=marathon-ec2}]

$ aws ec2 describe-instances --filters Name=tag:Name,Values=marathon-ec2
  • 接著我們建立一個 ec2 instance connect endpoint,其中 預設 VPC 有三個隨便選一個, 選預設的那一個(預設只有允許 AWS 內部連線)
  • EIC endpoint web console 位置:EC2 -> 左邊側欄 Virtual private cloud -> Endpoints 下面
  • 注意 connection-type 這裡是 eice(eice 是 EC2 Instance Connect Endpoint 的縮寫)
$ aws ec2 create-instance-connect-endpoint \
    --subnet-id <subnet-id> \
    --security-group-id <security-group-id>
	--tag-specifications ResourceType=instance-connect-endpoint,Tags=[{Key=Name,Value=marathon-ec2}]
$ aws ec2-instance-connect ssh --instance-id <ec2-instance-id> --connection-type eice
  • 接著我們執行 AWS CLI + ssh 指令,於是我們在沒有使用公有IP的情況下,連進去我們的 EC2 了
$ aws ec2-instance-connect ssh --instance-id <ec2-instance-id> --connection-type eice 
,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Thu Aug 17 15:40:12 2023 from 172.31.37.155
  • 另外我們也可以使用 Proxy Command ,這樣一來很多 ssh client 工具程式就可以使用 & 管理
$ ssh ec2-user@<ec2-instance-id> \
    -i EC2KeyPair.pem \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel \
    --instance-id <ec2-instance-id>'
  • 最棒的是可以開啟 web socket tunnel 使用本地端 8888 port 連進去
$ aws ec2-instance-connect open-tunnel \
    --instance-id <ec2-instance-id> \
    --local-port 8888
    
# connect with ssh using hostname 'localhost'
$ ssh -i my-key-pair.pem ec2-user@localhost -p 8888

# scp also works! Upload local file 'temp.txt' to remote file 'temp2.txt'
$ scp -i EC2KeyPair.pem -P 8888 temp.txt ec2-user@localhost:/home/ec2-user/temp2.txt      

如此一來我們可以使用像是 FileZilla 之類的 scp client 來管理我們在 EC2 Instance 上面的檔案,因為使用 tunnel 給了 EC2 Instance,hostname & port

最後記得清理 EC2 Instance & EC2 Instance Connect Endpoint,以免產生不必要的費用

$ aws ec2 terminate-instances --instance-ids <ec2-instance-id>
$ aws ec2 delete-instance-connect-endpoint --instance-connect-endpoint-id <instance-connect-endpoint-id>

參考資料

https://aws.amazon.com/tw/blogs/compute/secure-connectivity-from-public-to-private-introducing-ec2-instance-connect-endpoint-june-13-2023/
https://www.ecloudture.com/連線至ec2的三種方法與比較-ssh,ec2實例連接,系統管理/
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2-instance-connect/index.html
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-instance-connect-endpoint.html
https://arunksingh16.medium.com/introducing-ec2-instance-connect-endpoint-63d391317b69
https://varunmanik1.medium.com/connecting-to-aws-ec2-instance-with-winscp-and-integrating-with-putty-a-step-by-step-guide-b31ea40b77f4
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-using-eice.html


上一篇
Day 5 - 建立 VPC
下一篇
Day 7 - AWS Lambda in Python
系列文
AWS AI交易室實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言