
# 在FunctionGraph上通过委托获取临时凭证访问其他云服务
#### 方案概述
在华为云函数工作流FunctionGraph中，函数往往需要访问华为云其他服务（如对象存储服务OBS、云数据库RDS、云日志LTS等）来完成业务操作。这些云服务要求调用方提供合法的访问凭证，因此，如何在函数中安全地获取并使用凭证，是开发过程中需要解决的关键问题。
访问凭证按时效性可分为永久凭证和临时凭证两类。直接在函数代码中硬编码永久凭证（如固定 AK/SK），一旦泄露将带来严重的安全风险。相比之下，临时访问密钥有效期短、支持自动轮换，安全性更高，是推荐的做法。
借助 IAM 服务的委托功能，可以便捷地实现临时凭证的自动获取，具体步骤如下：
1. 创建云服务委托：通过IAM 创建FunctionGraph云服务委托，明确所需的访问权限范围。
2. 配置函数委托：将创建好的委托配置到需要跨服务访问的函数上。
3. 代码中获取凭证：函数运行时，直接通过context接口获取临时访问密钥，无需手动管理凭证，也无需调用额外的API。
 
#### 操作流程
在FunctionGraph上通过委托获取临时凭证访问其他云服务的操作流程如[图1]所示，步骤详情如[表1]所示。
图1操作流程   
![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002524727235.png)
 表1操作步骤说明 
| 步骤                                                                        | 步骤说明                                                          |
|:---|:---|
| [步骤一：创建FunctionGraph云服务委托] | 在统一身份认证服务IAM上创建函数工作流FunctionGraph云服务委托，并为该委托授权所需调用的服务权限和授权范围。 |
| [步骤二：为函数配置委托]              | 在函数工作流FunctionGraph控制台为函数配置委托，授予函数访问其他云服务的权限。                 |
| [步骤三：获取委托的临时凭证]             | 在函数代码中通过context接口获取临时访问密钥，即可通过委托获取临时凭证安全地访问其他云服务。             |
   
 #### 步骤一：创建FunctionGraph云服务委托
1. 登录[统一身份认证服务（IAM）控制台](https://console.huaweicloud.com/iam/)。
2. 在左侧导航窗格中，选择"委托"页签，单击右上方的"创建委托"。
   图2创建委托   
   ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002492752536.png "点击放大")
   
   
3. 配置委托参数，完成参数配置后如[图3]所示，单击"完成"，系统弹出"创建成功"提示，单击"立即授权"。
   图3填写基本信息   
   ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002524752259.png)
   
   表2委托配置参数 
   | 参数   | 取值                  | 说明                          |
   |:---|:---|:---|
   | 委托名称 | serverless-trust    | 自定义填写委托名称。                  |
   | 委托类型 | 云服务                 | 选择将账号内资源的操作权限委托给云服务。        |
   | 云服务  | 函数工作流 FunctionGraph | 选择需要授权的云服务。                 |
   | 持续时间 | 永久                  | 选择委托生效的持续时间，实际使用时请根据业务需求填写。 |
   | 描述   | -                   | 可选参数，填写委托的描述信息。             |
      
   
4. 进入"选择策略"页面，在右方搜索框中搜索需要添加的权限并勾选，单击"下一步"。 如果系统策略不满足授权要求，管理员可以通过"可视化视图"和"JSON视图"两种方式创建自定义策略，详情请参见[创建自定义策略](https://support.huaweicloud.com/usermanual-iam/iam_01_0605.html)。
   
5. 进入"设置最小授权范围"页面，建议根据最小授权原则勾选所需的授权范围。勾选完成后单击"确定"，进入"授权成功"界面，完成委托授权。
 
 #### 步骤二：为函数配置委托
如未创建函数，可在创建函数时为新函数配置委托；如已有目标函数，可在函数详情页中配置函数委托。
#### 创建函数时配置委托
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，单击右上角"创建函数"。
2. 在"创建函数"界面，"委托"选择[步骤一：创建FunctionGraph云服务委托]中已创建的"serverless-trust"函数委托，其他参数请按需设置，详情可参考[创建函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0150_0.html)。
3. 单击"创建函数"，进入函数详情页，完成新函数创建。
 
#### 为已有函数配置委托
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧导航栏选择"函数 \> 函数列表"。
2. 选择待配置委托的函数，单击函数名称进入函数详情页。
3. 选择"设置 \> 权限"，参考[表3]配置函数委托。配置完成后单击"保存"。
    表3配置函数委托参数说明 
   | 参数     | 说明                                                                                                                                       |
   |:---|:---|
   | 委托     | 在下拉框中选择已创建的"serverless-trust"函数委托。                                                                                                       |
   | 函数执行委托 | "函数执行委托"用于控制函数运行时访问其他云服务的权限，默认与上方"委托"保持一致。 如需为函数执行单独指定不同的委托，可勾选"为函数执行单独设置委托"进行配置。本例保持默认即可，无需勾选。 |
      
   
 
 #### 步骤三：获取委托的临时凭证
进入函数详情页后，可通过在线编辑或上传已有代码包的方式部署函数代码，在函数代码中可使用context接口中的方法获取临时访问密钥，**结合您的实际业务代码**即可通过委托获取临时凭证安全地访问其他云服务。
以下为各运行时获取临时访问密钥的代码片段示例：
表4不同运行时临时访问密钥获取 
| 运行时     | 获取说明                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|
| Node.js | 更多SDK接口说明请参见[Node.js SDK接口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0501.html#section3)。 示例： ``` const ak = context.getSecurityAccessKey() const sk = context.getSecuritySecretKey() const st = context.getSecurityToken() ```   |
| Python  | 更多SDK接口说明请参见[Python SDK接口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0502.html#section3)。 示例： ``` ak = context.getSecurityAccessKey() sk = context.getSecuritySecretKey() st = context.getSecurityToken() ```                         |
| Java    | 更多SDK接口说明请参见[Java SDK接口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0430.html#section2)。 示例： ``` String ak = context.getSecurityAccessKey(); String sk = context.getSecuritySecretKey(); String st = context.getSecurityToken(); ``` |
| C#      | 更多SDK接口说明请参见[C# SDK接口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0505.html#section2)。 示例： ``` string ak = context.SecurityAccessKey; string sk = context.SecuritySecretKey; string st = context.SecurityToken; ```                |
| Go      | 更多SDK接口说明请参见[Go SDK接口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0504.html#section1)。 示例： ``` ak := context.getSecurityAccessKey() sk := context.getSecuritySecretKey() st := context.getSecurityToken() ```                       |
| PHP     | 更多SDK接口说明请参见[PHP SDK接口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0506.html#section2)。 示例： ``` $ak = $context -> getSecurityAccessKey(); $sk = $context -> getSecuritySecretKey(); $st = $context -> getSecurityToken(); ```           |
   
