

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

# Amazon ECR 모니터링
<a name="monitoring"></a>

Amazon ECR에서 원시 데이터를 수집하여 읽기 가능하며 실시간에 가까운 측정치로 처리하는 Amazon CloudWatch를 사용해 Amazon ECR API 사용량을 모니터링할 수 있습니다. 이러한 통계는 2주간 기록되므로 기록 정보를 보고 API 사용에 대한 관점을 얻을 수 있습니다. Amazon ECR 지표 데이터는 1분 간격으로 CloudWatch로 자동 전송됩니다. CloudWatch에 대한 자세한 내용은 [Amazon CloudWatch 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)를 참조하세요.

Amazon ECR은 권한 부여, 이미지 푸시 및 이미지 가져오기 작업에 대한 API 사용량을 기반으로 하는 지표를 제공합니다.

모니터링은 Amazon ECR 및 AWS 솔루션의 안정성, 가용성 및 성능을 유지하는 데 중요한 부분입니다. 다중 지점 장애가 발생할 경우 보다 쉽게 디버깅할 수 있도록 AWS 솔루션을 구성하는 리소스에서 모니터링 데이터를 수집하는 것이 좋습니다. 하지만 Amazon ECR 모니터링을 시작하기 전에 다음 질문에 대한 답변을 포함하는 모니터링 계획을 수립해야 합니다.
+ 모니터링의 목표
+ 모니터링할 리소스
+ 이러한 리소스를 모니터링하는 빈도
+ 사용할 모니터링 도구
+ 모니터링 작업을 수행할 사람
+ 문제 발생 시 알려야 할 대상

다음 단계에서는 다양한 시간과 다양한 부하 조건에서 성능을 측정하여 환경에서 일반 Amazon ECR 성능의 기준선을 설정합니다. Amazon ECR을 모니터링할 때 새 성능 데이터와 비교할 수 있도록 과거 모니터링 데이터를 저장하고 일반적인 성능 패턴과 성능 이상을 식별하고 이를 해결할 방법을 고안합니다.

**Topics**
+ [

# 서비스 할당량 시각화 및 경보 설정
](monitoring-quotas-alarms.md)
+ [

# Amazon ECR 사용량 지표
](monitoring-usage.md)
+ [

# Amazon ECR 사용 보고서
](usage-reports.md)
+ [

# Amazon ECR 리포지토리 지표
](ecr-repository-metrics.md)
+ [

# Amazon ECR 이벤트 및 EventBridge
](ecr-eventbridge.md)
+ [

# 를 사용하여 Amazon ECR 작업 로깅 AWS CloudTrail
](logging-using-cloudtrail.md)

# 서비스 할당량 시각화 및 경보 설정
<a name="monitoring-quotas-alarms"></a>

CloudWatch 콘솔을 사용하여 서비스 할당량을 시각화하고 현재 사용량을 서비스 할당량과 비교해 볼 수 있습니다. 할당량에 가까워지면 알림을 받도록 경보를 설정할 수도 있습니다.

**서비스 할당량을 시각화하고 선택적으로 경보를 설정하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **지표**를 선택합니다.

1. **모든 지표** 탭에서 **사용량**을 선택한 다음 ** AWS 리소스별**을 선택합니다.

   서비스 할당량 사용량 지표 목록이 나타납니다.

1. 지표 중 하나 옆에 있는 확인란을 선택합니다.

   그래프에는 해당 AWS 리소스의 현재 사용량이 표시됩니다.

1. 그래프에 서비스 할당량을 추가하려면 다음을 수행합니다.

   1. **그래프로 표시된 지표(Graphed metrics)** 탭을 선택합니다.

   1. **수학 표현식(Math expression)**, **빈 표현식으로 시작(Start with an empty expression)**을 선택합니다. 그런 다음 새 행의 **세부 정보(Details)**에 **SERVICE\$1QUOTA(m1)**를 입력합니다.

      그래프에 새 줄이 추가되어 지표에 표시된 리소스에 대한 서비스 할당량을 표시합니다.

1. 현재 사용량을 할당량의 백분율로 보려면 새 표현식을 추가하거나 현재 **SERVICE\$1QUOTA** 표현식을 변경합니다. 새 표현식의 경우 **m1/60/SERVICE\$1QUOTA(m1)\$1100**을 사용합니다.

1. (선택 사항) 서비스 할당량에 접근하는 경우 알려주는 경보를 설정하려면 다음을 수행합니다.

   1. **m1/60/SERVICE\$1QUOTA(m1)\$1100** 행의 **작업(Actions)**에서 경보 아이콘을 선택합니다. 이 아이콘은 종처럼 보입니다.

      경보 생성 페이지가 나타납니다.

   1. **조건(Conditions)**에서 **임계값 유형(Threshold type)**이 **정적(Static)**이고 **표현식1이 해당할 때마다(Whenever Expression1 is)**가 **큼(Greater)**으로 설정되었는지 확인합니다. **보다(than)**에 **80**을 입력합니다. 이렇게 하면 사용량이 할당량의 80%를 초과할 경우 ALARM 상태가 되는 경보가 생성됩니다.

   1. **다음(Next)**을 선택합니다.

   1. 다음 페이지에서 Amazon SNS 주제를 선택하거나 새 주제를 생성합니다. 이 주제는 경보가 ALARM 상태로 전환되면 알림을 받습니다. 그런 다음, **다음(Next)**을 선택합니다.

   1. 다음 페이지에서 경보의 이름과 설명을 입력하고 **다음(Next)**을 선택합니다.

   1. **경보 생성(Create alarm)**을 선택합니다.

# Amazon ECR 사용량 지표
<a name="monitoring-usage"></a>

CloudWatch 사용량 지표를 사용하여 계정의 리소스 사용량을 확인할 수 있습니다. 이러한 지표를 사용하여 CloudWatch 그래프 및 대시보드에서 현재 서비스 사용량을 시각화합니다.

Amazon ECR 사용량 지표는 AWS 서비스 할당량에 해당합니다. 사용량이 서비스 할당량에 가까워지면 경고하는 경보를 구성할 수 있습니다. Amazon ECR 서비스 할당량에 대한 자세한 내용은 [Amazon ECR 서비스 할당량](service-quotas.md) 단원을 참조하세요.

Amazon ECR은 `AWS/Usage` 네임스페이스에 다음 지표를 게시합니다.


|  지표  |  설명  | 
| --- | --- | 
|  `CallCount`  |  계정에서 API 작업 호출 횟수입니다. 리소스는 지표와 연결된 차원에 의해 정의됩니다. 이 지표에 대한 가장 유용한 통계는 `SUM`입니다. 이 통계는 정의된 기간 동안 모든 기여자의 값의 합계를 나타냅니다.  | 
|  `ResourceCount`  |  계정에서 지정된 리소스의 수입니다. 리소스는 지표와 연결된 차원에 의해 정의됩니다. 이 지표에 가장 유용한 통계는 이며`MAXIMUM`, 이는 5분 동안 사용된 최대 리소스 수를 나타냅니다.  | 

다음 차원은 Amazon ECR에서 게시하는 API 사용량 지표를 구체화하는 데 사용됩니다.


