因為前陣子被 User-Data 弄了一些時間,同樣在公司有許多同事對於 User Data 有許多疑惑的地方,趁記憶猶新的時候記錄下來
開始講之前一樣先提 AWS 也有在文件提到 User-Data,這篇只講 User-Data。
User-Data 是依附在 EC2 底下的功能,主要就是講 EC2 在啟動的時候可以按照 User-Data 裡面寫的指令做事,不需要再 Login 到 Instance 裡面。
限制
- User-Data 並沒有隱密性,在 Management console 是明碼存在,而在 Instance 裡面是存在 meta-data 裡面,也是明碼顯示。
- 最大限制為 16 KB。
- 可以跑 base64
- 只有在 Launch instance 的時候跑,你如果 stop 再 start 的話是不會跑 User-data 的。
User-data 在 Instance 的實現
在 EC2 內建是跑 cloud-init 來執行 User-data,以 service 的方式跑在背景,詳細可以從 Log 看到 cloud-init 的過程:
- /var/log/cloud-init.log
- /var/log/cloud-output.log
User-data 在 Only private instance 的實現
這邊指的是在 Private subnet 而沒有 NAT Gateway 的環境下,如果你要透過 Internet 去做事的處理方式
cloud-init 本身是吃 export http_proxy/https_proxy 的,但 cloud-init 是跑在 rc3 的 service,根本吃不到你設在環境變數的 export http_proxy,所以即使你設在 environment 也沒用。
這個問題在 cloud-init 有一篇提到「setting up system proxy via cloud-config might be nice」
首先先說在 AWS Ubuntu 和 Amazon Linux 的 cloud-init 安裝方式不同,設定 Proxy 的方式也不太相同:
- Ubuntu 的 cloud-init
在 Ubuntu 的 cloud-init 是用 apt 裝 package 的方式,如果要添加 Proxy 要從 /etc/init/cloud-config.conf 這邊加入 proxy
$ vim /etc/init/cloud-config.conf env http_proxy=http://proxy.com:3128/ env https_proxy=http://proxy.com:3128/ env no_proxy=169.254.169.254 export http_proxy export https_proxy export no_proxy
- Amazon Linux 的 cloud-init
Amazon Linux 和 Ubuntu 的安裝方式不一樣,設定檔也不同,從 cloud-init 的 service 看到 (/etc/init.d/cloud-config) 在 runservice 之前有一段
# If there exist sysconfig/default variable override files use it…
[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init
[ -f /etc/default/cloud-init ] && . /etc/default/cloud-init
由此可知可以從 /etc/sysconfig/cloud-init 或是 /etc/default/cloud-init 加入 proxy
$ tee /etc/sysconfig/cloud-init <<EOF export http_proxy=http://proxy.com:3128 export https_proxy=http://proxy.com:3128 export no_proxy=169.254.169.254 EOF
至於為什麼要 no_proxy !? 這是因為幾乎所有 AWS 上跑的服務都會用到 meta-data,例如 credentials,所以一定要 no_proxy 169.254.169.254,否則你的服務就會一直遇到掛 Role 但找不到 credentials 的情境。