aws api 使用技巧

安装 WSL(最像服务器)

Windows Subsystem for Linux

你只需装 WSL,一次搞定 Bash + Linux

安装(Win10 / Win11)

以管理员身份打开 PowerShell:

wsl --install

重启后:

wsl

第二步
1️⃣ 更新系统(建议)

sudo apt update

2️⃣ 安装基础工具

sudo apt install -y curl unzip nano

3️⃣ 验证你现在就在 Bash

echo $SHELL

如果输出包含:

/bin/bash

说明你已经在 真正的 Bash 里了

第三步

✅ 第一步:回到 Linux 自己的 Home 目录(很重要)
cd ~

确认一下:

pwd

应该是类似:

/home/user

✅ 第二步:重新下载并解压 AWS CLI(在 Linux 目录)

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip awscliv2.zip

⚠️ 如果你刚才已经解压过,没关系,重新来一遍即可

✅ 第三步:安装

sudo ./aws/install

✅ 验证(关键)

aws --version

应看到类似:

aws-cli/2.x.x Python/3.x ...

第四步 设置api

aws configure

在\wsl$\Ubuntu\home\user 目录建

  1. 删除ec2实例
#!/usr/bin/env bash
set -euo pipefail

err(){ echo "❌ $*" >&2; exit 1; }
need(){ command -v "$1" >/dev/null 2>&1 || err "缺少命令:$1"; }
need aws

ask(){
  local var="$1" msg="$2" def="${3-}" val=""
  if [[ -n "$def" ]]; then
    read -r -p "$msg [$def]: " val
    val="${val:-$def}"
  else
    read -r -p "$msg: " val
  fi
  printf -v "$var" '%s' "$val"
}

echo "=== EC2 全区扫描 + 选择实例 + 开机/关机/重启/删除 ==="
echo

# 0) 选一个起始 region(只用来拉 regions 列表 + 做 sts 校验)
ask BASE_REGION "起始 Region(用来获取 EC2 regions 列表)" "ap-southeast-1"

echo "🔍 校验 AWS 凭证..."
aws sts get-caller-identity --region "$BASE_REGION" >/dev/null 2>&1 || err "AWS 凭证无效:请先 aws configure"
echo "✅ 凭证有效"
echo

echo "🌍 获取所有 EC2 regions(通过 $BASE_REGION)..."
mapfile -t REGIONS < <(aws ec2 describe-regions --region "$BASE_REGION" --query 'Regions[].RegionName' --output text | tr '\t' '\n')
[[ "${#REGIONS[@]}" -gt 0 ]] || err "无法获取 regions 列表(权限不足或 region 不可用)"

# 1) 全区扫描所有实例
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT

echo "🔎 开始扫描(会遍历所有 region,把每台实例列出来)..."
echo -e "IDX\tREGION\tAZ\tINSTANCE_ID\tSTATE\tNAME\tPUBLIC_IP\tPRIVATE_IP" > "$tmp"

idx=0
for r in "${REGIONS[@]}"; do
  # 只要某个 region 没开 EC2 或权限不足,可能会报错;这里吞掉错误继续扫
  lines="$(
    aws ec2 describe-instances --region "$r" \
      --query 'Reservations[].Instances[].[
        Placement.AvailabilityZone,
        InstanceId,
        State.Name,
        (Tags[?Key==<code>Name</code>].Value|[0]),
        PublicIpAddress,
        PrivateIpAddress
      ]' --output text 2>/dev/null || true
  )"

  # 没实例则跳过
  [[ -n "$lines" ]] || continue

  while IFS=$'\t' read -r az iid state name pubip privip; do
    [[ -n "$iid" ]] || continue
    idx=$((idx+1))
    name="${name:-}"
    pubip="${pubip:-}"
    privip="${privip:-}"
    echo -e "${idx}\t${r}\t${az}\t${iid}\t${state}\t${name}\t${pubip}\t${privip}" >> "$tmp"
  done <<< "$lines"
done

if [[ "$idx" -eq 0 ]]; then
  echo "❌ 扫描完了:没有找到任何 EC2 实例。"
  echo "可能原因:"
  echo " - 这个账号确实没有 EC2(只有 Lightsail 之类)"
  echo " - 你用的凭证权限不够(缺 ec2:DescribeInstances / ec2:DescribeRegions)"
  exit 1
fi

echo
echo "✅ 找到 $idx 台实例:"
echo

# 2) 打印列表(漂亮一点)
column -t -s $'\t' "$tmp" | sed -n '1,1p;2,99999p'

echo
ask PICK "请输入要操作的实例编号 IDX(例如 1)"
[[ "$PICK" =~ ^[0-9]+$ ]] || err "请输入数字编号"

