Amazon Web Services 한국 블로그

AWS CodeArtifact에 Swift 패키지 추가

오늘부터 Swift 개발자 중 Apple 플랫폼(iOS, iPadOS, macOS, tvOS, watchOS 또는 visionOS)이나 Swift 애플리케이션 중 서버측에서 실행 중인 앱에 대한 코드를 작성하는 경우 AWS CodeArtifact를 사용하여 패키지 종속 항목을 안전하게 저장하고 검색할 수 있습니다. CodeArtifact는 Xcode, xcodebuildSwift 패키지 관리자 (swift 패키지 명령) 등의 표준 개발자 도구와 통합됩니다.

간단한 애플리케이션은 보통 수십 개의 패키지를 포함합니다. 대형 애플리케이션은 수백 개의 종속 항목을 포함할 수 있습니다. 이 패키지는 네트워크 액세스, 암호화 기능 또는 데이터 형식 조작 등의 일반적인 프로그래밍 문제를 해결하는 코드를 제공하여 개발자가 개발 및 테스트 프로세스를 가속화하도록 지원합니다. 또한 개발자는 SDK 중에서도 AWS SDK 등을 포함시켜 원격 서비스에 액세스합니다. 이러한 패키지들은 조직의 다른 팀에서 제작하거나 오픈 소스 프로젝트와 같은 타사에서 유지 관리할 수 있습니다. 패키지 및 패키지 종속 항목 관리는 소프트웨어 개발 프로세스의 필수적인 부분입니다. 최신 프로그래밍 언어는 종속 항목을 다운로드 및 해결하는 도구를 포함하며 그 예로는 Java의 Maven, C#의 NuGet, JavaScript의 npm 또는 yarn 및 Python의 pip 등이 있습니다. 애플 플랫폼 개발자들은 CocoaPods 또는 Swift 패키지 매니저(SwiftPM)를 사용합니다.

패키지 다운로드 및 통합은 애플리케이션 개발자의 일상적인 작업입니다. 그러나 이는 조직에 최소한 두 가지의 중요한 과제를 안겨줍니다.

첫 번째 과제는 합법성입니다. 조직은 타사 패키지의 라이선스가 특정 프로젝트의 예상 라이선스 사용과 호환되고 해당 패키지가 다른 사람의 지적 재산권(IP)을 위반하지 않는지 확인해야 합니다. 두 번째 과제는 보안입니다. 조직은 포함된 코드가 사용하기에 안전하며, 앱에 보안 결함을 유발하도록 설계한 백도어 또는 의도적인 취약성을 포함하지 않는지 확인해야 합니다. 인기 있는 오픈 소스 프로젝트에 취약점을 주입하는 행위는 공급망 공격으로 알려져 있으며 최근 몇 년 동안 점점 인기를 얻고 있습니다.

이러한 문제를 해결하기 위해 조직은 일반적으로 사내 또는 클라우드에 사설 패키지 서버를 설치합니다. 개발자는 조직의 보안 및 법률 팀에서 심사하고 비공개 리포지토리를 통해 제공하는 패키지만 사용할 수 있습니다.

AWS CodeArtifact는 내부 개발자 팀에 패키지를 안전하게 배포할 수 있는 관리형 서비스입니다. 기본 인프라를 설치, 관리하거나 그 규모를 조정할 필요가 없습니다. 소프트웨어 개발 인프라 대신 앱 작업에 더 많은 시간을 할애할 수 있도록 저희가 대신 처리해 드립니다.

CodeArtifact가 이제 npm, PyPI, Maven, NuGet일반 패키지 형식 외에도 천연 Swift 패키지를 지원한다는 소식을 발표하게 되어 기쁩니다. Swift 패키지는 재사용 가능한 Swift 코드 요소를 패키징하고 배포하는 데 널리 사용되는 방법입니다. 자신만의 Swift 패키지를 생성하는 방법을 알아보려면 이 튜토리얼을 따르십시오. 또한 커뮤니티는 Swift 애플리케이션에서 사용할 수 있는 6,000개 이상의 Swift 패키지를 생성했습니다.

이제 AWS 클라우드의 CodeArtifact 리포지토리에서 Swift 패키지 종속 항목을 게시하고 다운로드할 수 있습니다. CodeArtifact SwiftPM은 Xcode, VSCodeSwift 패키지 관리자 명령줄 도구 등의 기존 개발자 도구와 함께 작동합니다. 패키지가 CodeArtifact에 저장되면 Git 엔드포인트를 사용하여 퍼블릭 Swift 패키지에 액세스하는 것과 비슷한 방식으로 프로젝트의 Package.swift 파일 또는 Xcode 프로젝트에서 패키지를 참조할 수 있습니다.

구성이 완료되면 네트워크로 차단된 구축 시스템이 CodeArtifact 저장소에서 패키지를 다운로드하여 애플리케이션의 구축 프로세스 중에 승인 및 제어된 패키지만 사용되도록 합니다.