|  차원  |  설명  | 
| --- | --- | 
|  `Service`  |  리소스가 포함된 AWS 서비스의 이름입니다. Amazon ECR 사용량 지표의 경우 이 차원 값은 `ECR`입니다.  | 
|  `Type`  |  보고되는 엔터티의 유형입니다. 현재 Amazon ECR API 사용량 지표에 유효한 유일한 값은 입니다`API`.  | 
|  `Resource`  |  실행 중인 리소스의 유형입니다. 현재 Amazon ECR은 다음 API 작업에 대한 API 사용량 정보를 반환합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/monitoring-usage.html)  | 
|  Class  |  추적 중인 리소스의 클래스입니다. 현재 Amazon ECR에서는 클래스 차원을 사용하지 않습니다.  | 

다음 차원은 Amazon ECR에서 게시하는 리소스 사용량 지표를 구체화하는 데 사용됩니다.


|  차원  |  설명  | 
| --- | --- | 
|  `Service`  |  리소스가 포함된 AWS 서비스의 이름입니다. Amazon ECR 사용량 지표의 경우 이 차원 값은 `ECR`입니다.  | 
|  `Type`  |  보고되는 엔터티의 유형입니다. 현재 Amazon ECR 리소스 사용 지표의 유일한 유효한 값은 입니다`RESOURCE`.  | 
|  `Resource`  |  실행 중인 리소스의 유형입니다. 현재 Amazon ECR은 다음 지표에 대한 리소스 사용량 정보를 반환합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/monitoring-usage.html)  | 
|  `ResourceId`  |  사용량이 발생한 리소스의 식별자입니다. 현재 ResourceId는 와만 관련이 `ImagesPerRepositoryCount` 있으며 해당 값은 repository/your\$1repository\$1name 형식입니다. 예: 'repository/my-repo'는 이름이 'my-repo'인 리포지토리의 이미지 수를 반환합니다.  | 

# Amazon ECR 사용 보고서
<a name="usage-reports"></a>

AWS 는 Amazon ECR 리소스의 비용 및 사용량을 분석할 수 있는 Cost Explorer라는 무료 보고 도구를 제공합니다.

Cost Explorer를 사용하여 사용량 및 비용 차트를 볼 수 있습니다. 이전 13개월의 데이터를 볼 수 있으며 향후 3개월 동안의 지출을 예상해볼 수 있습니다. Cost Explorer를 사용하면 시간 경과에 따라 AWS 리소스에 지출하는 금액의 패턴을 보고, 추가 질의가 필요한 영역을 식별하며, 비용을 이해하는 데 사용할 수 있는 추세를 알아볼 수 있습니다. 또한 데이터의 시간 범위를 지정하고 일별 또는 월별 시간 데이터를 볼 수도 있습니다.

