AWS CodeDeploy 跑在 On-Premises Instance 時的地雷...

AWS CodeDeploy 可以除了可以更新跑在 AWS 自家的程式外 (像是 EC2Lambda 之類的),也能更新不是跑在 AWS 裡的程式。比較明顯的差異就是跑在 AWS 內的 CodeDeploy 是不另外收費的 (應該需要同一區,不過沒特別提到),但跑在 AWS 外的需要收費:

For CodeDeploy on EC2/Lambda: There is no additional charge for code deployments to Amazon EC2 or AWS Lambda through AWS CodeDeploy.

For CodeDeploy On-Premises: You pay $0.02 per on-premises instance update using AWS CodeDeploy. There are no minimum fees and no upfront commitments. For example, a deployment to three instances equals three instance updates. You will only be charged if CodeDeploy performs an update to an instance. You will not be charged for any instances skipped during the deployment.

不過最近在測試的時候發現一堆雷,寫下來讓大家摸索的時候可以少痛苦一點... 之後 wiki 上的「AWS CodeDeploy」會持續更新。

第一個是在測試時,會反覆安裝練習,但會發現 Deregistered 後一直沒消失,而同樣名字的 instance 與 IAM 都不能再被使用。這個問題在 AWS 官方的 forum 上有被提到是 bug,而且目前沒有解 (deregister 後會有一段時間留在系統上),只能用 workaround 先處理 (用另外一個名字註冊),所以在練習的人得注意:「Deregister and register on-premise instance again」。

Thanks for your posting, this is a known bug on our side for deregister on-premise hosts. After you deregister an on-premises instance, you cannot create a replacement instance with the same name or the same associated IAM user name until AWS CodeDeploy deletes its records about the deregistered on-premises instance. This typically takes about 24 hours.

再來是跑 aws deploy install 的時候會裝 ruby2.0,但從前面的連結可以看到,ruby2.0 只在 14.04 上有,所以 16.04 (或是最新的 18.04) 都會安裝失敗。這點在 AWS 的 GitHub 上被戳了很多次,但目前都沒有下文:「Ruby 2.0 is unmaintained - also cannot install on Ubuntu LTS #61」、「eu-west-2 Agent Version Incorrect (ruby2.0 error) #92」、「ruby-2.0 won't work for recent ubuntu #2976」。目前我的 workaround 是自己裝 codedeploy-agent,隨便抓一區的 install 檔案裝就可以了。

然後是延續上一個問題,你雖然不在 AWS 內安裝 codedeploy-agent,但 install 檔案還是會去看看你是不是在 AWS 內... 而檢查的方法是去 http://169.254.169.254/ 裡挖資料,於是像 Vultr 也學 EC2 支援 http://169.254.169.254/ 的就會跟你說不能裝... 這邊的 workaround 是用 iptables -A OUTPUT -d 169.254.169.254 -j DROP 擋下來,重開機的時候這條消失沒關係,只要安裝時有擋下來就好。

最後是 AWS CodeDeploy 的 Web Console 後台上,On-premises instances 的 Matching instances 出不來,我是硬設下去發現 deploy 是有效的才發現 Web Console 這邊怪怪的。而且 On-premises 的 tag 部份不支援 *,也就是不能用 api-example-* 這樣去抓 (設下去也抓不到),但在 Amazon EC2 instances 的部份都是正常的 (Matching instances 看得到,* 也是有用的)。這點在 AWS 的 forum 上有翻到類似的現象,但不確定是不是同樣問題:「" Deployment Failed No instances found in deployment."」。

不過 On-Premises Instances 通常都是 non-cloud solution (實體機器或是租用 VPS),這個限制倒不是太大的問題,而且本來就有 tag 可以用了...

上面提到的問題也許會隨時間改善,即使過了幾個月或是幾年,歡迎在 comment 留言提醒修正... 我應該會在 wiki 那邊繼續整理。

One thought on “AWS CodeDeploy 跑在 On-Premises Instance 時的地雷...”

  1. CodeDeploy 跑 On-premises 的雷已經踩到遍體鱗傷了 Orz ... 提供我這邊的雷

    1. Deregistered 後要 24H 才會消失。(在官方 forum 內的官方回覆)
    2. 針對舊 OS 不支援 Ruby 2.0 的問題,我是使用 rvm 來解決 CentOS 5/6, Ubuntu 14.04。
    3. 預設安裝會去 http://169.254.169.254/ 抓 metadata 確認是不是 EC2,如果抓不到就會認為是 On-Premises (要等 timeout 會有點久,用 iptables 是不錯的方法)
    4. On-Premises 不支援 tag * 沒錯哦。
    5. 6/20 後 CodeDeploy-agent 版本低於 `v1.0.1.1458` 皆不支援 (AWS 憑證更新)
    6. CodeDeploy agent 若在沒有 Internet 權限的環境需要指定 `--proxy`,在 `/etc/cron.d` 內會有 CodeDeploy agent update 的 job 同樣也要加上 `--proxy` 參數,可以利用 Ansible / Puppet / Chef 等工具大量加工。

Leave a Reply

Your email address will not be published. Required fields are marked *