Amazon Web Services ブログ

Ruby gem を AWS CodeArtifact に追加する

Ruby デベロッパーは、AWS CodeArtifact を使用して gem を安全に保存および取得できるようになりました。CodeArtifact は、gemバンドラーなどの標準のデベロッパーツールと統合されています。

アプリケーションでは、ネットワークアクセス、暗号化、データ操作などの一般的なタスクに再利用可能なコードを提供し、多数のパッケージを使用して開発を加速することがよくあります。また、デベロッパーはリモートサービスにアクセスするために、AWS SDK などの SDK を埋め込みます。これらのパッケージは組織内にある場合と、オープンソースプロジェクトなどのサードパーティから提供される場合があります。パッケージと依存関係の管理は、ソフトウェア開発において必要不可欠です。Java、C#、JavaScript、Swift、Python などの言語には依存関係をダウンロードして解決するためのツールがあり、Ruby デベロッパーは通常 gemバンドラーを使用します。

ただし、サードパーティのパッケージを使用すると、法的およびセキュリティ上の課題が生じます。組織は、パッケージライセンスが自社のプロジェクトに適合しており、知的財産を侵害していないことを確認する必要があります。また、含まれているコードが安全で、サプライチェーン攻撃と呼ばれる手法に対する脆弱性が存在しないことを確認する必要もあります。これらの課題に対処するために、組織は通常プライベートパッケージサーバーを使用します。デベロッパーは、セキュリティチームと法務チームによって精査され、かつ、プライベートリポジトリを通じて使用できるパッケージのみを使用できます。

CodeArtifact は、基盤となるインフラストラクチャを管理することなく、パッケージを社内のデベロッパーチームに安全に配布できるマネージドサービスです。CodeArtifact では npmPyPIMavenNuGetSwiftPM、汎用フォーマットに加えて、Ruby Gem のサポートを開始しました。

gemバンドラーなどの既存のツールと連携して、AWS クラウドの CodeArtifact リポジトリから Ruby gem の依存関係を公開およびダウンロードできます。パッケージを CodeArtifact に保存したら、Gemfile でそれらを参照できます。その後、ビルドシステムはビルドプロセス中に CodeArtifact リポジトリから承認されたパッケージをダウンロードします。

開始方法
組織内の他の開発チームと共有するパッケージを作成しているとします。

このデモでは、環境を準備し、パッケージをリポジトリにアップロードして、この特定のパッケージビルドをプロジェクトの依存関係として使用する方法を示します。Ruby パッケージ特有の手順に焦点を当てています。CodeArtifact の利用を開始するに際して、同僚の Steven が作成したチュートリアルが参考になります。

パッケージリポジトリ (MyGemsRepo) とドメイン (stormacq-test) が既に設定されている AWS アカウントを使用します。

CodeArtifact - Ruby リポジトリ

Ruby ツールが CodeArtifact リポジトリにアクセスできるようにするために、まず CodeArtifact から認証トークンを収集します。

