大概在前陣子收到不少人來問怎麼用 AWS CDK 在建置 Amazon EKS 的同時就把一些 manifests 都一起建起來,AWS CDK 提供了像是 eks.KubernetesManifest 這種方法來設定 manifest,但如果希望是用 YAML/JSON file 的方法 include 進 AWS CDK 的話就需要額外用到一些 Typescript 的套件庫了。
其實多數人用熟 Typescript 開發的人應該比作者更熟練,這篇是提供像作者這種沒有深厚程式背景的人參考如何撰寫 AWS CDK include file,而這類型的 sample code 在 Github 上都能找到不少類似的寫法可以抄,這篇也算是留下一個紀錄 …
Amazon EKS Manifest apply YAML file
就拿 game-2048 作為範例,fs
將檔案讀出後交由 js-yaml
解析 YAML 格式
import yaml = require('js-yaml');
import fs = require('fs');
const manifestGame = yaml.loadAll(fs.readFileSync('files/eks/game-2048.yaml', 'utf-8')) as Record<string, any>[];
const manifestGameApply = new eks.KubernetesManifest(this, 'game-2048-deploy', {
cluster,
manifest: manifestGame,
prune: false
});
這幾行就相當於在執行 kubectl apply -f
指令:
$ kubectl apply -f files/eks/game-2048.yaml
AWS IAM Policy include JSON file
另一個案例是如果 IAM Policy 必須客製化又臭又長的規則,那麼作者是很不喜歡把他放到 CDK code 裡面,而是希望從外部引入 json file 的方式來做,也比較容易看得懂。
以 AWS Load balancer controller 為例,在建立 IRSA 時必須定義 IAM Policy 一樣用 fs
讀出後再用 JSON
解析就可以讓 iam.Policy 讀到正確的格式,這樣讓 AWS CDK 整體撰寫起來會簡潔一些。
const iamIngressPolicyDocument = JSON.parse(fs.readFileSync('files/iam/aws-lb-controller-v2.3.0-iam-policy.json').toString());
const iamIngressPolicy = new iam.Policy(this, 'aws-load-balancer-controller-policy', {
policyName: 'AWSLoadBalancerControllerIAMPolicy',
document: iam.PolicyDocument.fromJson(iamIngressPolicyDocument)
})
目前還有許多作者寫過的技巧範例都放在 cdk-samples 這個專案裡面,歡迎大家在撰寫 AWS CDK 時可以參考使用,當然也不吝給予作者一些意見。