跳转至

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 返回包含 UserIdAccountArn 的 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 返回包含 nameidtenantId 的 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 显示正确的 projectaccount

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 "未初始化"

实践任务

  1. 安装 AWS CLI v2,完成 aws configure,运行 aws sts get-caller-identity 验证身份
  2. 安装 Azure CLI,用 az login 完成认证,列出订阅和资源组
  3. 安装 gcloud CLI,完成初始化,运行 gcloud auth list 确认认证账号
  4. 创建上述多云身份验证脚本,测试三个平台均能正确输出当前账号信息

自测问题

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 logingcloud 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 仓库。