Amazon Web Services ブログ

新着 – Swift パッケージを AWS CodeArtifact に追加

9月20日より、Apple プラットフォーム (iOSiPadOSmacOStvOSwatchOSvisionOS)、またはサーバー側で実行されている Swift アプリケーション用のコードを記述する Swift デベロッパーは、AWS CodeArtifact を利用して、パッケージの依存関係を安全に保存および取得できます。CodeArtifact は、XcodexcodebuildSwift Package Manager (swift package コマンド) などの標準的なデベロッパーツールと統合します。

シンプルなアプリケーションには通常、数十のパッケージが含まれています。大規模なエンタープライズアプリケーションには、何百もの依存関係が存在する場合があります。これらのパッケージは、ネットワークアクセス、暗号化機能、データ形式の操作などの一般的なプログラミングの課題を解決するコードを提供することで、デベロッパーが開発とテストのプロセスをスピードアップするのに役立ちます。また、デベロッパーは、リモートサービスにアクセスするために、AWS SDK などの SDK を埋め込みます。これらのパッケージは、組織内の他のチームによって作成されたり、オープンソースプロジェクトなどのサードパーティーによって保守されたりする場合があります。パッケージとその依存関係の管理は、ソフトウェア開発プロセスの不可欠な部分です。最新のプログラミング言語には、依存関係をダウンロードして解決するためのツールが含まれています。Java の Maven、C# の NuGet、JavaScript の npm または yarn、Python の pip はその一例です。Apple プラットフォームのデベロッパーは、CocoaPods または Swift Package Manager (SwiftPM) を使用します。

パッケージのダウンロードと統合は、アプリケーションデベロッパーにとって日常的な業務です。ただし、組織にとっては少なくとも 2 つの重大な課題が生じます。

1 つ目の課題は法務関連です。組織は、サードパーティーパッケージのライセンスが、特定のプロジェクトで想定されるライセンスの使用と互換性があるようにするとともに、およびパッケージが他者の知的財産 (IP) を侵害していないようにする必要があります。2 つ目の課題はセキュリティです。組織は、含まれているコードが安全に使用できるものであるようにするとともに、アプリケーションにセキュリティ上の欠陥を導入するために設計されたバックドアや意図的な脆弱性が含まれていないようにする必要があります。人気のオープンソースプロジェクトに脆弱性を挿入することは、サプライチェーン攻撃として知られており、近年ますます発生件数が増加しています。

これらの課題に対処するために、組織は通常、プライベートパッケージサーバーをオンプレミスまたはクラウドでインストールします。デベロッパーは、組織のセキュリティチームと法務チームによって精査され、かつ、プライベートリポジトリを通じて使用できるパッケージのみを使用できます。

AWS CodeArtifact は、社内のデベロッパーチームにパッケージを安全に配布できるようにするマネージドサービスです。基盤となるインフラストラクチャをインストール、管理、スケールする必要はありません。当社がそれを処理するため、お客様は、ソフトウェア開発インフラストラクチャではなく、アプリケーション関連の業務により多くの時間を費やすことができます。

CodeArtifact が npmPyPIMavenNuGet汎用パッケージ形式に加えて、ネイティブ Swift パッケージをサポートするようになったことをお知らせします。Swift パッケージは、再利用可能な Swift コード要素をパッケージ化して配布するための方法として広く利用されています。独自の Swift パッケージを作成する方法を学ぶには、このチュートリアルに従ってください。または、コミュニティは、Swift アプリケーションで使用できる 6,000 を超える Swift パッケージを作成しました。

AWS クラウドの CodeArtifact リポジトリで Swift パッケージの依存関係を公開およびダウンロードできるようになりました。CodeArtifact SwiftPM は、XcodeVSCodeSwift Package Manager コマンドラインツールなどの既存のデベロッパーツールと連携して動作します。パッケージが CodeArtifact に保存されたら、Git エンドポイントを使用してパブリック Swift パッケージにアクセスするのと同様の方法で、プロジェクトの Package.swift ファイルまたは Xcode プロジェクトでそれらのパッケージを参照できます。

設定が完了すると、ネットワークジェイル化された構築システムが CodeArtifact リポジトリからパッケージをダウンロードし、アプリケーションの構築プロセス中に承認および制御されたパッケージのみが使用されるようにします。

