You need to enable JavaScript to run this app.
导航
使用 STS 临时访问凭证发起请求
最近更新时间:2025.02.13 20:34:16首次发布时间:2023.06.26 13:37:18

出于信息安全的考虑,建议您通过 STS 服务来申请临时访问凭证,使指定 IAM 用户在凭证有效期内访问权限范围内的 veImageX 资源。临时访问凭证包括临时访问密钥(AccessKeyId 和 AccessKeySecret)和安全令牌(SecurityToken),以下为您介绍临时访问凭证的适用场景和发起请求的操作步骤。

使用场景

主要用于授权第三方临时访问 veImageX,通常是在移动 APP 或 PC 客户端上传文件至 veImageX 的场景,为了保障您的信息安全,使上传资源免受到污染。建议不要将火山引擎主账号和 IAM 用户访问密钥保存在客户端代码中,您可以由服务端签出临时凭证,并下发至客户端,为您的第三方应用或 IAM 子账号签发临时访问凭证。该方式的优势如下所示:

  • 安全性高:严格限制时效、限制访问对象和使用次数。
  • 使用简单:通过 AK/SK 按标准方法签出即可。
  • 配置灵活:可以对使用参数灵活的签名和验签。

使用流程

Image

操作步骤

步骤一:创建 IAM 子用户并授予 STSAssumeRoleAccess 权限

  1. 使用主账户登录 veImageX 控制台,单击右上角个人中心,单击访问控制
  2. 访问控制 > 用户页面,单击新建用户按钮,每个新建的用户即为一个子账号。
    Image
  3. 在创建用户页面,您可以根据实际情况选择新建用户方式。以下以通过用户名创建为例。
    1. 基本信息设置:

      配置项

      说明

      用户名

      您可自定义用户名,以 veImageXSTS 为例。

      编程访问

      勾选开启

      Image

    2. 权限设置:搜索 STSAssumeRoleAccess 权限策略并勾选添加,然后单击下一步
      Image

    3. 审阅:检查信息是否正确后,单击提交按钮,完成用户创建配置。

  4. 页面将自动跳转至当前创建的用户信息页面,查看并记录 IAM 用户访问 Access Key ID 和 Secret Access Key。
    Image

步骤二:创建 IAM 角色并授予 veImageX 权限

创建一个角色,并授予其必需的权限,子账号通过服务端角色扮演接口获取到角色所属账号的临时安全令牌,从而以角色所属账号的身份来访问资源。

  1. 使用主账户登录访问控制控制台,进入角色管理页面。
  2. 单击新建角色按钮,参考以下内容完成配置。
    Image
    1. 选择信任身份:

      配置项

      说明

      选择信任身份类型

      选择账号

      选择身份

      选择当前账号

      Image

    2. 配置角色信息:自定义角色名,此处以 veImageXSTS 为例。
      Image

    3. 添加权限:搜索并添加 ImageXDefaultAccess 策略,作用范围选择全局
      Image

  3. 单击提交按钮,保存当前配置。
  4. 在角色管理页面,单击上一步创建的角色名。
    Image
  5. 在角色详情页面,切换到信任关系标签页,然后单击编辑信任策略。
    将代码中的 root替换为user/{IAMUserName},其中IAMUserName为步骤一中创建的用户名(本文以 veImageXSTS 为例)。该策略表示此 IAM 角色可以被火山引擎账号(AccountID = 2100*****)下的 IAM 用户 veImageXSTS 扮演。
    Image
  6. 修改完成后,单击保存

步骤三:通过 AssumeRole 获取临时访问凭证

