前言

緣起

系統有一項功能需求,當新開啟的 EC2 Instance 需要自動地將本身的 IP 向系統註冊登錄,該如何讓 EC2 Instance 取得自己本身的 Private IP 和 Public IP address 呢?

最快的方法是在 EC2 上透過 curl 特定位置來查詢自身的 Metadata,除此之外,在 linux 環境下可透過 ipifconfig 指令來取得,算是比較通用的作法。

這邊整理上述2種做法,同時複習一下在 Linux 上查詢 IP 的相關指令。

測試環境

  • EC2 Instance 作業系統:CentOS 7
  • iproute2 工具包 v4.8 (ip 指令)

如何取得 EC2 Instance 的 Private IP address

  • 方法1:使用 ifconfig 指令

    1
    /sbin/ifconfig eth0 | grep 'inet ' | cut -f2 | awk '{ print $2}'
  • 方法2:SSH 登入 EC2 Instance 查詢 meta-data 資訊

    1
    curl https://169.254.169.254/latest/meta-data/local-ipv4

如何取得 EC2 Instance 的 Public IP address

  • 方法1:使用外部的查詢 IP 網頁來獲知自己的 IP 為何,例如

    1
    curl ifconfig.co
  • 方法2:AWS CLI aws ec2 describe-instances 搭配 jq 取得 EC2 資訊

    1
    aws ec2 describe-instances --filters Name=private-ip-address,Values=${ip} | jq -r '.Reservations[].Instances[].NetworkInterfaces[].Association.PublicIp'
  • 方法3:SSH 登入 EC2 Instance 查詢 meta-data 資訊

    1
    curl https://169.254.169.254/latest/meta-data/public-ipv4

參考資料

ip 指令介紹

ip 指令 (/bin/ip) 是 Linux 上有關 TCP/IP 流量控制與查詢的一系列工具 (工具包名稱是 iproute2)
其功能與老牌但已經不在維護的 ifconfig (/sbin/ifconfig) 相似,我們可以使用 ip 取代 ifconfig 指令。

在 CentOS 上需要另外安裝嗎?

不需要另外安裝,ip 指令在 RHEL 及 CentOS 也是預設安裝。而除了查詢網路設定外,也可以用作設定網路,以下是 ip 指令的一些常見用法。

常用的 ip 指令

查詢 ipv4 或 ipv6 的 IP address 資訊。

ipv4:

1
$ ip -4 addr

ipv6:

1
$ ip -6 addr

查詢個別網卡的資訊(網卡名稱及 IP address),有以下三種方式:

1
2
3
$ ip addr show eth0
$ ip addr list eth0
$ ip addr show dev eth0

備註:ip 指令的完整參數

1
2
3
4
5
6
7
8
9
10
11
12
13
# -> # ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |
netns | l2tp | tcp_metrics | token }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } |
-o[neline] | -t[imestamp] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] }

備註:ifconfig 指令的完整參數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-> # ifconfig --help
Usage:
ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]
[add <address>[/<prefixlen>]]
[del <address>[/<prefixlen>]]
[[-]broadcast [<address>]] [[-]pointopoint [<address>]]
[netmask <address>] [dstaddr <address>] [tunnel <address>]
[outfill <NN>] [keepalive <NN>]
[hw <HW> <address>] [mtu <NN>]
[[-]trailers] [[-]arp] [[-]allmulti]
[multicast] [[-]promisc]
[mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]
[txqueuelen <NN>]
[[-]dynamic]
[up|down] ...
<HW>=Hardware Type.
List of possible hardware types:
loop (Local Loopback) slip (Serial Line IP) cslip (VJ Serial Line IP)
slip6 (6-bit Serial Line IP) cslip6 (VJ 6-bit Serial Line IP) adaptive (Adaptive Serial Line IP)
ash (Ash) ether (Ethernet) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) rose (AMPR ROSE) tunnel (IPIP Tunnel)
ppp (Point-to-Point Protocol) hdlc ((Cisco)-HDLC) lapb (LAPB)
arcnet (ARCnet) dlci (Frame Relay DLCI) frad (Frame Relay Access Device)
sit (IPv6-in-IPv4) fddi (Fiber Distributed Data Interface) hippi (HIPPI)
irda (IrLAP) ec (Econet) x25 (generic X.25)
infiniband (InfiniBand) eui64 (Generic EUI-64)
<AF>=Address family. Default: inet
List of possible address families:
unix (UNIX Domain) inet (DARPA Internet) inet6 (IPv6)
ax25 (AMPR AX.25) netrom (AMPR NET/ROM) rose (AMPR ROSE)
ipx (Novell IPX) ddp (Appletalk DDP) ec (Econet)
ash (Ash) x25 (CCITT X.25)

