

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 리포지토리 간 패키지 복사
<a name="copy-package"></a>

CodeArtifact에서는 특정 리포지토리의 패키지 버전을 다른 리포지토리로 복사할 수 있습니다. 이 기능은 패키지 프로모션 워크플로우나 팀 또는 프로젝트 간 패키지 버전 공유 같은 시나리오에 유용합니다. 소스 리포지토리와 대상 리포지토리는 패키지 버전을 복사하는 도메인과 동일한 도메인에 있어야 합니다.

## 패키지 복사에 필요한 IAM 권한
<a name="copypackageversions-iam-actions"></a>

CodeArtifact에서 패키지 버전을 복사하려면, 호출하는 사용자에게 필수 IAM 권한이 있어야 하고 소스 및 대상 리포지토리에 연결된 리소스 기반 정책에도 필수 권한이 있어야 합니다. 리소스 기반 권한 정책 및 CodeArtifact 리포지토리에 대한 자세한 내용은 [리포지토리 정책](repo-policies.md) 섹션을 참조하세요.

`copy-package-versions`를 호출하는 사용자에게는 소스 리포지토리에 대한 `ReadFromRepository` 권한과 대상 리포지토리에 대한 `CopyPackageVersions` 권한이 있어야 합니다.

소스 리포지토리에는 `ReadFromRepository` 권한이 있어야 하고 대상 리포지토리에는 IAM 계정 또는 사용자 복사 패키지에 할당된 `CopyPackageVersions` 권한이 있어야 합니다. 다음 정책은 `put-repository-permissions-policy` 명령을 사용하여 소스 리포지토리 또는 대상 리포지토리에 추가할 예제 리포지토리 정책입니다. *111122223333*을 계정 호출 `copy-package-versions`의 ID로 바꿉니다.