# 取出选中行
sel="$(awk -v p="$PICK" -F'\t' 'NR>1 && $1==p {print; exit}' "$tmp")"
[[ -n "$sel" ]] || err "找不到该编号:$PICK"

# 解析
REGION="$(echo "$sel" | awk -F'\t' '{print $2}')"
AZ="$(echo "$sel" | awk -F'\t' '{print $3}')"
INSTANCE_ID="$(echo "$sel" | awk -F'\t' '{print $4}')"
STATE="$(echo "$sel" | awk -F'\t' '{print $5}')"
NAME="$(echo "$sel" | awk -F'\t' '{print $6}')"

echo
echo "你选择的是:"
echo "  REGION:      $REGION"
echo "  AZ:          $AZ"
echo "  INSTANCE_ID: $INSTANCE_ID"
echo "  STATE:       $STATE"
echo "  NAME:        $NAME"
echo

# 3) 操作菜单
echo "选择操作:"
echo "  1) 刷新状态"
echo "  2) 开机 start"
echo "  3) 关机 stop"
echo "  4) 重启 reboot"
echo "  5) 删除 terminate(⚠️不可逆)"
echo "  0) 退出"
echo

while true; do
  ask CHOICE "请选择" "1"
  case "$CHOICE" in
    1)
      echo
      aws ec2 describe-instances --region "$REGION" --instance-ids "$INSTANCE_ID" \
        --query 'Reservations[0].Instances[0].{
          InstanceId:InstanceId,
          Name: Tags[?Key==<code>Name</code>].Value | [0],
          State: State.Name,
          InstanceType: InstanceType,
          AZ: Placement.AvailabilityZone,
          PublicIp: PublicIpAddress,
          PrivateIp: PrivateIpAddress
        }' --output table || true
      echo
      aws ec2 describe-instance-status --region "$REGION" --instance-ids "$INSTANCE_ID" --include-all-instances \
        --query 'InstanceStatuses[0].{
          InstanceState: InstanceState.Name,
          SystemStatus: SystemStatus.Status,
          InstanceStatus: InstanceStatus.Status
        }' --output table || true
      ;;
    2)
      echo "🚀 start..."
      aws ec2 start-instances --region "$REGION" --instance-ids "$INSTANCE_ID" --output table || true
      ;;
    3)
      echo "🛑 stop..."
      aws ec2 stop-instances --region "$REGION" --instance-ids "$INSTANCE_ID" --output table || true
      ;;
    4)
      echo "🔁 reboot..."
      aws ec2 reboot-instances --region "$REGION" --instance-ids "$INSTANCE_ID" || true
      echo "提示:reboot 通常不会变成一个固定 state(可能仍显示 running),看状态检查更准。"
      ;;
    5)
      echo "⚠️ terminate 不可逆:shutting-down -> terminated"
      read -r -p "确认删除请输入 DELETE: " CONFIRM
      if [[ "$CONFIRM" == "DELETE" ]]; then
        echo "🗑️ terminate..."
        aws ec2 terminate-instances --region "$REGION" --instance-ids "$INSTANCE_ID" --output table || true
      else
        echo "已取消删除。"
      fi
      ;;
    0)
      echo "退出。"
      exit 0
      ;;
    *)
      echo "请输入 0-5"
      ;;
  esac
  echo
done

2。建光帆

#!/usr/bin/env bash
set -euo pipefail

err(){ echo "❌ $*" >&2; exit 1; }
need(){ command -v "$1" >/dev/null 2>&1 || err "缺少命令:$1"; }

need aws

echo "=== Lightsail 交互式创建(区域可选;创建后自动全开端口)==="
echo

# Lightsail 的 get-regions 也必须指定 --region
# 这里用“引导 region”仅用于拉 regions 列表,不影响你最终选择
BOOTSTRAP_REGION_DEFAULT="us-east-1"
read -r -p "引导 Region(仅用于获取 Lightsail 可用区域列表) [${BOOTSTRAP_REGION_DEFAULT}]: " BOOTSTRAP_REGION
BOOTSTRAP_REGION="${BOOTSTRAP_REGION:-$BOOTSTRAP_REGION_DEFAULT}"

# 凭证自检(用引导 region)
echo "🔍 校验 AWS 凭证..."
aws sts get-caller-identity --region "$BOOTSTRAP_REGION" >/dev/null 2>&1 \
  || err "AWS 凭证无效/无权限。请先 aws configure,并确保有 Lightsail 权限。"
echo "✅ 凭证有效"
echo

# 1) 区域选择(从 Lightsail API 拉取)
echo "1) 选择 Region:"
mapfile -t REGIONS < <(
  aws lightsail get-regions \
    --region "$BOOTSTRAP_REGION" \
    --query 'regions[].name' \
    --output text | tr '\t' '\n'
)

[[ "${#REGIONS[@]}" -gt 0 ]] || err "无法获取 Lightsail regions(请检查权限或引导 region 是否有效)"

for i in "${!REGIONS[@]}"; do
  printf "   %2d) %s\n" "$((i+1))" "${REGIONS[$i]}"
done

read -r -p "请输入编号: " REGION_IDX
[[ "$REGION_IDX" =~ ^[0-9]+$ ]] || err "请输入数字编号"
(( REGION_IDX >= 1 && REGION_IDX <= ${#REGIONS[@]} )) || err "编号超出范围"

AWS_REGION="${REGIONS[$((REGION_IDX-1))]}"
export AWS_REGION
echo "✅ 已选择 Region:$AWS_REGION"
echo

# 2) 可用区(默认 region + a)
read -r -p "2) 可用区(如 ${AWS_REGION}a) [${AWS_REGION}a]: " AZ
AZ="${AZ:-${AWS_REGION}a}"

# 3) 实例名
read -r -p "3) 实例名称 [ls-${AWS_REGION}-1]: " INSTANCE_NAME
INSTANCE_NAME="${INSTANCE_NAME:-ls-${AWS_REGION}-1}"

echo
echo "4) 正在获取套餐(bundle)..."
aws lightsail get-bundles \
  --region "$AWS_REGION" \
  --query 'bundles | sort_by(@,&price)[].{id:bundleId,price:price,ram:ramSizeInGb,cpu:cpuCount,disk:diskSizeInGb,transfer:transferPerMonthInGb}' \
  --output table

read -r -p "请输入 bundleId(例如 nano_3_0 / micro_ipv6_3_0 等): " BUNDLE_ID
[[ -n "$BUNDLE_ID" ]] || err "bundleId 不能为空"

echo
echo "5) 正在获取系统镜像(blueprint)..."
aws lightsail get-blueprints \
  --region "$AWS_REGION" \
  --query 'blueprints | sort_by(@,&name)[].{id:blueprintId,name:name,platform:platform,version:version,isActive:isActive}' \
  --output table

read -r -p "请输入 blueprintId(建议 Ubuntu): " BLUEPRINT_ID
[[ -n "$BLUEPRINT_ID" ]] || err "blueprintId 不能为空"

echo
echo "6) 可选:初始脚本(userData)。输入 END 结束;直接 END 表示不加。"
USERDATA_FILE="$(mktemp)"
while IFS= read -r line; do
  [[ "$line" == "END" ]] && break
  echo "$line" >> "$USERDATA_FILE"
done

CREATE_ARGS=(
  --region "$AWS_REGION"
  --instance-names "$INSTANCE_NAME"
  --availability-zone "$AZ"
  --bundle-id "$BUNDLE_ID"
  --blueprint-id "$BLUEPRINT_ID"
)

if [[ -s "$USERDATA_FILE" ]]; then
  CREATE_ARGS+=(--user-data "file://$USERDATA_FILE")
  echo "✅ 已设置 userData:$(wc -l < "$USERDATA_FILE") 行"
else
  echo "未设置 userData"
fi

echo
echo "🚀 创建实例中..."
aws lightsail create-instances "${CREATE_ARGS[@]}" >/dev/null
echo "✅ 已提交创建请求:$INSTANCE_NAME"
echo

# 7) 等待实例 running
echo "⏳ 等待实例进入 running 状态..."
STATE="unknown"
IP=""

for i in {1..120}; do
  STATE="$(aws lightsail get-instance --region "$AWS_REGION" --instance-name "$INSTANCE_NAME" --query 'instance.state.name' --output text 2>/dev/null || echo "unknown")"
  IP="$(aws lightsail get-instance --region "$AWS_REGION" --instance-name "$INSTANCE_NAME" --query 'instance.publicIpAddress' --output text 2>/dev/null || echo "")"
  echo "[$i/120] state=$STATE ip=$IP"
  if [[ "$STATE" == "running" ]]; then
    echo "✅ 实例已 running"
    break
  fi
  sleep 5
done

[[ "$STATE" == "running" ]] || err "实例长时间未 running,请稍后再试:aws lightsail get-instance --region $AWS_REGION --instance-name $INSTANCE_NAME"

# 8) 自动全开端口(不再询问)
echo
echo "🔓 自动全开端口(TCP/UDP 0-65535)..."
aws lightsail put-instance-public-ports \
  --region "$AWS_REGION" \
  --instance-name "$INSTANCE_NAME" \
  --port-infos '[
    {"fromPort":0,"toPort":65535,"protocol":"tcp"},
    {"fromPort":0,"toPort":65535,"protocol":"udp"}
  ]'
echo "✅ 端口已全开"
echo

echo "📡 实例信息:"
aws lightsail get-instance \
  --region "$AWS_REGION" \
  --instance-name "$INSTANCE_NAME" \
  --query 'instance.{name:name,state:state.name,ip:publicIpAddress,username:username,zone:location.availabilityZone}' \
  --output table

rm -f "$USERDATA_FILE"
echo
echo "🎉 完成"

3.光帆的控制

#!/usr/bin/env bash
set -euo pipefail

err(){ echo "❌ $*" >&2; exit 1; }
need(){ command -v "$1" >/dev/null 2>&1 || err "缺少命令:$1"; }

need aws

echo "=== Lightsail 光帆实例管理:列出 -> 选择 -> 启动/停止/重启 ==="
echo

# Lightsail 的 get-regions 必须指定 --region,所以用一个引导 region
BOOTSTRAP_REGION_DEFAULT="us-east-1"
read -r -p "引导 Region(仅用于获取 Lightsail 区域列表) [${BOOTSTRAP_REGION_DEFAULT}]: " BOOTSTRAP_REGION
BOOTSTRAP_REGION="${BOOTSTRAP_REGION:-$BOOTSTRAP_REGION_DEFAULT}"

echo "🔍 校验 AWS 凭证..."
aws sts get-caller-identity --region "$BOOTSTRAP_REGION" >/dev/null 2>&1 \
  || err "AWS 凭证无效/无权限,请先 aws configure"
echo "✅ 凭证有效"
echo

echo "🌍 获取 Lightsail Regions..."
mapfile -t REGIONS < <(
  aws lightsail get-regions --region "$BOOTSTRAP_REGION" \
    --query 'regions[].name' --output text | tr '\t' '\n'
)
[[ "${#REGIONS[@]}" -gt 0 ]] || err "无法获取 regions"

tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT

echo -e "IDX\tREGION\tNAME\tSTATE\tPUBLIC_IP\tAZ" > "$tmp"
idx=0

echo "🔎 扫描所有 region 的 Lightsail 实例(有的话会列出来)..."
for r in "${REGIONS[@]}"; do
  # 某些 region 没开 lightsail 或权限异常,忽略错误继续
  out="$(
    aws lightsail get-instances --region "$r" \
      --query 'instances[].[
        name,
        state.name,
        publicIpAddress,
        location.availabilityZone
      ]' --output text 2>/dev/null || true
  )"
  [[ -n "$out" ]] || continue

  while IFS=$'\t' read -r name state ip az; do
    [[ -n "$name" ]] || continue
    idx=$((idx+1))
    state="${state:-unknown}"
    ip="${ip:-}"
    az="${az:-}"
    echo -e "${idx}\t${r}\t${name}\t${state}\t${ip}\t${az}" >> "$tmp"
  done <<< "$out"
done

if [[ "$idx" -eq 0 ]]; then
  echo "❌ 没有找到任何 Lightsail 光帆实例。"
  echo "如果你确定有,可能是:"
  echo " - 用错账号/凭证"
  echo " - IAM 权限缺 lightsail:GetInstances"
  exit 1
fi

echo
echo "✅ 找到 $idx 台 Lightsail 实例:"
echo
column -t -s $'\t' "$tmp"

echo
read -r -p "请输入要操作的实例编号 IDX(例如 1): " PICK
[[ "$PICK" =~ ^[0-9]+$ ]] || err "请输入数字编号"

sel="$(awk -v p="$PICK" -F'\t' 'NR>1 && $1==p {print; exit}' "$tmp")"
[[ -n "$sel" ]] || err "找不到该编号:$PICK"

REGION="$(echo "$sel" | awk -F'\t' '{print $2}')"
NAME="$(echo "$sel"   | awk -F'\t' '{print $3}')"

echo
echo "你选择的是:$NAME (Region: $REGION)"
echo

echo "选择操作:"
echo "  1) 启动 start"
echo "  2) 停止 stop"
echo "  3) 重启 reboot"
echo "  4) 刷新查看状态"
echo "  0) 退出"
echo

while true; do
  read -r -p "请选择 [4]: " ACTION
  ACTION="${ACTION:-4}"

  case "$ACTION" in
    1)
      echo "🚀 启动中..."
      aws lightsail start-instance --region "$REGION" --instance-name "$NAME"
      ;;
    2)
      echo "🛑 停止中..."
      aws lightsail stop-instance --region "$REGION" --instance-name "$NAME"
      ;;
    3)
      echo "🔁 重启中..."
      aws lightsail reboot-instance --region "$REGION" --instance-name "$NAME"
      ;;
    4)
      echo "📡 当前状态:"
      aws lightsail get-instance --region "$REGION" --instance-name "$NAME" \
        --query 'instance.{name:name,state:state.name,ip:publicIpAddress,zone:location.availabilityZone}' \
        --output table
      ;;
    0)
      echo "退出。"
      exit 0
      ;;
    *)
      echo "请输入 0-4"
      ;;
  esac

  echo
done

运行脚本
./xxxx.sh