This page looks best with JavaScript enabled

AWS,如何把原本使用 AWS console 建立的資源完整搬到 cdk 內

 ·  ☕ 2 min read

如何把原本使用 AWS console 建立的資源完整搬到 cdk 內

目前公司使用 AWS 上是手動與 cdk 混著用,早期的東西都是用手動建立的,例如 Dynamodb table,裡面的 index 等等。
但後來很多東西都陸續寫在 cdk 內,不得不說比起手動建立還是方便又安全多了,要修改和架設測試環境時只要改個環境變數或是 region 就直接部署上去,所以還是滿希望把所有東西通通都移到 cdk 上面的
最近剛好也要使用 Dynamodb 的 stream 功能(原本在 table 上是關閉的),就想說一起搬進去,這幾天就開始了瘋狂看文件的生活,不得不說 cdk 真的是剛出的東西,stack overflow 上面能抄的東西還真少 XD

載入現有 table from_table

最常見的直接解法就是在 cdk 中用 from_table_attributes, from_table_arn, from_table 直接載入現有的 table
不過這種方法其實沒辦法完全控制住這個資源
例如 from_table_attributes 就必須傳進 stream 的 arn 才行,實際上還是要去 console 手動開關那些東西
讓人強迫症發作

用 cdk 建立新的 Dynamodb Table 並把舊的資料移進去

也是可行的做法
不過問題是需要把伺服器關掉一陣子,或著是會讓伺服器需要同時連新舊兩個 db,migration 過程其實滿煩瑣的

用 cloudformation 搬移

這是研究了一陣子發現最方便可行的做法
可以讓 cdk code 裡面看起來就像是從這邊寫出來的資源,有完全的控制權力,而且用不用 db downtime

做法

其實滿簡單的

  1. 先 cdk deploy 一次,確保 cdk code 內容與 aws 上的 stack 內容一致

  2. 去 aws cloudformation 頁面上的 stack 中將 template 複製一份備用 (A),這份內容應該不包含你要 import 的資源

  3. 接著去 cdk 內加入新的 code,這邊會建議設定的跟原本存在 aws 上的資源完全一樣,如果有一點不同步的話,之後要改可能會出問題

  4. 使用 cdk synth 產生 cloudformation,去 cdk.out 裡面找到該 template (B)

  5. 此時 template B 會多出一些東西,包括 ‘新資源的改動’ 以及 ‘其他改動’(CDKMetadata之類的,應該是 cdk 自己產生的一些版本號),可以用 vscode diff 之類的來查看,要把 B 內除了新資源以外的變動用 A 的覆蓋掉

  6. 到 aws cloudformation 頁面內選擇該 stack,並在右上角 action 裡面選擇 import resource,上傳第 5 步驟修改後的 template,這時 aws 會自動偵測到 template 內有些資源是目前不在 aws stack 上的,就可以手動將資源填進去,然後就完成拉!

  7. 最後可以在 cloudformation 右上角按 detect drifts,然後 view drifts,會自動檢查 cdk 產生出來的東西是否與原本上面的資源一致。

我在搬移時就有遇過 cdk 內和 aws 上的值不同,要把 cdk 內的值改過去並且 deploy 時,出現 ‘不可以用同一個 value 更新 resource’ 這種錯誤,所以建議還是在測試環境多確認幾次 cdk 與 aws 資源一致,沒有 drifts ,才在 production 上做 import 會比較安全

Share on

Marko Peng
WRITTEN BY
Marko Peng
Good man