~ 我們走捷徑 ~
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 上面的檔案。
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
$ 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
$ 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 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
$ ssh ec2-user@<ec2-instance-id> \
-i EC2KeyPair.pem \
-o ProxyCommand='aws ec2-instance-connect open-tunnel \
--instance-id <ec2-instance-id>'
$ 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