26 - 云与混合环境集成(AWS CLI / Azure CLI / gcloud)
前提条件
- 已完成容器与虚拟化基础(Docker / Podman 至少有一项可用)
- 以 root 身份登录,或 ops 用户执行
sudo -i切换至 root 环境 - 系统运行在 Debian 12 Bookworm
- 需要真实云账号(AWS / Azure / GCP)用于测试;学习阶段可创建免费层账号
- 防火墙无需额外放行(三个 CLI 工具均通过出站 HTTPS 通信)
全局参数
主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops
三大云 CLI 对比
| 维度 | AWS CLI v2 | Azure CLI | gcloud CLI |
|---|---|---|---|
| 安装方式 | 官方脚本(推荐)或包管理器 | 官方脚本 | 官方 apt 源 |
| 认证方式 | Access Key / IAM Role / SSO | az login / Service Principal | gcloud init / ADC |
| 配置文件 | ~/.aws/credentials、~/.aws/config |
~/.azure/ |
~/.config/gcloud/ |
| 多账号切换 | --profile 参数 |
az account set |
gcloud config configurations |
| 输出格式 | json / table / text / yaml |
json / table / tsv / yaml |
json / yaml / table / text |
详细步骤
1. AWS CLI v2
安装(官方推荐方式,避免 Debian 仓库旧版):
apt install -y unzip curl
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o /tmp/awscliv2.zip
unzip /tmp/awscliv2.zip -d /tmp/
/tmp/aws/install --update
aws --version
配置访问凭证(使用 IAM 用户,严禁使用 root 账户密钥):
aws configure
# 依次输入:
# AWS Access Key ID : AKIA...
# AWS Secret Access Key : ...
# Default region name : ap-northeast-1
# Default output format : json
凭证存储位置:~/.aws/credentials(权限应为 600)。
基础验证命令:
aws sts get-caller-identity # 验证当前身份
aws ec2 describe-regions --output table # 列出所有区域(表格格式)
aws s3 ls # 列出 S3 存储桶(需有 s3:ListAllMyBuckets 权限)
检查点
aws sts get-caller-identity 返回包含 UserId、Account、Arn 的 JSON,无 InvalidClientTokenId 错误。
多 profile 管理:
# 添加第二个账号 profile
aws configure --profile staging
# 使用指定 profile 执行命令
aws s3 ls --profile staging
2. Azure CLI
安装(官方脚本方式):
curl -sL https://aka.ms/InstallAzureCLIDeb | bash
az --version
脚本安全说明
直接 | bash 执行远程脚本存在安全风险。生产环境建议先下载脚本、审查内容后再执行:curl -sL https://aka.ms/InstallAzureCLIDeb -o /tmp/install-az.sh && less /tmp/install-az.sh && bash /tmp/install-az.sh。
登录认证:
# 交互式登录(弹出浏览器)
az login
# 无头环境(服务主体,适合 CI/CD)
az login --service-principal \
-u <appId> \
-p <password> \
--tenant <tenantId>
基础验证命令:
az account show # 当前订阅信息
az account list -o table # 列出所有订阅
az group list -o table # 列出资源组
检查点
az account show 返回包含 name、id、tenantId 的 JSON,state 字段为 Enabled。
3. gcloud CLI
安装(官方 apt 源):
apt install -y apt-transport-https ca-certificates gnupg
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \
| gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] \
https://packages.cloud.google.com/apt cloud-sdk main" \
| tee /etc/apt/sources.list.d/google-cloud-sdk.list
apt update
apt install -y google-cloud-cli
gcloud version
初始化配置:
# 交互式初始化(需要浏览器完成 OAuth 授权)
gcloud init
无浏览器环境(服务账号密钥):
gcloud auth activate-service-account \
--key-file=/path/to/service-account-key.json
基础验证命令:
gcloud auth list # 当前认证账号列表
gcloud config list # 当前配置
gcloud projects list # 列出所有项目
检查点
gcloud auth list 输出中有 * 标记的活跃账号,gcloud config list 显示正确的 project 和 account。
4. 凭证安全管理
严禁将凭证明文写入脚本或提交到 Git
Access Key / Secret Key 等长期凭证一旦泄露,攻击者可完全控制云账号资源。泄露检测时间通常以分钟计。
凭证安全等级(从高到低):
| 方式 | 安全等级 | 适用场景 |
|---|---|---|
| 实例角色 / Managed Identity | 最高 | 云上实例(无需本地凭证) |
| 短期凭证(STS AssumeRole) | 高 | CI/CD、跨账号操作 |
| 加密凭证管理(aws-vault、pass + gpg) | 中 | 本地开发机器 |
~/.aws/credentials 文件(权限 600) |
低 | 仅限受控的开发机 |
| 明文写入脚本 / 环境变量 | 不可接受 | 任何场景均禁止 |
使用环境变量(临时会话,进程结束后消失):
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_DEFAULT_REGION=ap-northeast-1
# 会话结束后清除
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
5. 多云统一身份验证脚本
#!/bin/bash
# 检查三个云平台当前认证状态(ops 用户执行,非 root)
set -euo pipefail
echo "=== AWS ==="
aws sts get-caller-identity --query 'Arn' --output text 2>/dev/null \
|| echo "未配置或凭证无效"
echo "=== Azure ==="
az account show --query 'name' --output tsv 2>/dev/null \
|| echo "未登录"
echo "=== GCP ==="
gcloud config get-value account 2>/dev/null \
|| echo "未初始化"
实践任务
- 安装 AWS CLI v2,完成
aws configure,运行aws sts get-caller-identity验证身份 - 安装 Azure CLI,用
az login完成认证,列出订阅和资源组 - 安装 gcloud CLI,完成初始化,运行
gcloud auth list确认认证账号 - 创建上述多云身份验证脚本,测试三个平台均能正确输出当前账号信息
自测问题
1. AWS CLI v2 相比 v1 的主要改进是什么?
AWS CLI v2 的主要改进包括:内置 AWS SSO 支持(可通过 aws sso login 直接对接企业 SSO,无需手动复制临时凭证);改进的分页输出(自动分页,不再依赖 --page-size);改进的 --query 过滤性能;支持交互式参数补全(通过 aws_completer);内置 YAML 输出格式;部分命令语义更严格(如 S3 操作)。安装方式也由 pip 改为独立二进制包,不再依赖 Python 环境。
2. az login 和 gcloud init 的认证流程有何异同?
两者均使用 OAuth 2.0 设备授权流程:CLI 生成一个设备码并提示用户在浏览器中访问指定 URL 完成授权,授权后 CLI 获取访问令牌并存储在本地配置文件中。区别在于:az login 默认直接尝试打开系统浏览器;gcloud init 是向导式,会同时询问项目、默认区域等配置。在无浏览器的服务器环境中,两者均提供服务主体 / 服务账号密钥的替代认证方式。
3. 生产环境中为什么强烈不建议把 Access Key 直接写在脚本里?
长期凭证(Access Key)硬编码在脚本中存在多重风险:脚本一旦被提交到 Git,即便后续删除,历史记录中仍可被检索到;脚本文件可能被意外共享、备份到不受控位置;凭证无法自动轮换,长期有效意味着泄露后影响时间无限。生产环境应优先使用云厂商提供的实例角色(EC2 Instance Role / Azure Managed Identity / GCP Service Account)——实例自动获取短期令牌,无需在代码或文件中存储任何凭证。
4. 如何在 AWS CLI 中切换不同的 profile?
--profile 参数用于在单条命令中指定使用哪个凭证 profile:
# 临时使用指定 profile
aws s3 ls --profile production
# 在当前 shell 会话中设置默认 profile(不影响其他会话)
export AWS_PROFILE=staging
aws sts get-caller-identity # 自动使用 staging profile
多个 profile 配置在 ~/.aws/credentials 和 ~/.aws/config 中,格式为 [profile-name](credentials 文件中 default profile 不加 profile 前缀,其他 profile 加)。
总结
AWS CLI、Azure CLI、gcloud 是多云运维的基础工具,统一了资源管理、自动化部署和基础设施即代码的操作入口。凭证安全是云运维的第一要务:优先使用实例角色,避免长期凭证落盘,绝不将任何密钥写入代码或 Git 仓库。