備註:hostname 指令的完整指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-> # hostname --help
Usage: hostname [-b] {hostname|-F file} set host name (from file)
hostname [-a|-A|-d|-f|-i|-I|-s|-y] display formatted name
hostname display host name
{yp,nis,}domainname {nisdomain|-F file} set NIS domain name (from file)
{yp,nis,}domainname display NIS domain name
dnsdomainname display dns domain name
hostname -V|--version|-h|--help print info and exit
Program name:
{yp,nis,}domainname=hostname -y
dnsdomainname=hostname -d
Program options:
-a, --alias alias names
-A, --all-fqdns all long host names (FQDNs)
-b, --boot set default hostname if none available
-d, --domain DNS domain name
-f, --fqdn, --long long host name (FQDN)
-F, --file read host name or NIS domain name from given file
-i, --ip-address addresses for the host name
-I, --all-ip-addresses all addresses for the host
-s, --short short host name
-y, --yp, --nis NIS/YP domain name
Description:
This command can get or set the host name or the NIS domain name. You can
also get the DNS domain or the FQDN (fully qualified domain name).
Unless you are using bind or NIS for host lookups you can change the
FQDN (Fully Qualified Domain Name) and the DNS domain name (which is
part of the FQDN) in the /etc/hosts file.

參考資料

Conclusion

  • 取得 EC2 的 IP 最快的方法是在 EC2 上透過 curl 特定位置來查詢自身的 Metadata
  • 若要比較通用的作法,可在 linux 環境下可透過 ipifconfig 指令來取得。

關於工作的自我提問

一個平凡的週六,在運動中心的課程告個段落後,趁著今天老婆不在家,難得給自己一個人獨處的早晨。
窩在咖啡店 Coding 忙著公司和客戶的東西,眼神不經意瞄到書報架上有一本天下雜誌,隨手翻閱了一下。

高績效員工在決定跳槽之前,必然有一連串的自我提問:

  • 我對我的工作很滿意嗎?
  • 我喜歡我的經理、我的團隊嗎?
  • 手上的專案讓我有充實感嗎?
  • 我在學習嗎?
  • 我是否受到尊重?
  • 我有沒有成長?
  • 我覺得報酬合理嗎?
  • 這個公司(團隊)有願景嗎?
  • 我是否相信這個願景?
  • 我信任公司(團隊)領導人嗎?

天下雜誌的文章:人才難找 8招搞定明星員工

古人云:「吾日三省吾身」。

身為一位忙碌的現代人,似乎忘記了這句簡單的話,

嗯!的確是該好好自我檢視省思一下了。

Bobo內心旁白:「有一種自我診斷量表的感覺,各位軟體開發者都應該定期自我檢視一下,3分鐘護一生 (笑)」

前言

VSCode 在 v1.10 推出綜觀程式碼區塊的 Minimap 功能,只要在設定檔加入 "editor.minimap.enabled": true 即可開啟此功能。

預設的 Minimap 會將程式碼細緻顯示,相對的也增加畫面渲染的負擔,官方也提供 Minimap 使用方塊方式顯示程式碼,這兩種 Minimap 顯示方式的對照如下圖所示,以下說明如何設定。

設定 Minimap 使用方塊方式顯示程式碼

  1. 執行 command+, 開啟設定 (Open User Settings)
  2. 搜尋 minimap 找到相關設定
  3. "editor.minimap.renderCharacters": false, 設定為 false 即可。

VSCode 的 Minimap 功能持續進化中!敬請期待~

像是以下功能未來也可能會加入:

  • current selection
  • editor cursor
  • change annotations (i.e. git status)
  • find matches

這邊有相關討論:
https://github.com/Microsoft/vscode/issues/20934

聊聊 VSCode 為何漸漸地變成我的開發主力工具

對開發人員來說,編輯器可是和我們朝夕相處的好夥伴,好不好用、順不順手可是相當重要,用的順手可以讓你開發起來行雲流水,我的編輯器選擇也一路從 Notepad++、Sublime Text,到前陣子也逐漸地從 Sublime Text 轉移到 VSCode 上面來。

主要是 VSCode 提供了許多原本 Sublime Text 有特色的功能,像是 Sublime 當初很吸引我的 Minimap 功能!現在 VSCode 也支援了!甚至未來還會做得更好(期待),將有更多的 features 應用在 Minimap 上面。

VSCode 的生態圈相當活躍,版本更新也相當頻繁(幾乎一個月一版的更新),而且一直都有令人驚豔的新功能加入,這陣子用下來的確是越用越順手,尤其在面對多種語言開發需求(PHP、JavaScript、Elixir、Shell Script、Golang..),使用 VSCode 來開發更是行雲流水呀!

身為一位曾經實際以付費行動來挺 Sublime Text 的支持者,感謝 Sublime Text 曾經帶給我的現代化 Web 開發流暢體驗!在這個時代,有時候其實你並沒有做錯什麼,也沒有哪裡不好,只是這個時代的巨輪滾動的太快,一個閃神不往前就成了一種退步。

Hi Sublime Text 相信你還是會繼續配伴著我,來擔任我的高級文字編輯器好了。