Site icon Mr. 沙先生

How to read YAML/JSON file into AWS CDK with Typescript

大概在前陣子收到不少人來問怎麼用 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 時可以參考使用,當然也不吝給予作者一些意見。

Exit mobile version