ROS CDK(Cloud Development Toolkit)是ROS推出的代碼開發工具,幫助您使用少量代碼實現復雜模板的資源編排效果。
背景信息
ROS CDK已經在github上開源。
ROS CDK?持阿?云60種服務、276種資源。
ROS CDK?持JavaScript、TypeScript和Java三種編程語?。
安裝CLI
CLI?具提供了便捷使?ROS CDK的能力。以下示例將在CentOS 8.2 64位的系統上安裝CLI。
執行以下命令,安裝CLI。
# 由于ROS CDK使用TypeScript開發,因此需要安裝相關軟件包。 # 安裝Node.js、npm、tsc、lerna。 sudo yum install -y nodejs sudo npm install typescript -g sudo npm install lerna -g # 安裝ros-cdk-cli。 sudo npm install @alicloud/ros-cdk-cli -g
執行以下命令,查看ROS CDK功能列表。
sudo ros-cdk
執行命令后,輸出以下內容:
Usage: ros-cdk COMMAND Commands: ros-cdk init [TEMPLATE] Create a new, empty CDK project from a template. Invoked without TEMPLATE, the app template will be used. ros-cdk list [STACKS..] Lists all stacks in the app [aliases: ls] ros-cdk synthesize [STACKS..] Synthesizes and prints the ROS template for this stack [aliases: synth] ros-cdk deploy [STACKS..] Deploys the stack(s) named STACKS to ROS into your alicloud account ros-cdk diff [STACKS..] Compares the specified stack with the deployed stack or a local template file, and returns with status 1 if any difference is found ros-cdk destroy [STACKS..] Destroy the stack(s) named STACKS ros-cdk event [STACK..] Get resource events within the resource STACK ros-cdk resource [STACKS..] Get resources in the resource STACKS ros-cdk list-stacks [STACKS..] Get resources in the resource STACKS ros-cdk load-config Load Aliyun CLI config to CDK. ros-cdk config Set your alicloud account configuration. Options: --json, -j Use JSON output instead of YAML when templates are printed to STDOUT [boolean] [default: false] --ignore-errors Ignores synthesis errors, which will likely produce an invalid output [boolean] [default: false] --trace Print trace for stack warnings [boolean] --strict Do not construct stacks with warnings [boolean] --version Show version number [boolean] -h, --help Show help [boolean] If your app has a single stack, there is no need to specify the stack name If one of cdk.json or ~/.cdk.json exists, options specified there will be used as defaults. Settings in cdk.json take precedence.
命令說明如下表所示:
命令
說明
init
初始化ROS CDK?程。
list(ls)
列出?程中的所有資源棧。
synthesize(synth)
由代碼?成資源棧模板。
deploy
通過ROS部署資源棧。
diff
對?模板的差異。
destroy
通過ROS服務刪除資源棧。
event
通過ROS服務查詢資源棧事件。
resource
通過ROS服務查詢資源棧資源列表。
list-stacks
通過ROS服務查詢資源棧列表。
load-config
從阿里云CLI獲取阿里云賬號信息。
config
配置阿?云賬號信息。
使用示例
本文以TypeScript語言為例,為您介紹如何使用ROS CDK為資源棧添加VPC。
初始化工程。
執行以下命令,創建工程目錄并初始化工程。
# 創建工程目錄,目錄名為工程名。 sudo mkdir demo sudo cd demo # 初始化工程,使用TypeScript語言。 sudo ros-cdk init --language=typescript --generate-only=true
執行以下命令,為工程安裝依賴。
# 安裝工程所需依賴包。 sudo npm install
執行以下命令,查看工程結構。
sudo tree -I "node_modules"
執行命令后,輸出以下內容:
. ├── bin │ └── demo.ts ├── cdk.json ├── jest.config.js ├── lib │ └── demo-stack.ts ├── package.json ├── package-lock.json ├── README.md ├── test │ └── demo.test.ts └── tsconfig.json 3 directories, 9 files
工程結構說明如下:
bin/demo.ts
:入口。示例中創建了一個應用(類型為ros.App)和一個資源棧(類型為DemoStack,名稱為DemoStack),并將資源棧添加到應用中。
demo.ts
文件內容如下:說明一個工程有且僅有一個應用。
#!/usr/bin/env node import * as ros from '@alicloud/ros-cdk-core'; import { DemoStack } from '../lib/demo-stack'; const app = new ros.App({outdir: './cdk.out'}); new DemoStack(app, 'DemoStack');
ib/demo-stack.ts
:DemoStack的定義。您可以將資源添加到資源棧中,動態構建資源棧。初始化生成的代碼中,只為資源棧添加了描述信息。
demo-stack.ts
文件內容如下:import * as ros from '@alicloud/ros-cdk-core'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here } }
test/demo.test.ts
:單元測試。用于驗證構建資源棧的邏輯是否符合預期。
demo.test.ts
文件內容如下:import { expect as expectCDK, matchTemplate, MatchStyle } from '@alicloud/ros-cdk-assert'; import * as ros from '@alicloud/ros-cdk-core'; import * as Demo from '../lib/demo-stack'; test('Stack with version.', () => { const app = new ros.App(); // WHEN const stack = new Demo.DemoStack(app, 'MyTestStack'); // THEN expectCDK(stack).to( matchTemplate( { ROSTemplateFormatVersion: '2015-09-01', Description: "This is the simple ros cdk app example." }, MatchStyle.EXACT, ), ); });
為資源棧添加一個VPC。
修改
package.json
文件,在dependencies
中增加@alicloud/ros-cdk-ecs
的依賴。{ "name": "demo", "version": "0.1.0", "bin": { "demo": "bin/demo.js" }, "scripts": { "build": "tsc", "test": "jest" }, "devDependencies": { "@types/jest": "^25.2.1", "@types/node": "10.17.5", "typescript": "^3.9.7", "jest": "^25.5.0", "ts-jest": "^25.3.1", "ts-node": "^8.1.0", "babel-jest": "^26.6.3", "@babel/core": "^7.12.9", "@babel/preset-env": "7.12.7", "@babel/preset-typescript": "^7.12.7", "@alicloud/ros-cdk-assert": "^1.0.0" }, "dependencies": { "@alicloud/ros-cdk-core": "^1.0.0", "@alicloud/ros-cdk-ecs": "^1.0.0" } }
執行以下命令,為工程安裝新依賴。
# 安裝工程所需依賴包。 sudo npm install
修改
lib/demo-stack.ts
文件,增加一個VPC。import * as ros from '@alicloud/ros-cdk-core'; import * as ecs from '@alicloud/ros-cdk-ecs'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here new ecs.Vpc(this, 'vpc-from-ros-cdk', { vpcName: 'test-ros-cdk', cidrBlock: '10.0.0.0/8', description: 'This is ros cdk test' }); } }
執行以下命令,查看模板。
sudo ros-cdk synth --json
執行命令后,輸出以下內容:
{ "Description": "This is the simple ros cdk app example.", "ROSTemplateFormatVersion": "2015-09-01", "Resources": { "vpc-from-ros-cdk": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "10.0.0.0/8", "Description": "This is ros cdk test", "EnableIpv6": false, "VpcName": "test-ros-cdk" } } } }
修改
test/demo.test.ts
文件,確保單元測試與代碼一致。import { expect as expectCDK, matchTemplate, MatchStyle } from '@alicloud/ros-cdk-assert'; import * as ros from '@alicloud/ros-cdk-core'; import * as Demo from '../lib/demo-stack'; test('Stack with version.', () => { const app = new ros.App(); // WHEN const stack = new Demo.DemoStack(app, 'MyTestStack'); // THEN expectCDK(stack).to( matchTemplate( { "Description": "This is the simple ros cdk app example.", "ROSTemplateFormatVersion": "2015-09-01", "Resources": { "vpc-from-ros-cdk": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "10.0.0.0/8", "Description": "This is ros cdk test", "EnableIpv6": false, "VpcName": "test-ros-cdk" } } } }, MatchStyle.EXACT, ), ); });
執行以下命令,進行單元測試。
sudo npm test
執行命令后,輸出以下內容:
> demo@0.1.0 test /root/demo > jest PASS test/demo.test.ts ? Stack with version. (136ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 2.988s, estimated 3s Ran all test suites.
通過ROS服務部署資源棧。
配置ROS阿里云賬號信息。
執行
ros-cdk config
命令。sudo ros-cdk config
根據界面提示輸入配置信息。
endpoint(optional, default:https://ros.aliyuncs.com): defaultRegionId(optional, default:cn-hangzhou): [1] AK [2] StsToken [3] RamRoleArn [4] EcsRamRole [0] CANCEL Authenticate mode [1...4 / 0]: 1 accessKeyId:**************** accessKeySecret:****************************** ? Your cdk configuration has been saved successfully!
配置內容說明如下:
endpoint:ROS服務地址。默認值為https://ros.aliyuncs.com。
defaultRegionId:ROS資源棧部署的地域。默認值為cn-hangzhou。
Authenticate mode:鑒權方式。本示例的鑒權方式為AccessKey,您需要輸入accessKeyId和accessKeySecret。
執行以下命令,通過ROS部署資源棧。
sudo ros-cdk deploy
執行命令后,輸出以下內容:
? The deployment(create stack) has completed! RequestedId: BC963C80-054D-41A0-87E7-001E0AB7B1BA StackId: 0714be3a-0713-4b7d-b7aa-************
登錄資源編排控制臺,在左側導航欄單擊資源棧,查看資源棧狀態。
資源棧狀態列顯示創建成功,表示名為DemoStack的資源棧已經創建成功。
(可選)更改VPC名稱并在VPC中創建vSwitch。
通過ROS CDK可以實現更為復雜的功能,本示例中計劃實現以下功能:
更改VPC名稱:將VPC名稱從
test-ros-cdk
更改為test-ros-cdk-vpc
。在VPC中創建3個vSwitch:3個vSwitch有不同的名稱,屬于不同的可用區和網段。
修改
lib/demo-stack.ts
文件。import * as ros from '@alicloud/ros-cdk-core'; import * as ecs from '@alicloud/ros-cdk-ecs'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here const vpc = new ecs.Vpc(this, 'vpc-from-ros-cdk', { vpcName: 'test-ros-cdk-vpc', cidrBlock: '10.0.0.0/8', description: 'This is ros cdk test' }); for (let i = 0; i < 3; i++) { new ecs.VSwitch(this, `vsw-from-ros-cdk-${i}`, { vpcId: vpc.attrVpcId, zoneId: ros.Fn.select(`${i}`, ros.Fn.getAzs(ros.RosPseudo.region)), vSwitchName: `test-ros-cdk-vsw-${i}`, cidrBlock: `10.0.${i}.0/24`, }); } } }
修改說明如下:
通過修改vpcName的取值,為VPC更改名稱。
通過for循環創建vSwitch,極大地減少了代碼量。
通過使用
vpc.attrVpcId
獲取VPC的ID。通過Fn.getAzs函數配合偽參數
RosPseudo.region
獲取可用區列表。
修改
test/demo.test.ts
文件,讓單元測試與代碼一致,并執行npm test
命令進行單元測試。具體操作,請參見步驟2。
執行
ros-cdk diff
命令,查看變更情況。sudo ros-cdk diff
執行命令后,輸出以下內容:
Stack DemoStack Resources [+] ALIYUN::ECS::VSwitch vsw-from-ros-cdk-0/vsw-from-ros-cdk-0 vsw-from-ros-cdk-0 [+] ALIYUN::ECS::VSwitch vsw-from-ros-cdk-1/vsw-from-ros-cdk-1 vsw-from-ros-cdk-1 [+] ALIYUN::ECS::VSwitch vsw-from-ros-cdk-2/vsw-from-ros-cdk-2 vsw-from-ros-cdk-2 [~] ALIYUN::ECS::VPC vpc-from-ros-cdk/vpc-from-ros-cdk vpc-from-ros-cdk └─ [~] VpcName ├─ [-] test-ros-cdk └─ [+] test-ros-cdk-vpc
執行以下命令,通過ROS部署資源棧。
sudo ros-cdk deploy
執行命令后,輸出以下內容:
? The deployment(update stack) has completed! RequestedId: 15E99FD6-968E-47AA-9CD2-82FA6E87C08E StackId: 0714be3a-0713-4b7d-b7aa-************
登錄資源編排控制臺,在左側導航欄單擊資源棧,查看資源棧狀態。
資源棧狀態列顯示更新完成,表示名為DemoStack的資源棧已經更新完成。
單擊資源頁簽,查看資源列表。本示例中有1個VPC資源和3個VSwith資源。
(可選)刪除資源棧。
執行以下命令,列出工程中所有資源棧。
sudo ros-cdk list
執行命令后,輸出以下內容:
DemoStack deploy
執行以下命令,刪除資源棧。
sudo ros-cdk destroy
執行命令后,輸出以下內容:
The following stack(s) will be destroyed(Only deployed stacks will be displayed). DemoStack Please confirm.(Y/N) Y ? Deleted RequestedId: 1BF864E1-7965-4148-A302-E6ABFF806641
資源相關的npm包
資源相關的npm包如下,例如@alicloud/ros-cdk-ecs
代表ECS服務。每個npm包含這個服務在ROS上所支持的所有資源類型。
您可以登錄資源編排控制臺,在左側導航欄單擊資源類型,查看不同服務支持的資源。
@alicloud/ros-cdk-acm
@alicloud/ros-cdk-actiontrail
@alicloud/ros-cdk-apigateway
@alicloud/ros-cdk-arms
@alicloud/ros-cdk-bss
@alicloud/ros-cdk-cas
@alicloud/ros-cdk-cdn
@alicloud/ros-cdk-cen
@alicloud/ros-cdk-cloudfw
@alicloud/ros-cdk-cms
@alicloud/ros-cdk-cr
@alicloud/ros-cdk-cs
@alicloud/ros-cdk-datahub
@alicloud/ros-cdk-dbs
@alicloud/ros-cdk-dms
@alicloud/ros-cdk-dns
@alicloud/ros-cdk-drds
@alicloud/ros-cdk-dts
@alicloud/ros-cdk-eci
@alicloud/ros-cdk-ecs
@alicloud/ros-cdk-edas
@alicloud/ros-cdk-ehpc
@alicloud/ros-cdk-elasticsearch
@alicloud/ros-cdk-emr
@alicloud/ros-cdk-ens
@alicloud/ros-cdk-ess
@alicloud/ros-cdk-fc
@alicloud/ros-cdk-fnf
@alicloud/ros-cdk-foas
@alicloud/ros-cdk-ga
@alicloud/ros-cdk-gws
@alicloud/ros-cdk-hbr
@alicloud/ros-cdk-iot
@alicloud/ros-cdk-kafka
@alicloud/ros-cdk-kms
@alicloud/ros-cdk-marketplace
@alicloud/ros-cdk-memcache
@alicloud/ros-cdk-mns
@alicloud/ros-cdk-mongodb
@alicloud/ros-cdk-mse
@alicloud/ros-cdk-nas
@alicloud/ros-cdk-oos
@alicloud/ros-cdk-oss
@alicloud/ros-cdk-ots
@alicloud/ros-cdk-polardb
@alicloud/ros-cdk-pvtz
@alicloud/ros-cdk-ram
@alicloud/ros-cdk-rds
@alicloud/ros-cdk-redis
@alicloud/ros-cdk-resourcemanager
@alicloud/ros-cdk-rocketmq
@alicloud/ros-cdk-ros
@alicloud/ros-cdk-sae
@alicloud/ros-cdk-sag
@alicloud/ros-cdk-slb
@alicloud/ros-cdk-sls
@alicloud/ros-cdk-uis
@alicloud/ros-cdk-vpc
@alicloud/ros-cdk-vs
@alicloud/ros-cdk-waf