iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Cloud Native

30 天學習 Pulumi:用各種程式語言控制雲端資源系列 第 27

[Day 27] 使用 Automation API 進行整合測試

  • 分享至 

  • xImage
  •  

使用 Automation API 進行整合測試

今天來介紹使用 Automation API 做整合測試。Automation API 主要是將 Pulumi CLI 所提供的功能都用程式介面供使用者可以開發自己的 Pulumi 自動化功能。

舉凡之前用過的 pulumi uppulumi stacakpulumi destroy 等功能,都可以透過 Automation API 做自動化。

以下接續昨日的範例,並改成使用 Automation API 撰寫。

專案設定

開新專案後,必須安裝必要套件。本範例使用 TypeScript 程式語言撰寫 Pulumi 自動化程式,因此需要安裝 TypeScript 相關的套件與 @pulumi/pulumi

Automation API 就內建在每個程式語言的 pulumi 套件中!

$ npm install @pulumi/pulumi typescript @types/node ts-node

設定 tsconfig

$ tsc --init

開始撰寫自動化流程

首先,先來將整個程式大致的輪廓寫出來,就是一個 main function,並執行。第二行的地方預先 import 了 Pulumi Automation API 的 LocalWorkspaceLocalProgramArgs

import * as path from 'path';
import {LocalProgramArgs, LocalWorkspace} from '@pulumi/pulumi/automation';

async function main() {

}

if (require.main === module) {
    main()
        .then(() => console.info('Done!'))
        .catch(console.error);
}

設定 LocalProgramArgs

Automation API 提供了很多種專案執行的選擇,可以執行同一台電腦的另一個資料夾中的專案 (LocalProgram)。這就與前一篇文章的 Golang integration test 的功能有點類似。

除了執行其他資料夾的程式外,還可以將自動化的功能放在原本 IaC 專案中,稱為 InlineProgam

另外還有提供 RemoteWorkspace 的功能,可以從 git 上將其他專案下載下來執行。

以下範例為使用 aws-vpc-ts 做為要執行的專案,並隨機產生一個 stackName。

const randomStackName = 'my-test-stack' + Math.random().toString(36).substring(7);

const args: LocalProgramArgs = {
    stackName: randomStackName,
    workDir: path.join(__dirname, '../aws-vpc-ts'),
};

這邊與 Golang 的 Integration Test 功能不同,除了可以設定新的 stack name 外,還可以用既有的 stack name。例如使用 stage 就可以做到自動化部屬 stage 環境的功能。

開始執行 pulumi up

設定完專案的 stack 名稱與目錄後,就可以使用 LocalWorkspace.createOrSelectStack 產生一個 stack。

產生完 stack 後,使用 stack.setConfig 設定單一 config。或是使用stack.setAllConfig 一次設定所有 config。

設定完 stack 的 config 後,就可以使用 stack.up 方法,執行 pulumi up,幫我們產生對應的 stack、config,並部署雲端資源了!

const stack = await LocalWorkspace.createOrSelectStack(args);

await stack.setAllConfig({
    'aws:region': {value: 'ap-east-1'},
    'aws:profile': {value: 'personal'},
    'cidr': {value: '10.18.0.0/16'},
    'numOfAzs': {value: '1'},
    'numOfPublic': {value: '2'},
    'numOfPrivate': {value: '1'},
});

await stack.up({onOutput: console.info});

取得 Deployment 並驗證內容

與昨天的 ExtraRuntimeValidation 類似,可以透過 stack.exportStack 方法得到 Deployment 物件。
裡面就有所有的 resources 列表,這邊就不再列出驗證的程式碼了。

驗證的邏輯一樣可以拿出所有的 resources,並根據 type 做相對應的驗證。

const deployment = await stack.exportStack();

for (let resource of deployment.deployment.resources) {
 
}

刪除雲端資源

最後,測試結束後,要移除所有部屬的雲端資源,也就是類似 pulumi destroy 的功能。

這邊使用 stack.destroy 方法移除所有資源。

await stack.destroy({onOutput: console.info});

執行測試程式

最後就可以與執行一般 TypeScript 撰寫的 Node.js 程式一樣,使用 ts-node 執行撰寫好的自動化程式了!

不會再遇到需要使用 Pulumi CLI 才能運行 Pulumi IaC 專案的問題了。

$ npx ts-node index.js

小結

Automation API 提供了完整的 CLI 功能,但用它來撰寫自動化程式就會稍微繁瑣一點,需要自己管理 stack、生命週期。不過這也讓 Automation API 提供了無限可能的功能。


上一篇
[Day 26] 撰寫 IaC 整合測試
下一篇
[Day 28] Pulumi 的 Policy as Code
系列文
30 天學習 Pulumi:用各種程式語言控制雲端資源30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言