mcpField
A
alicloud-compute-ecs

alicloud-compute-ecs

github.com/cinienceクラウド・DevOps396280 回インストール11 週間前に更新
リポジトリ

alicloud-compute-ecs について

Alibaba Cloud OpenAPI を通じて Elastic Compute Service(ECS)を操作するスキルです。Python SDK の手順とスクリプトで、インベントリ作成、使用量の照会、リモートコマンド実行を行い、複数リージョンの ECS リソース管理に役立ちます。

主な機能

  1. 01OpenAPI による ECS リソース管理
  2. 02複数リージョンのインスタンス一覧
  3. 03CPU・メモリ・ネットワーク使用量の照会
  4. 04Cloud Assistant によるリモートコマンド実行
  5. 05属性別のインスタンス集計

活用シーン

  1. 01複数リージョンの ECS インスタンスの棚卸し
  2. 02特定インスタンスの使用量確認
  3. 03インスタンス上でのコマンド実行と記録
  4. 04リージョン別またはステータス別の集計

MCP 対応

入力には MCP 連携や MCP インターフェースについての記載がありません。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/cinience/alicloud-skills --skill alicloud-compute-ecs

インストール後、Claude Code で/alicloud-compute-ecsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
references/
api_overview.md
command-assistant.md
describe-instances.md
disks.md
endpoints.md
images.md
instances.md
keypairs.md
monitoring-events.md
network-interfaces.md
security-groups.md
snapshots.md
sources.md
tags.md
scripts/
list_instances_all_regions.py
query_instance_usage.py
run_remote_command.py
summary_instance_specs.py
summary_instances_by_instance_type.py
summary_instances_by_region.py
summary_instances_by_security_group.py
summary_instances_by_status.py
summary_instances_by_vpc.py

詳細

カテゴリー:サービス

Elastic Compute Service(ECS)

検証

mkdir -p output/alicloud-compute-ecs
python -m py_compile skills/compute/ecs/alicloud-compute-ecs/scripts/list_instances_all_regions.py
python -m py_compile skills/compute/ecs/alicloud-compute-ecs/scripts/query_instance_usage.py
python -m py_compile skills/compute/ecs/alicloud-compute-ecs/scripts/run_remote_command.py
echo "py_compile_ok" > output/alicloud-compute-ecs/validate.txt

合格基準:コマンドが終了コード 0 で終了し、output/alicloud-compute-ecs/validate.txt が生成されること。

出力とエビデンス

  • list/summarize の出力は output/alicloud-compute-ecs/ に保存します。
  • 各エビデンスファイルにコマンドの引数とリージョンの範囲を記録します。

ECS リソースの管理には、Alibaba Cloud OpenAPI(RPC)と公式 SDK、または OpenAPI Explorer を使用します。 すべての例と実行には、Python SDK の使用を推奨します。

前提条件

  • AccessKey を用意します(最小限の権限を持つ RAM ユーザー/ロール)。
  • 適切なリージョンとエンドポイント(パブリック/VPC)を選択します。
  • ECS OpenAPI は RPC スタイルです。手動での署名を避けるため、SDK または OpenAPI Explorer の使用を推奨します。

API の動作に関する注意事項(ECS ドキュメントより)

  • ほとんどの list/describe API は、PageNumber + PageSize または NextToken + MaxResults によるページネーションに対応しています。
  • RAM ユーザー/ロールに権限がない場合、DescribeInstances は空のリストを返します。権限の検証には DryRun を使用します。
  • DescribeInstances では、NextToken + MaxResults が推奨されるページクエリパターンです。返された NextToken を使用して次のページを取得します。
  • DescribeInstances のリクエストには、クライアントにリージョンが設定されている場合でも RegionId が必要です。
  • フィルターは AND 条件で適用されます。必要なフィルターのみを設定します。

ワークフロー

  1. リージョン、リソース識別子、実行する操作を確認します。
  2. references/api_overview.md で API グループと正確な操作名を確認します。
  3. Python SDK(推奨)または OpenAPI Explorer で API を呼び出します。
  4. describe/list API で結果を確認します。
  5. 繰り返し利用できるインベントリーや概要が必要な場合は、scripts/ を使用し、出力を output/alicloud-compute-ecs/ に保存します。

