以下的解釋,是基於 AWS CDK 官方文件,和使用 CDK Typescript 的角度,來解釋這些相關名詞
Construct
-
最基礎的函式庫 (或理解成最基礎的雲元件), CDK App、Stack 和一切引入 @aws-cdk 中的 Resources,都是繼承它來的
-
區分 L1 Construct、L2 Construct、Patterns Construct
- L1 Construct 為低階的 Construct,命名都以
cfn
開頭來命名,例如 cfnBucket,L1 是以 CloudFormation 為基底,而事實上,CDK 都是以 CloudFormation 為基底來運作,相對的,所有 CloudFormation 的好處,CDK 幾乎都有 - L2 Construct 為高階的 Construct,如同高階的程式語言會比低階的程式語言使用上來的方便,因為隱藏了許多細節,也就是預設一些設定值,相對於 L1 Construct,L1 Construct 就像編寫 CloudFormation 一樣,所有的參數都必需要設定
- Patterns Construct 就更為高階,例如官方文件所介紹的 ApplicationLoadBalancedFargateService,已經不是像 L2 以 Resource 為單位,而是以 Service 為單位,也就是多種 Resources 來組合成一個可用的服務
- L1 Construct 為低階的 Construct,命名都以
-
若要開發自家公司 CDK library,建議都用 Construct 的方式,以方便在公司內部共用
Stacks
- AWS CDK 部署的基本單位 (也就是 CloudFormation 中的 stack)
- 一個 App 中可以有多個 Stack
- 同時實例化二個相同的 Stack 時,使用指令 cdk synth 合成 CloudFormation 時,還是會視為兩個獨立的 Stack 來部署
- 一個 Stack 最多只能有 500 個 Resource
Apps
- Construct tree 中的最頂層,也就是 root (CDK 中所有類別都來自於 Construct,再一層一層 pass scope 下去,形成 Construct Tree)
- 使用 cdk deploy 指令時,有一連串 App 運行的生命週期,可參考 App lifecycle ,其中第 4 個 Synthesis 也就是生成 CloudFormation template 的時期
- 使用 cdk deploy 指令時,實際上會去讀取 cdk.json 中的 key 為 "app" 的值,也可以使用
--app
參數來取代實際要運行部署的指令
基本上對 Apps、Stacks、Construct 有最基本的認識後,就可以動手來使用 cdk 了,如下圖所示
圖片來源: AWS CDK 官方網站
App 在最外層,包含著 Stack,再包含著 Construct,Construct 中有各種 AWS Resources (S3、Lambda 等等…),有這些概念後,在實作時,會比較有概念,scope 的傳遞也比較不會亂掉
Environments
- CDK 環境變數最主要就是 CDK_DEFAULT_ACCOUNT 和 CDK_DEFAULT_REGION,決定部署時使用哪個帳號和地區
- CDK_DEFAULT_ACCOUNT 和 CDK_DEFAULT_REGION 環境變數若沒特別指定時,在下指令
cdk deploy --profile {your_profile}
時,會基於 AWS 指定的 profile (若沒指定就是 default profile) 中的設定來決定,AWS Profile Credential 檔案路徑為 ~/.aws/credentials - 建議可以像以下的片段程式碼來指定 env
const env = {
region: app.node.tryGetContext('region') || process.env.CDK_DEFAULT_REGION,
account: app.node.tryGetContext('account') || process.env.CDK_DEFAULT_ACCOUNT,
};
new AwsCodedeployWithAutoScalingInfraStack(
app,
'AwsCodedeployWithAutoScalingInfraStack',
{
env,
}
);
此設定參考 虎哥 youtube 影片
這樣設定好處在於,可以在下指令時,決定 account 和 region,例如指定 region
cdk deploy -c region=ap-northeast-1
而如果沒有指定 context,就使用環境變數來設定 env
- 指定 env 的好處在於,stack class 中可以使用 this.region or this.account 來取得資訊,若不指定 env 則會取不到值,所以使用這些判斷條件的時候就要小心,指定 env 就不會有問題 (若不指定必需等到 cdk deploy 最後的生命週期,才能取得 account 和 region 相關資訊)
- 承上,也不能在使用類似 Vpc.fromLookup 來尋找 region 中的 vpc,因為 vpc 相依於 region,同理 available zone 也是一樣的意思
- CDK 官方文件也是建議在正式生產環境,要指定 env 是比較好的作法
歡迎留言