项目展示

Our Projects

AWS CodeArtifact 为 Rust 软件包提供了对 Cargo 的支持 新闻博客

项目展示

AWS CodeArtifact 为 Rust 软件包提供了对 Cargo 的支持 新闻博客

2026-01-27 11:45:19 23

AWS CodeArtifact 支持 Rust 包的使用和管理

重点摘要

Rust 开发者现在可以在 AWS CodeArtifact 中存储和访问其库称为 crates。CodeArtifact 提供了一个安全的、可管理的包仓库,帮助开发者更好地管理软件包及其依赖关系。在法律和安全方面,组织可以通过设立私有包仓库来降低风险。Rust 和其官方包管理工具 Cargo 的组合,使得在项目中使用预编写的库变得简单高效。

从今天开始,Rust 开发者可以将他们的库在 Rust 生态系统中称为 crates存储在 AWS CodeArtifact 中。

现代软件开发高度依赖预先编写的代码包,以加快开发进程。对于单个应用,这些包的数量可能达到数百个,旨在处理常见的编程任务,这些包可以是内部创建的或外部获取的。然而,虽然这些包能显著加速开发过程,但它们的使用也为组织带来了两个主要挑战:法律和安全问题。

在法律方面,组织需要确保其拥有这些第三方包的兼容许可证,并且不侵犯知识产权。安全也是一个风险,因为这些包中的漏洞可能被利用以危害应用程序。供应链攻击是一种已知的策略,通过向流行的开源项目注入漏洞来实施。

为了应对这些挑战,组织可以设置私有包仓库。这些仓库存储经过安全和法律团队审查的预批准包,从而限制法律或安全风险。这就是 CodeArtifact 的用武之地。

AWS CodeArtifact 是一个完全托管的制品仓库服务,旨在安全地存储、发布和共享用于应用程序开发的软件包。它支持流行的包管理工具和格式,如 npm、PyPI、Maven、NuGet、SwiftPM 和 Rubygem,使其与现有开发工作流的集成变得简单。通过与 AWS 身份与访问管理 (IAM) 和持续集成/持续交付 (CI/CD) 工具的集成,CodeArtifact 提升了安全性,促进了团队之间的协作,帮助维护一致、安全和高效的软件开发生命周期。

连续八年,在 Stack Overflow 的年度开发者调查 中,Rust 被评为“最受欢迎的编程语言”,超过 80 的开发者表示希望明年继续使用该语言。Rust 受欢迎的原因在于它将 C 等系统语言的性能和内存安全与更易于编写可靠和并发代码的特性结合在一起。再加上丰富的生态系统和对社区合作的强烈关注,Rust 成为开发高性能系统和应用的开发者的一个有吸引力的选择。

Rust 开发者依赖于 Cargo,官方的包管理工具来管理包的依赖关系。Cargo 简化了查找、下载和集成预编写 crates库的过程。这不仅节省了手动管理依赖的时间,还确保了兼容性和安全性。Cargo 强大的依赖解析系统解决了不同 crate 版本之间的潜在冲突,并且由于许多 crates 来自一个经过筛选的注册处,开发者对代码的质量和安全性可以更有信心。这种对效率和可靠性的关注使得 Cargo 成为构建 Rust 应用的必要工具。

创建 CodeArtifact 仓库用于我的 crates

在此演示中,我使用 AWS 命令行界面 (AWS CLI) 和 AWS 管理控制台 创建两个仓库。我配置第一个仓库,以从官方 cratesio 仓库下载公共包。第二个仓库配置为仅从第一个仓库下载包。这样的双仓库配置是管理仓库和外部连接的推荐方式,详情请参见 CodeArtifact 文档中的管理外部连接。引用文档:

“建议每个域有一个仓库,并与给定公共仓库建立外部连接。要将其他仓库连接到公共仓库,请将带有外部连接的仓库作为上游添加到它们中。”

我绘制了这个图表来说明设置。

域和仓库可以通过命令行或控制台创建。我选择通过命令行。在终端 shell 中,我输入以下命令:

bashCODEARTIFACTDOMAIN=stormacqtest

创建一个内部仓库:cratesiostore

aws codeartifact createrepository domain CODEARTIFACTDOMAIN repository cratesiostore

将内部仓库 cratesiostore 与公共 cratesio 关联

aws codeartifact associateexternalconnection domain CODEARTIFACTDOMAIN repository cratesiostore externalconnection publiccratesio

创建第二个内部仓库:cargorepo

并将其连接到刚才创建的上游仓库 cratesiostore

aws codeartifact createrepository domain CODEARTIFACTDOMAIN repository cargorepo upstreams {repositoryNamecratesiostore}

接下来,作为开发者,我希望我的本地机器从我刚刚创建的内部仓库 (cargorepo) 中获取 crates。

我配置 cargo 从内部仓库而不是公共的 cratesio 获取库。为此,我创建一个 configtoml 文件以指向 CodeArtifact 的内部仓库。

bash

首先,我获取仓库的 URI

REPOENDPOINT=(aws codeartifact getrepositoryendpoint domain CODEARTIFACTDOMAIN repository cargorepo format cargo output text)

