Site icon Mr. 沙先生

AWS 的 EC2 上用 Proxy 後取不到正確的 meta-data

今天花一整天的時間在搞一台 EC2,這台 EC2 在 launch 的時候就塞入 Role 了,然後在安裝 CloudWatch agent 的時候一直出現「Unable to locate credentials」,意思就是吃不到憑證,但是我是 run  EC2 通常有 Attach Role 就可以吃到 credentials 才對

 

搞了一整天 Role 也開了 Administrator 連 S3 都是「Unable to locate credentials」

 

 

終於在看了 meta-data 之後找到答案

$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-keys/
reservation-id
security-groups
services/

上面是有問題 EC2 的 meta-data,關鍵的是少了 IAM,下面是正常的 meta-data 應該長這樣:

$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
iam/
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-keys/
reservation-id
security-groups

 

因為沒有 IAM 所以沒有 Role 的 credentials 非常合理 ..

 

然後想了一下 EC2 為什麼會沒有 IAM ….  通常是在沒有 assign Role 的時候才會沒有 IAM

但是這台 EC2 在一開始的時候就 assign Role 了,不應該會沒有 IAM 才對啊 !!

 

仔細看了一下 meta-data 的 instance-id .. 竟然是 Proxy 的 instance id,因為這台 EC2 如果要能夠上 internet 必須要透過 Proxy 才能出去,所以取到了是 Proxy 的 meta-data .. 而這台 Proxy 並沒有 assign Role,一切都合理了 !!

 

原來在 AWS 文件中就有提到如果 Using an HTTP Proxy 的話除了 export http_proxy/https_proxy 以外,還必須加上 NO_Proxy 例外排除 169.254.169.254

If you configure a proxy on an ec2 instance launched with an IAM role, you should also set the NO_PROXY environment variable with the IP address 169.254.169.254, so that the AWS CLI can access the Instance Meta Data Service (IMDS).

$ export NO_PROXY=169.254.169.254

 

但是為什麼用 Proxy 會取到不同的 meta-data,如果 169.254.169.254 是存在 EC2 local 就可以 access 的話,對於 export Proxy 來說應該是沒有影響的才對,但如果 169.254.169.254 對於 EC2 來說也是另一個 API Proxy Server 的話那一切就說得過去了。

 

 

Exit mobile version