介绍适用于 Python 的 Smit

作者: 乔丹·菲利普斯 | 202

亚马逊云科技 很高兴地宣布推出 Smithy 一代 Pythy 客户端 的预览版。该工具将使开发人员能够使用带有类型提示的 Python 生成客户端,其模型驱动方式与 亚马逊云科技 十多年来用于开发其服务的方式相同。为网络服务编写和维护手写客户端既耗时又容易出错,这些问题都可以通过生成具有明确规范的客户端来解决。我们已将 Smithy for Python 开源,以允许任何开发人员自信快速地生成自己的客户端。

什么是史密斯?

Smithy 是一个开源工具链,我们已经对其进行了标准化,用于构建新的 亚马逊云科技 开发工具包、对新的 亚马逊云科技 服务和功能进行建模以及生成客户端。Smithy 包含一种与协议无关的接口定义语言 (IDL),用于生成客户端、服务器、文档和其他工件。要了解更多信息,请访问s mithy.io ,并观看史密斯 首席工程师迈克尔·道林 的 介绍性演讲

包括什么?

代码生成的 Python 客户端将具有以下功能:

  • 代码生成和类型提示-客户端、操作及其包含的所有数据的代码将生成到 python 类中。除了类型提示外,这将允许客户使用诸如mypy或其他类型分析工具之类的工具轻松地整理和调试他们的代码。
  • 拦截器 — 拦截器是新的可扩展性功能,它取代了 botocore 事件系统。 它们旨在更加可靠,并在 Smithy 支持的所有语言中保持一致。
  • 首先是异步——异步在 Python 生态系统 中 变得越来越重要 ,而且由于客户将大部分时间都花在 IO 上,因此它们是它的完美用例。因此,所有操作都将作为异步函数生成。
  • 可配置组件-客户端的所有核心组件都将完全可配置。例如,如果你想使用龙卷风作为底层的 http 库,你可以很容易地做到这一点。

目前,协议支持仅限于 restJson1 协议,该协议使用 带有 JSON 正文的 http 绑定 。它被广泛用于亚马逊的服务中,例如API网关和Lambda。为了进行身份验证,目前支持 HttpaPiKey 身份验证。

入门

生成客户有三个先决条件。第一个先决条件是 Python,它的最低要求版本为 3.11。第二个先决条件是 Java 17,它只是构建生成器所必需的。将来,当生成器发布到软件包存储库时,将不需要这样做。也不需要运行生成的 Python 客户端。你需要的最后一个先决条件是 Smithy CLI

要构建生成器,请克隆 s mithy-python GitHub 存储库 并运行 make install- java 组件。 这将生成生成器并使其在您的本地计算机上可用。

现在你已经建造了生成器,你需要一个 Smithy 模型。在此示例中,您将为服务使用一个小型模型,该模型接受 JSON 正文中的字符串消息并未修改地返回该消息。 将以下模型内容保存到名为 main.smithy 的文件 中,该文件位于名为 m odel 的目录中。

$version: "2.0"

namespace com.example

use aws.protocols#restJson1

@restJson1
service EchoService {
    operations: [Echo]
}

@http(
    method: "POST"
    uri: "/echo"
)
operation EchoMessage {
    input := {
        message: String
    }
    output := {
        message: String
    }
}

现在你需要创建一个名为 s mithy- build.json 的配置文件。此配置文件允许您指定依赖关系、配置插件和创建投影,这些是满足特定目的的模型的不同视图。sm ithy-b uild 文档中提供了有关如何使用此配置文件和预测的更多信息。 以下 s mithy-build.json 文件添加了一些必要的依赖关系,并创建了用于构建 python 客户端的投影。在与模型文件夹相同的目录中创建您的 sm ithy-build.json 文件,其中包含以下内容:

{
    "version": "1.0",
    "sources": ["model"],
    "maven": {
        "dependencies": [
            "software.amazon.smithy:smithy-model:1.34.0",
            "software.amazon.smithy:smithy-aws-traits:1.34.0",
            "software.amazon.smithy.python:smithy-python-codegen:0.1.0"
        ]
    },
    "projections": {
        "python-client": {
            "plugins": {
                "python-client-codegen": {
                    "service": "com.example#EchoService",
                    "module": "echo",
                    "moduleVersion": "0.1.0"
                }
            }
        }
    }
}

你的文件结构现在应该是这样的:

.
├── model
│   └── main.smithy
└── smithy-build.json

生成客户端剩下的唯一步骤就是运行 s mithy build 。现在,您的新客户端将作为可安装包在 build/python-client/python-client-codegen 中提供。要使用它,你需要通过 从 smithy-python 存储库的根目录运行 m ake install-python 组件来安装 一些 Python 依赖项。以下片段显示了如何使用新客户端:

import asyncio

from echo.client import EchoService
from echo.config import Config
from echo.models import EchoMessageInput


async def main() -> None:
    client = EchoService(Config(endpoint_uri="https://example.com/"))
    response = await client.echo(EchoMessageInput(message="spam"))
    print(response.message)


if __name__ == "__main__":
    asyncio.run(main())

Smithy for Python 的下一步是什么?

我们将为代码生成器提供新功能,以便更轻松地生成自定义客户端。我们还将提供对更多协议和功能的支持,以生成更多类型的服务。

反馈

我们鼓励你试用 Smithy for Python 来构建自己的客户端。如果你有任何问题、意见、疑虑或想法,请在 s mithy-python GitH ub 存储库上打开问题或错误报告。 如果您发现潜在的安全问题,我们要求您改为通过我们的 漏洞报告页面 通知 亚马逊云科技/Amazon Security。我们感谢收到的任何反馈,并将用它来改进下一版本的客户。

作者简介:

Jordon Phillips

乔登·菲利普斯·

乔登是亚马逊云科技史密斯团队的高级软件开发工程师。他喜欢开发旨在改善开发者体验的项目和工具。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。