调用云 API

最近更新时间:2024-10-30 10:05:21

我的收藏

概述

云应用提供了一套方案,让应用进程以安全且受控的方式调用云 API,从而访问或操作客户的云资源。常用的场景包括:
云管类软件
调用公有云 SaaS 实现软件功能(如短信)
自动扩缩容
校验软件授权

方案说明

API 调用方案围绕 CAM 运行时角色的生成及使用进行。




操作步骤

第一步:在 package.yaml 声明所需云 API 范围

云应用在安装应用包时,会根据声明的接口清单来生成 CAM 策略。因此,没声明的 API,进程内是无调用权限的。
# package.yaml
scopes:
cloudAPI:
- cloudapp:VerifyLicense
- cvm:DescribeInstances

第二步:在 variable.tf 中声明使用角色变量

# variable.tf variable "cloudapp_cam_role" {}

第三步:将分配的角色名注入到进程内

云应用会把应用安装时生成的软件运行时角色,通过 Terraform 变量的方式给到应用包。应用包需要在声明云资源的时候,将角色名的变量 cloudapp_cam_role 注入到进程的环境变量或者配置文件中。以下是 CVM 和 容器的示例。
CVM 示例
容器示例

方法1:注入到环境变量

您可以在 CVM 声明的用户脚本中,添加环境变量。
# deployment.tf
resource "tencentcloud_instance" "demo_cvm" {
# 注意:需要将 CAM 角色绑定到 CVM 的实例运行时角色
cam_role_name = var.cloudapp_cam_role
user_data_raw = <<-EOT
#!/bin/bash
# 导出角色名到环境变量
export CLOUDAPP_CAM_ROLE=${var.cloudapp_cam_role}
# 启动进程可以从环境变量读取角色名
node main.js
EOT
}

方法2:注入到配置文件

您也可以将角色名注入到配置文件。
# deployment.tf
resource "tencentcloud_instance" "demo_cvm" {
# 注意:需要将 CAM 角色绑定到 CVM 的实例运行时角色
cam_role_name = var.cloudapp_cam_role
user_data_raw = <<-EOT
#!/bin/bash
# 导出角色名到配置文件
echo "${var.cloudapp_cam_role}" >> /usr/local/.cloudapp_cam_role
# 启动进程可以从配置文件 /usr/local/.cloudapp_cam_role 读取角色名
node main.js
EOT
}

首先:将变量作为 Chart 变量传入

首先 Terraform 中,声明 Worker 对应的云主机绑定运行时角色,同时将变量给到 Helm 的 Chart Values:
# <deployment.tf>
resource "tencentcloud_kubernetes_cluster" "tke-cluster1" {
worker_config {
# 此处省略了其他 worker_config 内容
cam_role_name = var.cloudapp_cam_role
}
}
resource "cloudapp_helm_app" "helm_charts" {
chart_values = {
CAM_ROLE = var.cloudapp_cam_role # 这里注入角色名变量
}
}

方法1:将 Chart 变量作为 StatefulSet 环境变量使用

在 Helm Chart 中,将 Chart 变量在工作负载中引用:
# <values.yaml>
# CAM 角色名,用于获取调用云 API 的临时密钥,从 tf 声明中注入
CAM_ROLE: ""

# <templates/statefulset.yaml>
kind: StatefulSet
spec:
spec:
containers:
- name: "my-container"
image: {{ quote .Values.SERVER_IMAGE }}
env:
# 将 CAM_ROLE 给到容器的环境变量
- name: CAM_ROLE
value: {{ quote .Values.CAM_ROLE }}
容器启动后,环境变量 CAM_ROLE 将包含角色名。

方法2:将变量写入到 ConfigMap,在 StatefulSet 中使用

在 Helm Chart 中,声明一个 Configmap,并且在工作负载引用:
# <values.yaml>
# CAM 角色名,用于获取调用云 API 的临时密钥,从 tf 声明中注入
CAM_ROLE: ""

# <configmap.yaml>
# 声明 ConfigMap
kind: ConfigMap
metadata:
name: cloudapp-config
data:
.cloudapp_cam_role: {{ quote .Values.CAM_ROLE }}

# <templates/statefulset.yaml>
kind: StatefulSet
spec:
template:
spec:
containers:
- name: "my-container"
image: {{ quote .Values.SERVER_IMAGE }}
valueMounts:
- name: cloudapp-cam-role
mountPath: /usr/local/cloudapp
subPath: .cloudapp_cam_role
volumes:
- name: cloudapp-cam-role
configMap:
name: cloudapp-config
至此,容器启动后,进程可以从 /usr/local/cloudapp/.cloudapp_cam_role 读取到 CAM 角色。

第四步:获取角色临时密钥

当进程里获得角色名后,我们通过 HTTP 请求就可获得角色的临时密钥。
请求的 CURL 示例如下:
curl http://metadata.tencentyun.com/meta-data/cam/security-credentials/$CLOUDAPP_CAM_ROLE
响应结果如下:
{ "TmpSecretId": "AKIDbfAmu6************kC4NL21Af9RDYF-ru50MqZV2mZXuiO5S4Ly5_IWM-rukFQK", "TmpSecretKey": "1Xho6SoJ3P***************+9Qw6ffnChY=", "ExpiredTime": 1658866289, "Expiration": "2022-07-26T20:11:29Z", "Token": "eIEKy0l6rWu*******w5K2FBnVjvwl", "Code": "Success" }

第五步:使用临时密钥调用云 API

使用上面的临时密钥,即可调用云 API。调用云 API 的认证凭证必须包含:SecretId、SecretKey、Token。
不同语言调用方法,可参考对应 SDK 文档:
PHP
Python
Java
Go
.NET
Node.js
C++