云应用 调用云 API

云应用提供了一套方案,让应用进程以安全且受控的方式调用云 API,从而访问或操作客户的云资源。常用的场景包括。

相关产品
云应用 产品页,含版本规格、价格与购买入口。

一、概述

·云管类软件

·调用公有云 SaaS 实现软件功能(如短信)

·自动扩缩容

·校验软件授权

二、方案说明

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

三、一、声明权限策略

在 package.yaml 声明权限策略,限制应用调用的云 API 范围。云应用在安装安装包时,会根据 声明的权限策略 来生成 CAM 策略。因此,没包含在权限策略声明中的 API,进程内是无调用权限的。

# package.yamlrole: policy: version: "2.0" statement: – action: – cloudapp:DescribeLicense – cvm:DescribeInstances resource: "*" effect: allow

四、二、声明使用角色变量

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

# variable.tf
variable "cloudapp_cam_role" {}

五、三、将分配的角色名注入到进程内

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

CVM 示例容器示例

六、方法1:注入到环境变量

你可以在 CVM 声明的用户脚本中,添加环境变量。

# deployment.tfresource "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.tfresource "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: StatefulSetspec: 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># 声明 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-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": "(RESPONSED SECRET ID)", "TmpSecretKey": "(RESPONSED SECRET KEY)", "ExpiredTime": 1658866289, "Expiration": "2022-07-26T20:11:29Z", "Token": "(RESPONSED TOKEN)", "Code": "Success"}

十二、五、使用临时密钥调用云 API

使用上面的临时密钥,即可调用云 API。调用云 API 的认证凭证必须包含:SecretId、SecretKey、Token。

不同语言调用方法,可参考对应 SDK 文档:

·PHP

·Python

·Java

·Go

·.NET

·Node.js

·C++

赞 (0)
上一篇 4天前
下一篇 4天前