비용 및 사용량 보고서의 측정 데이터는 모든 Amazon ECR 리포지토리에서의 사용량을 보여줍니다. 자세한 내용은 [리소스에 결제용 태깅](ecr-using-tags.md#tag-resources-for-billing) 단원을 참조하십시오.

 AWS 비용 및 사용 보고서 생성에 대한 자세한 내용은 *AWS Billing 사용 설명서*의 [AWS 비용 및 사용 보고서를](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-reports-costusage.html) 참조하세요.

# Amazon ECR 리포지토리 지표
<a name="ecr-repository-metrics"></a>

Amazon ECR은 리포지토리 풀 횟수 지표를 Amazon CloudWatch로 전송합니다. Amazon ECR 지표 데이터는 1분 간격으로 CloudWatch로 자동 전송됩니다. CloudWatch에 대한 자세한 정보는 [Amazon CloudWatch 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)를 참조하세요.

**Topics**
+ [

## CloudWatch 지표 활성화
](#enable_cloudwatch)
+ [

## 사용 가능한 지표 및 차원
](#available_cloudwatch_metrics)
+ [

## CloudWatch 콘솔을 사용해 Amazon ECR 지표 보기
](#viewing_metrics_console)

## CloudWatch 지표 활성화
<a name="enable_cloudwatch"></a>

Amazon ECR은 모든 리포지토리에 대해 리포지토리 지표를 자동 전송합니다. 수동 단계를 수행할 필요가 없습니다.

## 사용 가능한 지표 및 차원
<a name="available_cloudwatch_metrics"></a>

다음 섹션에는 Amazon ECR에서 Amazon CloudWatch로 전송하는 지표와 차원이 나열되어 있습니다.

### Amazon ECR 지표
<a name="ecr-metrics"></a>

Amazon ECR은 리포지토리의 모니터링을 위한 지표를 제공합니다. 풀 횟수를 측정할 수 있습니다.

`AWS/ECR` 네임스페이스에는 다음과 같은 지표가 포함됩니다.

`RepositoryPullCount`  
리포지토리에 있는 이미지에 대한 총 풀 횟수입니다.  
유효한 차원: `RepositoryName`  
유효한 통계: Average, Minimum, Maximum, Sum, Sample Count. 가장 유용한 통계는 Sum입니다.  
단위: 정수.

### Amazon ECR 지표 차원
<a name="ecs-metrics-dimensions"></a>

Amazon ECR 지표는 `AWS/ECR` 네임스페이스를 사용하며 다음 차원의 지표를 제공합니다.

`RepositoryName`  
이 차원은 지정한 리포지토리 내의 모든 컨테이너 이미지에 대해 요청하는 데이터를 필터링합니다.

## CloudWatch 콘솔을 사용해 Amazon ECR 지표 보기
<a name="viewing_metrics_console"></a>

Amazon ECR 리포지토리 지표는 CloudWatch 콘솔에서 볼 수 있습니다. CloudWatch 콘솔은 세분화되고 사용자 정의가 가능한 리소스 표시를 제공합니다. 자세한 내용은 [Amazon CloudWatch 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)를 참조하세요.

# Amazon ECR 이벤트 및 EventBridge
<a name="ecr-eventbridge"></a>

Amazon EventBridge를 사용하면 AWS 서비스를 자동화하고 애플리케이션 가용성 문제 또는 리소스 변경과 같은 시스템 이벤트에 자동으로 대응할 수 있습니다. AWS 서비스의 이벤트는 거의 실시간으로 EventBridge로 전송됩니다. 관심 있는 이벤트만 표시하도록 간단한 규칙을 작성한 후 규칙과 일치하는 이벤트 발생 시 실행할 자동 작업을 포함할 수 있습니다. 자동으로 트리거할 수 있는 태스크는 다음과 같습니다.
+ CloudWatch Logs의 로그 그룹에 이벤트 추가
+  AWS Lambda 함수 호출
+ Amazon EC2 Run Command 호출
+ Amazon Kinesis Data Streams로 이벤트 릴레이
+  AWS Step Functions 상태 시스템 활성화
+ SNS 주제 또는 Amazon SQS 대기열 알림

자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-getting-set-up.html)를 참조하세요.

## Amazon ECR의 샘플 이벤트
<a name="ecr-eventbridge-bus"></a>

다음은 Amazon ECR의 예시 이벤트입니다. 이벤트는 최선의 작업을 기반으로 발생됩니다.

**완료된 이미지 푸시에 대한 이벤트**

각 이미지 푸시가 완료되면 다음 이벤트가 전송됩니다. 자세한 내용은 [Amazon ECR 프라이빗 리포지토리에 Docker 이미지 푸시](docker-push-ecr-image.md) 단원을 참조하십시오.

```
{
    "version": "0",
    "id": "13cde686-328b-6117-af20-0e5566167482",
    "detail-type": "ECR Image Action",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2019-11-16T01:54:34Z",
    "region": "us-west-2",
    "resources": [],
    "detail": {
        "result": "SUCCESS",
        "repository-name": "my-repository-name",
        "image-digest": "sha256:7f5b2640fe6fb4f46592dfd3410c4a79dac4f89e4782432e0378abcd1234",
        "action-type": "PUSH",
        "image-tag": "latest"
    }
}
```

**풀스루 캐시 작업에 대한 이벤트**

풀스루 캐시 작업이 시도되면 다음 이벤트가 전송됩니다. 자세한 내용은 [Amazon ECR 프라이빗 레지스트리와 업스트림 레지스트리 동기화](pull-through-cache.md) 단원을 참조하십시오.

```
{
    "version": "0",
    "id": "85fc3613-e913-7fc4-a80c-a3753e4aa9ae",
    "detail-type": "ECR Pull Through Cache Action",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2023-02-29T02:36:48Z",
    "region": "us-west-2",
    "resources": [
        "arn:aws:ecr:us-west-2:123456789012:repository/docker-hub/alpine"
    ],
    "detail": {
        "rule-version": "1",
        "sync-status": "SUCCESS",
        "ecr-repository-prefix": "docker-hub",
        "repository-name": "docker-hub/alpine",
        "upstream-registry-url": "public.ecr.aws",
        "image-tag": "3.17.2",
        "image-digest": "sha256:4aa08ef415aecc80814cb42fa41b658480779d80c77ab15EXAMPLE",
    }
}
```

**완료된 이미지 스캔에 대한 이벤트(기본 스캔)**

레지스트리에 대한 기본 스캔이 사용 설정되면 각 이미지 스캔이 완료될 때 다음 이벤트가 전송됩니다. `finding-severity-counts` 파라미터는 심각도 수준이 있는 경우에만 값을 반환합니다. 예를 들어, 이미지에 `CRITICAL` 수준의 결과가 없으면 심각 카운트가 반환되지 않습니다. 자세한 내용은 [이미지에서 Amazon ECR의 OS 취약성 스캔](image-scanning-basic.md) 단원을 참조하십시오.

**참고**  
고급 스캔이 사용 설정된 경우 Amazon Inspector에서 발생하는 이벤트에 대한 자세한 내용은 [Amazon ECR의 고급 스캔을 위한 EventBridge 이벤트 전송](image-scanning-enhanced-events.md) 섹션을 참조하세요.

```
{
    "version": "0",
    "id": "85fc3613-e913-7fc4-a80c-a3753e4aa9ae",
    "detail-type": "ECR Image Scan",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2019-10-29T02:36:48Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ecr:us-east-1:123456789012:repository/my-repository-name"
    ],
    "detail": {
        "scan-status": "COMPLETE",
        "repository-name": "my-repository-name",
        "finding-severity-counts": {
	       "CRITICAL": 10,
	       "MEDIUM": 9
	     },
        "image-digest": "sha256:7f5b2640fe6fb4f46592dfd3410c4a79dac4f89e4782432e0378abcd1234",
        "image-tags": []
    }
}
```

**고급 스캔을 사용 설정한 리소스의 변경 알림에 대한 이벤트(고급 스캔)**

레지스트리에 대해 고급 스캔이 사용 설정된 경우 고급 스캔이 활성화된 리소스가 변경되면 Amazon ECR에서 다음 이벤트를 전송합니다. 여기에는 생성 중인 새 리포지토리, 변경 중인 리포지토리의 스캔 빈도 또는 고급 스캔이 사용 설정된 리포지토리에서 이미지를 생성하거나 삭제하는 시점이 포함됩니다. 자세한 내용은 [이미지에서 Amazon ECR의 소프트웨어 취약성 스캔](image-scanning.md) 단원을 참조하십시오.

```
{
	"version": "0",
	"id": "0c18352a-a4d4-6853-ef53-0ab8638973bf",
	"detail-type": "ECR Scan Resource Change",
	"source": "aws.ecr",
	"account": "123456789012",
	"time": "2021-10-14T20:53:46Z",
	"region": "us-east-1",
	"resources": [],
	"detail": {
		"action-type": "SCAN_FREQUENCY_CHANGE",
		"repositories": [{
				"repository-name": "repository-1",
				"repository-arn": "arn:aws:ecr:us-east-1:123456789012:repository/repository-1",
				"scan-frequency": "SCAN_ON_PUSH",
				"previous-scan-frequency": "MANUAL"
			},
			{
				"repository-name": "repository-2",
				"repository-arn": "arn:aws:ecr:us-east-1:123456789012:repository/repository-2",
				"scan-frequency": "CONTINUOUS_SCAN",
				"previous-scan-frequency": "SCAN_ON_PUSH"
			},
			{
				"repository-name": "repository-3",
				"repository-arn": "arn:aws:ecr:us-east-1:123456789012:repository/repository-3",
				"scan-frequency": "CONTINUOUS_SCAN",
				"previous-scan-frequency": "SCAN_ON_PUSH"
			}
		],
		"resource-type": "REPOSITORY",
		"scan-type": "ENHANCED"
	}
}
```

**이미지 삭제에 대한 이벤트**

이미지가 삭제되면 다음 이벤트가 전송됩니다. 자세한 내용은 [Amazon ECR에서 이미지 삭제](delete_image.md) 단원을 참조하십시오.

```
{
    "version": "0",
    "id": "dd3b46cb-2c74-f49e-393b-28286b67279d",
    "detail-type": "ECR Image Action",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2019-11-16T02:01:05Z",
    "region": "us-west-2",
    "resources": [],
    "detail": {
        "result": "SUCCESS",
        "repository-name": "my-repository-name",
        "image-digest": "sha256:7f5b2640fe6fb4f46592dfd3410c4a79dac4f89e4782432e0378abcd1234",
        "action-type": "DELETE",
        "image-tag": "latest"
    }
}
```

**이미지 아카이브 작업에 대한 이벤트**

이미지가 아카이브되면 다음 이벤트가 전송됩니다. `target-storage-class` 필드는 로 설정됩니다`ARCHIVE`. 이벤트에는 아카이브되는 콘텐츠 유형을 식별하기 위한 매니페스트 및 아티팩트 미디어 유형이 포함됩니다.

```
{
    "version": "0",
    "id": "4f5ec4d5-4de4-7aad-a046-EXAMPLE",
    "detail-type": "ECR Image Action",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2019-08-06T00:58:09Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "action-type": "UPDATE_STORAGE_CLASS",
        "target-storage-class": "ARCHIVE",
        "image-digest": "sha256:f98d67af8e53a536502bfc600de3266556b06ed635a32d60aa7a5fe6d7e609d7",
        "repository-name": "ubuntu",
        "result": "SUCCESS",
        "manifest-media-type": "application/vnd.oci.image.manifest.v1+json",
        "artifact-media-type": "application/vnd.oci.image.config.v1+json"
    }
}
```

**이미지 복원 작업에 대한 이벤트**

아카이브된 이미지가 복원되면 다음 이벤트가 전송됩니다. `target-storage-class` 필드는 로 설정됩니다`STANDARD`. 이벤트에는 이미지가 마지막으로 복원된 시기를 보여주는 `last-activated-at` 필드가 포함됩니다.

```
{
    "version": "0",
    "id": "7b8fc5e6-5ef5-8bbe-b157-EXAMPLE",
    "detail-type": "ECR Image Action",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2019-08-06T01:15:22Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "action-type": "UPDATE_STORAGE_CLASS",
        "target-storage-class": "STANDARD",
        "image-digest": "sha256:f98d67af8e53a536502bfc600de3266556b06ed635a32d60aa7a5fe6d7e609d7",
        "repository-name": "ubuntu",
        "result": "SUCCESS",
        "manifest-media-type": "application/vnd.oci.image.manifest.v1+json",
        "artifact-media-type": "application/vnd.oci.image.config.v1+json",
        "last-activated-at": "2025-10-10T19:13:02.74Z"
    }
}
```

**참조자 복원 작업에 대한 이벤트**

아카이브된 참조자(SBOM, 서명 또는 증명과 같은 참조 아티팩트)가 복원되면 다음 이벤트가 전송됩니다. `detail-type`는 일반 이미지 작업과 구별`ECR Referrer Action`하기 위한 것입니다. `manifest-media-type` 및 `artifact-media-type` 필드는 복원되는 특정 유형의 참조자를 식별합니다. 이 예제에서는 SBOM 아티팩트가 복원되고 있습니다.

```
{
    "version": "0",
    "id": "8c9gd6f7-6fg6-9ccf-c268-EXAMPLE",
    "detail-type": "ECR Referrer Action",
    "source": "aws.ecr",
    "account": "123456789012",
    "time": "2019-08-06T01:20:45Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "action-type": "UPDATE_STORAGE_CLASS",
        "target-storage-class": "STANDARD",
        "image-digest": "sha256:f98d67af8e53a536502bfc600de3266556b06ed635a32d60aa7a5fe6d7e609d7",
        "repository-name": "sbom",
        "result": "SUCCESS",
        "manifest-media-type": "application/vnd.cncf.oras.artifact.manifest.v1+json",
        "artifact-media-type": "text/sbom+json",
        "last-activated-at": "2025-10-10T19:13:02.74Z"
    }
}
```

**완료된 이미지 복제에 대한 이벤트**

각 이미지 복제가 완료되면 다음 이벤트가 전송됩니다. 자세한 내용은 [Amazon ECR에서 프라이빗 이미지 복제](replication.md) 단원을 참조하십시오.

```
{
  "version": "0",
  "id": "c8b133b1-6029-ee73-e2a1-4f466b8ba999",
  "detail-type": "ECR Replication Action",
  "source": "aws.ecr",
  "account": "123456789012",
  "time": "2024-05-08T20:44:54Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ecr:us-east-1:123456789012:repository/docker-hub/alpine"
  ],
  "detail": {
    "result": "SUCCESS",
    "repository-name": "docker-hub/alpine",
    "image-digest": "sha256:7f5b2640fe6fb4f46592dfd3410c4a79dac4f89e4782432e0378abcd1234",
    "source-account": "123456789012",
    "action-type": "REPLICATE",
    "source-region": "us-west-2",
    "image-tag": "3.17.2"
  }
}
```

**실패한 이미지 복제에 대한 이벤트**

이미지 복제가 완료되면 다음 이벤트가 전송됩니다. `result` 필드에는 `FAILED`가 포함되며 이벤트 세부 정보에 추가 오류 정보가 포함될 수 있습니다.

```
{
  "version": "0",
  "id": "d9c244c2-7130-ff84-f3b2-5g577c9cb000",
  "detail-type": "ECR Replication Action",
  "source": "aws.ecr",
  "account": "123456789012",
  "time": "2024-05-08T20:45:12Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ecr:us-east-1:123456789012:repository/my-app"
  ],
  "detail": {
    "result": "FAILED",
    "repository-name": "my-app",
    "image-digest": "sha256:8g6c3751gf7gc5g47603ege4511d5a80ead5g90f5893543f1489bde2345",
    "source-account": "123456789012",
    "action-type": "REPLICATE",
    "source-region": "us-west-2",
    "image-tag": "latest"
  }
}
```

# 를 사용하여 Amazon ECR 작업 로깅 AWS CloudTrail
<a name="logging-using-cloudtrail"></a>

Amazon ECR은 Amazon ECR에서 사용자 AWS CloudTrail, 역할 또는 서비스가 수행한 작업에 대한 레코드를 제공하는 AWS 서비스와 통합됩니다. CloudTrail은 다음의 Amazon ECR 작업을 이벤트로 캡처합니다.
+ Amazon ECR 콘솔의 호출을 포함한 모든 API 호출
+ 리포지토리의 암호화 설정으로 인해 수행된 모든 작업
+ 수명 주기 정책 규칙으로 인해 수행된 모든 작업(성공 및 실패 작업 모두 포함)
**중요**  
개별 CloudTrail 이벤트에 크기 제한이 있기 때문에 Amazon ECR은 10개 이상의 이미지가 만료된 수명 주기 정책 작업에 대해 CloudTrail에 여러 개의 이벤트를 전송합니다. 또한 Amazon ECR에서는 이미지당 최대 100개의 태그를 추가할 수 있습니다.

추적을 생성하는 경우 Amazon ECR 이벤트를 포함한 CloudTrail 이벤트를 지속적으로 Amazon S3 버킷에 전달할 수 있습니다. 추적을 구성하지 않은 경우에도 **이벤트 기록**에서 CloudTrail 콘솔의 최신 이벤트를 볼 수 있습니다. 이 정보를 사용하여 Amazon ECR에 수행된 요청, 요청이 발생하는 IP 주소, 요청을 수행한 사용자, 요청이 수행된 시간 및 추가 세부 정보를 확인할 수 있습니다.

자세한 내용은 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하십시오.

## CloudTrail의 Amazon ECR 정보
<a name="service-name-info-in-cloudtrail"></a>

 AWS 계정을 생성할 때 계정에서 CloudTrail이 활성화됩니다. Amazon ECR에서 활동이 수행되면 해당 활동은 **이벤트 기록(Event history)**에서 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. AWS 계정에서 최근 이벤트를 보고 검색하고 다운로드할 수 있습니다. 자세한 설명은 [CloudTrail 이벤트 기록으로 이벤트 보기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)를 참조하세요.

Amazon ECR에 대한 이벤트를 포함하여 AWS 계정에 이벤트를 지속적으로 기록하려면 추적을 생성합니다. CloudTrail은 추적을 사용하여 Amazon S3 버킷으로 로그 파일을 전송할 수 있습니다. 콘솔에서 추적을 생성할 때 추적을 단일 리전 또는 모든 리전에 적용할 수 있습니다. 추적은 AWS 파티션의 이벤트를 로깅하고 지정한 Amazon S3 버킷으로 로그 파일을 전송합니다. 또한 CloudTrail 로그에서 수집된 이벤트 데이터를 분석 및 처리하도록 다른 AWS 서비스를 구성할 수 있습니다. 자세한 내용은 다음을 참조하세요.
+ [AWS 계정에 대한 추적 생성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [AWS CloudTrail 로그와의 서비스 통합](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [CloudTrail에 대한 Amazon SNS 알림 구성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [여러 리전에서 CloudTrail 로그 파일 수신](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html) 및 [여러 계정에서 CloudTrail 로그 파일 수신](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

모든 Amazon ECR API 작업은 CloudTrail에서 로깅되며 [Amazon Elastic Container Registry API 참조](https://docs.aws.amazon.com/AmazonECR/latest/APIReference/)에 설명되어 있습니다. 일반 작업을 수행하는 경우 해당 작업의 일부인 각 API 작업에 대한 CloudTrail 로그 파일에 섹션이 생성됩니다. 예를 들어 리포지토리를 생성하는 경우 `GetAuthorizationToken`, `CreateRepository` 및 `SetRepositoryPolicy` 섹션이 CloudTrail 로그 파일에 생성됩니다. 이미지를 리포지토리, `InitiateLayerUpload`, `UploadLayerPart`, `PutImage`, `CompleteLayerUpload`에 푸시하면 BLOB 탑재가 활성화된 경우 `MountLayer` 섹션이 생성됩니다. 이미지를 가져오면 `GetDownloadUrlForLayer` 및 `BatchGetImage` 섹션이 생성됩니다. 이미지를 보관하거나 복원하면 `UpdateImageStorageClass` 섹션이 생성됩니다. OCI 1.1 사양을 지원하는 OCI 클라이언트가 Referrers API를 사용하는 이미지에 대한 레퍼러 또는 참조 아티팩트 목록을 가져올 때 `ListImageReferrers` CloudTrail 이벤트가 발생합니다. 이러한 일반적인 작업의 예시는 [CloudTrail 로그 항목 예제](#cloudtrail-examples)를 참조하세요.

모든 이벤트 또는 로그 항목에는 요청을 생성했던 사용자에 관한 정보가 포함됩니다. ID 정보를 이용하면 다음을 쉽게 판단할 수 있습니다.
+ 요청을 루트로 했는지 아니면 사용자 보안 인증으로 했는지 여부
+ 역할 또는 연합된 사용자에 대한 임시 보안 인증을 사용하여 요청이 생성되었는지 여부
+ 요청이 다른 AWS 서비스에서 이루어졌는지 여부

자세한 내용은 [CloudTrail `userIdentity` 요소](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)를 참조하세요.

## Amazon ECR 로그 파일 항목 이해
<a name="understanding-service-name-entries"></a>

추적이란 지정한 Amazon S3 버킷에 이벤트를 로그 파일로 입력할 수 있게 하는 구성입니다. CloudTrail 로그 파일에는 하나 이상의 로그 항목이 포함될 수 있습니다. 이벤트는 모든 소스로부터의 단일 요청을 나타내며 요청 작업, 작업 날짜와 시간, 요청 파라미터 등에 대한 정보가 들어 있습니다. CloudTrail 로그 파일은 퍼블릭 API 직접 호출에 대한 순서 지정된 스택 추적이 아니기 때문에 특정 순서로 표시되지 않습니다.

### CloudTrail 로그 항목 예제
<a name="cloudtrail-examples"></a>

다음은 몇 가지 일반 Amazon ECR 작업에 대한 CloudTrail 로그 항목의 예입니다.

이들 예제는 서식을 조정하여 가독성을 높인 것입니다. CloudTrail 로그 파일에서는 모든 항목 및 이벤트가 한 줄로 연결되어 있습니다. 또한 이 예제는 단일 Amazon ECR 항목으로 제한된 것입니다. 실제 CloudTrail 로그 파일에는 여러 AWS 서비스의 항목과 이벤트가 표시됩니다.

**중요**  
**sourceIPAddress**는 요청이 이루어진 IP 주소입니다. 서비스 콘솔에서 시작된 작업의 경우 보고된 주소는 콘솔 웹 서버가 아닌 기반 리소스의 주소입니다. 의 서비스의 경우 DNS 이름 AWS만 표시됩니다. AWS 서비스 DNS 이름으로 리디렉션된 경우에도 클라이언트 소스 IP로 인증을 평가합니다.

**Topics**
+ [

#### 예: 리포지토리 생성 작업
](#cloudtrail-examples-create-repository)
+ [

#### 예: Amazon ECR 리포지토리 생성 시 AWS KMS `CreateGrant` API 작업
](#cloudtrail-examples-create-repository-kms)
+ [

#### 예제: 이미지 푸시 작업
](#cloudtrail-examples-push-image)
+ [

#### 예제: 이미지 가져오기 작업
](#cloudtrail-examples-image-pull)
+ [

#### 예제: 이미지 수명 주기 정책 작업
](#cloudtrail-examples-lcp)
+ [

#### 예: 이미지 아카이브 작업
](#cloudtrail-examples-image-archive)
+ [

#### 예: 이미지 복원 작업
](#cloudtrail-examples-image-restore)
+ [

#### 예: 이미지 레퍼러 작업
](#cloudtrail-examples-image-referrers-action)

#### 예: 리포지토리 생성 작업
<a name="cloudtrail-examples-create-repository"></a>

다음은 `CreateRepository` 작업을 설명하는 CloudTrail 로그 항목을 보여 주는 예시입니다.

```
{
    "eventVersion": "1.04",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AIDACKCEVSQ6C2EXAMPLE:account_name",
        "arn": "arn:aws:sts::123456789012:user/Mary_Major",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2018-07-11T21:54:07Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AIDACKCEVSQ6C2EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/Admin",
                "accountId": "123456789012",
                "userName": "Admin"
            }
        }
    },
    "eventTime": "2018-07-11T22:17:43Z",
    "eventSource": "ecr.amazonaws.com",
    "eventName": "CreateRepository",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "203.0.113.12",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "repositoryName": "testrepo"
    },
    "responseElements": {
        "repository": {
            "repositoryArn": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo",
            "repositoryName": "testrepo",
            "repositoryUri": "123456789012.dkr.ecr.us-east-2.amazonaws.com/testrepo",
            "createdAt": "Jul 11, 2018 10:17:44 PM",
            "registryId": "123456789012"
        }
    },
    "requestID": "cb8c167e-EXAMPLE",
    "eventID": "e3c6f4ce-EXAMPLE",
    "resources": [
        {
            "ARN": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo",
            "accountId": "123456789012"
        }
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}
```

#### 예: Amazon ECR 리포지토리 생성 시 AWS KMS `CreateGrant` API 작업
<a name="cloudtrail-examples-create-repository-kms"></a>

다음 예제는 KMS 암호화가 활성화된 Amazon ECR AWS KMS 리포지토리를 생성할 때 `CreateGrant` 작업을 보여주는 CloudTrail 로그 항목을 보여줍니다. KMS 암호화가 활성화되고 생성된 각 리포지토리에 대해 CloudTrail에 두 개의 `CreateGrant` 로그 항목이 표시되어야 합니다.

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAIEP6W46J43IG7LXAQ",
        "arn": "arn:aws:iam::123456789012:user/Mary_Major",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Mary_Major",
        "sessionContext": {
            "sessionIssuer": {
                
            },
            "webIdFederationData": {
                
            },
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2020-06-10T19:22:10Z"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2020-06-10T19:22:10Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "203.0.113.12",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "keyId": "4b55e5bf-39c8-41ad-b589-18464af7758a",
        "granteePrincipal": "ecr.us-west-2.amazonaws.com",
        "operations": [
            "GenerateDataKey",
            "Decrypt"
        ],
        "retiringPrincipal": "ecr.us-west-2.amazonaws.com",
        "constraints": {
            "encryptionContextSubset": {
                "aws:ecr:arn": "arn:aws:ecr:us-west-2:123456789012:repository/testrepo"
            }
        }
    },
    "responseElements": {
        "grantId": "3636af9adfee1accb67b83941087dcd45e7fadc4e74ff0103bb338422b5055f3"
    },
    "requestID": "047b7dea-b56b-4013-87e9-a089f0f6602b",
    "eventID": "af4c9573-c56a-4886-baca-a77526544469",
    "readOnly": false,
    "resources": [
        {
            "accountId": "123456789012",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:123456789012:key/4b55e5bf-39c8-41ad-b589-18464af7758a"
        }
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}
```

#### 예제: 이미지 푸시 작업
<a name="cloudtrail-examples-push-image"></a>

다음 예제는 `PutImage` 작업을 사용하는 이미지 푸시를 시연하는 CloudTrail 로그 항목을 보여줍니다.

**참고**  
이미지를 푸시하는 경우 CloudTrail 로그에서 `InitiateLayerUpload`, `UploadLayerPart` 및 `CompleteLayerUpload` 참조 또한 확인할 수 있습니다.

```
{
    "eventVersion": "1.04",
    "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDACKCEVSQ6C2EXAMPLE:account_name",
    "arn": "arn:aws:sts::123456789012:user/Mary_Major",
    "accountId": "123456789012",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
		"userName": "Mary_Major",
		"sessionContext": {
			"attributes": {
				"mfaAuthenticated": "false",
				"creationDate": "2019-04-15T16:42:14Z"
			}
		}
	},
	"eventTime": "2019-04-15T16:45:00Z",
	"eventSource": "ecr.amazonaws.com",
	"eventName": "PutImage",
	"awsRegion": "us-east-2",
	"sourceIPAddress": "AWS Internal",
	"userAgent": "AWS Internal",
	"requestParameters": {
		"repositoryName": "testrepo",
		"imageTag": "latest",
		"registryId": "123456789012",
		"imageManifest": "{\n   \"schemaVersion\": 2,\n   \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n   \"config\": {\n      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n      \"size\": 5543,\n      \"digest\": \"sha256:000b9b805af1cdb60628898c9f411996301a1c13afd3dbef1d8a16ac6dbf503a\"\n   },\n   \"layers\": [\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 43252507,\n         \"digest\": \"sha256:3b37166ec61459e76e33282dda08f2a9cd698ca7e3d6bc44e6a6e7580cdeff8e\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 846,\n         \"digest\": \"sha256:504facff238fde83f1ca8f9f54520b4219c5b8f80be9616ddc52d31448a044bd\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 615,\n         \"digest\": \"sha256:ebbcacd28e101968415b0c812b2d2dc60f969e36b0b08c073bf796e12b1bb449\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 850,\n         \"digest\": \"sha256:c7fb3351ecad291a88b92b600037e2435c84a347683d540042086fe72c902b8a\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 168,\n         \"digest\": \"sha256:2e3debadcbf7e542e2aefbce1b64a358b1931fb403b3e4aeca27cb4d809d56c2\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 37720774,\n         \"digest\": \"sha256:f8c9f51ad524d8ae9bf4db69cd3e720ba92373ec265f5c390ffb21bb0c277941\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 30432107,\n         \"digest\": \"sha256:813a50b13f61cf1f8d25f19fa96ad3aa5b552896c83e86ce413b48b091d7f01b\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 197,\n         \"digest\": \"sha256:7ab043301a6187ea3293d80b30ba06c7bf1a0c3cd4c43d10353b31bc0cecfe7d\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 154,\n         \"digest\": \"sha256:67012cca8f31dc3b8ee2305e7762fee20c250513effdedb38a1c37784a5a2e71\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 176,\n         \"digest\": \"sha256:3bc892145603fffc9b1c97c94e2985b4cb19ca508750b15845a5d97becbd1a0e\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 183,\n         \"digest\": \"sha256:6f1c79518f18251d35977e7e46bfa6c6b9cf50df2a79d4194941d95c54258d18\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 212,\n         \"digest\": \"sha256:b7bcfbc2e2888afebede4dd1cd5eebf029bb6315feeaf0b56e425e11a50afe42\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 212,\n         \"digest\": \"sha256:2b220f8b0f32b7c2ed8eaafe1c802633bbd94849b9ab73926f0ba46cdae91629\"\n      }\n   ]\n}"
	},
	"responseElements": {
		"image": {
			"repositoryName": "testrepo",
			"imageManifest": "{\n   \"schemaVersion\": 2,\n   \"mediaType\": \"application/vnd.docker.distribution.manifest.v2+json\",\n   \"config\": {\n      \"mediaType\": \"application/vnd.docker.container.image.v1+json\",\n      \"size\": 5543,\n      \"digest\": \"sha256:000b9b805af1cdb60628898c9f411996301a1c13afd3dbef1d8a16ac6dbf503a\"\n   },\n   \"layers\": [\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 43252507,\n         \"digest\": \"sha256:3b37166ec61459e76e33282dda08f2a9cd698ca7e3d6bc44e6a6e7580cdeff8e\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 846,\n         \"digest\": \"sha256:504facff238fde83f1ca8f9f54520b4219c5b8f80be9616ddc52d31448a044bd\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 615,\n         \"digest\": \"sha256:ebbcacd28e101968415b0c812b2d2dc60f969e36b0b08c073bf796e12b1bb449\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 850,\n         \"digest\": \"sha256:c7fb3351ecad291a88b92b600037e2435c84a347683d540042086fe72c902b8a\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 168,\n         \"digest\": \"sha256:2e3debadcbf7e542e2aefbce1b64a358b1931fb403b3e4aeca27cb4d809d56c2\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 37720774,\n         \"digest\": \"sha256:f8c9f51ad524d8ae9bf4db69cd3e720ba92373ec265f5c390ffb21bb0c277941\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 30432107,\n         \"digest\": \"sha256:813a50b13f61cf1f8d25f19fa96ad3aa5b552896c83e86ce413b48b091d7f01b\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 197,\n         \"digest\": \"sha256:7ab043301a6187ea3293d80b30ba06c7bf1a0c3cd4c43d10353b31bc0cecfe7d\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 154,\n         \"digest\": \"sha256:67012cca8f31dc3b8ee2305e7762fee20c250513effdedb38a1c37784a5a2e71\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 176,\n         \"digest\": \"sha256:3bc892145603fffc9b1c97c94e2985b4cb19ca508750b15845a5d97becbd1a0e\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 183,\n         \"digest\": \"sha256:6f1c79518f18251d35977e7e46bfa6c6b9cf50df2a79d4194941d95c54258d18\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 212,\n         \"digest\": \"sha256:b7bcfbc2e2888afebede4dd1cd5eebf029bb6315feeaf0b56e425e11a50afe42\"\n      },\n      {\n         \"mediaType\": \"application/vnd.docker.image.rootfs.diff.tar.gzip\",\n         \"size\": 212,\n         \"digest\": \"sha256:2b220f8b0f32b7c2ed8eaafe1c802633bbd94849b9ab73926f0ba46cdae91629\"\n      }\n   ]\n}",
			"registryId": "123456789012",
			"imageId": {
				"imageDigest": "sha256:98c8b060c21d9adbb6b8c41b916e95e6307102786973ab93a41e8b86d1fc6d3e",
				"imageTag": "latest"
			}
		}
	},
	"requestID": "cf044b7d-5f9d-11e9-9b2a-95983139cc57",
	"eventID": "2bfd4ee2-2178-4a82-a27d-b12939923f0f",
	"resources": [{
		"ARN": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo",
		"accountId": "123456789012"
	}],
	"eventType": "AwsApiCall",
	"recipientAccountId": "123456789012"
}
```

#### 예제: 이미지 가져오기 작업
<a name="cloudtrail-examples-image-pull"></a>

다음은 `BatchGetImage` 작업을 사용한 이미지 가져오기를 시연하는 CloudTrail 로그 항목을 보여주는 예제입니다.

**참고**  
이미지를 가져오는 경우 로컬에 해당 이미지가 없다면 CloudTrail 로그에서 `GetDownloadUrlForLayer` 참조 또한 확인할 수 있습니다.

```
{
    "eventVersion": "1.04",
    "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDACKCEVSQ6C2EXAMPLE:account_name",
    "arn": "arn:aws:sts::123456789012:user/Mary_Major",
    "accountId": "123456789012",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
		"userName": "Mary_Major",
		"sessionContext": {
			"attributes": {
				"mfaAuthenticated": "false",
				"creationDate": "2019-04-15T16:42:14Z"
			}
		}
	},
	"eventTime": "2019-04-15T17:23:20Z",
	"eventSource": "ecr.amazonaws.com",
	"eventName": "BatchGetImage",
	"awsRegion": "us-east-2",
	"sourceIPAddress": "ecr.amazonaws.com",
	"userAgent": "ecr.amazonaws.com",
	"requestParameters": {
		"imageIds": [{
			"imageTag": "latest"
		}],
		"acceptedMediaTypes": [
			"application/json",
			"application/vnd.oci.image.manifest.v1+json",
			"application/vnd.oci.image.index.v1+json",
			"application/vnd.docker.distribution.manifest.v2+json",
			"application/vnd.docker.distribution.manifest.list.v2+json",
			"application/vnd.docker.distribution.manifest.v1+prettyjws"
		],
		"repositoryName": "testrepo",
		"registryId": "123456789012"
	},
	"responseElements": null,
	"requestID": "2a1b97ee-5fa3-11e9-a8cd-cd2391aeda93",
	"eventID": "c84f5880-c2f9-4585-9757-28fa5c1065df",
	"resources": [{
		"ARN": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo",
		"accountId": "123456789012"
	}],
	"eventType": "AwsApiCall",
	"recipientAccountId": "123456789012"
}
```

#### 예제: 이미지 수명 주기 정책 작업
<a name="cloudtrail-examples-lcp"></a>

다음 예제에서는 수명 주기 정책 규칙으로 인해 이미지가 만료되는 시점을 보여주는 CloudTrail 로그 항목을 보여줍니다. 이 이벤트 유형은 이벤트 이름 필드에서 `PolicyExecutionEvent`를 필터링하여 찾을 수 있습니다.

수명 주기 정책 미리 보기를 테스트하면 Amazon ECR은 이벤트 이름 필드가 `DryRunEvent`이고 구조가 `PolicyExecutionEvent`와 정확히 동일한 CloudTrail 로그 항목을 생성합니다. 이벤트 이름을 `DryRunEvent`로 변경하면 대신 드라이 런 이벤트를 필터링할 수 있습니다.

**중요**  
개별 CloudTrail 이벤트에 크기 제한이 있기 때문에 Amazon ECR은 10개 이상의 이미지가 만료된 수명 주기 정책 작업에 대해 CloudTrail에 여러 개의 이벤트를 전송합니다. 또한 Amazon ECR에서는 이미지당 최대 100개의 태그를 추가할 수 있습니다.

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "accountId": "123456789012",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2020-03-12T20:22:12Z",
    "eventSource": "ecr.amazonaws.com",
    "eventName": "PolicyExecutionEvent",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": null,
    "responseElements": null,
    "eventID": "9354dd7f-9aac-4e9d-956d-12561a4923aa",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:ecr:us-west-2:123456789012:repository/testrepo",
            "accountId": "123456789012",
            "type": "AWS::ECR::Repository"
        }
    ],
    "eventType": "AwsServiceEvent",
    "recipientAccountId": "123456789012",
    "serviceEventDetails": {
        "repositoryName": "testrepo",
        "lifecycleEventPolicy": {
            "lifecycleEventRules": [
                {
                    "rulePriority": 1,
                    "description": "remove all images > 2",
                    "lifecycleEventSelection": {
                        "tagStatus": "Any",
                        "tagPrefixList": [],
                        "countType": "Image count more than",
                        "countNumber": 2
                    },
                    "action": "expire"
                }
            ],
            "lastEvaluatedAt": 0,
            "policyVersion": 1,
            "policyId": "ceb86829-58e7-9498-920c-aa042e33037b"
        },
        "lifecycleEventImageActions": [
            {
                "lifecycleEventImage": {
                    "digest": "sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45",
                    "tagStatus": "Tagged",
                    "tagList": [
                        "alpine"
                    ],
                    "pushedAt": 1584042813000
                },
                "rulePriority": 1
            },
            {
                "lifecycleEventImage": {
                    "digest": "sha256:6ab380c5a5acf71c1b6660d645d2cd79cc8ce91b38e0352cbf9561e050427baf",
                    "tagStatus": "Tagged",
                    "tagList": [
                        "centos"
                    ],
                    "pushedAt": 1584042842000
                },
                "rulePriority": 1
            }
        ],
        "lifecycleEventFailureDetails": [
            {
                "lifecycleEventImage": {
                    "digest": "sha256:9117e1bc28cd20751e584b4ccd19b1178d14cf02d134b04ce6be0cc51bff762a",
                    "tagStatus": "Untagged",
                    "tagList": [],
                    "pushedAt": 1584042844000
                },
                "rulePriority": 1,
                "failureCode": "ImageReferencedByManifestList",
                "failureReason": "Requested image referenced by manifest list: [sha256:4b27c83d44a18c31543039d9e8b2786043ec6c8d00804d5800c5148d6b6f65bc]"
            }
        ]
    }
}
```

#### 예: 이미지 아카이브 작업
<a name="cloudtrail-examples-image-archive"></a>

다음 예제는가 로 `targetStorageClass` 설정된 `UpdateImageStorageClass` 작업을 사용하여 아카이브되는 이미지를 보여주는 CloudTrail 로그 항목을 보여줍니다`ARCHIVE`.

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDACKCEVSQ6C2EXAMPLE:account_name",
        "arn": "arn:aws:sts::123456789012:user/Mary_Major",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
		"userName": "Mary_Major",
		"sessionContext": {
			"attributes": {
				"mfaAuthenticated": "false",
				"creationDate": "2019-04-15T16:42:14Z"
			}
		}
	},
	"eventTime": "2019-04-15T16:45:00Z",
	"eventSource": "ecr.amazonaws.com",
	"eventName": "UpdateImageStorageClass",
	"awsRegion": "us-east-2",
	"sourceIPAddress": "AWS Internal",
	"userAgent": "AWS Internal",
	"requestParameters": {
		"repositoryName": "testrepo",
		"imageId": {
			"imageDigest": "sha256:98c8b060c21d9adbb6b8c41b916e95e6307102786973ab93a41e8b86d1fc6d3e"
		},
		"targetStorageClass": "ARCHIVE",
		"registryId": "123456789012"
	},
	"responseElements": {
		"image": {
			"registryId": "123456789012",
			"repositoryName": "testrepo",
			"imageId": {
				"imageDigest": "sha256:98c8b060c21d9adbb6b8c41b916e95e6307102786973ab93a41e8b86d1fc6d3e"
			},
			"imageStatus": "ARCHIVED"
		}
	},
	"requestID": "cf044b7d-EXAMPLE",
	"eventID": "2bfd4ee2-EXAMPLE",
	"readOnly": false,
	"resources": [{
		"ARN": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo",
		"accountId": "123456789012"
	}],
	"eventType": "AwsApiCall",
	"managementEvent": true,
	"recipientAccountId": "123456789012",
	"eventCategory": "Management"
}
```

#### 예: 이미지 복원 작업
<a name="cloudtrail-examples-image-restore"></a>

다음 예제에서는 복원 중인 이미지를 보여주는 CloudTrail 로그 항목을 보여줍니다. 아카이브된 이미지를 복원하면 두 개의 이벤트가 생성됩니다.

1. 복원이 시작될 때 API 호출 이벤트

1. 비동기 복원 작업이 완료될 때의 서비스 이벤트

**API 호출 이벤트(복원 시작)**

다음 예제는가 로 `targetStorageClass` 설정된 `UpdateImageStorageClass` 작업을 사용하여 이미지를 복원하기 위한 초기 API 호출을 보여줍니다`STANDARD`. 응답에는 이미지 상태가 로 표시됩니다`ACTIVATING`.

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDACKCEVSQ6C2EXAMPLE:account_name",
        "arn": "arn:aws:sts::123456789012:user/Mary_Major",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
		"userName": "Mary_Major",
		"sessionContext": {
			"attributes": {
				"mfaAuthenticated": "false",
				"creationDate": "2019-04-15T16:42:14Z"
			}
		}
	},
	"eventTime": "2019-04-15T16:45:00Z",
	"eventSource": "ecr.amazonaws.com",
	"eventName": "UpdateImageStorageClass",
	"awsRegion": "us-east-2",
	"sourceIPAddress": "AWS Internal",
	"userAgent": "AWS Internal",
	"requestParameters": {
		"repositoryName": "testrepo",
		"imageId": {
			"imageDigest": "sha256:98c8b060c21d9adbb6b8c41b916e95e6307102786973ab93a41e8b86d1fc6d3e"
		},
		"targetStorageClass": "STANDARD",
		"registryId": "123456789012"
	},
	"responseElements": {
		"image": {
			"registryId": "123456789012",
			"repositoryName": "testrepo",
			"imageId": {
				"imageDigest": "sha256:98c8b060c21d9adbb6b8c41b916e95e6307102786973ab93a41e8b86d1fc6d3e"
			},
			"imageStatus": "ACTIVATING"
		}
	},
	"requestID": "cf044b7d-EXAMPLE",
	"eventID": "2bfd4ee2-EXAMPLE",
	"readOnly": false,
	"resources": [{
		"ARN": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo",
		"accountId": "123456789012"
	}],
	"eventType": "AwsApiCall",
	"managementEvent": true,
	"recipientAccountId": "123456789012",
	"eventCategory": "Management"
}
```

**서비스 이벤트(복원 완료)**

다음 예제는 비동기 복원 작업이 완료될 때 생성되는 서비스 이벤트를 보여줍니다. 이 이벤트 유형은 이벤트 이름 필드에서 `ImageActivationEvent`를 필터링하여 찾을 수 있습니다. `serviceEventDetails` 섹션에는 복원 결과 및 최종 이미지 상태가 포함되어 있습니다.

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "accountId": "123456789012",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2020-03-12T20:22:12Z",
    "eventSource": "ecr.amazonaws.com",
    "eventName": "ImageActivationEvent",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": null,
    "responseElements": null,
    "eventID": "9354dd7f-EXAMPLE",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:ecr:us-west-2:123456789012:repository/testrepo",
            "accountId": "123456789012",
            "type": "AWS::ECR::Repository"
        }
    ],
    "eventType": "AwsServiceEvent",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "serviceEventDetails": {
        "repositoryName": "testrepo",
        "imageDigest": "sha256:98c8b060c21d9adbb6b8c41b916e95e6307102786973ab93a41e8b86d1fc6d3e",
        "targetStorageClass": "STANDARD",
        "result": "SUCCESS",
        "imageStatus": "ACTIVE"
    },
    "eventCategory": "Management"
}
```

#### 예: 이미지 레퍼러 작업
<a name="cloudtrail-examples-image-referrers-action"></a>

다음 예제는 OCI 1.1 규정을 준수하는 클라이언트가 `Referrers` API를 사용하여 이미지에 대한 참조자 또는 참조 아티팩트 목록을 가져오는 시기를 보여주는 AWS CloudTrail 로그 항목을 보여줍니다.

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AIDACKCEVSQ6C2EXAMPLE:account_name",
        "arn": "arn:aws:sts::123456789012:user/Mary_Major",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AIDACKCEVSQ6C2EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/Admin",
                "accountId": "123456789012",
                "userName": "Admin"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-10-08T16:38:39Z",
                "mfaAuthenticated": "false"
            },
            "ec2RoleDelivery": "2.0"
        },
        "invokedBy": "ecr.amazonaws.com"
    },
    "eventTime": "2024-10-08T17:22:51Z",
    "eventSource": "ecr.amazonaws.com",
    "eventName": "ListImageReferrers",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "ecr.amazonaws.com",
    "userAgent": "ecr.amazonaws.com",
    "requestParameters": {
        "registryId": "123456789012",
        "repositoryName": "testrepo",
        "subjectId": {
            "imageDigest": "sha256:000b9b805af1cdb60628898c9f411996301a1c13afd3dbef1d8a16ac6dbf503a"
        },
        "nextToken": "urD72mdD/mC8b5-EXAMPLE"
    },
    "responseElements": null,
    "requestID": "cb8c167e-EXAMPLE",
    "eventID": "e3c6f4ce-EXAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "123456789012",
            "ARN": "arn:aws:ecr:us-east-2:123456789012:repository/testrepo"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}
```