Create a Linux ECS instance with Pulumi
Use Python and Pulumi to provision a Linux Elastic Compute Service (ECS) instance on Alibaba Cloud, including the required Virtual Private Cloud (VPC) and networking resources.
Overview
Create a Pulumi project.
-
Deploy a Linux ECS instance.
The ECS instance is deployed to a specified region and zone, uses a VPC, and is configured with security group rules.
Prerequisites
Before you begin, make sure you have:
Python 3 or later
virtualenv installed
Pulumi installed, as described in Install Pulumi
Create a Pulumi project
-
Run
pulumi new --dirto create a local working directory.root@xxx:~# pulumi new --dir /root/project-demo Logging in using access token from PULUMI_ACCESS_TOKEN Please choose a template: aws-javascript A minimal AWS JavaScript Pulumi program aws-python A minimal AWS Python Pulumi program aws-typescript A minimal AWS TypeScript Pulumi program azure-javascript A minimal Azure JavaScript Pulumi program azure-python A minimal Azure Python Pulumi program azure-typescript A minimal Azure TypeScript Pulumi program gcp-javascript A minimal Google Cloud JavaScript Pulumi program gcp-python A minimal Google Cloud Python Pulumi program gcp-typescript A minimal Google Cloud TypeScript Pulumi program kubernetes-javascript A minimal Kubernetes JavaScript Pulumi program kubernetes-python A minimal Kubernetes Python Pulumi program kubernetes-typescript A minimal Kubernetes TypeScript Pulumi program > Show additional templates -
Scroll down and select the
alicloud-pythontemplate.alicloud-csharp A minimal AliCloud C# Pulumi program alicloud-fsharp A minimal AliCloud F# Pulumi program alicloud-go A minimal AliCloud Go Pulumi program alicloud-javascript A minimal AliCloud JavaScript Pulumi program > alicloud-python A minimal AliCloud Python Pulumi program alicloud-typescript A minimal AliCloud TypeScript Pulumi program alicloud-visualbasic A minimal AliCloud VB.NET Pulumi program aws-csharp A minimal AWS C# Pulumi program aws-fsharp A minimal AWS F# Pulumi program -
Enter the project name, description, stack name, and Alibaba Cloud region (default:
cn-beijing).Please choose a template: alicloud-python A minimal AliCloud Python Pulumi program This command will walk you through creating a new Pulumi project. Enter a value or leave blank to accept the (default), and press <ENTER>. Press ^C at any time to quit. project name: (project-demo) project-demo project description: (A minimal AliCloud Python Pulumi program) test Created project 'project-demo' Please enter your desired stack name. To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`). stack name: (dev) xxx/demo-dev Created stack 'demo-dev' alicloud:region: The AliCloud region to deploy into: (cn-beijing) cn-hangzhou Saved config Your new project is ready to go! To perform an initial deployment, run the following commands: 1. cd project-demo 2. virtualenv -p python3 venv 3. source venv/bin/activate 4. pip3 install -r requirements.txt Then, run 'pulumi up' -
Verify the project files.
root@xxx:~# cd project-demo/ root@xxx:~/project-demo# ls __main__.py Pulumi.demo-dev.yaml Pulumi.yaml requirements.txt
The project directory contains four files:
|
File |
Purpose |
|
|
Defines your infrastructure — write your deployment code here |
|
|
Stores stack-specific configuration, such as the target region |
|
|
Stores project metadata: name, description, and runtime language |
|
|
Lists the Python packages required at runtime |
-
Change to the project directory.
cd project-demo -
Set up an isolated Python environment. Skip this step if your server has only one Python version.
virtualenv -p python3 venv source venv/bin/activate -
Install the Pulumi and
pulumi-alicloudpackages.pip3 install -r requirements.txt
Deploy a Linux ECS instance
-
Replace the contents of
__main__.pywith the following code.import pulumi import pulumi_alicloud as alicloud vpc = alicloud.vpc.Network("my-vpc", cidr_block="172.16.0.0/12") az = "cn-hangzhou-i" sg = alicloud.ecs.SecurityGroup("pulumi_sg", description="pulumi security_groups", vpc_id=vpc.id) vswitch = alicloud.vpc.Switch("pulumi_vswitch", availability_zone=az, cidr_block="172.16.0.0/21", vpc_id=vpc.id) sg_ids = [sg.id] sg_rule = alicloud.ecs.SecurityGroupRule("sg_rule", security_group_id=sg.id, ip_protocol="tcp", type="ingress", nic_type="intranet", port_range="22/22", cidr_ip="0.0.0.0/0") instance = alicloud.ecs.Instance("ecs-instance2", availability_zone=az, instance_type="ecs.t6-c1m1.large", security_groups=sg_ids, image_id="ubuntu_18_04_64_20G_alibase_20190624.vhd", instance_name="ecsCreatedByPulumi2", vswitch_id=vswitch.id, internet_max_bandwidth_out=10)
This script provisions five resources:
|
Resource |
Name |
Details |
|
VPC |
|
CIDR block |
|
Security group |
|
Attached to the VPC |
|
vSwitch |
|
Subnet in zone |
|
Security group rule |
|
Inbound TCP rule allowing SSH (port 22) from any IP |
|
ECS instance |
|
|
Run
pulumi upto preview and deploy the changes.
pulumi up runs in two phases. First, it generates an execution plan listing every resource to create — without making any changes. Review the plan, then select yes to apply it. This lets you catch configuration errors before any infrastructure is provisioned.
(venv) root@xxx:~/project-demo# pulumi up
Previewing update (demo-dev):
Type Name Plan
pulumi:pulumi:Stack project-demo-demo-dev
+ ├─ alicloud:vpc:Network my-vpc create
+ ├─ alicloud:ecs:SecurityGroup pulumi_sg create
+ ├─ alicloud:vpc:Switch pulumi_vswitch create
+ ├─ alicloud:ecs:SecurityGroupRule sg_rule create
+ └─ alicloud:ecs:Instance ecs-instance2 create
Resources:
+ 5 to create
1 unchanged
Do you want to perform this update?
yes
> no
details
Select details to view the full resource configuration before committing.
Do you want to perform this update? details
pulumi:pulumi:Stack: (same)
[urn=urn:pulumi:demo-dev::project-demo::pulumi:pulumi:Stack::project-demo-demo-dev]
+ alicloud:vpc/network:Network: (create)
[urn=urn:pulumi:demo-dev::project-demo::alicloud:vpc/network:Network::my-vpc]
[provider=urn:pulumi:demo-dev::project-demo::pulumi:providers:alicloud::default_1_2_1::04da6b54-80e4-46f7-96ec-b56ff0331ba9]
cidrBlock : "172.16.0.0/12"
name : "my-vpc-b884659"
+ alicloud:ecs/securityGroup:SecurityGroup: (create)
[urn=urn:pulumi:demo-dev::project-demo::alicloud:ecs/securityGroup:SecurityGroup::pulumi_sg]
[provider=urn:pulumi:demo-dev::project-demo::pulumi:providers:alicloud::default_1_2_1::04da6b54-80e4-46f7-96ec-b56ff0331ba9]
description : "pulumi security_groups"
name : "pulumi_sg-9544de5"
securityGroupType : "normal"
vpcId : output<string>
+ alicloud:vpc/switch:Switch: (create)
[urn=urn:pulumi:demo-dev::project-demo::alicloud:vpc/switch:Switch::pulumi_vswitch]
[provider=urn:pulumi:demo-dev::project-demo::pulumi:providers:alicloud::default_1_2_1::04da6b54-80e4-46f7-96ec-b56ff0331ba9]
availabilityZone : "cn-hangzhou-i"
cidrBlock : "172.16.0.0/21"
name : "pulumi_vswitch-402081f"
vpcId : output<string>
+ alicloud:ecs/securityGroupRule:SecurityGroupRule: (create)
[urn=urn:pulumi:demo-dev::project-demo::alicloud:ecs/securityGroupRule:SecurityGroupRule::sg_rule]
[provider=urn:pulumi:demo-dev::project-demo::pulumi:providers:alicloud::default_1_2_1::04da6b54-80e4-46f7-96ec-b56ff0331ba9]
cidrIp : "0.0.0.0/0"
ipProtocol : "tcp"
nicType : "intranet"
policy : "accept"
portRange : "22/22"
priority : 1
securityGroupId : output<string>
type : "ingress"
+ alicloud:ecs/instance:Instance: (create)
[urn=urn:pulumi:demo-dev::project-demo::alicloud:ecs/instance:Instance::ecs-instance2]
[provider=urn:pulumi:demo-dev::project-demo::pulumi:providers:alicloud::default_1_2_1::04da6b54-80e4-46f7-96ec-b56ff0331ba9]
autoRenewPeriod : 1
availabilityZone : "cn-hangzhou-i"
deletionProtection : false
dryRun : false
forceDelete : false
imageId : "ubuntu_18_04_64_20G_alibase_20190624.vhd"
includeDataDisks : true
instanceChargeType : "PostPaid"
instanceName : "ecsCreatedByPulumi2"
instanceType : "ecs.t6-c1m1.large"
internetChargeType : "PayByTraffic"
internetMaxBandwidthOut : 10
period : 1
periodUnit : "Month"
renewalStatus : "Normal"
securityGroups : [
[0]: output<string>
]
spotStrategy : "NoSpot"
systemDiskCategory : "cloud_efficiency"
systemDiskSize : 40
vswitchId : output<string>
Select yes to apply the plan. The output confirms all five resources were created.
Do you want to perform this update? yes
Updating (demo-dev):
Type Name Status
pulumi:pulumi:Stack project-demo-demo-dev
+ ├─ alicloud:vpc:Network my-vpc created
+ ├─ alicloud:ecs:SecurityGroup pulumi_sg created
+ ├─ alicloud:vpc:Switch pulumi_vswitch created
+ ├─ alicloud:ecs:SecurityGroupRule sg_rule created
+ └─ alicloud:ecs:Instance ecs-instance2 created
Resources:
+ 5 created
1 unchanged
Duration: 42s
Permalink: https://app.pulumi.com/xxx/project-demo/demo-dev/updates/3
Click the permalink in the output to view the deployment in the Pulumi Service web console.
The Activity tab shows the successful update (Update #3). The CHANGES panel lists all created resources and their status.
Congratulations! You have successfully created a Linux ECS instance on Alibaba Cloud using Pulumi.
To avoid ongoing charges, run pulumi destroy to remove all resources created in this tutorial.