開始方法
このブログではいつものように、その仕組みを説明します。Amazon DynamoDB をデータベースとして利用する iOS アプリケーションについて作業していると仮定してください。私のアプリケーションには、依存関係として AWS SDK for Swift が埋め込まれています。私の組織のポリシーに準拠するために、アプリケーションは社内でコンパイルされ、組織の法務チームとセキュリティチームによって承認された特定のバージョンの AWS SDK for Swift を使用する必要があります。このデモでは、環境を準備し、パッケージをリポジトリにアップロードして、この特定のパッケージビルドをプロジェクトの依存関係として使用する方法を示します。

このデモでは、Swift パッケージに固有のステップについて中心的に説明します。CodeArtifact の利用を開始するに際して、同僚の Steven が作成したチュートリアルが参考になります。

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

CodeArtifact リポジトリ

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

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

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

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

export CODEARTIFACT_REPO=`aws codeartifact get-repository-endpoint  \
                               --domain stormacq-test               \
                               --domain-owner 012345678912          \
                               --format swift                       \
                               --repository MySwiftRepo             \
                               --query repositoryEndpoint           \
                               --output text`

リポジトリエンドポイントと認証トークンを取得したので、AWS コマンドラインインターフェイス (AWS CLI) を使用してマシン上で SwiftPM を設定します。

SwiftPM は、ユーザーレベル (ファイル ~/.swiftpm/configurations 内) またはプロジェクトレベル (ファイル <お客様のプロジェクト>/.swiftpm/configurations 内) でリポジトリ設定を保存できます。デフォルトでは、CodeArtifact ログインコマンドはプロジェクトレベルの設定を作成し、異なるプロジェクトに異なる CodeArtifact リポジトリを使用できるようにします。

AWS CLI を使用して、ビルドマシンで SwiftPM を設定します。

aws codeartifact login          \
    --tool swift                \
    --domain stormacq-test      \
    --repository MySwiftRepo    \
    --namespace aws             \
    --domain-owner 012345678912

このコマンドは、正しいオプションを使用して swift package-registry login を呼び出します。これにより、指定されたリポジトリ名 (MySwiftRepo) とスコープ名 (aws) を使用して必要な SwiftPM 設定ファイルが作成されます。

ビルドマシンの準備ができたので、私の組織が承認したバージョンの AWS SDK for Swift パッケージを準備し、それをリポジトリにアップロードします。

git clone https://github.com/awslabs/aws-sdk-swift.git
pushd aws-sdk-swift
swift package archive-source
mv aws-sdk-swift.zip ../aws-sdk-swift-0.24.0.zip
popd

最後に、このパッケージバージョンをリポジトリにアップロードします。

Swift 5.9 以降を使用している場合は、SwiftPM コマンドを使用してパッケージをプライベートリポジトリにアップロードできます。

swift package-registry publish           \
                       aws.aws-sdk-swift \
                       0.24.0            \
                       --verbose

5.9 よりも前のバージョンの Swift は、swift package-registry publish コマンドを提供しません。そのため、代わりに curl コマンドを使用します。

curl  -X PUT 
      --user "aws:$CODEARTIFACT_AUTH_TOKEN"               \
      -H "Accept: application/vnd.swift.registry.v1+json" \
      -F source-archive="@aws-sdk-swift-0.24.0.zip"       \
      "${CODEARTIFACT_REPO}aws/aws-sdk-swift/0.24.0"

リポジトリの URI の後のパッケージ名の形式に注目してください: <スコープ>/<パッケージ名>/<パッケージバージョン>。パッケージバージョンは、セマンティックバージョニングスキームに従う必要があります。

CLI またはコンソールを使用して、パッケージがリポジトリで利用可能であることを確認できます。

CodeArtifact List パッケージ

aws codeartifact list-package-versions      \
                  --domain stormacq-test    \
                  --repository MySwiftRepo  \
                  --format swift            \
                  --namespace aws           \
                  --package aws-sdk-swift
{
    "versions": [
        {
            "version": "0.24.0",
            "revision": "6XB5O65J8J3jkTDZd8RMLyqz7XbxIg9IXpTudP7THbU=",
            "status": "Published",
            "origin": {
                "domainEntryPoint": {
                    "repositoryName": "MySwiftRepo"
                },
                "originType": "INTERNAL"
            }
        }
    ],
    "defaultDisplayVersion": "0.24.0",
    "format": "swift",
    "package": "aws-sdk-swift",
    "namespace": "aws"
}

