如何把原本使用 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
做法
其實滿簡單的
-
先 cdk deploy 一次,確保 cdk code 內容與 aws 上的 stack 內容一致
-
去 aws cloudformation 頁面上的 stack 中將 template 複製一份備用 (A),這份內容應該不包含你要 import 的資源
-
接著去 cdk 內加入新的 code,這邊會建議設定的跟原本存在 aws 上的資源完全一樣,如果有一點不同步的話,之後要改可能會出問題
-
使用 cdk synth 產生 cloudformation,去 cdk.out 裡面找到該 template (B)
-
此時 template B 會多出一些東西,包括 ‘新資源的改動’ 以及 ‘其他改動’(CDKMetadata之類的,應該是 cdk 自己產生的一些版本號),可以用 vscode diff 之類的來查看,要把 B 內除了新資源以外的變動用 A 的覆蓋掉
-
到 aws cloudformation 頁面內選擇該 stack,並在右上角 action 裡面選擇 import resource,上傳第 5 步驟修改後的 template,這時 aws 會自動偵測到 template 內有些資源是目前不在 aws stack 上的,就可以手動將資源填進去,然後就完成拉!
-
最後可以在 cloudformation 右上角按 detect drifts,然後 view drifts,會自動檢查 cdk 產生出來的東西是否與原本上面的資源一致。
我在搬移時就有遇過 cdk 內和 aws 上的值不同,要把 cdk 內的值改過去並且 deploy 時,出現 ‘不可以用同一個 value 更新 resource’ 這種錯誤,所以建議還是在測試環境多確認幾次 cdk 與 aws 資源一致,沒有 drifts ,才在 production 上做 import 會比較安全