在这时,REPOENDPOINT 是 https//stormacqtest012345678912dcodeartifactuswest2amazonawscom/cargo/cargorepo/

接下来,我创建 Cargo 配置文件

cat ltlt EOF gt /cargo/configtoml[registriescargorepo]index = sparseREPOENDPOINTcredentialprovider = cargotokenfromstdout aws codeartifact getauthorizationtoken domain CODEARTIFACTDOMAIN query authorizationToken output text

[registry]default = cargorepo

[sourcecratesio]replacewith = cargorepoEOF

请注意,在创建配置文件时,两个环境变量被替换。cargo 不支持配置中的环境变量。

从现在开始,在这台机器上,每当我调用 cargo 添加一个 crate 时,cargo 都会从 CodeArtifact 获取一个授权令牌以与内部 cargorepo 仓库进行通信。根据我使用的命令,我必须拥有 IAM 权限 以调用 getauthorizationtoken CodeArtifact API,此外还需要读取/发布软件包的权限。如果您在构建机器上运行此设置以进行持续集成CI流程,则构建机器必须拥有相应的权限。

我现在可以测试这个设置并将一个 crate 添加到我的本地项目中。

网站加速器免费

bash cargo add regex 更新 codeartifact 索引 正在将 regex v1104 添加到依赖项中 特性: perf perfbacktrack perfcache perfdfa perfinline perfliteral perfonepass std unicode unicodeage unicodebool unicodecase unicodegencat unicodeperl unicodescript unicodesegment logging pattern perfdfafull unstable usestd 正在更新 cargorepo 索引

构建项目以触发 crate 下载

bash cargo build 从 cargorepo 下载 memchr v272 从 cargorepo 下载 regexsyntax v083 从 cargorepo 下载 regex v1104 从 cargorepo 下载 ahocorasick v113 从 cargorepo 下载 regexautomata v046 在 199 秒内下载了 5 个 crates15 MB 正在编译 memchr v272来自 cargorepo 正在编译 regexsyntax v083来自 cargorepo 正在编译 ahocorasick v113来自 cargorepo 正在编译 regexautomata v046来自 cargorepo 正在编译 regex v1104来自 cargorepo 正在编译 helloworld v010/home/ec2user/helloworld 完成开发配置 [未优化 调试信息] 目标用时 1660s

我可以验证 CodeArtifact 从上游公共仓库下载了 crate 及其依赖项。我连接到 CodeArtifact 控制台并检查我创建的两个仓库中可用的包列表。在此阶段,这两个仓库的包列表应是相同的。

将私有包发布到仓库

现在我知道上游链接按预期工作,我将向我的 cargorepo 仓库发布一个私包,以使其可以供我组织中的其他团队使用。

为此,我像往常一样使用标准的 Rust 工具 cargo。在这样做之前,我需要将项目文件添加并提交到 git 仓库。

bash git add ampamp git commit m initial commit 5 files changed 1855 insertions() create mode 100644 gitignore create mode 100644 Cargolock create mode 100644 Cargotoml create mode 100644 commandssh create mode 100644 src/mainrs

cargo publish 更新 codeartifact 索引 打包 helloworld v010/home/ec2user/helloworld 更新 cratesio 索引 更新 codeartifact 索引 验证 helloworld v010/home/ec2user/helloworld 编译 libc v02155 (省略以简化) 正在编译 helloworld v010/home/ec2user/helloworld/target/package/helloworld010 完成开发配置 [未优化 调试信息] 目标用时 1m 03s 打包了 5 个文件,441KiB115KiB 压缩 正在将 helloworld v010 上传到仓库 cargorepo 注意 等待 helloworld v010 在仓库 cargorepo 中可用。 您可以按 ctrlc 跳过等待;crate 应该很快就可用。 在仓库 cargorepo 中发布 helloworld v010

AWS CodeArtifact 为 Rust 软件包提供了对 Cargo 的支持 新闻博客

最后,我使用控制台验证 helloworld crate 现在在 cargorepo 中可用。

定价和可用性

您现在可以在 AWS CodeArtifact 可用的 13 个区域 中存储 Rust 库。对于 Rust 包,不会产生额外费用。收费维度包括存储以 GB 计算、请求数量以及传输到互联网或其他 AWS 区域的数据。传输到同一区域的 AWS 服务不收费,这意味着您可以在 Amazon Elastic Compute Cloud (Amazon EC2) 或 AWS CodeBuild 等服务上运行您的持续集成和交付 (CI/CD) 作业,而无需为 CodeArtifact 数据传输支付费用。如往常一样,详见 定价页面。

现在开始构建您的 Rust 应用程序并将您的私有 crates 上传到 CodeArtifact 吧!

seb

关于作者

Sbastien StormacqSeb 自上世纪八十年代中期首次接触 Commodore 64 开始编写代码。他激励构建者充分利用 AWS 云的价值,运用他的热情、热忱、客户倡导、好奇心和创造力。他的兴趣包括软件架构、开发工具和移动计算。如果您想向他销售某样东西,请确保它具有 API。请在 Twitter 上关注他 @sebsto。