パッケージが使用可能になったので、いつものようにプロジェクトで使用できます。

Xcode は、SwiftPM ツールと、作成したばかりの設定ファイルを使用します。Xcode プロジェクトにパッケージを追加するには、左側のペインでプロジェクト名を選択し、[パッケージの依存関係] タブを選択します。既にプロジェクトの一部となっているパッケージが表示されます。プライベートパッケージを追加するには、[パッケージ] の下にある [+] 記号を選択します。

Xcode が依存関係としてパッケージをプロジェクトに追加します

右上の検索フィールドに aws.aws-sdk-swift と入力します (これは、<スコープ名>.<パッケージ名> です)。1~2 秒後に、パッケージ名がリストに表示されます。右上で、ソースリポジトリ ([レジストリ] ラベルの横) を確認できます。[パッケージを追加] ボタンを選択する前に、公開されているパッケージについて選択する場合と同様に、パッケージバージョンを選択します。

Xcode で CodeArtifact からプライベートパッケージを追加します

あるいは、サーバー側アプリケーションまたはコマンドラインアプリケーションの場合は、依存関係を Package.swift ファイルに追加します。また、.package(id:from:) 関数の最初のパラメータとして形式 (<スコープ>.<パッケージ名>) を使用します。

    dependencies: [
        .package(id: "aws.aws-sdk-swift", from: "0.24.0")
    ],

swift package update と入力すると、SwiftPM が CodeArtifact リポジトリからパッケージをダウンロードします。

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

  • 前述の手順に示されているコマンドを試す前に、必ず CLI の最新バージョンに更新してください
  • swift package コマンドで CodeArtifact を使用するには、Swift バージョン 5.8 以降を使用する必要があります。macOS では、Swift ツールチェーンには Xcode が付属しています。Swift 5.8 は macOS 13 (Ventura) および Xcode 14 で使用できます。Linux および Windows では、swift.org から Swift ツールチェーンをダウンロードできます。
  • iOS、iPadOS、tvOS、または watchOS アプリケーションには Xcode 15 を使用する必要があります。私は、これを Xcode 15 beta8 でテストしました。
  • swift package-registry publish コマンドは、Swift 5.9 以降で使用できます。Swift 5.8 を使用する場合は、デモで示したように、curl を使用してパッケージをアップロードできます (または、任意の HTTP クライアントを使用します)。
  • Swift パッケージには、スコープという概念があります。スコープは、パッケージリポジトリ内の関連パッケージ用に名前空間を提供します。スコープは、CodeArtifact の名前空間にマッピングされます。
  • 認証トークンは 12 時間後に期限切れになります。更新を自動化するスクリプトを記述するか、またはスケジュールされた AWS Lambda 関数を使用してトークンを (例えば) AWS Secrets Manager に安全に保存することをお勧めします。

トラブルシューティング
Xcode がプライベートパッケージを見つけられない場合は、~/.swiftpm/configurations/registries.json のレジストリ設定を再確認してください。特に、スコープ名が存在するかどうかを確認してください。また、認証トークンがキーチェーンに存在することも確認してください。エントリの名前はリポジトリの URL です。キーチェーン内のエントリは、/Application/Utilities/Keychain Access.app アプリケーションまたは security コマンドラインツールを使用して確認できます。

security find-internet-password                                                  \
          -s "stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com" \
          -g

私のマシンの SwiftPM の設定は次のとおりです。

cat ~/.swiftpm/configuration/registries.json

{
  "authentication" : {
    "stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com" : {
      "loginAPIPath" : "/swift/MySwiftRepo/login",
      "type" : "token"
    }
  },
  "registries" : {
    "aws" : { // <-- これはスコープ名です!
      "url" : "https://stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com/swift/MySwiftRepo/"
    }
  },
  "version" : 1
}

CodeArtifact の認証トークンのキーチェーンの項目

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

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

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

— seb

PS: Swift プログラミング言語で Lambda 関数を記述できることをご存知ですか? クイックスタートガイドをご確認いただくか、またはこの 35 分間のチュートリアルに従ってください。

原文はこちらです。