Amazon Web Services ブログ

AWS CodeArtifact が Cargo での Rust パッケージのサポートを追加

6月20日より、Rust 開発者は、AWS CodeArtifact 上にライブラリ (Rust の クレート) を保存してアクセスできるようになりました。

開発を加速するために、今日のソフトウェア開発は事前に記述されたコードパッケージに大きく依存しています。1 つのアプリケーションにつき数百にも上ることがあるこれらのパッケージは、一般的なプログラミングタスクに使用でき、社内で作成するか、外部ソースから入手することができます。これらのパッケージは開発をスピードアップするのに大いに役立ちますが、その使用は組織にとって法的な懸念とセキュリティ上の懸念という2つの主な課題をもたらします。

法的な面では、組織はこれらのサードパーティ製パッケージと互換性のあるライセンスを保有していること、および知的財産権を侵害していないことを確認する必要があります。もう 1 つのリスクであるセキュリティの面では、パッケージの脆弱性が悪用されてアプリケーションが侵害される可能性があります。既知の戦術であるサプライチェーン攻撃では、一般的なオープンソースプロジェクトに脆弱性が注入されます。

このような課題に対処するために、組織はプライベートパッケージリポジトリを設定できます。これらのリポジトリには、セキュリティチームと法務チームによって精査された事前承認済みパッケージが保存されるため、法的またはセキュリティ上のリスクが軽減されます。ここで CodeArtifact を活用します。

AWS CodeArtifact は、アプリケーション開発で使用されるソフトウェアパッケージを安全に保存、公開、共有するために設計された完全マネージド型のアーティファクトリポジトリサービスです。npmPyPIMavenNuGetSwiftPMRubygem などの一般的なパッケージマネージャーと形式がサポートされるので、既存の開発ワークフローに簡単に統合できます。アクセスを制御することでセキュリティを強化し、チーム間のコラボレーションを促進することができます。CodeArtifact では、AWS Identity and Access Management (IAM) および継続的インテグレーションと継続的デプロイ (CI/CD) ツールとの統合によって一貫した安全で効率的なソフトウェア開発ライフサイクルを維持できます。

Rust は、Stack Overflow の開発者向け年次アンケートにおいて、「最も望まれるプログラミング言語」としてチャートのトップにランクインし、80% の開発者が翌年もこの言語を再び使用したいと回答しています。Rust の人気の高まりは、C++ などのシステム言語のパフォーマンスおよびメモリの安全性と信頼性の高い同時実行コードの記述を容易にする機能を組み合わせることができることに起因します。さらに、豊富なエコシステムとコミュニティコラボレーションに重点を置く Rust は、高性能システムやアプリケーションを開発する開発者にとって魅力的な選択肢です。

Rust の開発者は、公式のパッケージマネージャーである Cargo を利用してパッケージの依存関係を管理しています。Cargo を使用すると、事前に記述されたクレート (ライブラリ) の検索、ダウンロード、プロジェクトへの統合のプロセスが簡単になります。手動での依存関係管理が不要になり、時間を節約できるだけでなく、互換性とセキュリティも保証されます。Cargo の堅牢な依存関係解決システムは、異なるクレートバージョン間の潜在的な競合に対処します。また、多くのクレートは厳選されたレジストリからのものであるため、開発者にとって、コードの品質と安全性に関する懸念が大きく削減されます。このような効率性と信頼性へのフォーカスにより、Cargo は Rust アプリケーションを構築するための不可欠なツールとなっています。

クレート用の CodeArtifact リポジトリを作成する
このデモでは、AWS コマンドラインインターフェイス (AWS CLI)AWS マネジメントコンソールを使用して 2 つのリポジトリを作成します。最初のリポジトリは、公式の crates.io リポジトリからパブリックパッケージをダウンロードするように設定します。2 番目のリポジトリは、最初のリポジトリからのみパッケージをダウンロードするように設定します。このデュアルリポジトリ構成は、リポジトリと外部接続を管理するための推奨方法です。外部接続の管理に関する CodeArtifact のドキュメントを参照してください。ドキュメントからの引用を紹介します。

