Our Projects
AWS 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 应用的必要工具。
在此演示中,我使用 AWS 命令行界面 (AWS CLI) 和 AWS 管理控制台 创建两个仓库。我配置第一个仓库,以从官方 cratesio 仓库下载公共包。第二个仓库配置为仅从第一个仓库下载包。这样的双仓库配置是管理仓库和外部连接的推荐方式,详情请参见 CodeArtifact 文档中的管理外部连接。引用文档:
“建议每个域有一个仓库,并与给定公共仓库建立外部连接。要将其他仓库连接到公共仓库,请将带有外部连接的仓库作为上游添加到它们中。”
我绘制了这个图表来说明设置。
域和仓库可以通过命令行或控制台创建。我选择通过命令行。在终端 shell 中,我输入以下命令:
bashCODEARTIFACTDOMAIN=stormacqtest
aws codeartifact createrepository domain CODEARTIFACTDOMAIN repository cratesiostore
aws codeartifact associateexternalconnection domain CODEARTIFACTDOMAIN repository cratesiostore externalconnection publiccratesio
aws codeartifact createrepository domain CODEARTIFACTDOMAIN repository cargorepo upstreams {repositoryNamecratesiostore}
接下来,作为开发者,我希望我的本地机器从我刚刚创建的内部仓库 (cargorepo) 中获取 crates。
我配置 cargo 从内部仓库而不是公共的 cratesio 获取库。为此,我创建一个 configtoml 文件以指向 CodeArtifact 的内部仓库。
bash
REPOENDPOINT=(aws codeartifact getrepositoryendpoint domain CODEARTIFACTDOMAIN repository cargorepo format cargo output text)
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 索引
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

最后,我使用控制台验证 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。