/ AWS

三分鐘教你如何在 OpsWorks Stack 上面用 12.x 的 nodejs

最近做案子才第一次碰到 Opsworks Stack,然而剛碰到這個工具覺得非常害怕。首先當你在新增 stack 的時候,會發現只有 Chef 11 的 stack 和 Chef 12 的 stack。

新增 stack

Chef 都出到 16 了。AWS 是沒打算出新的意思嗎 😨

然後再來看看 Chef 11 的 build-in recipes 和 OS packages。 nodejs 的版本居然是 0.10.x,現在的 LTS 版本不是 12.x 嗎(抖抖抖

這個工具到底何時會被 AWS 淘汰啊,覺得驚恐。

nodejs 這麼舊,一定會有人反應對吧?沒錯!

不過 AWS 官方的態度是希望大家都去用 community cookbooks,沒打算再更新現有的 cookbooks 了。 簡單第一句話打發了來開 issue、加一的眾人:

Yes, please use the Chef community cookbook for Nodejs on Chef 12 for OpsWorks.

2020 年看到這句話的我覺得格外厭世,叫我上哪去找 community cookbooks 啦,Chef 11 跟 12 大家都差不多放棄支援了QQ

另外,Chef 12 Stack 再也沒有 build-in cookbooks 了,果然是官方不想在維護這個了嗎XD

所幸經過了黑暗的一個禮拜,終於成功把 nodejs override 成 12.x 了!真是謝天謝地!

接下來就跟大家說說該怎麼做。

觀察一下官方的 cookbook 做了什麼

當我把 nodejs 加到 OS package 裡以後,跑一下 setup,再看一下 instance log ,發現加上了 nodejs 套件以後,多了 opsworks_nodejs 這個 cookbook。

INFO: Storing updated cookbooks/opsworks_nodejs/recipes/create_env_file.rb in the cache.

要看看這個 cookbook 的內容可以不用直接上 /opt/aws/opsworks/current/cookbooks/,可以在 GitHub 上把他下載下來。

打開 recipe 看看他是怎麼裝 node 的。會看到這個 opsworks_commons_assets_installer

# opsworks_nodejs/recipes/default.rb:32-39
opsworks_commons_assets_installer "Install user space OpsWorks NodeJS package" do
  asset PACKAGE_BASENAME
  version node[:opsworks_nodejs][:version]
  release node[:opsworks_nodejs][:pkgrelease]

  notifies :write, "log[downloading]", :immediately
  action :install
end

也就是他是在這裡吃到 node[:opsworks_nodejs][:version] ,然後會試著把這個版本裝起來。

那這個 installer 幫我們做了哪些事呢?我們可以在 opsworks_commons/providers/assets_installer.rb 看到他的實作。觀察一下可以看出來他會去一個 S3 bucket(預設是 https://opsworks-instance-assets-us-east-1.s3.amazonaws.com)把對應的套件包抓下來裝起來。根據 linux 發行版、發行版版本、處理器的不同決定在哪一個 path。

@asset_url ||= URI.parse("#{node[:opsworks_commons][:assets_url]}/packages/#{_platform}/#{_platform_version}/#{asset_name}")

例如 Amazon Linux 2018.03 最後的 asset_url 可能會長這樣 /packages/amazon/2018.03/opsworks-nodejs-12.18.3-1.x86_64.rpm。Ubuntu 14.04 可能會像這樣 /packages/ubuntu/14.04/opsworks-nodejs_12.18.3-1_amd64.deb

AWS 提供的 bucket 上沒有我們要的 12.x 版本,但是我們可以自己指定我們要的 node 版本,放到我們自己的 S3 上。這樣也不需要魔改太多東西XD

不過這邊要 特別注意注意!注意!注意!,既然我們把 asset_url 改掉了,那之後 berkshelf 各種玩意兒都會試圖從我們新開的 S3 bucket 抓,所有會用到的套件等等都要記得放上來。

比方說我用 Rails 的 cookbook,就不能少了 ruby。如果開機器失敗了,可以檢查一下 log,應該會告訴你是少了哪一個 package 才會 setup 失敗。在 S3 補上對應的 package 即可。

Failed to download asset opsworks-ruby2.5 for Install user space OpsWorks ruby package with url https://your-bucket-name.s3-your-region.amazonaws.com/packages/amazon/2018.03/opsworks-ruby25-2.5.1-1.x86_64.rpm.

Override Attributes + 上傳 package file = 完成!

所以我們要做的事情是,想辦法蓋掉原本的 opsworks_nodejsversion,然後把對應的 package 傳上 S3。

至於怎麼覆蓋掉 version,可以看看 opsworks_commons/attributes/customize.rb 上面的說明

###
# This is the place to override the opsworks_commons cookbook's default attributes.
#
# Do not edit THIS file directly. Instead, create
# "opsworks_commons/attributes/customize.rb" in your cookbook repository and
# put the overrides in YOUR customize.rb file.
###

他希望你另外開個 custom-cookbook,在裡面留下這個 customize.rb 來蓋掉 version 的值。所以我們可以先到 GitHub (或其他你喜歡的平台w)開個 repo 來放你的 custom-cookbook,然後在裡面複製貼上 opsworks_commons/attributes/customize.rb(那個註解要不要留著看你)。

在裡面加上你要的 node 版本:

normal[:opsworks_nodejs][:version] = '12.18.3'

記得要去改 Stack setting,到Use custom Chef cookbooks 的區塊把這個 custom-cookbook 的 repo URL、branch name 加進去。

完成第一部分了,接著來做第二部分。到 S3 開個 bucket (名字看起來就是跟 OpsWorks 有關且不會誤刪即可w)。根據對應的 path 來放你的 assets。像上面提到的 /packages/amazon/2018.03 這樣。然後把 deb/rpm file 傳上來,名字改一改。像是我除了 node 還會用到 berkshelf 和 ruby,這些也要放上來。

然後在 custom json 加上新開的 bucket:

"opsworks_commons": {
  "assets_url": "https://your-bucket-name.s3-your-region.amazonaws.com"
}

最後去開台新的機器(或是把舊的停掉重開),看看有沒有順利完成 setup。如果當初檔名或 path 有設定錯,應該都可以在 log 中找到錯誤訊息。

如果順利 setup 了,連上機器檢查一下 node 版本是不是對的。

包含機器開開關關的過程可能不止三分鐘XD 這樣是不是有點標題詐欺 🤭

同場加映:消失的 Ruby 2.4 與 2.5

如果你有設定過 Rails App Server,會發現只有 Ruby 2.1、2.2、2.3、2.6。

咦?2.4 跟 2.5 飛去哪了?如果我想用 2.5 要怎麼辦?

這件事情也是有人抱怨過,官方目前置之不理(?)

不過有善良的 user 上來告訴大家解方,其實解法跟上述 nodejs 的差不多,一樣是改掉 ruby 版本、asset url,然後自己把各種套件包傳上 S3 這樣。

結論

實際上操作使用以後,覺得 OpsWorks Stack 的確是對 DevOps 人力不足的團隊來說相當友善,很多服務都被抽象成各種 layer,很好做設定。尤其時使用 build-in cookbook,真的是滑鼠點一點一個好好的環境就出來了。真的是可以理解為什麼業主到現在都還是使用… (ry

如果今年還是 2018 年之類的,我可能還是會覺得 OpsWorks Stacks 真是棒 owo

不過哪天沒有太多 issue 纏身,我還是想看看是否能改用其他工具www

最後也希望大家都有成功把 node 設定成想要的版本,一切順利 🌟

fumitsuki

文月

擅長耍雷的フレンズ,在茫茫海海探索人生中

Read More