「特定のパブリックリポジトリへの外部接続については、ドメインごとに 1 つのリポジトリを用意することをお勧めします。他のリポジトリをパブリックリポジトリに接続するには、外部接続のリポジトリをアップストリームとして追加します」。

次の図は、このセットアップを示しています。

Cargo のアーティファクトリポジトリ

ドメインとリポジトリは、コマンドラインまたはコンソールから作成できます。ここでは、コマンドラインを選択します。シェルターミナルで次のように入力します。

CODEARTIFACT_DOMAIN=stormacq-test

# 内部向けのリポジトリ crates-io-store を作成します
aws codeartifact create-repository \
   --domain $CODEARTIFACT_DOMAIN   \
   --repository crates-io-store

# 内部向けリポジトリ crates-io-store をパブリックの crates-io に関連付けます
aws codeartifact associate-external-connection \
--domain $CODEARTIFACT_DOMAIN \
--repository crates-io-store  \
--external-connection public:crates-io

# 2 番目の内部向けリポジトリ cargo-repo を作成します 
# 先に作成したアップストリームの crates-io-store に接続します
aws codeartifact create-repository \
   --domain $CODEARTIFACT_DOMAIN   \
   --repository cargo-repo         \
   --upstreams '{"repositoryName":"crates-io-store"}'	 

次に、作成した内部リポジトリ (cargo-repo) からローカルマシンでクレートを取得します。

パブリックの crates.io ではなく、内部リポジトリからライブラリを取得するように cargo を設定します。そのためには、config.toml ファイルを作成して CodeArtifact の内部リポジトリをポイントします。

# 最初にリポジトリの URI を取得します
REPO_ENDPOINT=$(aws codeartifact get-repository-endpoint \
                           --domain $CODEARTIFACT_DOMAIN \ 
                           --repository cargo-repo       \
                           --format cargo                \
                           --output text)

# この段階では、REPO_ENDPOINT は https://stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com/cargo/cargo-repo/ です

# 次に、Cargo 設定ファイルを作成します
cat << EOF > ~/.cargo/config.toml
[registries.cargo-repo]
index = "sparse+$REPO_ENDPOINT"
credential-provider = "cargo:token-from-stdout aws codeartifact get-authorization-token --domain $CODEARTIFACT_DOMAIN --query authorizationToken --output text"

[registry]
default = "cargo-repo"

[source.crates-io]
replace-with = "cargo-repo"
EOF

設定ファイルを作成すると、2 つの環境変数が置き換えられることに注意してください。cargo の設定では環境変数がサポートされません。

これ以降、このマシンで cargo を呼び出してクレートを追加するたびに、cargo は内部 cargo-repo リポジトリと通信するための承認トークンを CodeArtifact から取得します。使用したコマンドでのパッケージの読み取り / 公開のアクセス許可に加えて、get-authorization-token CodeArtifact API を呼び出す IAM 権限が必要です。このセットアップを継続的インテグレーション (CI) パイプラインのビルドマシンから実行する場合、そのための適切な権限がビルドマシンに必要です。

このセットアップをテストして、ローカルプロジェクトにクレートを追加できるようになりました。

$ cargo add regex
    Updating `codeartifact` index
      Adding regex v1.10.4 to dependencies
             Features:
             + perf
             + perf-backtrack
             + perf-cache
             + perf-dfa
             + perf-inline
             + perf-literal
             + perf-onepass
             + std
             + unicode
             + unicode-age
             + unicode-bool
             + unicode-case
             + unicode-gencat
             + unicode-perl
             + unicode-script
             + unicode-segment
             - logging
             - pattern
             - perf-dfa-full
             - unstable
             - use_std
    Updating `cargo-repo` index

