
Aliyun Ecs Manage
- 62 installs
- 396 repo stars
- Updated July 18, 2026
- cinience/alicloud-skills
Manage Alibaba Cloud ECS instances, disks, snapshots, images, security groups, and key pairs via OpenAPI with the Python SDK.
About
Uses the Alibaba Cloud ECS OpenAPI and Python SDK to list, create, start, stop, and reboot instances and manage related compute resources. A developer uses it to operate and troubleshoot ECS infrastructure.
- Covers pagination with NextToken/MaxResults and DryRun permission checks
- Scripts to list instances across regions and query usage
Aliyun Ecs Manage by the numbers
- 62 all-time installs (skills.sh)
- Ranked #681 of 1,039 Cloud & Infrastructure skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cinience/alicloud-skills --skill aliyun-ecs-manageAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 62 |
|---|---|
| repo stars | ★ 396 |
| Last updated | July 18, 2026 |
| Repository | cinience/alicloud-skills ↗ |
What it does
Manage Alibaba Cloud ECS instances, disks, snapshots, images, security groups, and key pairs via OpenAPI with the Python SDK.
Files
Category: service
Elastic Compute Service (ECS)
Validation
mkdir -p output/aliyun-ecs-manage
python -m py_compile skills/compute/ecs/aliyun-ecs-manage/scripts/list_instances_all_regions.py
python -m py_compile skills/compute/ecs/aliyun-ecs-manage/scripts/query_instance_usage.py
python -m py_compile skills/compute/ecs/aliyun-ecs-manage/scripts/run_remote_command.py
echo "py_compile_ok" > output/aliyun-ecs-manage/validate.txtPass criteria: command exits 0 and output/aliyun-ecs-manage/validate.txt is generated.
Output And Evidence
- Save list/summarize outputs under
output/aliyun-ecs-manage/. - Keep command arguments and region scope in each evidence file.
Use Alibaba Cloud OpenAPI (RPC) with official SDKs or OpenAPI Explorer to manage ECS resources. Prefer the Python SDK for all examples and execution.
Prerequisites
- Prepare AccessKey (RAM user/role with least privilege).
- Choose the correct region and endpoint (public/VPC).
- ECS OpenAPI is RPC style; prefer SDK or OpenAPI Explorer to avoid manual signing.
API behavior notes (from ECS docs)
- Most list/describe APIs support pagination via
PageNumber+PageSizeorNextToken+MaxResults. DescribeInstancesreturns an empty list if the RAM user/role lacks permissions; useDryRunto validate permissions.- For
DescribeInstances,NextToken+MaxResultsis the recommended paged query pattern; use the returnedNextTokento fetch subsequent pages. DescribeInstancesrequiresRegionIdin the request even if the client has a region set.- Filters are ANDed; set only the filters you need.
Workflow
1) Confirm region, resource identifiers, and desired action. 2) Find API group and exact operation name in references/api_overview.md. 3) Call API with Python SDK (preferred) or OpenAPI Explorer. 4) Verify results with describe/list APIs. 5) If you need repeatable inventory or summaries, use scripts/ and write outputs under output/aliyun-ecs-manage/.
SDK priority
1) Python SDK (preferred) 2) OpenAPI Explorer 3) Other SDKs (only if Python is not feasible)
Python SDK quickstart (list instances)
Virtual environment is recommended (avoid PEP 668 system install restrictions).
python3 -m venv .venv
. .venv/bin/activate
python -m pip install alibabacloud_ecs20140526 alibabacloud_tea_openapi alibabacloud_credentialsfrom alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
# Use env vars or shared config files per AccessKey priority.
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
return Ecs20140526Client(config)
def list_instances(region_id: str):
client = create_client(region_id)
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=1,
page_size=50,
))
for inst in resp.body.instances.instance:
print(inst.instance_id, inst.instance_name, inst.instance_type, inst.status)
if __name__ == "__main__":
list_instances("cn-hangzhou")Python SDK scripts (recommended for inventory)
- List all instances across regions (TSV/JSON):
scripts/list_instances_all_regions.py - Query resource usage (CPU/Memory/Network) for one instance:
scripts/query_instance_usage.py - Run remote commands via Cloud Assistant (RunCommand):
scripts/run_remote_command.py - Summarize instance specs across regions:
scripts/summary_instance_specs.py - Summarize instance counts by region (optional status breakdown):
scripts/summary_instances_by_region.py - Summarize instance counts by status:
scripts/summary_instances_by_status.py - Summarize instance counts by instance type:
scripts/summary_instances_by_instance_type.py - Summarize instance counts by VPC:
scripts/summary_instances_by_vpc.py - Summarize instance counts by security group:
scripts/summary_instances_by_security_group.py
Python SDK: query one instance resource usage
Install dependencies (add CMS SDK):
python -m pip install alibabacloud_ecs20140526 alibabacloud_cms20190101 alibabacloud_tea_openapi alibabacloud_credentialsExample (last 1 hour, 5-minute period):
python skills/compute/ecs/aliyun-ecs-manage/scripts/query_instance_usage.py \
--instance-id i-xxxxxxxxxxxxxxxxx \
--region-id cn-shanghai \
--hours 1 \
--period 300 \
--summary-only \
--output output/aliyun-ecs-manage/ecs-usage-i-xxxxxxxxxxxxxxxxx-1h.jsonRecommended default metrics:
CPUUtilizationmemory_usedutilizationInternetInRate,InternetOutRateIntranetInRate,IntranetOutRate
Python SDK: run remote command on one ECS instance
Example (ps -ef):
python skills/compute/ecs/aliyun-ecs-manage/scripts/run_remote_command.py \
--instance-id i-xxxxxxxxxxxxxxxxx \
--region-id cn-shanghai \
--command 'ps -ef' \
--output output/aliyun-ecs-manage/runcommand-i-xxxxxxxxxxxxxxxxx-ps-ef.jsonBehavior:
- Submit
RunCommandwithRunShellScript. - Poll
DescribeInvocationResultsuntil final status. - Decode base64 stdout and save normalized JSON evidence.
Python SDK: list instances for all regions
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def list_instances_all_regions():
for region_id in list_regions():
client = create_client(region_id)
req = ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=1,
page_size=100,
)
resp = client.describe_instances(req)
print(f"== {region_id} ({resp.body.total_count}) ==")
for inst in resp.body.instances.instance:
print(inst.instance_id, inst.instance_name, inst.instance_type, inst.status)
if __name__ == "__main__":
list_instances_all_regions()Python SDK: paginated instance listing
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
return Ecs20140526Client(config)
def list_instances_paged(region_id: str):
client = create_client(region_id)
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
print(inst.instance_id, inst.instance_name, inst.instance_type, inst.status)
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
if __name__ == "__main__":
list_instances_paged("cn-hangzhou")Python SDK: list instance types and pricing inputs
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
return Ecs20140526Client(config)
def list_types(region_id: str, zone_id: str | None = None, instance_type_family: str | None = None):
client = create_client(region_id)
req = ecs_models.DescribeInstanceTypesRequest(
zone_id=zone_id,
instance_type_family=instance_type_family,
)
resp = client.describe_instance_types(req)
for t in resp.body.instance_types.instance_type:
print(t.instance_type_id, t.cpu_core_count, t.memory_size)
if __name__ == "__main__":
list_types("cn-hangzhou", "cn-hangzhou-k")Common operation mapping
- Instance lifecycle:
RunInstances,CreateInstance,StartInstance(s),StopInstance(s),RebootInstance(s),DeleteInstance(s) - Instance details:
DescribeInstances,DescribeInstanceStatus,DescribeInstanceAttribute - Spec changes:
ModifyInstanceSpec,ModifyPrepayInstanceSpec,DescribeResourcesModification - System disk changes:
ReplaceSystemDisk,ResetDisk - Data disks:
CreateDisk,AttachDisk,DetachDisk,ResizeDisk,DescribeDisks - Snapshots:
CreateSnapshot,CopySnapshot,DescribeSnapshots,DeleteSnapshot - Images:
CreateImage,CopyImage,DescribeImages,DeleteImage,ModifyImageAttribute - Security groups:
CreateSecurityGroup,AuthorizeSecurityGroup,RevokeSecurityGroup,DescribeSecurityGroupAttribute - Key pairs:
CreateKeyPair,ImportKeyPair,DescribeKeyPairs,DeleteKeyPairs - ENI:
CreateNetworkInterface,AttachNetworkInterface,DetachNetworkInterface,DescribeNetworkInterfaces - Tags:
TagResources,UntagResources,ListTagResources - Monitoring/events:
DescribeInstancesFullStatus,DescribeInstanceHistoryEvents,DescribeInstanceMonitorData
Query patterns
- List instances:
DescribeInstances(supports filters such asVpcId,VSwitchId,ZoneId,SecurityGroupId,InstanceIds) - Count instances:
DescribeInstanceswithPageSize=1and readTotalCount - Region discovery:
DescribeRegionsthen loop all regions for inventory
Cloud Assistant (RunCommand) tips
- Instances must be in
Runningstate. - Ensure the Cloud Assistant agent is installed and online.
- Use shell for Linux, PowerShell for Windows.
- Poll results via
DescribeInvocationsandDescribeInvocationResults.
See references/command-assistant.md.
AccessKey priority (must follow, align with README)
1) Environment variables: ALIBABACLOUD_ACCESS_KEY_ID / ALIBABACLOUD_ACCESS_KEY_SECRET / ALIBABACLOUD_REGION_ID Region policy: ALIBABACLOUD_REGION_ID is an optional default. If unset, decide the most reasonable region for the task; if unclear, ask the user. 2) Shared config file: ~/.alibabacloud/credentials (region still from env)
Auth setup (README-aligned)
Environment variables:
export ALIBABACLOUD_ACCESS_KEY_ID="your-ak"
export ALIBABACLOUD_ACCESS_KEY_SECRET="your-sk"
export ALIBABACLOUD_REGION_ID="cn-hangzhou"Also supported by the Alibaba Cloud SDKs:
export ALIBABACLOUD_ACCESS_KEY_ID="your-ak"
export ALIBABACLOUD_ACCESS_KEY_SECRET="your-sk"Shared config file:
~/.alibabacloud/credentials
[default]
type = access_key
access_key_id = your-ak
access_key_secret = your-skAPI discovery
- Product code:
Ecs - Default API version:
2014-05-26 - Use OpenAPI metadata endpoints to list APIs and get schemas (see references).
Output policy
If you need to save responses or generated artifacts, write them under: output/aliyun-ecs-manage/
Resource usage query evidence example: output/aliyun-ecs-manage/ecs-usage-<instance-id>-<window>.json
Remote command evidence example: output/aliyun-ecs-manage/runcommand-<instance-id>-<name>.json
References
- API overview:
references/api_overview.md - Endpoints:
references/endpoints.md - Cloud Assistant:
references/command-assistant.md - DescribeInstances:
references/describe-instances.md - Instances:
references/instances.md - Disks:
references/disks.md - Snapshots:
references/snapshots.md - Images:
references/images.md - Security groups:
references/security-groups.md - Network interfaces:
references/network-interfaces.md - Key pairs:
references/keypairs.md - Tags:
references/tags.md - Monitoring/events:
references/monitoring-events.md - Sources:
references/sources.md
interface:
display_name: "Alibaba Cloud Compute ECS"
short_description: "ECS lifecycle and inventory workflows"
default_prompt: "Use $aliyun-ecs-manage to complete this compute/ecs task on Alibaba Cloud."
ECS OpenAPI overview (2014-05-26)
Use the official API overview to locate exact operation names and required parameters. Keep this file as a quick index for common workflows; always verify details in the docs.
Regions and resource discovery
- Regions/Zones/Capacity:
DescribeRegions,DescribeZones,DescribeAvailableResource - Quotas/limits:
DescribeAccountAttributes - Instance type changes:
DescribeResourcesModification,DescribeRecommendInstanceType
Pricing and renewal
- Price and renewal:
DescribePrice,DescribeRenewalPrice,DescribeInstanceModificationPrice
Instances (lifecycle and config)
- Create:
RunInstances,CreateInstance - Start/Stop/Reboot:
StartInstance(s),StopInstance(s),RebootInstance(s) - Delete:
DeleteInstance(s) - Query:
DescribeInstances,DescribeInstanceStatus,DescribeInstanceAttribute - Modify:
ModifyInstanceAttribute,ModifyInstanceSpec,ModifyPrepayInstanceSpec - Network/metadata:
ModifyInstanceNetworkOptions,ModifyInstanceMetadataOptions - RAM role:
AttachInstanceRamRole,DescribeInstanceRamRole,DetachInstanceRamRole - User data:
DescribeUserData - Auto renew:
DescribeInstanceAutoRenewAttribute,ModifyInstanceAutoRenewAttribute - Spot:
DescribeSpotPriceHistory,DescribeSpotAdvice
Images
- Create/delete/modify:
CreateImage,DeleteImage,ModifyImageAttribute - Query:
DescribeImages,DescribeImageFromFamily,DescribeImageSupportInstanceTypes - Share:
DescribeImageSharePermission,ModifyImageSharePermission - Import/export/copy:
ImportImage,ExportImage,CopyImage,CancelCopyImage
Disks (EBS)
- Create/attach/detach:
CreateDisk,AttachDisk,DetachDisk - Resize/modify:
ResizeDisk,ModifyDiskAttribute,ModifyDiskSpec,ModifyDiskChargeType - Replace/rollback:
ReplaceSystemDisk,ResetDisk,ReInitDisk - Query/delete:
DescribeDisks,DeleteDisk
Snapshots
- Create/copy/delete:
CreateSnapshot,CopySnapshot,DeleteSnapshot - Query/modify:
DescribeSnapshots,ModifySnapshotAttribute - Snapshot policy:
CreateAutoSnapshotPolicy,ApplyAutoSnapshotPolicy,CancelAutoSnapshotPolicy,DescribeAutoSnapshotPolicyEx
Security groups
- Create/delete/modify:
CreateSecurityGroup,DeleteSecurityGroup,ModifySecurityGroupPolicy - Rules:
AuthorizeSecurityGroup,RevokeSecurityGroup,DescribeSecurityGroupAttribute - Query:
DescribeSecurityGroups
Network interfaces (ENI)
- Create/delete:
CreateNetworkInterface,DeleteNetworkInterface - Attach/detach:
AttachNetworkInterface,DetachNetworkInterface - Query/modify:
DescribeNetworkInterfaces,ModifyNetworkInterfaceAttribute
Key pairs
- Create/import/delete:
CreateKeyPair,ImportKeyPair,DeleteKeyPairs - Query:
DescribeKeyPairs
Tags
- Tagging:
TagResources,UntagResources,ListTagResources
Cloud Assistant (commands)
- Run commands:
RunCommand - Query results:
DescribeInvocations,DescribeInvocationResults - Install agent:
InstallCloudAssistant, check status withDescribeCloudAssistantStatus
System events and monitoring
- Status/events:
DescribeInstancesFullStatus,DescribeInstanceHistoryEvents,DescribeDisksFullStatus - Monitoring:
DescribeInstanceMonitorData,DescribeDiskMonitorData,DescribeEniMonitorData,DescribeSnapshotMonitorData
References
- Official operation list: https://www.alibabacloud.com/help/en/ecs/developer-reference/api-ecs-2014-05-26-overview
ECS Cloud Assistant (RunCommand)
Use Cloud Assistant to execute shell or PowerShell scripts on ECS instances.
Key requirements
- Instance must be in
Runningstate. - Cloud Assistant agent must be installed and online.
- Use the correct command type for OS (shell for Linux, PowerShell for Windows).
Typical flow
1) (Optional) Install agent: InstallCloudAssistant. 2) Execute command: RunCommand. 3) Query execution: DescribeInvocations and DescribeInvocationResults.
References
- RunCommand API: https://www.alibabacloud.com/help/en/ecs/developer-reference/runcommand
DescribeInstances (ECS)
Use this API to query ECS instances and inventory.
Key fields
TotalCount: total instances for the current query scopeInstances.Instance[]: instance list
Common filters
VpcId,VSwitchId,ZoneIdSecurityGroupIdInstanceIds(JSON array string)
Pagination
PageNumber+PageSize- Or
NextToken+MaxResultsfor token-based pagination when available
Permissions check
- If the RAM user/role lacks permissions, the API returns an empty list.
DryRun=Truevalidates permissions without executing the request.
References
- https://www.alibabacloud.com/help/en/ecs/developer-reference/describeinstances
ECS disks (EBS)
Common operations
- Create/attach/detach:
CreateDisk,AttachDisk,DetachDisk - Resize/modify:
ResizeDisk,ModifyDiskAttribute,ModifyDiskSpec - Replace/rollback:
ReplaceSystemDisk,ResetDisk,ReInitDisk - Query/delete:
DescribeDisks,DeleteDisk
Attach/Detach notes
- The disk and instance must be in the same zone.
- The disk must be
Availablewhen attaching. - The instance must be
RunningorStopped. - A system disk can only be attached to its original instance and the instance must be stopped.
References
- API overview:
https://www.alibabacloud.com/help/en/ecs/developer-reference/api-ecs-2014-05-26-overview - AttachDisk:
https://www.alibabacloud.com/help/en/ecs/developer-reference/attachdisk
ECS OpenAPI endpoints
ECS uses RPC-style OpenAPI. Prefer SDK or OpenAPI Explorer to avoid manual signing.
Public endpoint pattern
- Regional endpoint:
ecs.<region-id>.aliyuncs.com - Example (China East 1):
ecs.cn-hangzhou.aliyuncs.com
VPC endpoint pattern
- VPC endpoint:
ecs-vpc.<region-id>.aliyuncs.com
Notes
- The API version for ECS is
2014-05-26. - Always use the endpoint matching your instance region.
References
- Endpoint list and usage: https://www.alibabacloud.com/help/en/ecs/developer-reference/endpoints
ECS images
Common operations
- Create/delete/modify:
CreateImage,DeleteImage,ModifyImageAttribute - Query:
DescribeImages,DescribeImageFromFamily,DescribeImageSupportInstanceTypes - Share:
DescribeImageSharePermission,ModifyImageSharePermission - Import/export/copy:
ImportImage,ExportImage,CopyImage,CancelCopyImage
Notes
CreateImagecreates a custom image from an instance or snapshot.- Use
DescribeImagesto list public, custom, or shared images.
References
- CreateImage:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createimage - DescribeImages:
https://www.alibabacloud.com/help/id/ecs/developer-reference/describeimages
ECS instances
Use these APIs for instance lifecycle, configuration, and queries.
Common operations
- Create:
RunInstances,CreateInstance - Start/Stop/Reboot:
StartInstance(s),StopInstance(s),RebootInstance(s) - Delete:
DeleteInstance(s) - Query:
DescribeInstances,DescribeInstanceStatus,DescribeInstanceAttribute - Modify:
ModifyInstanceSpec,ModifyInstanceAttribute
Behavioral notes
- Instance lifecycle operations are asynchronous; use
DescribeInstanceStatusto verify state transitions. - Stop behavior depends on billing; pay-as-you-go supports stop charging or keep charging.
References
- API overview:
https://www.alibabacloud.com/help/en/ecs/developer-reference/api-ecs-2014-05-26-overview - StopInstance:
https://www.alibabacloud.com/help/en/ecs/developer-reference/stopinstance - StartInstance:
https://www.alibabacloud.com/help/en/ecs/developer-reference/startinstance - DescribeInstances:
https://www.alibabacloud.com/help/en/ecs/developer-reference/describeinstances
ECS key pairs
Common operations
- Create/import/delete:
CreateKeyPair,ImportKeyPair,DeleteKeyPairs - Query:
DescribeKeyPairs
Notes
CreateKeyPairreturns the private key only once; store it securely.- Maximum number of key pairs per region is limited by quota.
References
- CreateKeyPair:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createkeypair
ECS monitoring and events
Common operations
- Instance status/events:
DescribeInstancesFullStatus,DescribeInstanceHistoryEvents - Disk status:
DescribeDisksFullStatus - Monitoring:
DescribeInstanceMonitorData,DescribeDiskMonitorData,DescribeEniMonitorData,DescribeSnapshotMonitorData
Notes
- Use status/events APIs to detect impaired or scheduled maintenance events.
References
- API overview:
https://www.alibabacloud.com/help/en/ecs/developer-reference/api-ecs-2014-05-26-overview
ECS network interfaces (ENI)
Common operations
- Create/delete:
CreateNetworkInterface,DeleteNetworkInterface - Attach/detach:
AttachNetworkInterface,DetachNetworkInterface - Query/modify:
DescribeNetworkInterfaces,ModifyNetworkInterfaceAttribute
Notes
- ENI and instance must be in the same VPC and zone.
- An ENI can be attached to only one instance at a time.
- A single ENI supports up to 49 secondary private IPs.
References
- CreateNetworkInterface:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createnetworkinterface
ECS security groups
Common operations
- Create/delete/modify:
CreateSecurityGroup,DeleteSecurityGroup,ModifySecurityGroupPolicy - Rules:
AuthorizeSecurityGroup,RevokeSecurityGroup,DescribeSecurityGroupAttribute - Query:
DescribeSecurityGroups
Rule notes
- Smaller
Prioritymeans higher priority. - If a rule already exists, the API still returns success.
- A single ENI supports up to 1000 security group rules.
References
- CreateSecurityGroup:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createsecuritygroup - AuthorizeSecurityGroup:
https://www.alibabacloud.com/help/en/ecs/developer-reference/authorizesecuritygroup
ECS snapshots
Common operations
- Create/copy/delete:
CreateSnapshot,CopySnapshot,DeleteSnapshot - Query/modify:
DescribeSnapshots,ModifySnapshotAttribute - Policy:
CreateAutoSnapshotPolicy,ApplyAutoSnapshotPolicy,CancelAutoSnapshotPolicy,DescribeAutoSnapshotPolicyEx
Notes
- A disk must have been attached to an instance before you can create a snapshot.
- The disk must be in
In_useorAvailablestate. - Snapshot creation is asynchronous; use
DescribeSnapshotsto check status.
References
- CreateSnapshot:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createsnapshot - DescribeSnapshots:
https://www.alibabacloud.com/help/en/ecs/developer-reference/describesnapshots
- OpenAPI product page:
https://api.aliyun.com/product/Ecs - API list (metadata):
https://api.aliyun.com/meta/v1/products/Ecs/versions/2014-05-26/api-docs.json - API overview:
https://www.alibabacloud.com/help/en/ecs/developer-reference/api-ecs-2014-05-26-overview - Endpoints:
https://www.alibabacloud.com/help/en/ecs/developer-reference/endpoints - DescribeInstances:
https://www.alibabacloud.com/help/en/ecs/developer-reference/describeinstances - StartInstance:
https://www.alibabacloud.com/help/en/ecs/developer-reference/startinstance - StopInstance:
https://www.alibabacloud.com/help/en/ecs/developer-reference/stopinstance - CreateSnapshot:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createsnapshot - DescribeSnapshots:
https://www.alibabacloud.com/help/en/ecs/developer-reference/describesnapshots - AttachDisk:
https://www.alibabacloud.com/help/en/ecs/developer-reference/attachdisk - CreateImage:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createimage - DescribeImages:
https://www.alibabacloud.com/help/id/ecs/developer-reference/describeimages - CreateSecurityGroup:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createsecuritygroup - AuthorizeSecurityGroup:
https://www.alibabacloud.com/help/en/ecs/developer-reference/authorizesecuritygroup - CreateNetworkInterface:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createnetworkinterface - CreateKeyPair:
https://www.alibabacloud.com/help/en/ecs/developer-reference/createkeypair - RunCommand:
https://www.alibabacloud.com/help/en/ecs/developer-reference/runcommand
ECS tags
Common operations
- Tagging:
TagResources,UntagResources,ListTagResources
Notes
- Tag resources by instance, disk, snapshot, image, security group, ENI, and more.
- Use
ListTagResourcesto query tag coverage.
References
- API overview:
https://www.alibabacloud.com/help/en/ecs/developer-reference/api-ecs-2014-05-26-overview
#!/usr/bin/env python3
"""List ECS instances across all regions.
Outputs TSV by default. Use --json for JSON output.
"""
from __future__ import annotations
import argparse
import json
import os
from typing import Iterable
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str) -> Iterable[ecs_models.DescribeInstancesResponseBodyInstancesInstance]:
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def to_record(region_id: str, inst) -> dict:
return {
"region_id": region_id,
"instance_id": inst.instance_id,
"instance_name": inst.instance_name,
"status": inst.status,
"instance_type": inst.instance_type,
"cpu": inst.cpu,
"memory_gib": inst.memory,
"zone_id": inst.zone_id,
"vpc_id": (inst.vpc_attributes.vpc_id if inst.vpc_attributes else None),
"vswitch_id": (inst.vpc_attributes.v_switch_id if inst.vpc_attributes else None),
}
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--json", action="store_true", help="Output JSON array")
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
records = []
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
records.append(to_record(region_id, inst))
if args.json:
output = json.dumps(records, ensure_ascii=False, indent=2)
else:
lines = [
"region_id\tinstance_id\tinstance_name\tstatus\tinstance_type\tcpu\tmemory_gib\tzone_id\tvpc_id\tvswitch_id"
]
for r in records:
lines.append(
"\t".join(
[
str(r.get("region_id") or ""),
str(r.get("instance_id") or ""),
str(r.get("instance_name") or ""),
str(r.get("status") or ""),
str(r.get("instance_type") or ""),
str(r.get("cpu") or ""),
str(r.get("memory_gib") or ""),
str(r.get("zone_id") or ""),
str(r.get("vpc_id") or ""),
str(r.get("vswitch_id") or ""),
]
)
)
output = "\n".join(lines)
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Query ECS resource usage metrics for one instance via CloudMonitor (CMS).
Default namespace is `acs_ecs_dashboard`, with 5-minute period and 1-hour window.
Outputs JSON by default; use --summary-only for compact output.
"""
from __future__ import annotations
import argparse
import json
import os
from datetime import datetime, timedelta, timezone
from statistics import fmean
from typing import Any
from alibabacloud_cms20190101 import models as cms_models
from alibabacloud_cms20190101.client import Client as CmsClient
from alibabacloud_tea_openapi import models as open_api_models
DEFAULT_METRICS = [
"CPUUtilization",
"memory_usedutilization",
"InternetInRate",
"InternetOutRate",
"IntranetInRate",
"IntranetOutRate",
]
def create_client(region_id: str) -> CmsClient:
config = open_api_models.Config(
region_id=region_id,
endpoint="metrics.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return CmsClient(config)
def parse_datapoints(raw: str) -> list[dict[str, Any]]:
try:
data = json.loads(raw or "[]")
except json.JSONDecodeError:
return []
if isinstance(data, dict):
data = [data]
if not isinstance(data, list):
return []
out = [x for x in data if isinstance(x, dict)]
out.sort(key=lambda x: int(x.get("timestamp") or x.get("Timestamp") or 0))
return out
def pick_value(point: dict[str, Any]) -> float | None:
for key in ("Average", "Value", "Maximum", "Minimum"):
val = point.get(key)
if val is None:
continue
try:
return float(val)
except (TypeError, ValueError):
continue
return None
def summarize(points: list[dict[str, Any]]) -> dict[str, Any]:
values = [v for v in (pick_value(p) for p in points) if v is not None]
if not values:
return {"points": 0}
return {
"points": len(values),
"avg": round(fmean(values), 3),
"max": round(max(values), 3),
"min": round(min(values), 3),
}
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--instance-id", required=True)
parser.add_argument("--region-id", default=os.getenv("ALIBABACLOUD_REGION_ID") or os.getenv("ALIBABA_CLOUD_REGION_ID") or os.getenv("ALICLOUD_REGION_ID") or "cn-hangzhou")
parser.add_argument("--hours", type=float, default=1.0, help="Lookback window in hours")
parser.add_argument("--period", type=int, default=300, help="Metric period in seconds")
parser.add_argument("--namespace", default="acs_ecs_dashboard")
parser.add_argument(
"--metrics",
default=",".join(DEFAULT_METRICS),
help="Comma-separated metric names",
)
parser.add_argument("--summary-only", action="store_true", help="Output summary only")
parser.add_argument("--output", help="Write JSON output to file")
args = parser.parse_args()
end = datetime.now(timezone.utc).replace(microsecond=0)
start = end - timedelta(hours=args.hours)
start_time = start.isoformat().replace("+00:00", "Z")
end_time = end.isoformat().replace("+00:00", "Z")
metrics = [m.strip() for m in args.metrics.split(",") if m.strip()]
client = create_client(args.region_id)
result: dict[str, Any] = {
"instance_id": args.instance_id,
"region_id": args.region_id,
"namespace": args.namespace,
"window_utc": {
"start": start_time,
"end": end_time,
"period_sec": args.period,
},
"metrics": {},
}
for metric in metrics:
req = cms_models.DescribeMetricListRequest(
namespace=args.namespace,
metric_name=metric,
dimensions=json.dumps({"instanceId": args.instance_id}),
start_time=start_time,
end_time=end_time,
period=str(args.period),
)
try:
resp = client.describe_metric_list(req)
points = parse_datapoints(resp.body.datapoints or "[]")
payload: dict[str, Any] = {"summary": summarize(points)}
if not args.summary_only:
payload["datapoints"] = points
result["metrics"][metric] = payload
except Exception as exc: # noqa: BLE001
result["metrics"][metric] = {"error": str(exc)}
output = json.dumps(result, ensure_ascii=False, indent=2)
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Run a remote command on one ECS instance via Cloud Assistant (RunCommand).
This utility submits a command, polls invocation results, decodes stdout,
and outputs JSON for reproducible evidence.
"""
from __future__ import annotations
import argparse
import base64
import json
import os
import time
from typing import Any
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_tea_openapi import models as open_api_models
FINAL_STATES = {"Finished", "Failed", "Stopped", "Terminated", "Timeout"}
def create_client(region_id: str) -> EcsClient:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return EcsClient(config)
def safe_b64decode(content: str | None) -> str:
if not content:
return ""
try:
return base64.b64decode(content).decode("utf-8", errors="replace")
except Exception: # noqa: BLE001
return ""
def to_result_payload(item: Any) -> dict[str, Any]:
return {
"invoke_record_status": getattr(item, "invoke_record_status", None),
"exit_code": getattr(item, "exit_code", None),
"finished_time": getattr(item, "finished_time", None),
"start_time": getattr(item, "start_time", None),
"instance_id": getattr(item, "instance_id", None),
"stdout": safe_b64decode(getattr(item, "output", None)),
"stderr": getattr(item, "error_info", None),
}
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--instance-id", required=True)
parser.add_argument("--command", required=True, help="Shell command text, e.g. 'ps -ef'")
parser.add_argument("--region-id", default=os.getenv("ALIBABACLOUD_REGION_ID") or os.getenv("ALIBABA_CLOUD_REGION_ID") or os.getenv("ALICLOUD_REGION_ID") or "cn-hangzhou")
parser.add_argument("--name", default="codex-remote-command")
parser.add_argument("--command-type", default="RunShellScript", choices=["RunShellScript", "RunPowerShellScript"])
parser.add_argument("--timeout", type=int, default=120, help="RunCommand timeout seconds")
parser.add_argument("--poll-interval", type=float, default=2.0)
parser.add_argument("--max-wait", type=int, default=180, help="Max polling wait seconds")
parser.add_argument("--output", help="Write JSON output to file")
args = parser.parse_args()
client = create_client(args.region_id)
run_req = ecs_models.RunCommandRequest(
region_id=args.region_id,
type=args.command_type,
command_content=args.command,
instance_id=[args.instance_id],
name=args.name,
timeout=args.timeout,
)
run_resp = client.run_command(run_req)
invoke_id = run_resp.body.invoke_id
poll_req = ecs_models.DescribeInvocationResultsRequest(
region_id=args.region_id,
invoke_id=invoke_id,
instance_id=args.instance_id,
)
deadline = time.time() + args.max_wait
final_payload: dict[str, Any] | None = None
while time.time() < deadline:
poll_resp = client.describe_invocation_results(poll_req)
invocation = getattr(poll_resp.body, "invocation", None)
inv_results = getattr(invocation, "invocation_results", None) if invocation else None
items = getattr(inv_results, "invocation_result", None) if inv_results else None
if items:
item = items[0]
status = getattr(item, "invoke_record_status", "")
if status in FINAL_STATES:
final_payload = to_result_payload(item)
break
time.sleep(args.poll_interval)
result = {
"region_id": args.region_id,
"instance_id": args.instance_id,
"invoke_id": invoke_id,
"command": args.command,
"command_type": args.command_type,
"timed_out": final_payload is None,
"result": final_payload,
}
output = json.dumps(result, ensure_ascii=False, indent=2)
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
if final_payload is None:
return 2
status = final_payload.get("invoke_record_status")
return 0 if status == "Finished" else 1
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Summarize ECS instance specs across all regions."""
from __future__ import annotations
import argparse
import os
from collections import Counter
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str):
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
counter: Counter[str] = Counter()
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
spec = f"{inst.instance_type} | {inst.cpu} vCPU | {inst.memory} GiB"
counter[spec] += 1
lines = []
for spec, cnt in counter.most_common():
lines.append(f"{cnt}\t{spec}")
output = "\n".join(lines) if lines else "No ECS instances found."
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Summarize ECS instance counts by instance type across all regions."""
from __future__ import annotations
import argparse
import os
from collections import Counter
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str):
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
counter: Counter[str] = Counter()
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
counter[inst.instance_type] += 1
lines = ["instance_type\tcount"]
for itype, cnt in sorted(counter.items()):
lines.append(f"{itype}\t{cnt}")
output = "\n".join(lines) if len(lines) > 1 else "No ECS instances found."
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Summarize ECS instance counts by region (and optionally by status)."""
from __future__ import annotations
import argparse
import os
from collections import Counter
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str):
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--by-status", action="store_true", help="Break down by instance status")
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
counter: Counter[str] = Counter()
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
key = f"{region_id}\t{inst.status}" if args.by_status else region_id
counter[key] += 1
lines = []
if args.by_status:
lines.append("region_id\tstatus\tcount")
for key, cnt in sorted(counter.items()):
region_id, status = key.split("\t", 1)
lines.append(f"{region_id}\t{status}\t{cnt}")
else:
lines.append("region_id\tcount")
for region_id, cnt in sorted(counter.items()):
lines.append(f"{region_id}\t{cnt}")
output = "\n".join(lines) if lines else "No ECS instances found."
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Summarize ECS instance counts by security group across all regions."""
from __future__ import annotations
import argparse
import os
from collections import Counter
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str):
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
counter: Counter[str] = Counter()
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
group_ids = []
if inst.security_group_ids and inst.security_group_ids.security_group_id:
group_ids = inst.security_group_ids.security_group_id
if not group_ids:
counter["(none)"] += 1
continue
for sg in group_ids:
counter[sg] += 1
lines = ["security_group_id\tcount"]
for sg_id, cnt in sorted(counter.items()):
lines.append(f"{sg_id}\t{cnt}")
output = "\n".join(lines) if len(lines) > 1 else "No ECS instances found."
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Summarize ECS instance counts by status across all regions."""
from __future__ import annotations
import argparse
import os
from collections import Counter
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str):
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
counter: Counter[str] = Counter()
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
counter[inst.status] += 1
lines = ["status\tcount"]
for status, cnt in sorted(counter.items()):
lines.append(f"{status}\t{cnt}")
output = "\n".join(lines) if len(lines) > 1 else "No ECS instances found."
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())
#!/usr/bin/env python3
"""Summarize ECS instance counts by VPC across all regions."""
from __future__ import annotations
import argparse
import os
from collections import Counter
from alibabacloud_ecs20140526.client import Client as Ecs20140526Client
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_openapi import models as open_api_models
def create_client(region_id: str) -> Ecs20140526Client:
config = open_api_models.Config(
region_id=region_id,
endpoint=f"ecs.{region_id}.aliyuncs.com",
)
ak = os.getenv("ALIBABACLOUD_ACCESS_KEY_ID") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") or os.getenv("ALICLOUD_ACCESS_KEY_ID")
sk = os.getenv("ALIBABACLOUD_ACCESS_KEY_SECRET") or os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") or os.getenv("ALICLOUD_ACCESS_KEY_SECRET")
token = os.getenv("ALIBABACLOUD_SECURITY_TOKEN") or os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN") or os.getenv("ALICLOUD_SECURITY_TOKEN")
if ak and sk:
config.access_key_id = ak
config.access_key_secret = sk
if token:
config.security_token = token
return Ecs20140526Client(config)
def list_regions() -> list[str]:
client = create_client("cn-hangzhou")
resp = client.describe_regions(ecs_models.DescribeRegionsRequest())
return [r.region_id for r in resp.body.regions.region]
def iter_instances(client: Ecs20140526Client, region_id: str):
page_number = 1
page_size = 100
while True:
resp = client.describe_instances(ecs_models.DescribeInstancesRequest(
region_id=region_id,
page_number=page_number,
page_size=page_size,
))
for inst in resp.body.instances.instance:
yield inst
total = resp.body.total_count
if page_number * page_size >= total:
break
page_number += 1
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--output", help="Write output to file")
args = parser.parse_args()
counter: Counter[str] = Counter()
for region_id in list_regions():
client = create_client(region_id)
for inst in iter_instances(client, region_id):
vpc_id = None
if inst.vpc_attributes:
vpc_id = inst.vpc_attributes.vpc_id
key = vpc_id or "(classic)"
counter[key] += 1
lines = ["vpc_id\tcount"]
for vpc_id, cnt in sorted(counter.items()):
lines.append(f"{vpc_id}\t{cnt}")
output = "\n".join(lines) if len(lines) > 1 else "No ECS instances found."
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
else:
print(output)
return 0
if __name__ == "__main__":
raise SystemExit(main())