概述
云应用提供了一套方案,让应用进程以安全且受控的方式调用云 API,从而访问或操作客户的云资源。常用的场景包括:
云管类软件
调用公有云 SaaS 实现软件功能(如短信)
自动扩缩容
校验软件授权
方案说明
API 调用方案围绕 CAM 运行时角色的生成及使用进行。
操作步骤
第一步:在 package.yaml 声明所需云 API 范围
云应用在安装应用包时,会根据声明的接口清单来生成 CAM 策略。因此,没声明的 API,进程内是无调用权限的。
# package.yamlscopes:cloudAPI:- cloudapp:VerifyLicense- cvm:DescribeInstances
第二步:在 variable.tf 中声明使用角色变量
# variable.tf variable "cloudapp_cam_role" {}
第三步:将分配的角色名注入到进程内
云应用会把应用安装时生成的软件运行时角色,通过 Terraform 变量的方式给到应用包。应用包需要在声明云资源的时候,将角色名的变量
cloudapp_cam_role
注入到进程的环境变量或者配置文件中。以下是 CVM 和 容器的示例。方法1:注入到环境变量
您可以在 CVM 声明的用户脚本中,添加环境变量。
# deployment.tfresource "tencentcloud_instance" "demo_cvm" {# 注意:需要将 CAM 角色绑定到 CVM 的实例运行时角色cam_role_name = var.cloudapp_cam_roleuser_data_raw = <<-EOT#!/bin/bash# 导出角色名到环境变量export CLOUDAPP_CAM_ROLE=${var.cloudapp_cam_role}# 启动进程可以从环境变量读取角色名node main.jsEOT}
方法2:注入到配置文件
您也可以将角色名注入到配置文件。
# deployment.tfresource "tencentcloud_instance" "demo_cvm" {# 注意:需要将 CAM 角色绑定到 CVM 的实例运行时角色cam_role_name = var.cloudapp_cam_roleuser_data_raw = <<-EOT#!/bin/bash# 导出角色名到配置文件echo "${var.cloudapp_cam_role}" >> /usr/local/.cloudapp_cam_role# 启动进程可以从配置文件 /usr/local/.cloudapp_cam_role 读取角色名node main.jsEOT}
首先:将变量作为 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: StatefulSetspec:spec:containers:- name: "my-container"image: {{ quote .Values.SERVER_IMAGE }}env:# 将 CAM_ROLE 给到容器的环境变量- name: CAM_ROLEvalue: {{ quote .Values.CAM_ROLE }}
容器启动后,环境变量 CAM_ROLE 将包含角色名。
方法2:将变量写入到 ConfigMap,在 StatefulSet 中使用
在 Helm Chart 中,声明一个 Configmap,并且在工作负载引用:
# <values.yaml># CAM 角色名,用于获取调用云 API 的临时密钥,从 tf 声明中注入CAM_ROLE: ""# <configmap.yaml># 声明 ConfigMapkind: ConfigMapmetadata:name: cloudapp-configdata:.cloudapp_cam_role: {{ quote .Values.CAM_ROLE }}# <templates/statefulset.yaml>kind: StatefulSetspec:template:spec:containers:- name: "my-container"image: {{ quote .Values.SERVER_IMAGE }}valueMounts:- name: cloudapp-cam-rolemountPath: /usr/local/cloudappsubPath: .cloudapp_cam_rolevolumes:- name: cloudapp-cam-roleconfigMap: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++