export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
                                     --domain stormacq-test              \
                                     --domain-owner 012345678912         \
                                     --query authorizationToken          \
                                     --output text`

export GEM_HOST_API_KEY="Bearer $CODEARTIFACT_AUTH_TOKEN"

認証トークンは 12 時間後に期限切れになることに注意してください。12 時間が経過すると、新しいトークンを取得するためにこのコマンドを繰り返す必要があります。

その後、リポジトリエンドポイントをリクエストします。ドメイン名とドメイン所有者 (AWS アカウント ID) を渡します。--format ruby オプションに注目してください。

export RUBYGEMS_HOST=`aws codeartifact get-repository-endpoint  \
                           --domain stormacq-test               \
                           --domain-owner 012345678912          \
                           --format ruby                        \
                           --repository MyGemsRepo              \
                           --query repositoryEndpoint           \
                           --output text`

リポジトリエンドポイントと認証トークンを用意できたので、gem はこれらの環境変数値を使用してプライベートパッケージリポジトリに接続します。

非常にシンプルなプロジェクトを作成してビルドし、パッケージリポジトリに送信します。

CodeArtifact - カスタムパッケージのビルドとプッシュ

$ gem build hola.gemspec 

Successfully built RubyGem
  Name: hola-codeartifact
  Version: 0.0.0
  File: hola-codeartifact-0.0.0.gem
  
$ gem push hola-codeartifact-0.0.0.gem 
Pushing gem to https://stormacq-test-486652066693.d.codeartifact.us-west-2.amazonaws.com/ruby/MyGemsRepo...

パッケージが利用可能であることをコンソールで確認します。

CodeArtifact - Hola パッケージがある

パッケージが使用可能になったので、いつものようにプロジェクトで使用できます。そのためには、マシン上のローカルの ~/.gemrc ファイルを設定します。コンソールの指示に従い、必ず ${CODEARTIFACT_AUTH_TOKEN} を実際の値に置き換えます。

CodeArtifact - リポジトリに接続するためのコンソール指示

~/.gemrc が正しく設定されると、通常どおり gem をインストールできます。gem はプライベート gem リポジトリからダウンロードされます。

$ gem install hola-codeartifact

Fetching hola-codeartifact-0.0.0.gem
Successfully installed hola-codeartifact-0.0.0
Parsing documentation for hola-codeartifact-0.0.0
Installing ri documentation for hola-codeartifact-0.0.0
Done installing documentation for hola-codeartifact after 0 seconds
1 gem installed

アップストリームからインストールする
リポジトリをアップストリームのソースに関連付けることもできます。リクエストすると、アップストリームから自動的に gem が取得されます。

リポジトリを rubygems.org に関連付けるには、コンソールを使用するか、次のように入力します。

aws codeartifact  associate-external-connection \
                   --domain stormacq-test       \
                   --repository MyGemsRepo      \
                   --external-connection public:ruby-gems-org

{
    "repository": {
        "name": "MyGemsRepo",
        "administratorAccount": "012345678912",
        "domainName": "stormacq-test",
        "domainOwner": "012345678912",
        "arn": "arn:aws:codeartifact:us-west-2:012345678912:repository/stormacq-test/MyGemsRepo",
        "upstreams": [],
        "externalConnections": [
            {
                "externalConnectionName": "public:ruby-gems-org",
                "packageFormat": "ruby",
                "status": "AVAILABLE"
            }
        ],
        "createdTime": "2024-04-12T12:58:44.101000+02:00"
    }
}

関連付けを行った後は、CodeArtifact を使用してあらゆる gem を取り出すことができます。ローカルで利用できない場合は、自動的にアップストリームからパッケージを取得します。

$ gem install rake 

Fetching rake-13.2.1.gem
Successfully installed rake-13.2.1
Parsing documentation for rake-13.2.1
Installing ri documentation for rake-13.2.1
Done installing documentation for rake after 0 seconds
1 gem installed

コンソールを使用して、rake パッケージがリポジトリで利用できるようになったことを確認します。

知っておくべきこと
最初の Ruby パッケージをアップロードする前に、留意すべき点がいくつかあります。

  • 前述の手順に示されているコマンドを試す前に、必ず AWS CLI の最新バージョンに更新してください。CodeArtifact の Ruby リポジトリについて把握しているのは、最新バージョンの CLI のみです。
  • 認証トークンは 12 時間後に期限切れになります。更新を自動化するスクリプトを記述するか、またはスケジュールされた AWS Lambda 関数を使用してトークンを (例えば) AWS Secrets Manager に安全に保存することをお勧めします。

料金と利用可能なリージョン
Ruby パッケージの CodeArtifact のコストは、既にサポートされている他のパッケージ形式のコストと同じです。CodeArtifact の請求額は、ストレージ (GB/月で測定)、リクエスト数、インターネットまたは他の AWS リージョンへのデータ転送 (OUT) という 3 つのメトリクスによって決まります。同じリージョンの AWS サービスへのデータ転送には料金がかかりません。つまり、CodeArtifact のデータ転送についての料金が発生しない状態で、Amazon Elastic Compute Cloud (Amazon EC2)AWS CodeBuild で継続的インテグレーションと継続的デリバリー (CI/CD) ジョブなどを実行できます。いつものように、詳細については料金ページをご確認ください。

CodeArtifact for Ruby パッケージは、CodeArtifact が使用可能な 13 のリージョンすべてでご利用いただけます。

さぁ、Ruby アプリケーションを構築して、プライベートパッケージを CodeArtifact にアップロードしましょう!

— seb

原文はこちらです。