请以创建的 IAM 子用户调用 AssumeRole 生成临时访问凭证(包含 AccessKeyIdSecretAccessKeySessionToken),从而以角色所属账号的身份来访问云资源。
您也可以通过 AssumeRole SDK 获取临时访问凭证,如 Python SDKJava SDK

  • 请求示例

    GET /?RoleTrn=trn:iam::2100******:role/veImageXSTS&RoleSessionName=imagex_session&Action=AssumeRole&Version=2018-01-01 HTTP/1.1
    Accept: application/json
    Content-Type: application/x-www-form-urlencoded
    Host: open.volcengineapi.com
    X-Date: 发请求时指定
    
    Authorization: 待签算(此处用IAM用户veImageXSTS的密钥)
    
  • 返回示例

    {
        "ResponseMetadata": {
            "RequestId": "20210412725429273501625**",
            "Action": "AssumeRole",
            "Version": "2018-01-01",
            "Service": "sts"
        },
        "Result": {
            "Credentials": {
                "CurrentTime": "2023-04-03T11:30:00+08:00",
                "ExpiredTime": "2023-04-03T12:30:00+08:00",
                "AccessKeyId": "AKTP8shJDSYGbi8*****",
                "SecretAccessKey": "TVRUSGNCLhdsgTSDCXPJDJSAJNNNCbE1E****",
                "SessionToken": "STSeyJBY2NvdW50SWklkZW50aXR5VHlwZSI6NCwiSWRlbnRpdHlJZCI6MzAyMTcsIkNoYW5uZWwiOiJyZXNvdXJjZSIsIkFjY2Vzc0tleUlkIjoiQUtUUE9EZzBNelZrWlRNMVlqQXlOR05sWkdGbU0yVTNaVEl6T0RnMlpEY3hNRGciLCJTaWduZWRTZWNyZXRBY2Nlc3NLZXkiOiJHSHRuc2Q1b3BOOThUeUNrckVuMVAxTDd1ZzBXczZFMytzTktDMDJQT01lNzFMOUloNzhYaDB5VXE4Ni9JMW8reEZxTmtkK01tVUR0cjRHR0NodXJQdz09IiwiRXhwaXJlZFRpbWUiOjE2MTgxOTk4MjksIlBvbGljeVN0cmluZyI6IiIsIlNpZ25hdHVyZSI6IjdiZTEzNTU1MDM5NzcyM2VkMDQxYmVkNTIyNzU4YmMyNjQ3YzRmNzZiNmRjYTViNzVhZDUyOTMwYTg1NjE5ZGEiLCJTZXNzaW9uTmFtZSI6ImNlc2hpYXNzdW1****"
            },
            "AssumedRoleUser": {
                "Trn": "trn:sts::2100******:assumed-role/veImageXSTS/imagex_session",
                "AssumedRoleId": "**:imagex_session"
            }
        }
    }
    

步骤四:使用临时访问凭证上传文件至 veImageX

在完成相关服务配置后,您可通过服务端 SDK 或上传 SDK 向 veImageX 上传任意合法资源。以下为 GO 的 Demo 示例:

说明

  • 临时安全令牌默认有效期为 1 小时,到期后请及时更新临时安全令牌。
  • 您可以通过 AssumeRole 的 DurationSeconds 参数设置临时安全令牌的有效期。DurationSeconds 参数单位为秒,最大可设置 12 小时。
package main

import (
        "fmt"
        "os"

        "github.com/volcengine/volc-sdk-golang/base"
        "github.com/volcengine/volc-sdk-golang/service/imagex"
)

// 上传文件
func main() {
        // 默认 ImageX 实例为 `cn-north-1`,如果您想使用其他区域的实例,请使用 `imagex.NewInstanceWithRegion(区域名)` 显式指定区域
        instance := imagex.DefaultInstance

        instance.SetCredential(base.Credentials{
         //使用 Step 3 获取的临时访问凭证
                AccessKeyID:     "AKTP8shJDSYGbi8*****", 
                SecretAccessKey: "TVRUSGNCLhdsgTSDCXPJDJSAJNNNCbE1E****",
                SessionToken:    "STSeyJBY2NvdW50SWklkZW50aXR5VHlwZSI6NCwiSWRlbnRpdHlJZCI6MzAyMTcsIkNoYW5uZWwiOiJyZXNvdXJjZSIsIkFjY2Vzc0tleUlkIjoiQUtUUE9EZzBNelZrWlRNMVlqQXlOR05sWkdGbU0yVTNaVEl6T0RnMlpEY3hNRGciLCJTaWduZWRTZWNyZXRBY2Nlc3NLZXkiOiJHSHRuc2Q1b3BOOThUeUNrckVuMVAxTDd1ZzBXczZFMytzTktDMDJQT01lNzFMOUloNzhYaDB5VXE4Ni9JMW8reEZxTmtkK01tVUR0cjRHR0NodXJQdz09IiwiRXhwaXJlZFRpbWUiOjE2MTgxOTk4MjksIlBvbGljeVN0cmluZyI6IiIsIlNpZ25hdHVyZSI6IjdiZTEzNTU1MDM5NzcyM2VkMDQxYmVkNTIyNzU4YmMyNjQ3YzRmNzZiNmRjYTViNzVhZDUyOTMwYTg1NjE5ZGEiLCJTZXNzaW9uTmFtZSI6ImNlc2hpYXNzdW1****", 
        })

        params := &imagex.ApplyUploadImageParam{
                ServiceId: "service id", // 服务 ID
                // StoreKeys: []string{"example.jpg"}, // 指定文件存储名
        }

        // 读取文件
        dat, err := os.ReadFile("image file")
        if err != nil {
                fmt.Printf("read file from %s error %v", "", err)
                os.Exit(-1)
        }

        // 上传文件
        resp, err := instance.UploadImages(params, [][]byte{dat})

        if err != nil {
                fmt.Printf("error %v", err)
        } else {
                fmt.Printf("success %v", resp)
        }
}

其他语言 SDK 的说明文档如下: