aws api 使用技巧
- 建站相关
- 26天前
- 45热度
- 0评论
安装 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 目录建
- 删除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