SDK の優先順位

  1. Python SDK(推奨)
  2. OpenAPI Explorer
  3. その他の SDK(Python が実行できない場合のみ)
Python SDK クイックスタート(インスタンスの一覧表示)

PEP 668 によるシステムへのインストール制限を避けるため、仮想環境の使用を推奨します。

python3 -m venv .venv
. .venv/bin/activate
python -m pip install alibabacloud_ecs20140526 alibabacloud_tea_openapi alibabacloud_credentials
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(
        # 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 スクリプト(インベントリーに推奨)
  • すべてのリージョンの全インスタンスを一覧表示(TSV/JSON):scripts/list_instances_all_regions.py
  • 1 つのインスタンスのリソース使用状況(CPU/メモリ/ネットワーク)をクエリ:scripts/query_instance_usage.py
  • Cloud Assistant(RunCommand)でリモートコマンドを実行:scripts/run_remote_command.py
  • すべてのリージョンのインスタンス仕様を集計:scripts/summary_instance_specs.py
  • リージョン別にインスタンス数を集計(ステータスの内訳は任意):scripts/summary_instances_by_region.py
  • ステータス別にインスタンス数を集計:scripts/summary_instances_by_status.py
  • インスタンスタイプ別にインスタンス数を集計:scripts/summary_instances_by_instance_type.py
  • VPC 別にインスタンス数を集計:scripts/summary_instances_by_vpc.py
  • セキュリティグループ別にインスタンス数を集計:scripts/summary_instances_by_security_group.py
Python SDK:1 つのインスタンスのリソース使用状況をクエリ

依存関係をインストールします(CMS SDK を追加):

python -m pip install alibabacloud_ecs20140526 alibabacloud_cms20190101 alibabacloud_tea_openapi alibabacloud_credentials

例(直近 1 時間、5 分間隔):

python skills/compute/ecs/alicloud-compute-ecs/scripts/query_instance_usage.py \
  --instance-id i-xxxxxxxxxxxxxxxxx \
  --region-id cn-shanghai \
  --hours 1 \
  --period 300 \
  --summary-only \
  --output output/alicloud-compute-ecs/ecs-usage-i-xxxxxxxxxxxxxxxxx-1h.json

推奨されるデフォルトのメトリクス:

  • CPUUtilization
  • memory_usedutilization
  • InternetInRate、InternetOutRate
  • IntranetInRate、IntranetOutRate
Python SDK:1 つの ECS インスタンスでリモートコマンドを実行

例(ps -ef):

python skills/compute/ecs/alicloud-compute-ecs/scripts/run_remote_command.py \
  --instance-id i-xxxxxxxxxxxxxxxxx \
  --region-id cn-shanghai \
  --command 'ps -ef' \
  --output output/alicloud-compute-ecs/runcommand-i-xxxxxxxxxxxxxxxxx-ps-ef.json

動作:

  • RunShellScript を指定して RunCommand を送信します。
  • 最終ステータスになるまで DescribeInvocationResults をポーリングします。
  • base64 の標準出力をデコードし、正規化した JSON エビデンスを保存します。
Python SDK:すべてのリージョンのインスタンスを一覧表示
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:ページネーションを使用したインスタンスの一覧表示
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:インスタンスタイプと料金計算用の入力情報を一覧表示
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")

一般的な操作の対応関係

  • インスタンスのライフサイクル:RunInstances、CreateInstance、StartInstance(s)、StopInstance(s)、RebootInstance(s)、DeleteInstance(s)
  • インスタンスの詳細:DescribeInstances、DescribeInstanceStatus、DescribeInstanceAttribute
  • 仕様の変更:ModifyInstanceSpec、ModifyPrepayInstanceSpec、DescribeResourcesModification
  • システムディスクの変更:ReplaceSystemDisk、ResetDisk
  • データディスク:CreateDisk、AttachDisk、DetachDisk、ResizeDisk、DescribeDisks
  • スナップショット:CreateSnapshot、CopySnapshot、DescribeSnapshots、DeleteSnapshot
  • イメージ:CreateImage、CopyImage、DescribeImages、DeleteImage、ModifyImageAttribute
  • セキュリティグループ:CreateSecurityGroup、AuthorizeSecurityGroup、RevokeSecurityGroup、DescribeSecurityGroupAttribute
  • キーペア:CreateKeyPair、ImportKeyPair、DescribeKeyPairs、DeleteKeyPairs
  • ENI:CreateNetworkInterface、AttachNetworkInterface、DetachNetworkInterface、DescribeNetworkInterfaces
  • タグ:TagResources、UntagResources、ListTagResources
  • モニタリング/イベント:DescribeInstancesFullStatus、DescribeInstanceHistoryEvents、DescribeInstanceMonitorData

クエリのパターン

  • インスタンスの一覧表示:DescribeInstances(VpcId、VSwitchId、ZoneId、SecurityGroupId、InstanceIds などのフィルターに対応)
  • インスタンス数の取得:PageSize=1 を指定して DescribeInstances を実行し、TotalCount を読み取ります
  • リージョンの検出:DescribeRegions を実行し、その後すべてのリージョンをループしてインベントリを取得します

Cloud Assistant(RunCommand)のヒント

  • インスタンスは Running 状態である必要があります。
  • Cloud Assistant エージェントがインストールされ、オンラインであることを確認してください。
  • Linux ではシェル、Windows では PowerShell を使用します。
  • DescribeInvocations と DescribeInvocationResults で結果をポーリングします。

references/command-assistant.md を参照してください。

AccessKey の優先順位(必ず従い、README と整合させてください)

  1. 環境変数:ALICLOUD_ACCESS_KEY_ID / ALICLOUD_ACCESS_KEY_SECRET / ALICLOUD_REGION_ID リージョンのポリシー:ALICLOUD_REGION_ID は省略可能なデフォルト値です。設定されていない場合は、タスクに最も適したリージョンを選択してください。不明な場合はユーザーに確認してください。
  2. 共有設定ファイル:~/.alibabacloud/credentials(リージョンは引き続き環境変数から取得します)
認証の設定(README に準拠)

環境変数:

export ALICLOUD_ACCESS_KEY_ID="your-ak"
export ALICLOUD_ACCESS_KEY_SECRET="your-sk"
export ALICLOUD_REGION_ID="cn-hangzhou"

Alibaba Cloud SDK でも次の設定がサポートされています:

export ALIBABA_CLOUD_ACCESS_KEY_ID="your-ak"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="your-sk"

共有設定ファイル:

~/.alibabacloud/credentials

[default]
type = access_key
access_key_id = your-ak
access_key_secret = your-sk

API の検出

  • プロダクトコード:Ecs
  • デフォルトの API バージョン:2014-05-26
  • OpenAPI メタデータのエンドポイントを使用して API の一覧表示とスキーマの取得を行います(references を参照)。

出力ポリシー

レスポンスや生成されたアーティファクトを保存する必要がある場合は、次の場所に保存してください: output/alicloud-compute-ecs/

リソース使用状況のクエリ証拠の例: output/alicloud-compute-ecs/ecs-usage-<instance-id>-<window>.json

リモートコマンドの証拠の例: output/alicloud-compute-ecs/runcommand-<instance-id>-<name>.json

参考資料

  • API の概要:references/api_overview.md
  • エンドポイント:references/endpoints.md
  • Cloud Assistant:references/command-assistant.md
  • DescribeInstances:references/describe-instances.md
  • インスタンス:references/instances.md
  • ディスク:references/disks.md
  • スナップショット:references/snapshots.md
  • イメージ:references/images.md
  • セキュリティグループ:references/security-groups.md
  • ネットワークインターフェイス:references/network-interfaces.md
  • キーペア:references/keypairs.md
  • タグ:references/tags.md
  • モニタリング/イベント:references/monitoring-events.md
  • ソース:references/sources.md

コメント