今天花一整天的時間在搞一台 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 的話那一切就說得過去了。