**참고**  
현재 리포지토리 정책이 있는 경우 `put-repository-permissions-policy`를 호출하면 현재 정책이 대체됩니다. `get-repository-permissions-policy` 명령을 사용하면 정책이 존재하는지 확인할 수 있습니다. 자세한 내용은 [정책 읽기](repo-policies.md#reading-a-policy) 섹션을 참조하세요. 정책이 존재한다면, 정책을 바꾸는 대신 이러한 권한을 추가하는 것이 좋습니다.

**소스 리포지토리 권한 정책 예시**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::111122223333:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

**대상 리포지토리 권한 정책 예제**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:CopyPackageVersions"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::111122223333:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

## 패키지 버전 복사
<a name="copy-package-versions"></a>

CodeArtifact에서 `copy-package-versions` 명령을 사용하여 소스 리포지토리에 있는 하나 이상의 패키지 버전을 동일한 도메인에 있는 대상 리포지토리로 복사합니다. 다음 예제는 `my_repo` 리포지토리에 있는 `my-package`라는 npm 패키지의 버전 6.0.2 및 4.0.0을 `repo-2` 리포지토리로 복사합니다.

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository my_repo \
 --destination-repository repo-2 --package my-package --format npm \
 --versions 6.0.2 4.0.0
```

단일 작업으로 패키지 이름이 같은 여러 버전을 복사할 수 있습니다. 패키지 이름이 다른 버전을 복사하려면 버전별로 `copy-package-versions`를 호출해야 합니다.

두 버전을 모두 성공적으로 복사할 수 있다면, 앞의 명령은 다음과 같은 출력을 생성합니다.

```
{
   "successfulVersions": {
        "6.0.2": {
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        },
        "4.0.0": {
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        }
    },
    "failedVersions": {}
}
```

## 업스트림 리포지토리에서 패키지 복사
<a name="copy-package-upstream"></a>

일반적으로 `copy-package-versions`는 복사할 버전을 `--source-repository` 옵션에서 지정한 리포지토리에서만 찾습니다. 하지만 `--include-from-upstream` 옵션을 사용하면 소스 리포지토리와 업스트림 리포지토리 모두에서 버전을 복사할 수 있습니다. CodeArtifact SDK를 사용하는 경우 `includeFromUpstream` 파라미터를 true로 설정하여 `CopyPackageVersions` API를 호출하세요. 자세한 내용은 [CodeArtifact에서의 업스트림 리포지토리 작업](repos-upstream.md) 단원을 참조하십시오.

## 범위가 지정된 npm 패키지 복사
<a name="copying-a-scoped-npm-package"></a>

 범위 내의 npm 패키지 버전을 복사하려면 `--namespace` 옵션을 사용하여 범위를 지정하세요. 예를 들어 `@types/react` 패키지를 복사하려면 `--namespace types`를 사용합니다. `--namespace`를 사용할 때는 `@` 기호를 생략해야 합니다.

```
aws codeartifact copy-package-versions  --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \
 --destination-repository repo-2 --format npm --namespace types \
 --package react --versions 0.12.2
```

## Maven 패키지 버전 복사
<a name="copying-a-maven-package"></a>

리포지토리 간에 Maven 패키지 버전을 복사하려면 `--namespace` 옵션을 적용해 Maven 그룹 ID를 전달하고 `--name` 옵션을 적용해 Maven artifactID를 전달하여 복사할 패키지를 지정하세요. 예를 들어 `com.google.guava:guava`의 단일 버전을 복사하는 방법은 다음과 같습니다.

```
 aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333  \
 --source-repository my_repo --destination-repository repo-2 --format maven --namespace com.google.guava \
 --package guava --versions 27.1-jre
```

패키지 버전이 성공적으로 복사되면 다음과 비슷한 출력이 표시됩니다.

```
{
    "successfulVersions": {
        "27.1-jre": {
            "revision": "REVISION-1-SAMPLE-6C81EFF7DA55CC",
            "status": "Published"
        }
    },
    "failedVersions": {}
}
```

## 소스 리포지토리에 없는 버전
<a name="versions-that-do-not-exist-in-the-source-repository"></a>

소스 리포지토리에 없는 버전을 지정하면 복사가 되지 않습니다. 소스 리포지토리에 있는 버전도 있고 없는 버전도 있다면, 모든 버전이 복사되지 않습니다. 다음 예제에서 `array-unique` npm 패키지의 버전 0.2.0은 소스 리포지토리에 있지만 버전 5.6.7은 그렇지 않습니다.

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \
         --source-repository my_repo --destination-repository repo-2 --format npm \
         --package array-unique --versions 0.2.0 5.6.7
```

이 시나리오에서는 다음과 비슷한 출력이 표시됩니다.

```
{
    "successfulVersions": {},
    "failedVersions": {
        "0.2.0": {
            "errorCode": "SKIPPED",
            "errorMessage": "Version 0.2.0 was skipped"
        },
        "5.6.7": {
            "errorCode": "NOT_FOUND",
            "errorMessage": "Could not find version 5.6.7"
        }
    }
}
```

`SKIPPED` 오류 코드는 다른 버전을 복사할 수 없어 해당 버전이 대상 리포지토리에 복사되지 않았음을 나타내는 데 사용합니다.

## 대상 리포지토리에 이미 존재하는 버전
<a name="versions-that-already-exist-in-the-destination-repository"></a>

 패키지 버전이 이미 존재하는 리포지토리에 복사되면, CodeArtifact는 두 리포지토리의 패키지 자산과 패키지 버전 수준 메타데이터를 비교합니다.

 소스 및 대상 리포지토리의 패키지 버전 자산과 메타데이터가 동일한 경우 복사가 수행되지 않지만 작업은 성공한 것으로 간주됩니다. 즉, `copy-package-versions`는 멱등성입니다. 이 경우 소스 리포지토리와 대상 리포지토리에 이미 존재하는 버전은 `copy-package-versions`의 출력에 나열되지 않습니다.

다음 예제에서는 npm 패키지 `array-unique`의 두 버전이 소스 리포지토리 `repo-1`에 존재합니다. 버전 0.2.1도 대상 리포지토리 `dest-repo`에 있지만 버전 0.2.0은 없습니다.

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \
         --source-repository my_repo --destination-repository repo-2 --format npm --package array-unique \
         --versions 0.2.1 0.2.0
```

이 시나리오에서는 다음과 비슷한 출력이 표시됩니다.

```
{
    "successfulVersions": {
        "0.2.0": {
            "revision": "Yad+B1QcBq2kdEVrx1E1vSfHJVh8Pr61hBUkoWPGWX0=",
            "status": "Published"
        }
    },
    "failedVersions": {}
}
```

버전 0.2.0은 소스에서 대상 리포지토리로 성공적으로 복사되었기 때문에 `successfulVersions`에 나열됩니다. 버전 0.2.1은 대상 리포지토리에 이미 존재하므로 출력에 표시되지 않습니다.

 패키지 버전 자산 또는 메타데이터가 소스 및 대상 리포지토리에서 서로 다르다면 복사 작업이 실패하게 됩니다. `--allow-overwrite` 파라미터를 사용하여 강제로 덮어쓸 수 있습니다.

대상 리포지토리에 있는 버전도 있고 없는 버전도 있다면, 모든 버전이 복사되지 않습니다. 다음 예제에서 `array-unique` npm 패키지의 버전 0.3.2는 소스 리포지토리와 대상 리포지토리에 모두 존재하지만 패키지 버전의 콘텐츠가 다릅니다. 버전 0.2.1은 소스 리포지토리에는 있지만 대상 리포지토리에는 없습니다.

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 \
         --source-repository my_repo --destination-repository repo-2 --format npm --package array-unique \
         --versions 0.3.2 0.2.1
```

이 시나리오에서는 다음과 비슷한 출력이 표시됩니다.

```
{
    "successfulVersions": {},
    "failedVersions": {
        "0.2.1": {
            "errorCode": "SKIPPED",
            "errorMessage": "Version 0.2.1 was skipped"
        },
        "0.3.2": {
            "errorCode": "ALREADY_EXISTS",
            "errorMessage": "Version 0.3.2 already exists"
        }
    }
}
```

버전 0.2.1은 대상 리포지토리에 복사되지 않았기 때문에 `SKIPPED`로 표시됩니다. 버전 0.3.2는 대상 리포지토리에 존재했지만 소스 및 대상 리포지토리에서 동일하지 않아 복사에 실패했습니다.

## 패키지 버전 개정 지정
<a name="specify-package-version-revision"></a>

 패키지 버전 개정은 패키지 버전의 특정 자산 및 메타데이터 세트를 지정하는 문자열입니다. 패키지 버전 개정을 지정하여 특정 상태의 패키지 버전을 복사할 수 있습니다. 패키지 버전 개정을 지정하려면 `--version-revisions` 파라미터를 사용하여, 쉼표로 구분된 패키지 버전 하나 이상과 패키지 버전 개정 쌍을 `copy-package-versions` 명령에 전달합니다.

**참고**  
`copy-package-versions`가 있는 `--versions` 또는 `--version-revisions` 파라미터를 지정해야 합니다. 둘 다 지정할 수는 없습니다.

다음 예제에서는 패키지 버전 개정 `REVISION-1-SAMPLE-6C81EFF7DA55CC`와 함께 소스 리포지토리에 존재하는 패키지 `my-package`의 버전 0.3.2만 복사합니다.

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \
 --destination-repository repo-2 --format npm --namespace my-namespace \
 --package my-package --version-revisions 0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC
```

다음 예제에서는 패키지 `my-package`의 두 버전(0.3.2 및 0.3.13)을 복사합니다. `my-package`의 소스 리포지토리 버전 0.3.2에 개정 `REVISION-1-SAMPLE-6C81EFF7DA55CC`가 있고 버전 0.3.13에 개정 `REVISION-2-SAMPLE-55C752BEE772FC`가 있는 경우에만 복사가 성공합니다.

```
aws codeartifact copy-package-versions --domain my_domain --domain-owner 111122223333 --source-repository repo-1 \
 --destination-repository repo-2 --format npm --namespace my-namespace \
 --package my-package --version-revisions 0.3.2=REVISION-1-SAMPLE-6C81EFF7DA55CC,0.3.13=REVISION-2-SAMPLE-55C752BEE772FC
```

 패키지 버전의 개정을 찾으려면 `describe-package-version` 또는 `list-package-versions` 명령을 사용합니다.

 자세한 내용은 *CodeArtifact API 참조*의 [패키지 버전 개정](codeartifact-concepts.md#welcome-concepts-package-version-revision) 및 [CopyPackageVersion](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_CopyPackageVersions.html)을 참조하세요.

## npm 패키지 복사
<a name="copying-npm-packages"></a>

 npm 패키지의 `copy-package-versions` 동작에 대한 자세한 내용은 [npm 태그 및 CopyPackageVersions API](npm-tags.md#tags-and-cpv)를 참조하세요.