# プロジェクトをビルドして、クレートのダウンロードをトリガーします。
$ cargo build
  Downloaded memchr v2.7.2 (registry `cargo-repo`)
  Downloaded regex-syntax v0.8.3 (registry `cargo-repo`)
  Downloaded regex v1.10.4 (registry `cargo-repo`)
  Downloaded aho-corasick v1.1.3 (registry `cargo-repo`)
  Downloaded regex-automata v0.4.6 (registry `cargo-repo`)
  Downloaded 5 crates (1.5 MB) in 1.99s
   Compiling memchr v2.7.2 (registry `cargo-repo`)
   Compiling regex-syntax v0.8.3 (registry `cargo-repo`)
   Compiling aho-corasick v1.1.3 (registry `cargo-repo`)
   Compiling regex-automata v0.4.6 (registry `cargo-repo`)
   Compiling regex v1.10.4 (registry `cargo-repo`)
   Compiling hello_world v0.1.0 (/home/ec2-user/hello_world)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 16.60s

CodeArtifact がアップストリームのパブリックリポジトリからクレートとその依存関係をダウンロードしたことを確認します。CodeArtifact コンソールに接続し、作成したいずれかのリポジトリで利用可能なパッケージのリストを確認します。この段階では、2 つのリポジトリのパッケージリストは同じであるはずです。

CodeArtifact の Cargo パッケージリスト

プライベートパッケージをリポジトリに公開する
アップストリームリンクが意図した通りに機能することが確認できたので、プライベートパッケージを cargo-repo リポジトリに公開して、組織内の他のチームが利用できるようにします。

通常通り、標準の Rust ツール cargo を使用します。その前に、プロジェクトファイルを git リポジトリに追加してコミットします。

$  git add . && git commit -m "initial commit"
 5 files changed, 1855 insertions(+)
create mode 100644 .gitignore
create mode 100644 Cargo.lock
create mode 100644 Cargo.toml
create mode 100644 commands.sh
create mode 100644 src/main.rs

$  cargo publish 
    Updating `codeartifact` index
   Packaging hello_world v0.1.0 (/home/ec2-user/hello_world)
    Updating crates.io index
    Updating `codeartifact` index
   Verifying hello_world v0.1.0 (/home/ec2-user/hello_world)
   Compiling libc v0.2.155
... (redacted for brevity) ....
   Compiling hello_world v0.1.0 (/home/ec2-user/hello_world/target/package/hello_world-0.1.0)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 03s
    Packaged 5 files, 44.1KiB (11.5KiB compressed)
   Uploading hello_world v0.1.0 (/home/ec2-user/hello_world)
    Uploaded hello_world v0.1.0 to registry `cargo-repo`
note: waiting for `hello_world v0.1.0` to be available at registry `cargo-repo`.
You may press ctrl-c to skip waiting; the crate should be available shortly.
   Published hello_world v0.1.0 at registry `cargo-repo`

最後に、コンソールを使用して hello_world クレートが cargo-repo で使用できるようになったことを確認します。

CodeArtifact の Cargo パッケージ hello_world

料金と利用可能なリージョン
現在、Rust ライブラリは、CodeArtifact を利用できる 13 の AWS リージョンに保存できます。Rust パッケージの追加料金は発生しません。課金対象となるのは、ストレージ (月あたりの GB で測定)、リクエスト数、インターネットまたは他の AWS リージョンに転送されるデータの 3 つです。同じリージョンの AWS サービスへのデータ転送に対しては料金が発生しないので、Amazon Elastic Compute Cloud (Amazon EC2) や AWS CodeBuild などで継続的インテグレーションと継続的デリバリー (CI/CD) のジョブを実行しても CodeArtifact のデータ転送の料金は発生しません。いつものように、詳細については料金ページをご確認ください。

Rust アプリケーションを構築してプライベートクレートを CodeArtifact にアップロードしてみてください。

— seb

原文はこちらです。