시작하기
평소와 같이 이 블로그에서 어떻게 작동하는지 보여 드리겠습니다. Amazon DynamoDB를 데이터베이스로 사용하는 iOS 애플리케이션을 개발 중이라고 가정해 봅시다. 제 애플리케이션은 AWS SDK for Swift를 종속 항목으로 포함합니다. 조직 정책을 준수하려면 애플리케이션은 사내에서 만들고 조직의 법률 및 보안 팀에서 승인한 특정 버전의 Swift용 AWS SDK를 사용해야 합니다. 이 데모에서는 환경을 준비하고, 패키지를 리포지토리에 업로드하며, 이 특정 패키지 빌드를 프로젝트의 종속 항목으로 사용하는 방법을 보여줍니다.

이 데모에서는 Swift 패키지별 단계를 중점적으로 살펴보겠습니다. 제 동료 Steven이 작성한 튜토리얼을 읽고 CodeArtifact를 시작할 수 있습니다.

패키지 저장소(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 Command Line Interface(AWS CLI)를 사용하여 시스템에 SwiftPM을 구성합니다.

SwiftPM은 사용자 수준(~/.swiftpm/configurations 파일에서) 또는 프로젝트 수준(<your project>/.swiftpm/configurations 파일에서)에서 저장소 구성을 저장할 수 있습니다. 기본적으로 CodeArtifact 로그인 명령은 프로젝트별로 다른 CodeArtifact 저장소를 사용할 수 있도록 프로젝트 수준 구성을 생성합니다.

AWS CLI를 사용하여 빌드 머신에서 SwiftPM을 구성합니다.

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

이 명령은 올바른 옵션을 사용하여 swift 패키지 레지스트리 로그인을 호출하고, 그러면 지정된 저장소 이름(MySwiftRepo) 및 범위 이름(aws)을 사용하여 필요한 SwiftPM 구성 파일이 생성됩니다.

이제 빌드 머신이 준비되었으므로 조직에서 승인한 버전의 Swift용 AWS SDK 패키지를 준비한 다음 저장소에 업로드합니다.

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 뒤에 있는 패키지 이름의 형식이 <scope>/<package name>/<package version>인지 확인합니다. 패키지 버전은 시맨틱 버저닝 스키마를 따라야 합니다.

CLI나 콘솔을 사용하여 저장소에서 패키지를 사용할 수 있는지 확인할 수 있습니다.

CodeArtifact 목록 패키지

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를 입력합니다(이것은 <scope name>.<package name>입니다). 1~2초 후에 패키지 이름이 목록에 나타납니다. 우측 상단에서 소스 저장소를 확인할 수 있습니다(레지스트리 레이블 옆). 패키지 추가 버튼을 선택하기 전에 공개적으로 사용 가능한 패키지와 마찬가지로 패키지 버전을 선택합니다.

Xcode의 Codeartifact에서 비공개 패키지 추가

또는 서버측 또는 명령줄 애플리케이션의 경우 Package.swift 파일에 종속 항목을 추가합니다. 또한 (<scope>.<package name>) 형식을 .package(id:from:) 함수의 첫 번째 매개 변수로 사용합니다.

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

swift 패키지 업데이트를 입력하면 SwiftPM이 CodeArtifact 저장소에서 패키지를 다운로드합니다.

알아야 할 사항
첫 번째 Swift 패키지를 업로드하기 전에 염두에 두어야 할 몇 가지 사항이 있습니다.

  • 이전 지침에 표시된 명령을 시도하기 전에 반드시 최신 버전의 CLI로 업데이트하십시오.
  • swift 패키지 명령과 함께 CodeArtifact를 사용하려면 Swift 버전 5.8 이상을 사용해야 합니다. macOS에서는 스위프트 툴체인이 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 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" : { // <-- this is the scope name!
      "url" : "https://stormacq-test-012345678912.d.codeartifact.us-west-2.amazonaws.com/swift/MySwiftRepo/"
    }
  },
  "version" : 1
}

CodeArtifact 인증 토큰의 키체인 아이템

요금 및 가용성
Swift 패키지의 CodeArtifact 비용은 이미 지원되는 다른 패키지 형식의 비용과 동일합니다. CodeArtifact 요금은 저장소(월별 GB 단위), 요청 수, 인터넷 또는 다른 AWS 리전으로의 데이터 전송이라는 세 가지 지표에 따라 달라집니다. 동일한 리전 내 AWS 서비스로의 데이터 전송에는 요금이 부과되지 않습니다. 즉, CodeArtifact 데이터 전송 요금 없이 Amazon EC2 Mac 인스턴스에서 CICD 작업을 실행할 수 있습니다. 평소처럼 세부 정보는 요금 페이지에서 확인할 수 있습니다.

CodeArtifact for Swift 패키지는 CodeArtifact를 사용할 수 있는 13개 리전 모두에 출시되었습니다.

이제 Swift 애플리케이션을 구축하고 개인 패키지를 CodeArtifact에 업로드하세요!

— seb

PS: Swift 프로그래밍 언어로 Lambda 함수를 작성할 수 있다는 것을 알고 계십니까? 퀵 스타트 가이드를 확인하거나 35분 분량의 튜토리얼을 따르십시오.