# 无服务器云函数间调用

## 概述

通常情况下，我们可能需要在一个无服务器云函数中依赖另一个或多个无服务器云函数。通过在无服务器云函数中集成并使用 Tencent Cloud SDK for Python，无服务器云函数间调用将非常易于实现。

在下文中我们将通过一个简单的应用场景向您进一步介绍并演示如何使用 Tencent Cloud SDK for Python 快速实现在无服务器云函数之间相互调用。

## 场景

### 设定

假定我们在数据中心 `ap-shanghai` 的命名空间 `default` 中拥有 2 个已创建就绪的无服务器云函数，其名称分别是 `hello` 和 `addend`。这些无服务器云函数的配置如下：

| 配置项  | 值                  |
| ---- | ------------------ |
| 运行环境 | Python 3.6         |
| 内存上限 | 64 MBytes          |
| 入口函数 | `index.main`       |
| 运行角色 | QCS\_SCFExcuteRole |

### 要求

在该场景中，我们要求在无服务器云函数 `hello` 中以友好且可供人类直接阅读的字符串返回一次加法运算的结果，其加法运算过程要求在无服务器云函数 `addend` 中实现。

## 指导

在下文中，我们将通过几个步骤向您演示编写符合当前场景要求的代码示例：

### 编写 `addend` 函数

首先，我们需要先编写无服务器云函数 `hello` 的依赖函数 `addend` 的函数源代码：

```python
def main(
    event: dict,
    context: dict
) -> int:
    try:
        return event['value1'] + event['value2']
    except KeyError as error:
        raise ValueError('event missing field: ' + str(error))
```

在无服务器云函数 `addend` 中，我们尝试获取当前函数调用事件中的字段 `value1` 和 `value2` 的值，并将字段 `value1` 和 `value2` 的值相加后返回，期望相加值类型为整形。

### 编写 `hello` 函数

接着，我们需要编写依赖无服务器云函数 `addend` 的主函数 `hello` 的函数源代码：

#### 导入模块

首先我们需要在无服务器云函数 `hello` 中导入 Tencent Cloud SDK for Python 相关命名空间和模块：

```python
from tencent.cloud.serverless import functions
```

#### 入口函数

接着我们需要为无服务器云函数 `hello` 编写入口函数。

在入口函数中我们将尝试使用 Tencent Cloud SDK for Python 所提供的无服务器云函数间调用功能调用无服务器云函数 `addend` 完成一次加法运算并获取结果：

```python
def main(
    event: dict,
    context: dict
) -> str:
    try:
        result: int = functions.invoke('addend', function_event = {
            'value1': 10,
            'value2': 20    
        })
        
        return 'addend result: ' + str(result)
    except functions.errors.InvokeError as error:
        return 'invoke addend function error: ' + str(error)
```

在无服务器云函数 `hello` 中，我们尝试使用 Tencent Cloud SDK for Python 函数间调用功能调用无服务器云函数 `addend` 计算数值 `10` 和 `20` 的相加结果并以人类易读的描述性字符串返回。

如果无服务器云函数 `addend` 运行出错，则返回错误原因的描述性字符串。

{% hint style="warning" %}
请注意，无服务器云函数间调用仅支持已配置 [运行角色](https://cloud.tencent.com/document/product/583/32389) 的无服务器云函数发起调用。
{% endhint %}

{% content-ref url="/pages/-M-j9M4sZsfoBrs320Ri" %}
[easy\_invoke 方法](/tencent-cloud-sdk/python-docs/serverless-functions/class-and-method/client/easy-invoke-method.md)
{% endcontent-ref %}

## 运行

现在我们尝试运行无服务器云函数 `hello`，如果一切正常其运行结果为：

```python
"addend result: 30"
```

## 探究

在上文的演示代码中我们导入 Tencent Cloud SDK for Python 的无服务器云函数产品软件包，使用 `functions.invoke` 函数完成无服务器云函数之间相互调用的工作。

您或许已经注意到，无服务器云函数间调用的方式不需要您维护一个访问凭据和无服务器云函数产品客户端实例，这是因为 Tencent Cloud SDK for Python 的无服务器云函数间调用机制已代您维护一个有效的临时访问凭据和产品客户端实例。

当您初次使用 `functions.invoke` 或 `functions.invoke_async` 函数时，Tencent Cloud SDK for Python 会尝试在内部实例化一个无服务器云函数产品客户端并搜寻采用非持久环境凭据。

当无服务器云函数已配置具有有效访问权限的 [运行角色](https://cloud.tencent.com/document/product/583/32389) 时，其函数在运行代码之前将自动申请并获得一个非持久性的临时访问凭据并将其存储在当前运行环境的环境变量中，这就是环境凭据的由来。

{% hint style="info" %}
如果当前无服务器云函数已配置 [运行角色](https://cloud.tencent.com/document/product/583/32389)，实例化通用或产品客户端时允许不提供访问凭据，此时 Tencent Cloud SDK for Python 将自动搜寻并采用环境凭据。
{% endhint %}

并且，函数 `functions.invoke` 或 `functions.invoke_async` 在内部将依赖无服务器云函数产品客户端的 `easy_invoke` 实例方法，其具有与依赖方法相同的行为和返回值。

{% hint style="warning" %}
请注意，使用无服务器云函数间调用方式调用的目标无服务器云函数必须与当前无服务器云函数所在数据中心相同，且命名空间为 default。

否则，您应该将参数 namespace\_name 和 region\_id 设置为有效值。
{% endhint %}

因此，无服务器云函数间调用机制并非真正地脱离无服务器云函数产品客户端，只是 Tencent Cloud SDK for Python 为开发者提供更佳便利的封装调用机制。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://smallso.gitbook.io/tencent-cloud-sdk/python-best-practices/serverless-functions/function-invoke.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
