AWS CLI:用 profile、STS 身份与区域守卫控制资源操作
AWS CLI 的风险不在命令拼写,而在凭据提供链最终选择了谁、默认 Region 指向哪里、脚本是否在变更前验证账号与角色。每次资源操作都应把 profile、STS 身份、Region 和请求结果视为一组不可分割的证据。
profile 只是配置入口,STS 才能证明调用者
AWS CLI 的 config 与 credentials 文件按 profile 组织。profile 可以引用静态凭据,也可以配置 IAM Identity Center、角色或外部进程;角色 profile 会通过 AWS STS 获取临时凭据并在本机缓存。命令行参数和环境变量还能覆盖文件值,因此只查看 ~/.aws/config 不能证明实际身份。
aws --version
aws configure list --profile dev-readonly
aws sts get-caller-identity --profile dev-readonly --output json
aws configure get region --profile dev-readonlyget-caller-identity 返回 Account、Arn 与 UserId,应在任何写操作之前执行。脚本把允许的账号 ID、角色 ARN 模式和 Region 写成显式输入,不能接受无 profile 的默认状态。官方 AWS CLI 配置文档说明,命令参数、环境变量与 profile 存在优先级;排障时要用 aws configure list 查看最终来源。
安装与登录要留下可复现的客户端身份
安装入口应固定包来源和版本,CI 镜像记录二进制哈希或镜像摘要。人员开发优先使用组织批准的浏览器登录或 IAM Identity Center;自动化工作负载使用 OIDC 或受控角色,不把个人 Access Key 复制进 Secret。
aws configure sso --profile dev-readonly
aws sso login --profile dev-readonly
aws sts get-caller-identity --profile dev-readonly登录成功只证明获取到会话。随后还要验证目标账号、角色和 Region,并以最小只读 API 证明授权范围。若团队使用 aws login 或其他当前发行线提供的登录入口,也要把本地缓存位置、会话期限和注销动作纳入基线,而不是把一次浏览器成功当成长久凭据。
正反实验要同时验证允许与拒绝
正向实验可以查询一个已知标签的开发资源,并保存 Account、Region、资源 ARN 与 RequestId。反向实验则切换到错误账号、未授权 Region 或越权动作,确认服务稳定返回 AccessDenied 或组织策略拒绝。只验证“能列资源”无法证明写权限没有过大。
aws ec2 describe-instances \
--profile dev-readonly \
--region ap-southeast-1 \
--filters Name=tag:Environment,Values=dev \
--query 'Reservations[].Instances[].{Id:InstanceId,State:State.Name}' \
--output json
aws ec2 terminate-instances \
--profile dev-readonly \
--region ap-southeast-1 \
--instance-ids i-intentional-negative-canary反例使用明确的测试对象或不存在的占位 ID,不能误伤真实资源。错误证据要区分身份未登录、Region 错误、资源不存在、权限拒绝和服务限流,RequestId 用于回查 CloudTrail 或工单。
结构化输出与分页属于脚本契约
自动化消费 JSON 或 text,不解析 table 的对齐文本。--query 可以缩小输出,但查询字段仍受服务 API 模型影响;分页接口必须确认 CLI 是否自动分页、脚本是否使用 --no-paginate 以及下一页令牌如何处理。大范围 list 会消耗 API 配额、运行时间和审计存储。
变更脚本先调用 STS,再校验白名单账号、角色和 Region,最后才执行资源 API。dry-run 只在服务支持时作为额外证据,不能代替身份守卫。资源创建还要写入 owner、environment、expires-at 与 cost-center 等标签,使后续盘点、预算和删除能回到同一责任记录。
actual_account=$(aws sts get-caller-identity --profile "$AWS_PROFILE" --query Account --output text)
test "$actual_account" = "$EXPECTED_AWS_ACCOUNT" || exit 42
test "$AWS_REGION" = "$EXPECTED_AWS_REGION" || exit 43
aws s3api list-buckets --profile "$AWS_PROFILE" --output json权限、数据与成本从第一条命令开始治理
config 文件可以包含 SSO 会话、角色关系和区域,credentials 与缓存可能包含可用凭据,二者都按敏感资产处理。调试日志会暴露请求头、资源名称和路径,只有在受控环境短期开启。任何已泄漏的长期密钥都应立即停用并追查审计,而不是只删除终端历史。
权限用角色、Session Policy、Permission Boundary 与组织 SCP 共同约束。CI 的 OIDC 信任条件钉住仓库、分支、环境和 audience;部署与只读盘点使用不同角色。批量查询的容量需要估算账号数、Region 数、资源类型、分页与重试,资源费用还要覆盖 NAT、日志、快照、弹性 IP 和跨区流量等隐性对象。
清理与退出必须覆盖缓存和云端状态
本地注销或删除 profile 不会删除云资源,也不一定撤销已签发会话。退出顺序是先停止自动化入口,盘点该 profile 创建或维护的资源,按依赖关系删除并复核账单与 CloudTrail,再注销会话和清理本机配置。删除前保存资源 ARN、标签、依赖、快照与恢复条件。
aws sso logout --profile dev-readonly
aws configure list-profiles
aws sts get-caller-identity --profile dev-readonly最后一条应按预期失败或要求重新登录。团队长期维护 profile owner、允许账号/Region、角色信任、CLI 版本、失败金丝雀、缓存保留和退出演练。AWS CLI 主文只负责客户端身份与调用链;跨云临时凭据、成本清理和审计入口分别回到本家族对应任务文章。
