

# Batch Operations를 사용하여 대량으로 객체 작업 수행
<a name="batch-ops"></a>

S3 배치 작업을 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 배치 작업은 지정된 Amazon S3 객체 목록에 대해 단일 작업을 수행할 수 있습니다. 단일 작업으로 엑사바이트 규모의 데이터가 포함된 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다. Amazon S3는 진행 상황을 추적하고 알림을 보내며 모든 작업에 대한 자세한 완료 보고서를 저장하여 감사 가능한 완전관리형 서버리스 환경을 제공합니다. Amazon S3 콘솔, AWS CLI(AWS Command Line Interface), AWS SDK 또는 Amazon S3 REST API를 통해 S3 Batch Operations를 사용할 수 있습니다.

S3 Batch Operations를 사용하여 객체를 복사하고, 객체의 서버 측 암호화를 업데이트하고, 객체 태그 또는 액세스 제어 목록(ACL)을 설정합니다. S3 Glacier Flexible Retrieval에서 객체 복원을 시작하거나 AWS Lambda 함수를 호출하여 객체로 사용자 정의 작업을 수행할 수도 있습니다. 사용자 지정 객체 목록에서 이러한 작업을 수행하거나 Amazon S3 인벤토리 보고서를 사용하여 객체 목록을 손쉽게 생성할 수 있습니다. Amazon S3 Batch Operations는 이미 Amazon S3에서 사용하고 있는 것과 동일한 Amazon S3 API 작업을 사용합니다.

**참고**  
Amazon S3 Express One Zone 스토리지 클래스를 디렉터리 버킷과 함께 사용하는 방법에 대한 자세한 내용은 [S3 Express One Zone](directory-bucket-high-performance.md#s3-express-one-zone) 및 [디렉터리 버킷 작업](directory-buckets-overview.md) 섹션을 참조하세요. S3 Express One Zone 및 디렉터리 버킷에서 배치 작업을 사용하는 방법에 대한 자세한 내용은 [디렉터리 버킷에 배치 작업 사용](directory-buckets-objects-Batch-Ops.md) 섹션을 참조하세요.

## S3 배치 작업 기본 사항
<a name="batch-ops-basics"></a>

S3 배치 작업을 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 배치 작업은 지정된 Amazon S3 객체 목록에 대해 단일 작업을 실행할 수 있습니다.

### 용어
<a name="batch-ops-terminology"></a>

이 섹션에서는 *매니페스트*, *작업(job)*, *작업(operation)* 및 *태스크*라는 용어를 사용하며, 이 용어는 다음과 같이 정의됩니다.

**매니페스트**  
매니페스트는 Amazon S3가 작업을 수행할 객체 키를 포함하는 Amazon S3 객체입니다. Batch Operations 작업을 만들려면 매니페스트를 제공해야 합니다. 사용자 생성 매니페스트에는 버킷 이름, 객체 키, 각 객체의 객체 버전(선택 사항)이 포함되어야 합니다. 사용자 생성 매니페스트를 제공하는 경우 Amazon S3 인벤토리 보고서 또는 CSV 파일 형식이어야 합니다.  
또한. 작업을 만들 때 지정하는 객체 필터 기준에 따라 Amazon S3에서 자동으로 매니페스트를 생성하도록 할 수도 있습니다. 이 옵션은 Amazon S3 콘솔을 사용해 생성하는 Batch Operations 작업 또는 AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API로 생성하는 모든 작업 유형에서 사용할 수 있습니다.

**작업**  
작업(job)은 S3 배치 작업의 기본 작업 단위입니다. 작업은 매니페스트에 나열된 객체에 대해 지정된 작업을 실행하는 데 필요한 모든 정보를 포함합니다. 이 정보를 제공하고 작업 시작을 요청하면 작업은 매니페스트의 각 객체에 대해 작업(operation)을 수행합니다.

**작업**  
작업(operation)은 배치 작업(job)을 실행할 객체 복사와 같은 API [작업](https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations.html)의 유형입니다. 각 작업(job)은 매니페스트에 지정된 모든 개체에서 단일 유형의 작업(operation)을 수행합니다.

**작업**  
작업(task)은 작업(job)의 실행 단위입니다. 태스크는 하나의 객체에 대해 작업(job)의 작업(operation)을 수행하기 위한 Amazon S3 또는 AWS Lambda API 작업에 대한 단일 호출을 나타냅니다. 작업 수명 주기 동안 S3 배치 작업은 매니페스트에 지정된 각 객체에 대해 하나의 태스크(task)를 생성합니다.

### S3 배치 작업 건의 작동 방식
<a name="batch-ops-basics-how-it-works"></a>

작업(job)은 S3 배치 작업의 기본 작업 단위입니다. 작업은 객체 목록에 대해 지정된 작업을 실행하는 데 필요한 모든 정보를 포함합니다. 작업을 생성하려면 S3 배치 작업에 객체 목록을 제공하고 해당 객체에서 수행할 작업을 지정합니다. S3 배치 작업에서 지원하는 작업에 대한 자세한 내용은 [S3 배치 작업에서 지원하는 작업](batch-ops-operations.md) 섹션을 참조하세요.

배치 작업은 **매니페스트에 포함된 모든 객체에 대해 지정된 작업을 수행합니다. 매니페스트는 배치 작업에서 처리할 객체를 나열하며 버킷에 객체로 저장됩니다. CSV(쉼표로 구분된 값) 형식의 [S3 Inventory를 사용한 데이터 카탈로그화 및 분석](storage-inventory.md) 보고서를 매니페스트로 사용하면 버킷에 있는 긴 객체 목록을 쉽게 만들 수 있습니다. 또한 단일 버킷에 포함된 객체의 사용자 지정된 목록에 대해 배치 작업을 수행할 수 있는 단순 CSV 형식의 매니페스트를 지정할 수도 있습니다.

작업을 생성하면 Amazon S3가 매니페스트의 객체 목록을 처리하고 각 객체에 지정된 작업(operation)을 실행합니다. 작업이 실행되는 동안 프로그래밍 방식으로 또는 Amazon S3 콘솔을 통해 진행 상황을 모니터링할 수 있습니다. 작업이 완료되면 완료 보고서를 생성하도록 작업을 구성할 수도 있습니다. 완료 보고서는 작업에 의해 수행된 각 작업(task)의 결과를 설명합니다. 작업 모니터링에 대한 자세한 내용은 [S3 배치 작업 건 관리](batch-ops-managing-jobs.md) 섹션을 참조하세요.

S3 Batch Operations과 관련된 비용이 있습니다. 완료 전에 취소된 작업을 포함하여 Batch Operations 생성에 대해 요금이 청구됩니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하세요.

S3 Batch Operations 작업은 기본적으로 모든 작업에서 최대 40억 개의 객체를 처리할 수 있습니다. 특히 복사, 객체 태그 지정, Object Lock, AWS Lambda 함수 간접 호출 및 배치 복제 작업은 최대 200억 개의 객체를 지원할 수 있습니다. AWS 계정당 활성 배치 복제 작업 수는 6개로 제한됩니다. 배치 작업 만들기를 시작하려면 [Creating an S3 Batch Operations job](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-create-job.html)을 참조하세요.

## S3 배치 작업 자습서
<a name="batch-ops-basics-tutorial"></a>

다음 자습서에서는 일부 배치 작업 태스크를 처음부터 끝까지 수행하는 절차를 보여줍니다.
+ [자습서: S3 Batch Operations를 통해 비디오 일괄 트랜스코딩](tutorial-s3-batchops-lambda-mediaconvert-video.md)

# 배치 작업에 대한 권한 부여
<a name="batch-ops-iam-role-policies"></a>

S3 배치 작업을 생성 및 실행하기 전에, 필요한 권한을 부여해야 합니다. Amazon S3 배치 작업을 생성하려면 `s3:CreateJob` 사용자 권한이 필요합니다. 작업을 생성한 동일한 엔터티에는 작업에 대해 지정된 AWS Identity and Access Management(IAM) 역할을 Batch Operations에 전달하는 `iam:PassRole` 권한도 있어야 합니다.

다음 섹션에서는 IAM 역할 생성 및 정책 연결에 대한 정보를 제공합니다. IAM 리소스 지정에 대한 일반적인 정보는 *IAM 사용 설명서*의 [IAM JSON 정책 요소: 리소스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)를 참조하세요.

**Topics**
+ [

## S3 배치 작업 IAM 역할 생성
](#batch-ops-iam-role-policies-create)
+ [

## 권한 연결 정책
](#batch-ops-iam-role-policies-perm)

## S3 배치 작업 IAM 역할 생성
<a name="batch-ops-iam-role-policies-create"></a>

Amazon S3에는 사용자를 대신해 S3 배치 작업을 수행할 권한이 있어야 합니다. AWS Identity and Access Management(IAM) 역할을 통해 이러한 권한을 부여합니다. S3 배치 작업을 생성할 때 작업을 사용할 IAM 역할을 지정합니다. 이는 기존 IAM 역할일 수 있습니다. 또는 Amazon S3 콘솔을 사용하여 작업을 생성하는 경우 Amazon S3가 자동으로 생성하는 IAM 역할일 수 있습니다.

Amazon S3가 IAM 역할을 자동으로 생성하도록 선택하면 신뢰 및 권한 정책이 자동으로 생성되어 역할에 연결됩니다. 신뢰 정책은 S3 Batch Operations 서비스 보안 주체(`batchoperations.s3.amazonaws.com`)가 역할을 수임하도록 허용합니다. 권한 정책은 작업에 대해 지정한 설정에 따라 작업을 실행하는 데 필요한 모든 작업을 허용합니다. 예를 들어 AWS 계정의 한 버킷에서 다른 버킷으로 객체를 복사하도록 작업을 구성하는 경우 권한 정책은 `s3:GetObject` 및 `s3:PutObject`와 같은 작업을 허용합니다. 작업을 제출하기 전에 역할에 대한 신뢰 및 권한 정책을 검토할 수 있습니다. 이 옵션은 Amazon S3 콘솔을 사용하여 작업을 생성하고 필터를 사용하거나 복제 구성을 기반으로 하는 S3 생성 객체 목록을 사용하도록 작업을 구성하는 경우에만 사용할 수 있습니다. 작업을 제출하면 IAM 역할이 계정에 유지됩니다. 그런 다음 동일한 작업을 수행하는 후속 작업에 다시 사용하거나 작업 실행이 완료되면 삭제할 수 있습니다.

IAM 역할을 수동으로 생성하려는 경우 이 섹션의 정책 예제를 통해 역할을 생성할 수 있습니다. IAM 역할 생성 및 구성에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하세요. S3 리소스 유형별 S3 API 작업 권한에 대한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요. 추가 예제는 [작업 태그를 사용하여 Batch Operations에 대한 권한 제어](batch-ops-job-tags-examples.md) 및 [S3 배치 작업을 사용하여 객체 복사](batch-ops-examples-copy.md) 섹션을 참조하세요.

IAM 정책에서 조건 키를 사용하여 S3 배치 작업 건에 대한 액세스 권한을 필터링할 수도 있습니다. Amazon S3에 사용되는 조건 키의 전체 목록과 자세한 내용은 **서비스 승인 참조에서 [Amazon S3에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

다음 비디오에는 Amazon S3 콘솔을 사용하여 Batch Operations에 대한 IAM 권한을 설정하는 방법이 포함되어 있습니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/qpwHUrwAiUI//0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/qpwHUrwAiUI/)


### 신뢰 정책
<a name="batch-ops-iam-role-policies-trust"></a>

S3 배치 작업 서비스 보안 주체가 IAM 역할을 맡도록 허용하려면 다음 신뢰 정책을 역할에 연결합니다.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"batchoperations.s3.amazonaws.com"
         },
         "Action":"sts:AssumeRole"
      }
   ]
}
```

------

## 권한 연결 정책
<a name="batch-ops-iam-role-policies-perm"></a>

작업(operation) 유형에 따라 다음 정책 중 하나를 연결할 수 있습니다.

사용 권한을 구성하기 전에 다음 사항에 유의하세요.
+ 작업(operation)과 상관없이 Amazon S3는 S3 버킷에서 매니페스트 객체를 읽고 선택적으로 버킷에 보고서를 쓸 수 있는 권한이 필요합니다. 따라서 다음의 모든 정책은 이러한 권한을 포함합니다.
+ Amazon S3 인벤토리 보고서 매니페스트의 경우 S3 배치 작업에서는 manifest.json 객체 및 연결된 모든 CSV 데이터 파일을 읽을 수 있는 권한이 필요합니다.
+ 객체의 버전 ID를 지정할 때는 `s3:GetObjectVersion`과 같은 버전 관련 권한만 필요합니다.
+ 암호화된 객체에 대해 S3 배치 작업을 실행하는 경우 IAM 역할에도 해당 객체를 암호화하는 데 사용되는 AWS KMS 키에 대한 액세스 권한이 있어야 합니다.
+ AWS KMS로 암호화된 인벤토리 보고서 매니페스트를 제출하는 경우 IAM 정책에 manifest.json 객체 및 연결된 모든 CSV 데이터 파일에 대한 `"kms:Decrypt"` 및 `"kms:GenerateDataKey"` 권한이 포함되어 있어야 합니다.
+ 액세스 제어 목록(ACL)이 활성화되어 있고 다른 AWS 계정에 있는 버킷의 매니페스트를 Batch Operations 작업에서 생성하는 경우, 배치 작업에 대해 구성된 IAM 역할의 IAM 정책에서 `s3:PutObjectAcl` 권한을 부여해야 합니다. 이 권한을 포함하지 않은 경우 배치 작업은 `Error occurred when preparing manifest: Failed to write manifest` 오류와 함께 실패합니다.

### 객체 복사: PutObject
<a name="batch-ops-put-copy-object-policy"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectTagging",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-source-bucket",
                "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
            ]
        }
    ]
}
```

------

### 객체 태그 지정 대체: PutObjectTagging
<a name="batch-ops-put-object-tagging-policy"></a>

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Effect":"Allow",
      "Action":[
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
      ]
    },
    {
      "Effect":"Allow",
      "Action":[
        "s3:PutObject"
      ],
      "Resource":[
        "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
      ]
    }
  ]
}
```

------

### 객체 태그 지정 삭제: DeleteObjectTagging
<a name="batch-ops-delete-object-tagging-policy"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
              "s3:DeleteObjectTagging",
              "s3:DeleteObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
            ]
        }
    ]
}
```

------

### 액세스 제어 목록 대체: PutObjectAcl
<a name="batch-ops-put-object-acl-policy"></a>

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
      ]
    }
  ]
}
```

------

### 객체 복원: RestoreObject
<a name="batch-ops-initiate-restore-policy"></a>

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Effect":"Allow",
      "Action":[
          "s3:RestoreObject"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
      ]
    },
    {
      "Effect":"Allow",
      "Action":[
        "s3:PutObject"
      ],
      "Resource":[
        "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
      ]
    }
  ]
}
```

------

### Object Lock 보존 적용: PutObjectRetention
<a name="batch-ops-put-object-lock-policy"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetBucketObjectLockConfiguration",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectRetention",
                "s3:BypassGovernanceRetention"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
            ]
        }
    ]
}
```

------

### Object Lock 법적 보존 적용: PutObjectLegalHold
<a name="batch-ops-put-object-legal-hold-policy"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetBucketObjectLockConfiguration",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:PutObjectLegalHold",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
            ]
        }
    ]
}
```

------

### 기존 객체 복제: S3 생성 매니페스트를 사용한 InitiateReplication
<a name="batch-ops-batch-replication-policy"></a>

S3 생성 매니페스트를 사용 및 저장하는 경우 이 정책을 사용합니다. 기존 객체 복제에 Batch Operations를 사용하는 방법에 대한 자세한 내용은 [배치 복제를 사용한 기존 객체 복제](s3-batch-replication-batch.md) 섹션을 참조하세요.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Action":[
            "s3:InitiateReplication"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
         ]
      },
      {
         "Action":[
            "s3:GetReplicationConfiguration",
            "s3:PutInventoryConfiguration"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket"
         ]
      },
      {
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*",
            "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"    
         ]
      }
   ]
}
```

------

### 기존 객체 복제: 사용자 매니페스트를 사용한 InitiateReplication
<a name="batch-ops-batch-replication-policy-user"></a>

사용자 제공 매니페스트를 사용하는 경우 이 정책을 사용합니다. 기존 객체 복제에 Batch Operations를 사용하는 방법에 대한 자세한 내용은 [배치 복제를 사용한 기존 객체 복제](s3-batch-replication-batch.md) 섹션을 참조하세요.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Action":[
            "s3:InitiateReplication"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
         ]
      },
      {
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"    
         ]
      }
   ]
}
```

------

### 체크섬 계산: `GetObject`, `GetObjectVersion`, `RestoreObject` 및 `PutObject` 허용
<a name="batch-ops-compute-object-checksum-policies"></a>

**체크섬 계산** 작업을 S3 Batch Operations과 함께 사용하려는 경우 이 정책을 사용합니다. 저장된 데이터의 바이트를 가져오고 읽으려면 `GetObject`, `GetObjectVersion` 및 `RestoreObject`에 대한 권한이 필요합니다. user input placeholders를 사용자의 정보로 대체합니다. **체크섬 계산**에 대한 자세한 내용은 [Amazon S3의 저장 데이터에 대한 객체 무결성 확인](checking-object-integrity-at-rest.md) 섹션을 참조하세요.

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:RestoreObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket2/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket3/*"
      ]
    }
  ]
}
```

### 객체 암호화 업데이트
<a name="batch-ops-update-encryption-policies"></a>

Batch Operations가 매니페스트를 읽고, 객체의 암호화 유형을 업데이트하고, 완료 보고서를 작성하도록 허용하려면 다음 권한 정책을 연결해야 합니다. 이 권한 정책을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다. 이 작업 사용 및 IAM 위탁자가 사용하는 역할에 연결해야 하는 권한에 대한 자세한 내용은 [객체 암호화 업데이트](batch-ops-update-encryption.md) 섹션을 참조하세요.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [{
            "Sid": "S3BatchOperationsUpdateEncryption",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:PutObject",
                "s3:UpdateObjectEncryption"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-target"
                "arn:aws:s3:::amzn-s3-demo-bucket-target/*"
            ]
        },
        {
            "Sid": "S3BatchOperationsPolicyForManifestFile",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-manifest/*"
            ]
        },
        {
            "Sid": "S3BatchOperationsPolicyForCompletionReport",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-completion-report/*"
            ]
        },
        {
            "Sid": "S3BatchOperationsPolicyManifestGeneration",
            "Effect": "Allow",
            "Action": [
                "s3:PutInventoryConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-target"
            ]
        }
        {
            "Sid": "AllowKMSOperationsForS3BatchOperations",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:Encrypt",
                "kms:ReEncrypt*"
            ],
            "Resource": [
                "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
            ]
        }
    ]
}
```

# S3 배치 작업 건 생성
<a name="batch-ops-create-job"></a>

Amazon S3 배치 작업을 사용하면 특정 Amazon S3 객체 목록에서 대규모 배치 작업을 수행할 수 있습니다. 이 섹션에서는 S3 배치 작업을 생성하는 데 필요한 정보와 `CreateJob` 요청의 결과를 설명합니다. 또한 Amazon S3 콘솔, AWS Command Line Interface(AWS CLI) 및 AWS SDK for Java를 사용하여 배치 작업 생성 지침도 제공합니다.

S3 배치 작업을 생성할 때 모든 작업 또는 실패한 작업에 대한 완료 보고서를 요청할 수 있습니다. 하나 이상의 작업이 성공적으로 호출되면 S3 배치 작업은 완료, 실패 또는 취소된 작업에 대한 보고서를 생성합니다. 자세한 내용은 [예: S3 배치 작업 완료 보고서](batch-ops-examples-reports.md) 섹션을 참조하세요.

다음 비디오에서는 Amazon S3 콘솔을 사용하여 배치 작업을 생성하는 방법에 대한 간단한 데모를 제공합니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/qpwHUrwAiUI//0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/qpwHUrwAiUI/)


**Topics**
+ [

## 배치 작업 요청 요소
](#batch-ops-create-job-request-elements)
+ [

## 매니페스트 지정
](#specify-batchjob-manifest)
+ [

## 객체 목록을 자동으로 생성하고 매니페스트 파일로 저장
](#automatically-generate-manifest-file)
+ [

## 매니페스트 파일 생성
](#create-manifest-file)
+ [

## 기존 매니페스트 사용
](#specify-existing-manifest-file)
+ [

## 작업 생성
](#to-create-batch-ops-job)
+ [

## 작업 응답
](#batch-ops-create-job-response-elements)

## 배치 작업 요청 요소
<a name="batch-ops-create-job-request-elements"></a>

S3 배치 작업 건을 생성하려면 다음 정보를 제공해야 합니다.

**작업**  
매니페스트 내 객체에 대해 S3 배치 작업이 실행할 작업을 지정합니다. 각 작업 유형은 해당 작업과 관련된 파라미터를 허용합니다. 배치 작업을 사용하면 작업을 대량으로 수행함으로써 각 객체에 해당 작업을 하나씩 수행할 때와 같은 결과를 얻을 수 있습니다.

**매니페스트**  
*매니페스트*는 Amazon S3가 작업할 객체 키 목록을 포함하는 Amazon S3 객체입니다. 다음 방법을 사용하여 배치 작업 건의 매니페스트를 지정할 수 있습니다.  
+ 지정한 메타데이터를 기반으로 객체 목록을 생성하도록 Batch Operations에 지시합니다. 이 목록을 매니페스트 파일로 저장하여 작업 생성 시 사용할 수 있습니다. 이 옵션은 Amazon S3 콘솔, AWS CLI, AWS SDK 또는 Amazon S3 REST API로 생성하는 모든 작업 유형에서 사용할 수 있습니다.
+ 기존 복제 구성을 기반으로 객체 목록을 자동 생성합니다. 이 목록을 매니페스트 파일로 저장하여 향후 작업에 다시 사용할 수 있습니다.
+ 새 매니페스트 파일을 수동으로 생성합니다.
+ 기존 매니페스트를 사용합니다.
+ 작업할 객체를 지정하는 방법과 관계없이 매니페스트 자체는 범용 버킷에 저장되어야 합니다. Batch Operations는 디렉터리 버킷에서 기존 매니페스트를 가져오거나 생성된 객체 목록을 매니페스트로 디렉터리 버킷에 저장할 수 없습니다. 하지만 매니페스트에 설명된 객체는 디렉터리 버킷에 저장할 수 있습니다. 자세한 내용은 [디렉터리 버킷](https://docs.aws.amazon.com//AmazonS3/latest/userguide/directory-buckets-overview.html)을 참조하세요.
+ 매니페스트 내 객체가 버전이 지정된 버킷에 있는 경우, 객체의 버전 ID를 지정하면 배치 작업이 지정된 버전에서 실행됩니다. 버전 ID를 지정하지 않는 경우 배치 작업 시 객체의 마지막 버전에서 작업이 실행됩니다. 매니페스트에 버전 ID 필드가 포함된 경우, 매니페스트 내 모든 객체에 대한 버전 ID를 제공해야 합니다.
자세한 내용은 [매니페스트 지정](#specify-batchjob-manifest) 섹션을 참조하세요.

**우선 순위**  
작업 우선 순위를 사용하여 이 작업의 상대적 우선 순위를 계정에서 실행 중인 다른 작업에 표시합니다. 숫자가 높을수록 우선 순위가 높아집니다.  
작업 우선 순위는 동일한 계정 및 리전의 다른 작업에 대해 설정된 우선 순위와 관련되어야만 의미가 있습니다. 사용자는 자신에게 적합한 번호 지정 시스템을 선택할 수 있습니다. 예를 들어 모든 **복원**(`RestoreObject`) 작업에 1의 우선순위를, 모든 **복사**(`CopyObject`) 작업에 2의 우선순위를, 모든 **액세스 제어 목록(ACL) 교체**(`PutObjectAcl`) 작업에 3의 우선순위를 할당할 수 있습니다.  
S3 배치 작업은 우선순위 번호에 따라 작업의 우선순위를 부여하며 다만 정확한 순서가 보장되지는 않습니다. 따라서 어떤 작업이 다른 작업보다 먼저 시작되거나 끝나도록 하기 위해 작업 우선순위를 사용해서는 안 됩니다. 정확한 순서가 필요한 경우 다음 작업을 시작하기 전에 하나의 작업이 완료될 때까지 기다려야 합니다.

**RoleArn**  
작업을 실행할 AWS Identity and Access Management(IAM) 역할을 지정합니다. 사용하는 IAM 역할에는 해당 작업 건(job)에 지정된 작업(operation)을 수행하기에 충분한 권한이 있어야 합니다. 예를 들어 `CopyObject` 작업을 실행하려면 IAM 역할이 소스 버킷에 대한 `s3:GetObject` 권한과 대상 버킷에 대한 `s3:PutObject` 권한을 가져야 합니다. 또한 역할에는 매니페스트를 읽고 완료 보고서를 작성할 수 있는 권한도 필요합니다.  
IAM 역할은 기존 역할일 수 있습니다. 또는 Amazon S3 콘솔을 사용하여 작업을 생성하는 경우 Amazon S3가 자동으로 생성하는 IAM 역할일 수 있습니다. 자세한 내용은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 섹션을 참조하세요.  
IAM 역할에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) 단원을 참조하세요. Amazon S3 권한에 대한 자세한 내용은 [Amazon S3의 정책 작업](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-actions) 섹션을 참조하세요.  
디렉터리 버킷에서 작업을 수행하는 배치 작업 건에는 특정 권한이 필요합니다. 자세한 내용은 [AWS Identity and Access Management (IAM) for S3 Express One Zone](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-security-iam.html)을 참조하세요.

**Report**  
S3 배치 작업에서 완료 보고서를 생성할지 여부를 지정합니다. 완료 보고서를 요청하면 이 요소에서 보고서에 대한 파라미터도 제공해야 합니다. 다음 정보가 필요합니다.  
+ 보고서를 저장할 버킷
**참고**  
보고서는 범용 버킷에 저장해야 합니다. 배치 작업에서는 보고서를 디렉터리 버킷에 저장할 수 없습니다. 자세한 내용은 [디렉터리 버킷](https://docs.aws.amazon.com//AmazonS3/latest/userguide/directory-buckets-overview.html)을 참조하세요.
+ 보고서의 형식
+ 보고서에 모든 작업 또는 실패한 작업의 세부 정보만 포함할지 여부
+ 선택적 접두사 문자열
`CreateJob.Report.ExpectedBucketOwner` 필드가 제공된 경우, 완료 보고서 버킷 소유자가 일치해야 합니다. 일치하지 않으면 작업이 실패합니다.  
완료 보고서는 항상 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)로 암호화됩니다.

**태그(선택 사항)**  
*태그*를 추가하여 S3 배치 작업 건에 대한 레이블을 지정하고 액세스를 제어할 수 있습니다. 배치 작업 건의 책임자를 식별하거나 사용자가 배치 작업 건과 상호작용하는 방법을 제어하기 위해 태그를 사용할 수 있습니다. 작업 태그가 있을 경우 사용자가 작업을 취소하고, 확인 상태의 작업을 활성화하거나 작업의 우선 순위 레벨을 바꿀 수 있는 능력을 부여하거나 제한할 수 있습니다. 예를 들어, `"Department=Finance"` 태그로 작업이 생성된 경우 `CreateJob` 작업을 호출할 수 있는 권한을 사용자에게 부여할 수 있습니다.  
태그가 연결된 작업을 생성할 수 있으며 작업을 생성한 후 작업에 태그를 추가할 수 있습니다.  
자세한 내용은 [태그를 사용하여 액세스 제어 및 작업 레이블 지정](batch-ops-job-tags.md) 섹션을 참조하세요.

**Description(선택 사항)**  
작업 건을 추적하고 모니터링하기 위해 최대 256자의 설명을 제공할 수도 있습니다. Amazon S3는 작업 건에 대한 정보를 반환하거나 Amazon S3 콘솔에 작업 세부 정보를 표시할 때마다 이 설명을 포함합니다. 그러므로 지정한 설명에 따라 손쉽게 작업을 정렬하고 필터링할 수 있습니다. 설명이 고유할 필요는 없으므로 설명을 범주(예: "주간 로그 복사 작업")로 사용하면 유사한 작업 그룹을 추적하는 데 도움이 됩니다.

## 매니페스트 지정
<a name="specify-batchjob-manifest"></a>

*매니페스트*는 Amazon S3가 작업할 객체 키 목록을 포함하는 Amazon S3 객체입니다. 다음 방법을 사용하여 배치 작업 건의 매니페스트를 지정할 수 있습니다.
+ 지정한 메타데이터를 기반으로 객체 목록을 생성하도록 Batch Operations에 지시합니다. 이 목록을 매니페스트로 저장하여 작업 생성 시 사용할 수 있습니다. 이 옵션은 Amazon S3 콘솔, AWS CLI, AWS SDK 또는 Amazon S3 REST API로 생성하는 모든 작업 유형에서 사용할 수 있습니다.
+ 기존 복제 구성을 기반으로 객체 목록을 자동 생성합니다. 이 목록을 매니페스트로 저장하여 향후 작업에 다시 사용할 수 있습니다.
+ 새 매니페스트 파일을 수동으로 생성합니다.
+ 기존 매니페스트를 사용합니다.

**참고**  
Amazon S3 Batch Operations는 리전 간 객체 목록 생성을 지원하지 않습니다.
작업할 객체를 지정하는 방법과 관계없이 매니페스트 자체는 범용 버킷에 저장되어야 합니다. Batch Operations는 디렉터리 버킷에서 기존 매니페스트를 가져오거나 생성된 객체 목록을 매니페스트로 디렉터리 버킷에 저장할 수 없습니다. 하지만 매니페스트에 설명된 객체는 디렉터리 버킷에 저장할 수 있습니다. 자세한 내용은 [디렉터리 버킷](https://docs.aws.amazon.com//AmazonS3/latest/userguide/directory-buckets-overview.html)을 참조하세요.

## 객체 목록을 자동으로 생성하고 매니페스트 파일로 저장
<a name="automatically-generate-manifest-file"></a>

지정한 메타데이터를 기반으로 객체 목록을 자동으로 생성하도록 Amazon S3에 지시할 수 있습니다. 이 목록을 매니페스트로 저장하여 작업 생성 시 사용할 수 있습니다. 이 옵션은 Amazon S3 콘솔, AWS CLI, AWS SDK 또는 Amazon S3 REST API로 생성하는 모든 작업 유형에서 사용할 수 있습니다.

객체 목록을 자동으로 생성하여 매니페스트 파일로 저장하려면 작업 생성 요청 시 다음 요소를 지정합니다.
+ 소스 객체를 포함하는 버킷에 대한 정보(버킷 소유자 및 Amazon 리소스 이름(ARN) 등).
+ 매니페스트 출력에 대한 정보(매니페스트 파일 생성 플래그, 출력 버킷 소유자, ARN, 접두사, 파일 형식, 암호화 유형 등).
+ 생성 날짜, 키 이름, 크기, 암호화 유형, KMS 키 ARN, 버킷 키 및 스토리지 클래스를 기준으로 객체를 필터링하는 선택적 기준. 복제 작업의 경우 태그를 사용하여 객체를 필터링할 수도 있습니다.

### 객체 필터 기준
<a name="manifest-generator-filter-criteria"></a>

자동으로 생성된 객체 목록에 포함할 객체 목록을 필터링하기 위해 다음 기준을 지정할 수 있습니다. 자세한 내용은 **Amazon S3 API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobManifestGeneratorFilter.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobManifestGeneratorFilter.html) 섹션을 참조하세요.

**CreatedAfter**  
제공된 경우 생성된 매니페스트에는 이 시점 후에 생성된 소스 버킷 객체만 포함됩니다.

**CreatedBefore**  
제공된 경우 생성된 매니페스트에는 이 시점 전에 생성된 소스 버킷 객체만 포함됩니다.

**EligibleForReplication**  
제공된 경우 생성된 매니페스트에는 소스 버킷의 복제 구성에 따라 복제에 적합한 객체만 포함됩니다.

**KeyNameConstraint**  
제공된 경우 생성된 매니페스트에는 **MatchAnySubstring**, **MatchAnyPrefix** 및 **MatchAnySuffix**에 지정된 문자열 제약 조건과 객체 키가 일치하는 소스 버킷 객체만 포함됩니다.  
**MatchAnySubstring** - 제공된 경우 생성된 매니페스트에는 지정된 문자열이 객체 키 문자열 내에 있으면 객체가 포함됩니다.  
**MatchAnyPrefix** - 제공된 경우 생성된 매니페스트에는 지정된 문자열이 객체 키 문자열의 시작 부분에 있으면 객체가 포함됩니다.  
**MatchAnySuffix** - 제공된 경우 생성된 매니페스트에는 지정된 문자열이 객체 키 문자열의 끝 부분에 있으면 객체가 포함됩니다.

**MatchAnyObjectEncryption**  
 제공된 경우, 매니페스트 파일로 저장되는 생성된 객체 목록에는 지정된 서버 측 암호화 유형(SSE-S3, SSE-KMS, DSSE-KMS, SSE-C 또는 NOT-SSE)을 가진 소스 버킷 객체만 포함됩니다. SSE-KMS 또는 DSSE-KMS를 선택하는 경우 특정 KMS 키 ARN을 지정하여 결과를 추가로 필터링할 수 있습니다. SSE-KMS를 선택하는 경우 버킷 키 활성화 상태를 기준으로 결과를 추가로 필터링할 수도 있습니다.

**MatchAnyStorageClass**  
제공된 경우 생성된 매니페스트에는 지정된 스토리지 클래스와 함께 저장된 소스 버킷 객체만 포함됩니다.

**ObjectReplicationStatuses**  
제공된 경우 생성된 매니페스트에는 지정된 복제 상태 중 하나를 가진 소스 버킷 객체만 포함됩니다.

**ObjectSizeGreaterThanBytes**  
제공된 경우 생성된 매니페스트에는 파일 크기가 지정된 바이트 수보다 큰 소스 버킷 객체만 포함됩니다.

**ObjectSizeLessThanBytes**  
제공된 경우 생성된 매니페스트에는 파일 크기가 지정된 바이트 수보다 작은 소스 버킷 객체만 포함됩니다.

**참고**  
객체 목록을 자동 생성하여 매니페스트로 저장한 대부분의 작업은 복제할 수 없습니다. `KeyNameConstraint`, `MatchAnyStorageClass`, `ObjectSizeGreaterThanBytes` 또는 `ObjectSizeLessThanBytes` 매니페스트 필터 기준을 사용하는 경우를 제외하고 배치 복제 작업을 복제할 수 있습니다.

매니페스트 기준을 지정하는 구문은 작업을 생성하는 데 사용하는 방법에 따라 달라집니다. 예시는 [작업 생성](#to-create-batch-ops-job) 섹션을 참조하세요.

## 매니페스트 파일 생성
<a name="create-manifest-file"></a>

수동으로 매니페스트 파일을 생성하려면 매니페스트 객체 키, ETag(엔터티 태그) 및 선택적으로 버전 ID를 CSV 형식의 목록으로 지정합니다. 매니페스트의 콘텐츠는 URL로 인코딩되어야 합니다.

기본적으로 Amazon S3가 Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 사용하여 Amazon S3 버킷에 업로드된 매니페스트를 암호화합니다. 고객 제공 키를 사용한 서버 측 암호화(SSE-C) 키를 사용한 매니페스트는 지원되지 않습니다. AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통한 서버 측 암호화를 사용하는 매니페스트는 CSV 형식의 인벤토리 보고서를 사용할 때만 지원됩니다. AWS KMS로 수동으로 생성된 매니페스트를 사용하는 것은 지원되지 않습니다.

매니페스트에는 버킷 이름, 객체 키, 각 객체의 객체 버전(선택 사항)이 포함되어야 합니다. 매니페스트의 다른 모든 필드는 S3 배치 작업에서 사용되지 않습니다.

**참고**  
매니페스트 내 객체가 버전이 지정된 버킷에 있는 경우, 객체의 버전 ID를 지정하면 배치 작업이 지정된 버전에서 실행됩니다. 버전 ID를 지정하지 않는 경우 배치 작업 시 객체의 마지막 버전에서 작업이 실행됩니다. 매니페스트에 버전 ID 필드가 포함된 경우, 매니페스트 내 모든 객체에 대한 버전 ID를 제공해야 합니다.

다음은 버전 ID가 없는 CSV 형식의 매니페스트 예입니다.

```
amzn-s3-demo-bucket1,objectkey1
amzn-s3-demo-bucket1,objectkey2
amzn-s3-demo-bucket1,objectkey3
amzn-s3-demo-bucket1,photos/jpgs/objectkey4
amzn-s3-demo-bucket1,photos/jpgs/newjersey/objectkey5
amzn-s3-demo-bucket1,object%20key%20with%20spaces
```

다음은 버전 ID를 포함하는 CSV 형식의 매니페스트 예시입니다.

```
amzn-s3-demo-bucket1,objectkey1,PZ9ibn9D5lP6p298B7S9_ceqx1n5EJ0p
amzn-s3-demo-bucket1,objectkey2,YY_ouuAJByNW1LRBfFMfxMge7XQWxMBF
amzn-s3-demo-bucket1,objectkey3,jbo9_jhdPEyB4RrmOxWS0kU0EoNrU_oI
amzn-s3-demo-bucket1,photos/jpgs/objectkey4,6EqlikJJxLTsHsnbZbSRffn24_eh5Ny4
amzn-s3-demo-bucket1,photos/jpgs/newjersey/objectkey5,imHf3FAiRsvBW_EHB8GOu.NHunHO1gVs
amzn-s3-demo-bucket1,object%20key%20with%20spaces,9HkPvDaZY5MVbMhn6TMn1YTb5ArQAo3w
```

## 기존 매니페스트 사용
<a name="specify-existing-manifest-file"></a>

다음 두 가지 형식 중 하나를 사용하여 기존 매니페스트를 지정하여 Batch Operations 작업을 생성할 수 있습니다.
+ **Amazon S3 인벤토리 보고서** - CSV 형식의 Amazon S3 인벤토리 보고서여야 합니다. 인벤토리 보고서와 연결된 `manifest.json` 파일을 지정해야 합니다. 인벤토리 보고서에 대한 자세한 내용은 [S3 Inventory를 사용한 데이터 카탈로그화 및 분석](storage-inventory.md) 섹션을 참조하세요. 인벤토리 보고서가 버전 ID를 포함할 경우, S3 배치 작업이 특정 객체 버전에만 작용합니다.
**참고**  
S3 배치 작업은 SSE-KMS로 암호화된 CSV *인벤토리 보고서*를 지원합니다.
SSE-KMS로 암호화된 인벤토리 보고서 매니페스트를 제출하는 경우 IAM 정책에 `manifest.json` 객체 및 연결된 모든 CSV 데이터 파일에 대한 `"kms:Decrypt"` 및 `"kms:GenerateDataKey"` 권한이 포함되어 있어야 합니다.
+ **CSV 파일** - 파일 내 각 행이 버킷 이름, 객체 키 및 선택적으로 객체 버전을 포함해야 합니다. 객체 키는 다음 예제와 같이 URL로 인코딩되어야 합니다. 매니페스트는 모든 객체에 대한 버전 ID를 포함하거나 모든 객체에 대한 버전 ID를 생략해야 합니다. CSV 매니페스트 형식에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobManifestSpec.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobManifestSpec.html)을 참조하세요.
**참고**  
S3 배치 작업은 SSE-KMS로 암호화된 CSV *매니페스트 파일*을 지원하지 않습니다.

**중요**  
수동으로 생성된 매니페스트와 버전이 지정된 버킷을 사용하는 경우 객체의 버전 ID를 지정하는 것이 좋습니다. 작업을 생성하면 S3 배치 작업이 작업을 실행하기 전에 전체 매니페스트를 구문 분석합니다. 하지만 버킷 상태 "스냅샷"을 생성하지는 않습니다.  
매니페스트에는 수십억 개의 객체가 포함될 수 있으므로 작업 실행에 오랜 시간이 걸릴 수 있으며, 그러한 경우 작업이 실행되는 객체의 버전에 영향을 미칠 수 있습니다. 작업이 실행되는 동안 객체를 새 버전으로 덮어쓰고 그 객체에 버전 ID를 지정하지 않았다고 가정해 봅시다. 이 경우 Amazon S3는 작업 생성 시 존재했던 버전이 아니라 객체의 최신 버전에서 작업을 수행합니다. 이 문제를 피하는 유일한 방법은 매니페스트에 나열된 객체에 버전 ID를 지정하는 것입니다.

## 작업 생성
<a name="to-create-batch-ops-job"></a>

 Amazon S3 콘솔, AWS CLI, AWS SDK 또는 Amazon REST API를 사용하여 S3 배치 작업을 생성할 수 있습니다.

작업 요청 생성에 대한 자세한 내용은 [배치 작업 요청 요소](#batch-ops-create-job-request-elements) 섹션을 참조하세요.

**사전 조건**  
배치 작업 건을 생성하기 전에 관련 권한을 구성했는지 확인합니다. 자세한 내용은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 섹션을 참조하세요.

### S3 콘솔 사용
<a name="batch-ops-create-job-console"></a>

**S3 콘솔을 사용하여 Batch Operations 작업을 생성하는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. Amazon S3 콘솔의 왼쪽 탐색 창에서 **배치 작업**을 선택합니다.

1. **작업 생성**을 선택합니다.

1. **리전 및 범위 선택**에서 작업을 생성할 AWS 리전을 선택하고 확인합니다.
**참고**  
복사 작업의 경우 대상 버킷과 동일한 리전에서 작업을 생성해야 합니다. 기타 작업의 경우 매니페스트에 있는 객체와 동일한 리전에서 작업을 생성해야 합니다.

1. **범위**에서 Batch Operations 작업이 조치를 취할 객체 목록을 지정합니다.

   **객체 목록**에서 객체 목록을 사용하여 매니페스트를 생성하거나, 복제 구성을 사용하여 매니페스트를 생성하거나, 기존 매니페스트를 사용하도록 선택할 수 있습니다.
   + **객체 목록 생성**을 선택하면 지정한 소스 위치 및 메타데이터를 기반으로 객체 목록이 자동 생성됩니다. 이 목록을 매니페스트로 저장하여 향후 작업에 다시 사용할 수 있습니다.
**참고**  
객체 목록을 생성하려면 `s3:PutInventoryConfiguration` 권한이 있어야 합니다. 소스 버킷은 범용 버킷이어야 합니다.
   + **기존 매니페스트 사용**을 선택하면 기존 매니페스트에서 객체 목록을 가져올 수 있습니다. 매니페스트는 Batch Operations가 조치를 취할 특정 객체를 나열하는 S3 Inventory 보고서 또는 CSV 파일입니다.
   + **복제 구성 사용**을 선택하면 기존 복제 구성을 기반으로 객체 목록을 자동 생성할 수 있습니다. 이 목록을 매니페스트로 저장하여 향후 작업에 다시 사용할 수 있습니다.

      이 예제에서는 **객체 목록 생성**을 선택합니다.

1. **소스 계정**에서 소스 객체를 소유한 계정을 선택합니다.

1. **소스**에서 소스 경로를 입력합니다(예: `s3://`*amzn-s3-demo-bucket*).

1. **객체 필터**에서 필터를 사용하여 객체 키의 일부 또는 객체 키의 끝부분을 기준으로 필터링할 수 있습니다. **객체 키 필터**는 매니페스트에 사용할 객체 목록을 구체화하는 데 도움이 됩니다. **객체 메타데이터 필터**에서 필터를 선택하여 매니페스트에 포함할 객체 범위를 추가로 정의합니다.

1. **작업 선택**에서 매니페스트에 나열된 모든 객체에 수행할 작업 유형을 선택합니다. 매니페스트가 디렉터리 버킷에 저장된 객체를 참조하는 경우 복사 또는 AWS Lambda 함수 간접 호출 작업만 사용합니다. 기타 모든 작업은 지원되지 않습니다.

1. 작업 유형을 선택한 후 **다음**을 선택합니다.

1. **추가 옵션 구성**에 대한 정보를 입력합니다.

   **권한**에서 작업을 사용할 AWS Identity and Access Management(IAM) 역할을 지정합니다. 이는 기존 역할이거나 Amazon S3가 자동으로 생성하는 역할일 수 있습니다. 자세한 내용은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 섹션을 참조하세요. 복제 구성을 기반으로 필터 또는 객체 목록과 함께 S3 생성 객체 목록을 사용하도록 작업을 구성한 경우 Amazon S3에서 역할을 생성할 수 있습니다.

1. 추가 옵션 구성을 마치면 **다음**을 선택합니다.

1. **검토**에서 설정을 확인합니다. 설정을 변경하려면 **이전**을 선택합니다 그렇지 않으면 **작업 제출**을 선택할 수 있습니다.

### AWS CLI 사용
<a name="batch-ops-example-cli-job-create"></a>

AWS CLI를 사용하여 Batch Operations 작업을 만들려면 기존 매니페스트를 지정할지 아니면 매니페스트를 자동으로 생성할지에 따라 다음 예제 중 하나를 선택하세요.

------
#### [ Specify manifest ]

다음 예제는 AWS CLI를 사용하여 기존 매니페스트 파일에 나열된 객체에 대해 수행되는 S3 Batch Operations `S3PutObjectTagging` 작업을 만드는 방법을 보여줍니다.

**매니페스트를 지정하여 Batch Operations `S3PutObjectTagging` 작업을 만들려면**

1. 다음 명령을 사용하여 AWS Identity and Access Management(IAM) 역할을 생성한 다음 IAM 정책을 생성하여 관련 권한을 할당합니다. 다음 역할 및 정책은 Amazon S3에 객체 태그를 추가할 수 있는 권한을 부여합니다. 이 권한은 후속 단계에서 작업을 생성할 때 필요합니다.

   1. 다음 예시 명령을 사용하여 배치 작업에서 사용할 IAM 역할을 생성합니다. 이 예시 명령을 사용하려면 `S3BatchJobRole`을 역할에 지정할 이름으로 변경하세요.

      ```
      aws iam create-role \
       --role-name S3BatchJobRole \
       --assume-role-policy-document '{
         "Version": "2012-10-17"		 	 	 ,
         "Statement":[
            {
               "Effect":"Allow",
               "Principal":{
                  "Service":"batchoperations.s3.amazonaws.com"
               },
               "Action":"sts:AssumeRole"
            }
         ]
      }'
      ```

      역할의 Amazon 리소스 이름(ARN)을 기록합니다. 작업을 생성할 때 ARN이 필요합니다.

   1. 다음 예시 명령을 사용하여 필요한 권한이 포함된 IAM 정책을 생성하고 이전 단계에서 생성한 IAM 역할에 연결합니다. 필요한 권한에 대한 자세한 내용은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 섹션을 참조하세요.
**참고**  
디렉터리 버킷에서 작업을 수행하는 배치 작업 건에는 특정 권한이 필요합니다. 자세한 내용은 [AWS Identity and Access Management (IAM) for S3 Express One Zone](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-security-iam.html)을 참조하세요.

      이 예시 명령을 사용하려면 `user input placeholders`를 다음과 같이 바꾸세요.
      + `S3BatchJobRole`을 IAM 역할의 이름으로 바꿉니다. 이 이름이 이전에 사용한 이름과 일치하는지 확인하세요.
      + `PutObjectTaggingBatchJobPolicy`를 IAM 정책에 부여하려는 이름으로 바꿉니다.
      + `amzn-s3-demo-destination-bucket`을 태그를 적용하려는 객체를 포함하는 버킷의 이름으로 바꿉니다.
      + *`amzn-s3-demo-manifest-bucket`*을 매니페스트를 포함하는 버킷의 이름으로 대체합니다.
      + *`amzn-s3-demo-completion-report-bucket`*을 완료 보고서를 전송하려는 버킷 이름으로 대체합니다.

      ```
      aws iam put-role-policy \
        --role-name S3BatchJobRole \
        --policy-name PutObjectTaggingBatchJobPolicy \
        --policy-document '{
        "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
        "Statement":[
          {
            "Effect":"Allow",
            "Action":[
              "s3:PutObjectTagging",
              "s3:PutObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
          },
          {
            "Effect": "Allow",
            "Action": [
              "s3:GetObject",
              "s3:GetObjectVersion",
              "s3:GetBucketLocation"
            ],
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-manifest-bucket",
              "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
          },
          {
            "Effect":"Allow",
            "Action":[
              "s3:PutObject",
              "s3:GetBucketLocation"
            ],
            "Resource":[
              "arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
              "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
            ]
          }
        ]
      }'
      ```

1. 다음 예시 명령을 사용하여 `S3PutObjectTagging` 작업을 생성합니다.

   `manifest.csv` 파일은 일련의 버킷 및 객체 키 값을 제공합니다. 이 작업은 매니페스트에서 식별된 객체에 지정된 태그를 적용합니다. `ETag`는 `manifest.csv` 객체의 ETag이며 Amazon S3 콘솔에서 가져올 수 있습니다. 이 요청은 `no-confirmation-required` 파라미터를 지정하므로 `update-job-status` 명령으로 파라미터를 확인하지 않고도 작업을 실행할 수 있습니다. 자세한 내용은 *AWS CLI 명령 참조*의 [https://docs.aws.amazon.com/cli/latest/reference/s3control/create-job.html](https://docs.aws.amazon.com/cli/latest/reference/s3control/create-job.html) 섹션을 참조하십시오.

   이 예 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체하세요. *`IAM-role`*을 이전에 생성한 IAM 역할의 ARN으로 바꿉니다.

   ```
   aws s3control create-job \
       --region us-west-2 \
       --account-id acct-id \
       --operation '{"S3PutObjectTagging": { "TagSet": [{"Key":"keyOne", "Value":"ValueOne"}] }}' \
       --manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::amzn-s3-demo-manifest-bucket/manifest.csv","ETag":"60e460c9d1046e73f7dde5043ac3ae85"}}' \
       --report '{"Bucket":"arn:aws:s3:::amzn-s3-demo-completion-report-bucket","Prefix":"final-reports", "Format":"Report_CSV_20180820","Enabled":true,"ReportScope":"AllTasks"}' \
       --priority 42 \
       --role-arn IAM-role \
       --client-request-token $(uuidgen) \
       --description "job description" \
       --no-confirmation-required
   ```

   이에 대한 응답으로 Amazon S3은 작업 ID(예: `00e123a4-c0d8-41f4-a0eb-b46f9ba5b07c`)를 반환합니다. 작업을 식별, 모니터링 및 수정하려면 작업 ID가 필요합니다.

------
#### [ Generate manifest ]

다음 예시는 객체 필터 기준에 따라 매니페스트를 자동으로 생성하는 `S3DeleteObjectTagging` S3 배치 작업 건을 생성하는 방법을 보여줍니다. 이 기준에는 생성 날짜, 키 이름, 크기, 스토리지 클래스 및 태그가 포함됩니다.

**매니페스트를 생성하여 Batch Operations `S3DeleteObjectTagging` 작업을 만들려면**

1. 다음 명령을 사용하여 AWS Identity and Access Management(IAM) 역할을 생성한 다음 IAM 정책을 생성하여 권한을 할당합니다. 다음 역할 및 정책은 Amazon S3에 객체 태그를 삭제할 수 있는 권한을 부여합니다. 이 권한은 후속 단계에서 작업을 생성할 때 필요합니다.

   1. 

      다음 예시 명령을 사용하여 배치 작업에서 사용할 IAM 역할을 생성합니다. 이 예시 명령을 사용하려면 `S3BatchJobRole`을 역할에 지정할 이름으로 변경하세요.

      ```
      aws iam create-role \
       --role-name S3BatchJobRole \
       --assume-role-policy-document '{
         "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
         "Statement":[
            {
               "Effect":"Allow",
               "Principal":{
                  "Service":"batchoperations.s3.amazonaws.com"
               },
               "Action":"sts:AssumeRole"
            }
         ]
      }'
      ```

      역할의 Amazon 리소스 이름(ARN)을 기록합니다. 작업을 생성할 때 ARN이 필요합니다.

   1. 다음 예시 명령을 사용하여 필요한 권한이 포함된 IAM 정책을 생성하고 이전 단계에서 생성한 IAM 역할에 연결합니다. 필요한 권한에 대한 자세한 내용은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 섹션을 참조하세요.
**참고**  
디렉터리 버킷에서 작업을 수행하는 배치 작업 건에는 특정 권한이 필요합니다. 자세한 내용은 [AWS Identity and Access Management (IAM) for S3 Express One Zone](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-security-iam.html)을 참조하세요.

      이 예시 명령을 사용하려면 `user input placeholders`를 다음과 같이 바꾸세요.
      + `S3BatchJobRole`을 IAM 역할의 이름으로 바꿉니다. 이 이름이 이전에 사용한 이름과 일치하는지 확인하세요.
      + `DeleteObjectTaggingBatchJobPolicy`를 IAM 정책에 부여하려는 이름으로 바꿉니다.
      + `amzn-s3-demo-destination-bucket`을 태그를 적용하려는 객체를 포함하는 버킷의 이름으로 바꿉니다.
      + `amzn-s3-demo-manifest-bucket`을 매니페스트를 저장하려는 버킷의 이름으로 바꿉니다.
      + `amzn-s3-demo-completion-report-bucket`을 완료 보고서를 전송하려는 버킷 이름으로 바꿉니다.

      ```
      aws iam put-role-policy \
        --role-name S3BatchJobRole \
        --policy-name DeleteObjectTaggingBatchJobPolicy \
        --policy-document '{
        "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
        "Statement":[
          {
            "Effect":"Allow",
            "Action":[
              "s3:DeleteObjectTagging",
              "s3:DeleteObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
          },
          {
            "Effect":"Allow",
            "Action":[
              "s3:PutInventoryConfiguration"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket"
          },
          {
            "Effect": "Allow",
            "Action": [
              "s3:GetObject",
              "s3:GetObjectVersion",
              "s3:ListBucket"
            ],
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-manifest-bucket",
              "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
          },
          {
            "Effect":"Allow",
            "Action":[
              "s3:PutObject",
              "s3:ListBucket"
            ],
            "Resource":[
              "arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
              "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*",
              "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
          }
        ]
      }'
      ```

      

1. 다음 예시 명령을 사용하여 `S3DeleteObjectTagging` 작업을 생성합니다.

   이 예시에서 `--report` 섹션의 값은 생성될 작업 보고서의 버킷, 접두사, 형식 및 범위를 지정합니다. `--manifest-generator` 섹션은 작업이 실행될 객체를 포함하는 소스 버킷에 대한 정보, 작업에 대해 생성될 매니페스트 출력 목록에 대한 정보, 매니페스트에 포함할 객체의 범위를 생성 날짜, 이름 제약 조건, 크기, 스토리지 클래스별로 좁히는 필터 기준이 지정됩니다. 또한 이 명령은 작업의 우선순위, IAM 역할, AWS 리전을 지정합니다.

   자세한 내용은 *AWS CLI 명령 참조*의 [https://docs.aws.amazon.com/cli/latest/reference/s3control/create-job.html](https://docs.aws.amazon.com/cli/latest/reference/s3control/create-job.html) 섹션을 참조하십시오.

   이 예 명령을 사용하려면 `user input placeholders`를 실제 정보로 대체하세요. *`IAM-role`*을 이전에 생성한 IAM 역할의 ARN으로 바꿉니다.

   ```
   aws s3control create-job \
       --account-id 012345678901 \
       --operation '{
           "S3DeleteObjectTagging": {}
       }' \
       --report '{
           "Bucket":"arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
           "Prefix":"reports", 
           "Format":"Report_CSV_20180820",
           "Enabled":true,
           "ReportScope":"AllTasks"
       }' \
       --manifest-generator '{
           "S3JobManifestGenerator": {
             "ExpectedBucketOwner": "012345678901",
             "SourceBucket": "arn:aws:s3:::amzn-s3-demo-source-bucket",
             "EnableManifestOutput": true,
             "ManifestOutputLocation": {
               "ExpectedManifestBucketOwner": "012345678901",
               "Bucket": "arn:aws:s3:::amzn-s3-demo-manifest-bucket",
               "ManifestPrefix": "prefix",
               "ManifestFormat": "S3InventoryReport_CSV_20211130"
             },
             "Filter": {
               "CreatedAfter": "2023-09-01",
               "CreatedBefore": "2023-10-01",
               "KeyNameConstraint": {
                 "MatchAnyPrefix": [
                   "prefix"
                 ],
                 "MatchAnySuffix": [
                   "suffix"
                 ]
               },
               "ObjectSizeGreaterThanBytes": 100,
               "ObjectSizeLessThanBytes": 200,
               "MatchAnyStorageClass": [
                 "STANDARD",
                 "STANDARD_IA"
               ]
             }
           }
         }' \
        --priority 2 \
        --role-arn IAM-role \
        --region us-east-1
   ```

   이에 대한 응답으로 Amazon S3은 작업 ID(예: `00e123a4-c0d8-41f4-a0eb-b46f9ba5b07c`)를 반환합니다. 작업을 식별, 모니터링 또는 수정하려면 이 작업 ID가 필요합니다.

------

### AWS SDK for Java 사용
<a name="batch-ops-examples-java-create-job"></a>

AWS SDK for Java로 Batch Operations 작업을 만들 때, 기존 매니페스트를 지정할지 또는 매니페스트를 자동으로 생성할지에 따라 다음 두 가지 방식 중 하나를 선택할 수 있습니다.
+ *기존 매니페스트 지정:* 기존 매니페스트 파일에 나열된 객체에 대해 작동하는 S3 Batch Operations 작업(예: `S3PutObjectTagging`)을 만듭니다. 이 접근 방식을 사용하려면 매니페스트 위치, ETag 및 형식 사양을 제공해야 합니다.
+ *매니페스트 자동 생성:* 만든 날짜, 키 이름, 크기 제약 조건 등 객체 필터 기준에 따라 매니페스트를 자동으로 생성하는 S3 Batch Operations 작업(예: `s3PutObjectCopy`)을 만듭니다.

두 접근 방식 모두 S3Control 클라이언트를 사용하여 작업, 매니페스트 사양, 작업 보고서, IAM 역할과 우선순위 및 확인 요구 사항을 포함한 기타 작업 파라미터를 구성합니다.

AWS SDK for Java를 사용하여 S3 Batch Operations 작업을 만드는 방법의 예는 *Amazon S3 API 참조*의 [Create a batch job to copy objects](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_CreateJob_section.html)를 참조하세요.

### REST API 사용
<a name="batch-ops-examples-rest-create-job"></a>

REST API를 사용하여 배치 작업을 생성할 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html)를 참조하세요.

## 작업 응답
<a name="batch-ops-create-job-response-elements"></a>

`CreateJob` 요청이 성공하면 Amazon S3가 작업 ID를 반환합니다. 작업 ID는 Amazon S3가 자동으로 생성하는 고유한 식별자이므로 배치 작업 건을 식별하고 그 상태를 모니터링할 수 있습니다.

AWS CLI, AWS SDK 또는 REST API를 통해 작업을 생성할 때 자동으로 작업 처리를 시작하도록 S3 배치 작업을 설정할 수 있습니다. 작업은 우선순위가 더 높은 작업을 기다리지 않고 준비가 완료되는 즉시 실행됩니다.

Amazon S3 콘솔을 통해 작업을 생성할 때 작업 세부 정보를 검토하고 배치 작업이 처리를 시작하기 전에 작업을 실행할 것인지 확인해야 합니다. 작업이 30일 이상 일시 중지된 상태로 있으면 작업이 실패합니다.

# S3 배치 작업에서 지원하는 작업
<a name="batch-ops-operations"></a>

S3 배치 작업을 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 배치 작업은 지정된 Amazon S3 객체 목록에 대해 단일 작업을 수행할 수 있습니다. 단일 작업으로 엑사바이트 규모의 데이터가 포함된 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다. Amazon S3는 진행 상황을 추적하고 알림을 보내며 모든 작업에 대한 자세한 완료 보고서를 저장하여 감사 가능한 완전관리형 서버리스 환경을 제공합니다. Amazon S3 콘솔, AWS CLI, AWS SDK 또는 Amazon S3 REST API를 통해 S3 Batch Operations를 사용할 수 있습니다.

S3 배치 작업은 다음 작업(operation)을 지원합니다.

# 객체 복사
<a name="batch-ops-copy-object"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. Batch Operations **복사** 작업은 매니페스트에 지정된 각 객체를 복사합니다. 객체를 동일한 AWS 리전의 버킷 또는 다른 리전의 버킷으로 복사할 수 있습니다. S3 배치 작업은 객체를 복사할 때 Amazon S3를 통해 사용 가능한 대부분의 옵션을 지원합니다. 이러한 옵션에는 객체 메타데이터 설정, 권한 설정, 객체 스토리지 클래스 변경이 포함됩니다.

또한, **복사** 작업을 사용하여 암호화되지 않은 기존 객체를 복사하고 암호화된 객체로 동일한 버킷에 다시 쓸 수 있습니다. 자세한 내용은 [Amazon S3 배치 작업에서 객체 암호화](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)를 참조하세요.

객체를 복사할 때 객체의 체크섬을 계산하는 데 사용되는 체크섬 알고리즘을 변경할 수 있습니다. 객체에 계산된 추가 체크섬이 없는 경우 Amazon S3에서 사용할 체크섬 알고리즘을 지정하여 체크섬을 추가할 수도 있습니다. 자세한 내용은 [Amazon S3에서 객체 무결성 확인](checking-object-integrity.md) 섹션을 참조하세요.

Amazon S3의 객체 복사와 필수 및 선택적 파라미터에 대한 자세한 내용은 이 가이드의 [객체 복사, 이동, 이름 변경](copy-object.md) 섹션과 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 섹션을 참조하세요.

## 규제 및 제한
<a name="batch-ops-copy-object-restrictions"></a>

Batch Operations **복사** 작업을 사용하는 경우 다음과 같은 규제 및 제한이 적용됩니다.
+ 모든 원본 객체가 한 버킷에 있어야 합니다.
+ 모든 대상 객체가 한 버킷에 있어야 합니다.
+ 원본 버킷에 대한 읽기 권한과 대상 버킷에 대한 쓰기 권한이 있어야 합니다.
+ 복사할 객체는 크기가 최대 5GB까지 가능합니다.
+ S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive 클래스에서 S3 Standard 스토리지 클래스로 객체를 복사하려는 경우 먼저 객체를 복원해야 합니다. 자세한 내용은 [아카이브된 객체 복원](restoring-objects.md) 섹션을 참조하세요.
+ 객체를 복사하려는 리전인 대상 리전에 Batch Operations **복사** 작업을 만들어야 합니다.
+ 엔터티 태그(ETag)의 조건부 검사와 고객 제공 암호화 키를 사용한 서버 측 암호화(SSE-C)를 제외한 모든 `CopyObject` 옵션이 지원됩니다.
+ 대상 버킷의 버전이 지정되지 않는 경우 키 이름이 같은 모든 객체를 덮어쓰게 됩니다.
+ 객체는 반드시 매니페스트에 나타나는 것과 동일한 순서로 복사되는 것은 아닙니다. 버전이 지정된 버킷의 경우 최신 또는 비최신 버전 순서를 유지하는 것이 중요하다면 모든 비최신 버전을 먼저 복사합니다. 그런 다음 첫 번째 작업이 완료된 후 후속 작업에서 현재 버전을 복사합니다.
+ Reduced Redundancy Storage(RRS) 클래스로 객체를 복사하는 것은 지원되지 않습니다.
+ 단일 Batch Operations 복사 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

# S3 배치 작업을 사용하여 객체 복사
<a name="batch-ops-examples-copy"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 Batch Operations를 사용하여 **복사**(`CopyObject`) 작업을 만들어 동일한 계정 내에서 또는 다른 대상 계정으로 객체를 복사할 수 있습니다.

다음 예제는 다른 계정에 있는 매니페스트를 저장하고 사용하는 방법을 보여줍니다. 첫 번째 예제는 Amazon S3 Inventory를 사용하여 작업을 만드는 동안 사용할 수 있도록 인벤토리 보고서를 대상 계정으로 전달하는 방법을 보여줍니다. 두 번째 예제에서는 소스 또는 대상 계정에서 쉼표로 구분된 값(CSV) 매니페스트를 사용하는 방법을 보여줍니다. 세 번째 예제에서는 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)를 통해 암호화된 기존 객체에 대해 S3 버킷 키를 활성화하도록 **복사** 작업을 사용하는 방법을 보여줍니다.

**Topics**
+ [

# 인벤토리 보고서를 사용하여 AWS 계정 간에 객체 복사
](specify-batchjob-manifest-xaccount-inventory.md)
+ [

# CSV 매니페스트를 사용하여 AWS 계정 간에 객체 복사
](specify-batchjob-manifest-xaccount-csv.md)
+ [

# Batch Operations를 사용하여 SSE-KMS용 S3 버킷 키 활성화
](batch-ops-copy-example-bucket-key.md)

# 인벤토리 보고서를 사용하여 AWS 계정 간에 객체 복사
<a name="specify-batchjob-manifest-xaccount-inventory"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 Batch Operations를 사용하여 **복사**(`CopyObject`) 작업을 만들어 동일한 계정 내에서 또는 다른 대상 계정으로 객체를 복사할 수 있습니다.

Amazon S3 Inventory를 사용하여 인벤토리 보고서를 만들고 이 보고서를 사용하여 S3 Batch Operations로 복사할 객체 목록(매니페스트)을 만들 수 있습니다. 소스 또는 대상 계정에서 CSV 매니페스트를 사용하는 방법에 대한 자세한 내용은 [CSV 매니페스트를 사용하여 AWS 계정 간에 객체 복사](specify-batchjob-manifest-xaccount-csv.md) 섹션을 참조하세요.

Amazon S3 인벤토리는 버킷에 객체의 인벤토리를 생성합니다. 결과 목록은 출력 파일에 게시됩니다. 인벤토리에 추가된 버킷을 원본 버킷이라고 하고 인벤토리 보고서 파일이 저장되는 버킷을 대상 버킷이라고 합니다.

Amazon S3 인벤토리 보고서를 다른 AWS 계정에 전송하도록 인벤토리 보고서를 구성할 수 있습니다. 그러면 대상 계정에서 작업이 생성될 때 S3 Batch Operations에서 인벤토리 보고서를 읽을 수 있습니다.

Amazon S3 인벤토리 소스 및 대상 버킷에 대한 자세한 내용은 [원본 및 대상 버킷](storage-inventory.md#storage-inventory-buckets) 섹션을 참조하세요.

인벤토리를 설정하는 가장 쉬운 방법은 Amazon S3 콘솔을 사용하는 것이지만, Amazon S3 REST API, AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용할 수도 있습니다.

다음 콘솔 절차에는 S3 배치 작업에 대한 권한을 설정하기 위한 상위 단계가 포함되어 있습니다. 이 절차에서는 원본 계정에서 대상 계정으로 객체를 복사하고, 대상 계정에 인벤토리 보고서를 저장합니다.

**다른 계정이 소유한 원본 버킷과 대상 버킷에 Amazon S3 인벤토리를 설정하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. 인벤토리 보고서를 저장할 대상 매니페스트 버킷을 결정하거나 만듭니다. 이 절차에서 *대상 계정*은 대상 매니페스트 버킷과 객체가 복사되는 버킷을 모두 소유한 계정입니다.

1. 소스 버킷에 대한 인벤토리 보고서를 구성합니다. 콘솔을 사용하여 인벤토리 목록을 구성하는 방법 또는 인벤토리 목록 파일을 암호화하는 방법에 대한 자세한 내용은 [Amazon S3 인벤토리 구성](configure-inventory.md) 페이지를 참조하세요.

   인벤토리 보고서를 구성할 때 목록을 저장할 대상 버킷을 지정합니다. 원본 버킷에 대한 인벤토리 보고서가 대상 버킷에 게시됩니다. 이 절차에서 *원본 계정*은 원본 버킷을 소유한 계정입니다.

   출력 형식으로 **CSV**를 선택하세요.

   대상 버킷에 대한 정보를 입력할 때 **다른 계정의 버킷**을 선택하세요. 그런 다음 대상 매니페스트 버킷의 이름을 입력합니다. 선택적으로 대상 계정의 계정 ID를 입력할 수 있습니다.

   인벤토리 구성을 저장하면 콘솔에 다음과 유사한 메시지가 표시됩니다.

   Amazon S3은 대상 버킷에 버킷 정책을 생성할 수 없습니다. Amazon S3이 대상 버킷에 데이터를 저장할 수 있도록 다음 버킷 정책을 추가하려면 대상 버킷 소유자에게 요청하세요.

   그러면 콘솔에 대상 버킷에 사용할 수 있는 버킷 정책이 표시됩니다.

1. 콘솔에 표시되는 대상 버킷 정책을 복사하세요.

1. 대상 계정에서 인벤토리 보고서가 저장된 대상 매니페스트 버킷에 복사한 버킷 정책을 추가합니다.

1. S3 배치 작업 신뢰 정책을 기반으로 하는 대상 계정에 역할을 생성합니다. 신뢰 정책에 대한 자세한 내용은 [신뢰 정책](batch-ops-iam-role-policies.md#batch-ops-iam-role-policies-trust) 섹션을 참조하세요.

   역할 만들기에 대한 자세한 내용은 **IAM 사용 설명서의 [역할을 만들어 AWS 서비스에 권한 위임](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

   역할의 이름을 입력하세요(다음 예제 역할은 이름 *`BatchOperationsDestinationRoleCOPY`* 사용). **S3** 서비스를 선택한 다음, 신뢰 정책을 역할에 적용하는 **S3 Batch Operations** 사용 사례를 선택합니다.

   그리고 **정책 생성**을 선택하여 다음 정책을 역할에 연결하세요. 이 정책을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsDestinationObjectCOPY",
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:PutObjectVersionAcl",
           "s3:PutObjectAcl",
           "s3:PutObjectVersionTagging",
           "s3:PutObjectTagging",
           "s3:GetObject",
           "s3:GetObjectVersion",
           "s3:GetObjectAcl",
           "s3:GetObjectTagging",
           "s3:GetObjectVersionAcl",
           "s3:GetObjectVersionTagging"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
         ]
       }
     ]
   }
   ```

------

   이 역할은 정책을 사용하여 대상 버킷의 매니페스트를 읽을 수 있는 `batchoperations.s3.amazonaws.com` 권한을 부여합니다. 소스 객체 버킷의 `GET` 객체, 액세스 제어 목록(ACL), 태그 및 버전에 대한 권한도 부여합니다. 또한, 대상 객체 버킷의 `PUT` 객체, ACL, 태그 및 버전에 대한 권한을 부여합니다.

1. 소스 계정에서, 이전 단계에서 만든 역할에 소스 버킷의 `GET` 객체, ACL, 태그 및 버전에 대한 권한을 부여하는 소스 버킷에 대한 버킷 정책을 만듭니다. 이 단계에서는 신뢰할 수 있는 역할을 통해 S3 배치 작업이 원본 버킷에서 객체를 가져올 수 있습니다.

   다음은 원본 계정에 대한 버킷 정책의 예입니다. 이 정책을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowBatchOperationsSourceObjectCOPY",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/BatchOperationsDestinationRoleCOPY"
               },
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:GetObjectAcl",
                   "s3:GetObjectTagging",
                   "s3:GetObjectVersionAcl",
                   "s3:GetObjectVersionTagging"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
           }
       ]
   }
   ```

------

1. 인벤토리 보고서를 사용할 수 있게 되면 대상 계정에 S3 Batch Operations **복사**(`CopyObject`) 작업을 생성하고 대상 매니페스트 버킷에서 인벤토리 보고서를 선택합니다. 대상 계정에서 만든 IAM 역할에 대한 ARN이 필요합니다.

   작업 생성에 대한 일반적인 정보는 [S3 배치 작업 건 생성](batch-ops-create-job.md) 섹션을 참조하세요.

   콘솔을 사용하여 작업을 만드는 방법에 대한 자세한 내용은 [S3 배치 작업 건 생성](batch-ops-create-job.md) 섹션을 참조하세요.

# CSV 매니페스트를 사용하여 AWS 계정 간에 객체 복사
<a name="specify-batchjob-manifest-xaccount-csv"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 Batch Operations를 사용하여 **복사**(`CopyObject`) 작업을 만들어 동일한 계정 내에서 또는 다른 대상 계정으로 객체를 복사할 수 있습니다.

소스 계정에 저장된 CSV 매니페스트를 사용하여 S3 배치 작업에서 AWS 계정 간에 객체를 복사할 수 있습니다. S3 인벤토리 보고서를 매니페스트로 사용하려면 [인벤토리 보고서를 사용하여 AWS 계정 간에 객체 복사](specify-batchjob-manifest-xaccount-inventory.md) 섹션을 참조하세요.

매니페스트 파일의 CSV 형식 예는 [매니페스트 파일 생성](batch-ops-create-job.md#create-manifest-file) 섹션을 참조하세요.

다음 절차에서는 S3 배치 작업을 사용하여 소스 계정의 객체를 소스 계정에 저장된 CSV 매니페스트 파일이 있는 대상 계정으로 복사할 때 권한을 설정하는 방법을 보여줍니다.

**CSV 매니페스트를 사용하여 AWS 계정 간에 객체를 복사하려면**

1. S3 Batch Operations 신뢰 정책을 기반으로 하는 대상 계정에서 AWS Identity and Access Management(IAM) 역할을 만듭니다. 이 절차에서 *대상 계정*은 객체가 복사되는 계정입니다.

   신뢰 정책에 대한 자세한 내용은 [신뢰 정책](batch-ops-iam-role-policies.md#batch-ops-iam-role-policies-trust) 섹션을 참조하세요.

   역할 만들기에 대한 자세한 내용은 **IAM 사용 설명서의 [역할을 만들어 AWS 서비스에 권한 위임](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

   콘솔을 사용하여 역할을 만드는 경우 역할의 이름을 입력합니다(다음 예제 역할은 이름 `BatchOperationsDestinationRoleCOPY` 사용). **S3** 서비스를 선택한 다음, 신뢰 정책을 역할에 적용하는 **S3 Batch Operations** 사용 사례를 선택합니다.

   그리고 **정책 생성**을 선택하여 다음 정책을 역할에 연결하세요. 이 정책을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsDestinationObjectCOPY",
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:PutObjectVersionAcl",
           "s3:PutObjectAcl",
           "s3:PutObjectVersionTagging",
           "s3:PutObjectTagging",
           "s3:GetObject",
           "s3:GetObjectVersion",
           "s3:GetObjectAcl",
           "s3:GetObjectTagging",
           "s3:GetObjectVersionAcl",
           "s3:GetObjectVersionTagging"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
         ]
       }
     ]
   }
   ```

------

   이 역할은 정책을 사용하여 원본 매니페스트 버킷의 매니페스트를 읽을 수 있는 `batchoperations.s3.amazonaws.com` 권한을 부여합니다. 소스 객체 버킷의 `GET` 객체, 액세스 제어 목록(ACL), 태그 및 버전에 대한 권한을 부여합니다. 또한 대상 객체 버킷의 `PUT` 객체, ACL, 태그 및 버전에 대한 권한을 부여합니다.

1. 소스 계정에서 매니페스트가 포함된 버킷에 대한 버킷 정책을 생성하여 이전 단계에서 생성한 역할에 소스 매니페스트 버킷의 `GET` 객체 및 버전에 대한 권한을 부여합니다.

   이 단계에서는 S3 배치 작업이 신뢰할 수 있는 역할을 사용하여 매니페스트를 읽을 수 있습니다. 매니페스트가 포함된 버킷에 버킷 정책을 적용합니다.

   다음은 원본 매니페스트 버킷에 적용할 버킷 정책의 예입니다. 이 정책을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsSourceManifestRead",
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "arn:aws:iam::111122223333:user/ConsoleUserCreatingJob",
             "arn:aws:iam::111122223333:role/BatchOperationsDestinationRoleCOPY"
           ]
         },
         "Action": [
           "s3:GetObject",
           "s3:GetObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
       }
     ]
   }
   ```

------

   또한 이 정책은 대상 계정에서 작업을 생성하는 콘솔 사용자가 동일한 버킷 정책을 통해 원본 매니페스트 버킷의 동일한 권한을 사용할 수 있는 권한을 부여합니다.

1. 소스 계정에서, 생성한 역할에 소스 객체 버킷의 `GET` 객체, ACL, 태그 및 버전에 대한 권한을 부여하는 버킷 정책을 소스 버킷에 대해 생성합니다. 그런 다음 S3 배치 작업은 신뢰할 수 있는 역할을 통해 원본 버킷에서 객체를 가져올 수 있습니다.

   다음은 원본 객체가 포함된 버킷에 대한 버킷 정책의 예입니다. 이 정책을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsSourceObjectCOPY",
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:role/BatchOperationsDestinationRoleCOPY"
         },
         "Action": [
           "s3:GetObject",
           "s3:GetObjectVersion",
           "s3:GetObjectAcl",
           "s3:GetObjectTagging",
           "s3:GetObjectVersionAcl",
           "s3:GetObjectVersionTagging"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
       }
     ]
   }
   ```

------

1. 대상 계정에서 S3 배치 작업을 생성합니다. 대상 계정에서 생성한 역할에 대한 Amazon 리소스 이름(ARN)이 필요합니다. 작업 생성에 대한 자세한 내용은 [S3 배치 작업 건 생성](batch-ops-create-job.md) 단원을 참조하세요.

# Batch Operations를 사용하여 SSE-KMS용 S3 버킷 키 활성화
<a name="batch-ops-copy-example-bucket-key"></a>

S3 버킷 키는 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS Key Management Service(AWS KMS)를 사용한 서버 측 암호화(SSE-KMS) 비용을 절감합니다. 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 및 [새 객체에 SSE-KMS와 함께 S3 버킷 키를 사용하도록 버킷 구성](configuring-bucket-key.md)(을)를 참조하세요. REST API, AWS SDK 또는 AWS CLI를 사용하여 `CopyObject` 작업을 수행할 때 `x-amz-server-side-encryption-bucket-key-enabled` 요청 헤더에 `true` 또는 `false` 값을 추가하여 객체 수준에서 S3 버킷 키를 활성화하거나 비활성화할 수 있습니다.

`CopyObject` 작업을 사용하여 객체에 대한 S3 버킷 키를 구성하면 Amazon S3는 해당 객체에 대한 설정만 업데이트합니다. 대상 버킷에 대한 S3 버킷 키 설정은 변경되지 않습니다. S3 버킷 키가 활성화된 버킷에 AWS KMS로 암호화된 객체에 대한 `CopyObject` 요청을 제출하면 요청 헤더의 키를 비활성화하지 않는 이상 객체 수준 작업에서 자동으로 S3 버킷 키가 사용됩니다. 객체에 S3 버킷 키를 지정하지 않으면 Amazon S3가 대상 버킷에 대한 S3 버킷 키 설정을 객체에 적용합니다.

기존 Amazon S3 객체를 암호화하기 위해 S3 Batch Operations를 사용할 수 있습니다. **배치 작업 복사 작업**을 사용하여 암호화되지 않은 기존 객체를 복사하고 암호화된 새로운 객체를 동일한 버킷에 작성할 수 있습니다. 자세한 내용은 AWS 스토리지 블로그의 [Amazon S3 Batch Operations로 객체 암호화](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)를 참조하세요.

다음 예제에서는 Batch Operations **복사** 작업을 사용하여 기존 객체에서 S3 버킷 키를 활성화합니다. 자세한 내용은 [객체 수준에서 S3 버킷 키 구성](configuring-bucket-key-object.md) 섹션을 참조하세요.

**Topics**
+ [

## S3 Batch Operations를 사용하여 S3 버킷 키가 활성화된 객체를 암호화할 때 고려해야 할 사항
](#bucket-key-ex-things-to-note)
+ [

## 사전 조건
](#bucket-key-ex-prerequisites)
+ [

## 1단계: Amazon S3 인벤토리를 사용하여 객체 목록 가져오기
](#bucket-key-ex-get-list-of-objects)
+ [

## 2단계: S3 Select를 사용하여 객체 목록 필터링
](#bucket-key-ex-filter-object-list-with-s3-select)
+ [

## 3단계: S3 배치 작업 설정 및 실행
](#bucket-key-ex-setup-and-run-job)

## S3 Batch Operations를 사용하여 S3 버킷 키가 활성화된 객체를 암호화할 때 고려해야 할 사항
<a name="bucket-key-ex-things-to-note"></a>

S3 Batch Operations를 사용하여 S3 버킷 키가 활성화된 객체를 암호화할 때는 다음 문제를 고려합니다.
+ 데이터 전송, 요청 및 기타 요금을 포함하여 S3 배치 작업에서 사용자를 대신해 수행하는 작업과 연관된 요금 외에도 S3 배치 작업, 객체 및 요청에 대한 요금이 청구됩니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing)을 참조하세요.
+ 버전 관리 버킷을 사용하는 경우 수행된 각 S3 배치 작업은 암호화된 새 객체 버전을 생성합니다. 또한, S3 버킷 키가 구성되지 않은 이전 버전도 유지 관리합니다. 이전 버전을 삭제하려면 [수명 주기 구성의 요소](intro-lifecycle-rules.md)에서 설명한 대로, 최신 버전이 아닌 버전에 대해 S3 수명 주기 만료 정책을 설정합니다.
+ 복사 작업은 새 생성 날짜에 새 객체를 생성하므로 아카이브와 같은 수명 주기 작업에 영향을 줄 수 있습니다. 버킷의 모든 객체를 복사하는 경우, 모든 새 사본의 생성 날짜가 동일하거나 비슷합니다. 이러한 객체를 추가로 식별하고 다양한 데이터 하위 집합에 대해 서로 다른 수명 주기 규칙을 생성하려면 객체 태그 사용을 고려합니다.

## 사전 조건
<a name="bucket-key-ex-prerequisites"></a>

S3 버킷 키를 사용하도록 객체를 구성하기 전에 [S3 버킷 키를 사용 설정하기 전에 유의할 변경 사항](bucket-key.md#bucket-key-changes) 섹션을 검토하세요.

이 예제를 사용하려면 AWS 계정 및 작업 파일과 암호화된 결과를 보관할 수 있는 S3 버킷이 하나 이상 있어야 합니다. 또한, 다음 항목을 포함하여 기존 S3 배치 작업 설명서의 대부분을 유용하게 사용할 수 있습니다.
+ [S3 배치 작업 기본 사항](batch-ops.md#batch-ops-basics)
+ [S3 배치 작업 건 생성](batch-ops-create-job.md)
+ [S3 배치 작업에서 지원하는 작업](batch-ops-operations.md)
+ [S3 배치 작업 건 관리](batch-ops-managing-jobs.md)

## 1단계: Amazon S3 인벤토리를 사용하여 객체 목록 가져오기
<a name="bucket-key-ex-get-list-of-objects"></a>

시작하려면 암호화할 객체를 포함하는 S3 버킷을 식별하고 해당 콘텐츠 목록을 가져옵니다. Amazon S3 인벤토리 보고서는 이 작업을 수행하는 가장 편리하면서도 경제적인 방법입니다. 이 보고서는 연결된 메타데이터와 함께 버킷에 있는 객체 목록을 제공합니다. 이 단계에서 소스 버킷은 인벤토리가 있는 버킷이고 대상 버킷은 인벤토리 보고서 파일을 저장하는 버킷입니다. Amazon S3 인벤토리 소스 및 대상 버킷에 대한 자세한 내용은 [S3 Inventory를 사용한 데이터 카탈로그화 및 분석](storage-inventory.md) 섹션을 참조하세요.

인벤토리를 설정하는 가장 쉬운 방법은 AWS Management Console을 사용하는 것입니다. 하지만 REST API, AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용할 수도 있습니다. 이 단계를 수행하기 전에 콘솔에 로그인하고 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다. . 권한 거부 오류가 발생하면 대상 버킷에 버킷 정책을 추가합니다. 자세한 내용은 [S3 인벤토리 및 S3 분석 권한 부여](example-bucket-policies.md#example-bucket-policies-s3-inventory-1) 섹션을 참조하세요.

**S3 인벤토리를 사용하여 객체 목록 가져오기**

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

1. 왼쪽 탐색 창에서 **버킷**을 선택하고 암호화할 객체를 포함하는 버킷을 선택합니다.

1. [**관리(Management)**] 탭에서 [**인벤토리 구성(Inventory configurations)**] 섹션으로 이동하고 [**인벤토리 구성 작성(Create inventory configuration)**]을 선택합니다.

1. 새 인벤토리에 이름을 지정하고 대상 S3 버킷의 이름을 입력한 다음, 선택적으로 Amazon S3 대상 접두사를 생성하여 해당 버킷에서 객체를 할당합니다.

1. [**출력 형식(Output format)**]으로 [**CSV**]를 선택합니다.

1. (선택 사항) **추가 필드 - **선택 사항** 섹션에서 **암호화** 및 원하는 기타 보고서 필드를 선택합니다. 첫 번째 보고서가 버킷에 더 빨리 제공되도록 보고서 제공 빈도를 [**일별(Daily)**]로 설정합니다.

1. [**생성(Create)**]을 선택하여 구성을 저장합니다.

Amazon S3에서 첫 번째 보고서를 제공하는 데 최대 48시간이 걸릴 수 있으므로 첫 번째 보고서가 도착하면 다시 확인합니다. 첫 번째 보고서를 받은 후 다음 단계로 이동하여 S3 Inventory 보고서의 콘텐츠를 필터링합니다. 이 버킷에 대한 인벤토리 보고서를 더 이상 받지 않으려면 S3 인벤토리 구성을 삭제합니다. 그렇지 않으면 Amazon S3는 매일 또는 매주 일정에 따라 보고서를 계속 제공합니다.

인벤토리 목록은 모든 객체의 단일 시점 보기가 아닙니다. 인벤토리 목록은 최종 일관성을 지닌 버킷 항목의 롤링 스냅샷입니다(예: 목록에 최근에 추가되거나 삭제된 객체가 포함되지 않을 수 있음). S3 인벤토리와 S3 배치 작업을 결합하면 정적 객체 또는 2일 이상 전에 생성한 객체 세트로 작업할 때 가장 효과적입니다. 최신 데이터로 작업하려면 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)(`GET` 버킷) API 작업을 사용하여 수동으로 객체 목록을 작성합니다. 필요한 경우 다음 며칠 동안 또는 인벤토리 보고서에 모든 객체의 원하는 상태가 표시될 때까지 이 프로세스를 반복합니다.

## 2단계: S3 Select를 사용하여 객체 목록 필터링
<a name="bucket-key-ex-filter-object-list-with-s3-select"></a>

S3 Inventory 보고서를 받은 후 활성화된 S3 버킷 키로 암호화되지 않은 객체만 나열하도록 보고서의 콘텐츠를 필터링할 수 있습니다. 활성화된 S3 버킷 키로 모든 버킷의 객체를 암호화하려는 경우 이 단계는 무시할 수 있습니다. 그러나 이 단계에서 S3 Inventory 보고서를 필터링하면 이전에 활성화된 S3 버킷 키로 암호화한 객체를 다시 암호화하는 데 드는 시간과 비용을 절약할 수 있습니다.

다음 단계에서는 [Amazon S3 Select](https://aws.amazon.com/blogs/aws/s3-glacier-select/)를 사용하여 필터링하는 방법을 보여주지만, [Amazon Athena](https://aws.amazon.com/athena)를 사용할 수도 있습니다. 사용할 도구를 결정하려면 S3 인벤토리 보고서의`manifest.json` 파일을 검토합니다. 이 파일은 해당 보고서에 연결된 데이터 파일의 수를 나열합니다. 많은 경우 Amazon Athena를 사용합니다. 여러 S3 객체에서 실행되기 때문입니다. 반면 S3 Select는 한 번에 하나의 객체에서 작동합니다. Amazon S3와 Athena를 함께 사용하는 방법에 대한 자세한 내용은 AWS 스토리지 블로그 게시물 [Amazon S3 Batch Operations로 객체 암호화](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations)에서 [Amazon Athena로 Amazon S3 인벤토리 쿼리](storage-inventory-athena-query.md) 및 'Athena 사용'을 참조하세요.

**S3 Select를 사용하여 S3 Inventory 보고서를 필터링하려면**

1. 인벤토리 보고서에서 `manifest.json` 파일을 열고 JSON의 `fileSchema` 섹션을 참조하세요. 이 데이터에서 실행하는 쿼리를 알립니다.

   다음 JSON 버전 관리가 사용되는 버킷에서 CSV 형식 인벤토리의 `manifest.json` 파일에 대한 예제입니다. 인벤토리 보고서를 구성한 방법에 따라 매니페스트가 다를 수 있습니다.

   ```
     {
       "sourceBucket": "batchoperationsdemo",
       "destinationBucket": "arn:aws:s3:::amzn-s3-demo-destination-bucket",
       "version": "2021-05-22",
       "creationTimestamp": "1558656000000",
       "fileFormat": "CSV",
       "fileSchema": "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, BucketKeyStatus",
       "files": [
         {
           "key": "demoinv/batchoperationsdemo/DemoInventory/data/009a40e4-f053-4c16-8c75-6100f8892202.csv.gz",
           "size": 72691,
           "MD5checksum": "c24c831717a099f0ebe4a9d1c5d3935c"
         }
       ]
     }
   ```

   버킷에서 버전 관리가 활성화되지 않았거나 최신 버전에 대한 보고서를 실행하도록 선택한 경우 `fileSchema`는 `Bucket`, `Key` 및 `BucketKeyStatus`입니다.

   버전 관리가 **활성화된 경우 인벤토리 보고서를 설정하는 방법에 따라 `fileSchema`에는 `Bucket`, `Key`, `VersionId`, `IsLatest`, `IsDeleteMarker`, `BucketKeyStatus`가 포함될 수 있습니다. 따라서 쿼리를 실행할 때는 1, 2, 3, 6 열에 주의하세요.

   S3 배치 작업에는 `BucketKeyStatus`인 검색 기준 필드 외에, 작업을 수행하기 위한 입력으로 버킷, 키 및 버전 ID가 필요합니다. `VersionID` 필드가 필요하지는 않지만, 버전이 지정된 버킷에서 작업할 때 `VersionID` 필드를 지정하는 데 도움이 됩니다. 자세한 내용은 [버전 관리가 사용 설정된 버킷의 객체 작업](manage-objects-versioned-bucket.md) 섹션을 참조하세요.

1. 인벤토리 보고서의 데이터 파일을 찾습니다. `manifest.json` 객체는 **files** 아래 데이터 파일을 나열합니다..

1. S3 콘솔에서 데이터 파일을 찾아 선택한 후 [**작업(Actions)**]을 선택한 다음 [**S3 Select에서 쿼리(Query with S3 Select)**]를 선택합니다.

1. 사전 설정된 [**CSV**], [**쉼표(Comma)**] 및 [**GZIP**] 필드를 선택한 상태로 두고 [**다음(Next)**]을 선택합니다.

1. 계속하기 전에 인벤토리 보고서의 형식을 검토하려면 [**파일 미리 보기 표시(Show file preview)**]를 선택합니다.

1. SQL 표현식 필드에 참조할 열을 입력하고 **SQL 실행(Run SQL)**을 선택합니다. 다음 표현식은 S3 버킷 키가 구성되지 않은 모든 객체에 대해 1\$13번째 열을 반환합니다.

   `select s._1, s._2, s._3 from s3object s where s._6 = 'DISABLED'`

   다음은 예 결과입니다.

   ```
         batchoperationsdemo,0100059%7Ethumb.jpg,lsrtIxksLu0R0ZkYPL.LhgD5caTYn6vu
         batchoperationsdemo,0100074%7Ethumb.jpg,sd2M60g6Fdazoi6D5kNARIE7KzUibmHR
         batchoperationsdemo,0100075%7Ethumb.jpg,TLYESLnl1mXD5c4BwiOIinqFrktddkoL
         batchoperationsdemo,0200147%7Ethumb.jpg,amufzfMi_fEw0Rs99rxR_HrDFlE.l3Y0
         batchoperationsdemo,0301420%7Ethumb.jpg,9qGU2SEscL.C.c_sK89trmXYIwooABSh
         batchoperationsdemo,0401524%7Ethumb.jpg,ORnEWNuB1QhHrrYAGFsZhbyvEYJ3DUor
         batchoperationsdemo,200907200065HQ%7Ethumb.jpg,d8LgvIVjbDR5mUVwW6pu9ahTfReyn5V4
         batchoperationsdemo,200907200076HQ%7Ethumb.jpg,XUT25d7.gK40u_GmnupdaZg3BVx2jN40
         batchoperationsdemo,201103190002HQ%7Ethumb.jpg,z.2sVRh0myqVi0BuIrngWlsRPQdb7qOS
   ```

1. 결과를 다운로드하여 CSV 형식으로 저장한 다음 S3 배치 작업의 객체 목록으로 Amazon S3에 업로드합니다.

1. 매니페스트 파일이 여러 개인 경우 [**S3 Select에서 쿼리(Query with S3 Select)**도 실행합니다. 결과의 크기에 따라 목록을 결합하여 단일 S3 배치 작업을 실행하거나 각 목록을 별도의 작업으로 실행할 수 있습니다. 실행할 작업 수를 결정하려면 각 S3 Batch Operations 작업의 실행 [요금](https://aws.amazon.com/s3/pricing/)을 고려합니다.

## 3단계: S3 배치 작업 설정 및 실행
<a name="bucket-key-ex-setup-and-run-job"></a>

S3 객체의 CSV 목록을 필터링했으므로, S3 Batch Operations 작업을 시작하여 활성화된 S3 버킷 키로 객체를 암호화할 수 있습니다.

*작업*은 제공된 객체의 목록(매니페스트), 수행된 작업 및 지정된 파라미터를 총체적으로 나타냅니다. 활성화된 S3 버킷 키로 객체 집합을 암호화하는 가장 쉬운 방법은 **복사** 작업을 사용하고 매니페스트에 나열된 객체와 동일한 대상 접두사를 지정하는 것입니다. 버전이 지정되지 않은 버킷에서 이 작업은 기존 객체를 덮어씁니다. 버전 관리가 설정된 버킷에서 이 작업은 암호화된 최신 버전의 객체를 생성합니다.

객체를 복사하는 과정에서 Amazon S3가 SSE-KMS 암호화로 객체를 암호화하도록 지정합니다. 이 작업은 객체를 복사하므로, 처음에 Amazon S3에 추가한 시점과 관계없이 모든 객체가 완료 시 업데이트된 생성 날짜를 표시합니다. 또한, 객체 태그와 스토리지 클래스를 포함하여 S3 배치 작업의 일부로 객체 집합에 대한 다른 속성을 지정합니다.

**Topics**
+ [

### IAM 정책 설정
](#bucket-key-ex-set-up-iam-policy)
+ [

### 배치 작업 IAM 역할 설정
](#bucket-key-ex-set-up-iam-role)
+ [

### 기존 버킷에 대해 S3 버킷 키 활성화
](#bucket-key-ex-enable-s3-bucket-key-on-a-bucket)
+ [

### 배치 작업 생성
](#bucket-key-ex-create-job)
+ [

### 배치 작업 실행
](#bucket-key-ex-run-job)

### IAM 정책 설정
<a name="bucket-key-ex-set-up-iam-policy"></a>

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

1. 왼쪽 탐색 창에서 **정책**을 선택한 다음 **정책 만들기**를 선택합니다.

1. [**JSON**] 탭을 선택합니다. [**정책 편집(Edit policy)**]을 선택하고 다음 코드 블록에 표시되는 IAM 정책 예제를 추가합니다.

   정책 예제를 [IAM 콘솔](https://console.aws.amazon.com/iam/)에 복사한 후 다음을 바꿉니다.

   1. `amzn-s3-demo-source-bucket`을 객체를 복사할 소스 버킷의 이름으로 바꿉니다.

   1. `amzn-s3-demo-destination-bucket`을 객체를 복사할 대상 버킷의 이름으로 바꿉니다.

   1. `amzn-s3-demo-manifest-bucket/manifest-key`를 매니페스트 객체의 이름으로 바꿉니다.

   1. `amzn-s3-demo-completion-report-bucket`을 완료 보고서를 저장하려는 버킷의 이름으로 바꿉니다.

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

****  

   ```
     {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Sid": "CopyObjectsToEncrypt",
           "Effect": "Allow",
           "Action": [
             "s3:PutObject",
             "s3:PutObjectTagging",
             "s3:PutObjectAcl",
             "s3:PutObjectVersionTagging",
             "s3:PutObjectVersionAcl",
             "s3:GetObject",
             "s3:GetObjectAcl",
             "s3:GetObjectTagging",
             "s3:GetObjectVersion",
             "s3:GetObjectVersionAcl",
             "s3:GetObjectVersionTagging"
           ],
           "Resource": [
             "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
             "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
           ]
         },
         {
           "Sid": "ReadManifest",
           "Effect": "Allow",
           "Action": [
             "s3:GetObject",
             "s3:GetObjectVersion"
           ],
           "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/manifest-key"
         },
         {
           "Sid": "WriteReport",
           "Effect": "Allow",
           "Action": [
             "s3:PutObject"
           ],
           "Resource": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
         }
       ]
     }
   ```

------

1. **다음: 태그**를 선택합니다.

1. 선택적으로 원하는 태그를 추가하고 [**다음: 검토(Next: Review)**]를 선택합니다.

1. 정책 이름과 설명(선택 사항)을 추가하고 [**정책 생성(Create policy)**]을 선택합니다.

1. [**정책 검토(Review policy)**] 및 [**변경 사항 저장(Save changes)**]을 선택합니다.

1. 이제 S3 배치 작업 정책이 완료되면 콘솔이 IAM **정책** 페이지로 이동합니다. 정책 이름을 필터링하고 정책 이름 왼쪽에 있는 버튼을 선택한 다음 [**정책 작업(Policy actions)**]을 선택하고 [**연결(Attach)**]을 선택합니다.

   새로 생성된 정책을 IAM 역할에 연결하려면 계정에서 적절한 사용자, 그룹 또는 역할을 선택하고 [**정책 연결(Attach policy)**]을 선택합니다. 그러면 IAM 콘솔로 돌아갑니다.

### 배치 작업 IAM 역할 설정
<a name="bucket-key-ex-set-up-iam-role"></a>

1. [IAM 콘솔](https://console.aws.amazon.com/iam/)의 탐색 창에서 **역할**을 선택하고 **역할 생성**을 선택합니다.

1. **AWS 서비스**, **S3** 및 **S3 배치 작업**을 선택합니다. 그런 다음 [**Next: Permissions**]를 선택합니다.

1. 먼저 방금 생성한 IAM **정책** 이름을 입력합니다. 정책 이름이 나타나면 해당 확인란을 선택하고 [**다음: 태그(Next: Tags)**]를 선택합니다.

1. (선택 사항) 이 연습에서는 태그를 추가하거나 키 및 값 필드를 비워 둡니다. **다음: 검토**를 선택합니다.

1. 역할 이름을 입력하고 기본 설명을 그대로 사용하거나 직접 추가합니다. **역할 생성**을 선택합니다.

1. 작업을 생성하는 사용자에게 다음 예제의 권한이 있는지 확인합니다.

   AWS 계정 ID 및 `IAM-role-name`의 `account-id`를 나중에 배치 작업 생성 단계에서 생성할 IAM 역할에 적용하려는 이름으로 바꿉니다. 자세한 내용은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 섹션을 참조하세요.

   ```
               {
               "Sid": "AddIamPermissions",
               "Effect": "Allow",
               "Action": [
               "iam:GetRole",
               "iam:PassRole"
               ],
               "Resource": "arn:aws:iam::account-id:role/IAM-role-name"
               }
   ```

### 기존 버킷에 대해 S3 버킷 키 활성화
<a name="bucket-key-ex-enable-s3-bucket-key-on-a-bucket"></a>

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

1. **버킷** 목록에서 S3 버킷 키를 활성화할 버킷을 선택합니다.

1. [**속성(Properties)**]을 선택합니다.

1. **기본 암호화**에서 **편집**을 선택합니다.

1. **암호화 유형**에서 **Amazon S3 관리형 키(SSE-S3)** 또는 **AWS Key Management Service 키(SSE-KMS)**를 선택할 수 있습니다.

1. **AWS Key Management Service 키(SSE-KMS)**를 선택한 경우, **AWS KMS key**에서 다음 옵션 중 하나를 통해 AWS KMS 키를 지정할 수 있습니다.
   + 사용 가능한 KMS 키 목록에서 선택하려면 **AWS KMS 키에서 선택**을 선택합니다. 사용 가능한 키 목록에서 버킷과 동일한 리전의 대칭 암호화 KMS 키를 선택합니다. AWS 관리형 키(`aws/s3`)와 고객 관리형 키가 모두 목록에 표시됩니다.
   + KMS 키 ARN을 입력하려면 **AWS KMS 키 ARN 입력**을 선택한 다음 나타나는 필드에 KMS 키 ARN을 입력합니다.
   + AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 **KMS 키 생성**을 선택합니다.

1. [**버킷 키(Bucket Key)**] 아래에서 [**사용(Enable)**]을 선택하고 [**변경 사항 저장(Save changes)**]을 선택합니다.

버킷 수준에서 S3 버킷 키가 활성화되었으므로, 이 버킷으로 업로드, 수정 또는 복사된 객체는 기본적으로 이 암호화 구성을 상속합니다. 여기에는 Amazon S3 배치 작업을 사용하여 복사된 객체가 포함됩니다.

### 배치 작업 생성
<a name="bucket-key-ex-create-job"></a>

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

1. 탐색 창에서 **배치 작업(Batch Operations)**을 선택하고 **작업 생성(Create Job)**을 선택합니다.

1. 객체를 저장할 [**리전(Region)**]을 선택하고 매니페스트 유형으로 [**CSV**]를 선택합니다.

1. 경로를 입력하거나 이전에 S3 Select(또는 Athena) 결과에서 생성한 CSV 매니페스트 파일로 이동합니다. 매니페스트에 버전 ID가 있으면 해당 상자를 선택합니다. [**Next**]를 선택합니다.

1. [**복사(Copy)**] 작업을 선택하고 복사 대상 버킷을 선택합니다. 서버 측 암호화를 사용하지 않도록 설정할 수 있습니다. 버킷 대상에서 S3 버킷 키가 사용되는 한, 복사 작업은 대상 버킷에 S3 버킷 키를 적용합니다.

1. (선택 사항) 스토리지 클래스와 다른 파라미터를 원하는 대로 선택합니다. 이 단계에서 지정하는 파라미터는 매니페스트에 나열된 객체에서 수행된 모든 작업에 적용됩니다. **다음**을 선택합니다.

1. 서버 측 암호화를 구성하려면 다음 단계를 따르세요.

   1. **서버 측 암호화**에서 다음 중 하나를 선택합니다.
      + Amazon S3에 객체를 저장할 때 객체의 기본 서버 측 암호화에 대한 버킷 설정을 유지하려면 **암호화 키를 지정하지 마십시오**를 선택합니다. 버킷 대상에서 S3 버킷 키가 사용되는 한 복사 작업은 대상 버킷에 S3 버킷 키를 적용합니다.
**참고**  
지정된 대상의 버킷 정책에서 Amazon S3에 저장하기 전에 객체를 암호화해야 하는 경우 암호화 키를 지정해야 합니다. 지정하지 않으면 대상에 대한 객체 복사가 실패합니다.
      + Amazon S3에 저장하기 전에 객체를 암호화하려면 **암호화 키 지정**을 선택합니다.

   1. **암호화 설정**에서 **암호화 키 지정**을 선택하는 경우, **기본 암호화에 대상 버킷 설정 사용** 또는 **기본 암호화에 대상 버킷 설정 재정의** 중 하나를 선택해야 합니다.

   1. **기본 암호화에 대상 버킷 설정 재정의**를 선택하는 경우 다음과 같은 암호화 설정을 구성해야 합니다.

      1. **암호화 유형**에서 **Amazon S3 관리형 키(SSE-S3)** 또는 **AWS Key Management Service 키(SSE-KMS)** 중 하나를 선택해야 합니다. SSE-S3는 가장 강력한 블록 암호 중 하나인 256비트 Advanced Encryption Standard(AES-256)을 사용하여 각 객체를 암호화합니다. SSE-KMS는 키에 대한 더 많은 제어 기능을 제공합니다. 자세한 내용은 [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3) 사용](UsingServerSideEncryption.md) 및 [AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용](UsingKMSEncryption.md)(을)를 참조하세요.

      1. **AWS Key Management Service 키(SSE-KMS)**를 선택하는 경우, **AWS KMS key**에서 다음 옵션 중 하나를 통해 AWS KMS key를 지정할 수 있습니다.
         + 사용 가능한 KMS 키 목록에서 선택하려면 **AWS KMS keys 중에서 선택**을 선택한 다음, 버킷과 동일한 리전에서 대칭 암호화 KMS 키를 선택합니다. AWS 관리형 키(`aws/s3`)와 고객 관리형 키가 모두 목록에 표시됩니다.
         + KMS 키 ARN을 입력하려면 **AWS KMS 키 ARN 입력**을 선택하고 나타나는 필드에 KMS 키 ARN을 입력합니다.
         + AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 **KMS 키 생성**을 선택합니다.

      1. **버킷 키(Bucket Key)**에서 **사용(Enable)**을 선택합니다. 복사 작업은 대상 버킷에서 S3 버킷 키를 적용합니다.

1. 작업에 설명을 제공하거나 기본값을 유지하고 우선 순위 수준을 설정하며, 보고서 유형을 선택하고, [**완료 보고서 대상 경로(Path to completion report destination)**]를 지정합니다.

1. **권한(Permissions)** 섹션에서 앞서 정의한 배치 작업 IAM 역할을 선택해야 합니다. [**Next**]를 선택합니다.

1. [**검토(Review)**]에서 설정을 확인합니다. 변경하려면 [**이전(Previous)**]을 선택합니다 배치 작업 설정을 확인한 후 **작업 생성(Create job)**을 선택합니다.

   자세한 내용은 [S3 배치 작업 건 생성](batch-ops-create-job.md) 섹션을 참조하세요.

### 배치 작업 실행
<a name="bucket-key-ex-run-job"></a>

설치 마법사가 Amazon S3 콘솔의 S3 배치 작업 섹션으로 자동으로 돌아갑니다. 새 작업은 S3에서 프로세스를 시작할 때 [**신규(New)**] 상태에서 [**준비 중(Preparing)**] 상태로 전환됩니다. 준비 중 상태에서는 S3가 작업의 매니페스트를 읽고 오류를 확인하며 객체 수를 계산합니다.

1. Amazon S3 콘솔에서 새로 고침 버튼을 선택하여 진행 상태를 확인합니다. 매니페스트의 크기에 따라 읽는 데 몇 분 또는 몇 시간이 걸릴 수 있습니다.

1. S3가 작업 매니페스트 읽기를 마치면 작업이 [**확인을 기다리는 중(Awaiting your confirmation)**] 상태로 이전됩니다. 작업 ID 왼쪽에 있는 옵션 버튼을 선택하고 [**작업 실행(Run job)**]을 선택합니다.

1. 작업에 대한 설정을 확인하고 오른쪽 하단에 있는 [**작업 실행(Run job)**]을 선택합니다.

   작업 실행이 시작된 후 특정 작업을 선택하거나 새로 고침 버튼을 선택하여 콘솔 대시보드 보기를 통해 진행 상태를 확인할 수 있습니다.

1. 작업이 완료되면 [**성공(Successful)**] 및 [**실패(Failed)**] 객체 개수를 보고 모든 작업이 예상대로 수행되었는지 확인할 수 있습니다. 작업 보고서를 사용하는 경우 보고서에서 실패한 작업의 정확한 원인을 확인합니다.

   AWS CLI, AWS SDK 또는 Amazon S3 REST API를 사용해서도 이 단계를 수행할 수 있습니다. 작업 상태 및 완료 보고서 추적에 대한 자세한 내용은 [작업 상태 및 완료 보고서 추적](batch-ops-job-status.md) 섹션을 참조하세요.

AWS CLI 및 AWS SDK for Java에서 태그를 사용한 복사 작업을 보여 주는 예제는 [레이블 지정에 작업 태그를 사용하는 배치 작업 생성](batch-ops-tags-create.md) 섹션을 참조하세요.

# 체크섬 계산
<a name="batch-ops-compute-checksums"></a>

**체크섬 계산** 작업과 함께 S3 Batch Operations를 사용하여 Amazon S3 객체에 대한 저장 시 체크섬 계산을 수행할 수 있습니다. **체크섬 계산** 작업은 저장된 데이터의 객체를 다운로드하거나 복원하지 않고도 데이터 무결성을 검증하는 데 사용할 수 있는 객체 체크섬을 계산합니다. **체크섬 계산** 작업을 사용하여 지원되는 모든 체크섬 알고리즘에 대해 복합 및 전체 객체 체크섬 유형 모두에 대한 체크섬을 계산할 수 있습니다.

**체크섬 계산** 작업을 사용하면 단일 작업 요청을 통해 수십억 개의 객체를 처리할 수 있습니다. 이 배치 작업은 객체 크기에 관계없이 모든 S3 스토리지 클래스와 호환됩니다. **체크섬 계산** 작업을 만들려면 Amazon S3 콘솔, AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API를 사용합니다.

[서버 액세스 로깅을 활성화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html)하면 **체크섬 계산** 작업에 대한 로그 항목을 수신할 수도 있습니다. **체크섬 계산** 작업은 체크섬 계산을 완료한 후 별도의 서버 액세스 로그 이벤트를 내보냅니다. 이러한 로그 항목은 표준 [S3 서버 액세스 로깅 형식](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html)을 따르며 작업 유형, 타임스탬프, [오류 코드](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList) 및 관련 **체크섬 계산** 작업 ID와 같은 필드를 포함합니다. 이 로깅은 객체에 대해 수행된 체크섬 확인 활동의 감사 추적을 제공하여 데이터 무결성 작업을 추적하고 확인하는 데 도움이 됩니다.

**참고**  
**체크섬 계산** 작업은 고객 제공 암호화 키(SSE-C) 암호화 객체를 사용한 서버 측 암호화를 지원하지 않습니다. 그러나 **체크섬 계산** 작업은 [S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html), AWS Key Management Service를 사용한 서버 측 암호화(DSSE-KMS)를 사용하여 암호화된 객체에 사용할 수 있습니다. **체크섬 계산** 작업을 수행할 수 있는 [적절한 AWS KMS 권한을 부여](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#require-sse-kms)했는지 확인합니다.

Batch Operations를 사용하여 **체크섬 계산** 작업을 시작하려면 다음 중 하나를 수행할 수 있습니다.
+ 새 매니페스트 파일을 수동으로 만듭니다.
+ 기존 매니페스트를 사용합니다.
+ [작업을 만들 때 지정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-create-job.html#specify-batchjob-manifest)한 객체 필터 기준에 따라 자동으로 매니페스트를 생성하도록 Batch Operations에 지시합니다.

그런 다음 **체크섬 계산** 작업 요청을 제출하고 상태를 모니터링합니다. **체크섬 계산** 작업이 완료되면 지정된 대상 버킷에서 완료 보고서를 자동으로 수신합니다. 이 완료 보고서에는 버킷의 모든 객체에 대한 체크섬 정보가 포함되어 있으므로 데이터 일관성을 확인할 수 있습니다. 이 보고서를 사용하여 작업을 조사하는 방법에 대한 자세한 내용은 [작업 상태 및 완료 보고서 추적](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-job-status.html)을 참조하세요.

**체크섬 계산** 기능과 콘솔에서 **체크섬 계산**을 사용하는 방법에 대한 자세한 내용은 [Amazon S3의 저장 데이터에 대한 객체 무결성 확인](checking-object-integrity-at-rest.md) 섹션을 참조하세요. **체크섬 계산**에 REST 요청을 보내는 방법에 대한 자세한 내용은 *Amazon S3 API 참조*의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) 및 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html) 섹션을 참조하세요.

다음 섹션에서는 S3 Batch Operations와 함께 **체크섬 계산**을 사용하여 시작할 수 있는 방법에 대해 설명합니다.

**Topics**
+ [

## S3 Batch Operations **체크섬 계산** 고려 사항
](#batch-ops-compute-checksum-considerations)
+ [

## S3 Batch Operations 완료 보고서
](#batch-ops-compute-checksum-completion-report)

## S3 Batch Operations **체크섬 계산** 고려 사항
<a name="batch-ops-compute-checksum-considerations"></a>

**체크섬 계산** 작업을 사용하기 전에 다음 고려 사항 목록을 검토합니다.
+ 매니페스트에 버전 ID 필드가 포함된 경우, 매니페스트 내 모든 객체에 대한 버전 ID를 제공해야 합니다. 버전 ID를 지정하지 않으면 **체크섬 계산** 요청이 객체의 최신 버전에서 작업을 수행합니다.
+ [서버 액세스 로그](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html)에서 **체크섬 계산** 작업 세부 정보를 수신하려면 먼저 소스 버킷에서 [서버 액세스 로깅을 활성화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html)하고 로그를 저장할 대상 버킷을 지정해야 합니다. 대상 버킷은 소스 버킷과 동일한 AWS 리전 및 AWS 계정에 있어야 합니다. 서버 액세스 로깅을 구성한 후 **체크섬 계산** 작업은 작업 유형, HTTP 상태 코드, [S3 오류 코드](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList), 타임스탬프 및 연결된 **체크섬 계산** 작업 ID와 같은 표준 필드를 포함하는 [로그 레코드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html#log-record-fields)를 생성합니다. **체크섬 계산** 작업은 비동기적으로 실행됩니다. 따라서 [로그 항목](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html#log-record-fields)은 로그 항목에 요청 ID가 아닌 **체크섬 계산** 작업 ID를 사용합니다.
+ 저장된 객체의 경우 보고서 생성에 최대 몇 시간이 걸릴 수 있습니다.
+ 다음 S3 Glacier 스토리지 클래스의 경우 **체크섬 계산** 작업을 완료하는 데 최대 1주일이 걸릴 수 있습니다.
  + S3 Glacier Flexible Retrieval
  + S3 Glacier Deep Archive
+ 완료 보고서를 작성할 버킷의 경우 **체크섬 계산** 작업을 실행할 때 [버킷 소유자 조건](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html#bucket-owner-condition-when-to-use)을 사용해야 합니다. 제출된 작업 요청에 대해 실제 버킷 소유자가 예상 버킷 소유자와 일치하지 않으면 요청이 실패합니다. 버킷 소유자 조건을 지원하지 않는 S3 작업 목록은 [규제 및 제한](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html#bucket-owner-condition-restrictions-limitations)을 참조하세요.

## S3 Batch Operations 완료 보고서
<a name="batch-ops-compute-checksum-completion-report"></a>

**체크섬 계산** 작업을 만들 때 S3 Batch Operations 완료 보고서를 요청할 수 있습니다. 이 CSV 파일에는 객체, 성공 또는 실패 코드, 출력 및 설명이 표시됩니다. 작업 추적 및 완료 보고서에 대한 자세한 내용은 [완료 보고서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-job-status.html#batch-ops-completion-report)를 참조하세요.

# 모든 객체 태그 삭제
<a name="batch-ops-delete-object-tagging"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **모든 객체 태그 삭제** 작업은 매니페스트에 나열된 객체와 현재 연결된 모든 Amazon S3 객체 태그 세트를 제거합니다. S3 Batch Operations는 다른 태그를 그대로 남겨 두면서 객체에서 태그를 삭제하는 작업을 지원하지 않습니다.

매니페스트의 객체가 버전 지정된 버킷에 있는 경우, 특정 버전의 객체에서 태그 세트를 제거할 수 있습니다. 그렇게 하려면 매니페스트의 모든 객체에 대한 버전 ID를 지정해야 합니다. 객체에 대한 버전 ID를 포함하지 않으면 S3 배치 작업이 모든 객체의 최신 버전에서 태그 세트를 제거합니다. 배치 작업 매니페스트에 대한 자세한 내용은 [매니페스트 지정](batch-ops-create-job.md#specify-batchjob-manifest) 섹션을 참조하세요.

객체 태그 지정에 대한 자세한 내용을 알아보려면 이 가이드의 [태그를 사용하여 객체 분류](object-tagging.md) 섹션을 살펴보고, **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html) 섹션을 참조하세요.

**주의**  
이 작업을 실행하면 매니페스트에 나열된 모든 객체의 모든 객체 태그 세트가 제거됩니다.

콘솔을 사용하여 **모든 객체 태그 삭제** 작업을 만들려면 [S3 배치 작업 건 생성](batch-ops-create-job.md) 섹션을 참조하세요.

## 규제 및 제한
<a name="batch-ops-delete-object-tagging-restrictions"></a>

Batch Operations를 사용하여 객체 태그를 삭제하는 경우 다음 규제와 제한 사항이 적용됩니다.
+ 작업을 실행하기 위해 지정하는 AWS Identity and Access Management(IAM) 역할에는 기본 Amazon S3 `DeleteObjectTagging` 작업을 수행할 수 있는 권한이 있어야 합니다. 자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html)를 참조하세요.
+ S3 Batch Operations는 Amazon S3 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html) 작업을 사용하여 매니페스트의 모든 객체에서 태그 집합을 제거합니다. 기본 작업에 적용되는 모든 규제 및 제한은 S3 배치 작업에도 적용됩니다.
+ 단일 객체 태그 삭제 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

# AWS Lambda 함수 호출
<a name="batch-ops-invoke-lambda"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **AWS Lambda 함수 간접 호출** Batch Operations 작업은 매니페스트에 나열된 객체에 대한 사용자 지정 작업을 수행할 AWS Lambda 함수를 시작합니다. 이 섹션에서는 S3 배치 작업에 사용할 Lambda 함수 생성 방법과 함수 호출 작업 생성 방법을 설명합니다. S3 배치 작업은 `LambdaInvoke` 작업을 사용하여 매니페스트에 나열된 모든 객체에 대해 Lambda 함수를 실행합니다.

Amazon S3 콘솔, AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API를 사용하여 S3 Batch Operations와 함께 작업할 수 있습니다. Lambda 사용에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS Lambda 시작하기](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)를 참조하세요.

다음 섹션에서는 S3 배치 작업을 Lambda와 함께 사용하여 시작할 수 있는 방법에 대해 설명합니다.

**Topics**
+ [

## Batch Operations에 Lambda 사용
](#batch-ops-invoke-lambda-using)
+ [

## S3 배치 작업에서 사용할 Lambda 함수 생성
](#batch-ops-invoke-lambda-custom-functions)
+ [

## Lambda 함수를 호출하는 S3 배치 작업 건 생성
](#batch-ops-invoke-lambda-create-job)
+ [

## Lambda 매니페스트에서 태스크 수준 정보 제공
](#storing-task-level-information-in-lambda)
+ [

## S3 배치 작업 자습서
](#batch-ops-tutorials-lambda)

## Batch Operations에 Lambda 사용
<a name="batch-ops-invoke-lambda-using"></a>

S3 배치 작업을 AWS Lambda와 함께 사용할 때 특별히 S3 배치 작업에 사용할 새로운 Lambda 함수를 생성해야 합니다. 기존의 Amazon S3 이벤트 기반 함수를 S3 배치 작업에 재사용할 수는 없습니다. 이벤트 함수는 메시지만 받을 수 있습니다. 메시지를 반환하지 않습니다. S3 배치 작업에 사용되는 Lambda 함수는 메시지를 수락하고 반환해야 합니다. Amazon S3 이벤트와 함께 Lambda를 사용하는 방법에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [Amazon S3에서 AWS Lambda 사용 섹션을 참조하세요](https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html).

Lambda 함수를 호출하는 S3 배치 처리 작업을 생성합니다. 이 작업은 매니페스트에 나열된 모든 객체에 대해 동일한 Lambda 함수를 실행합니다. 매니페스트의 객체를 처리하는 동안 사용할 Lambda 함수의 버전을 제어할 수 있습니다. S3 배치 작업은 정규화되지 않은 Amazon 리소스 이름(ARN), 별칭 및 특정 버전을 지원합니다. 자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS Lambda 버전 관리 소개](https://docs.aws.amazon.com/lambda/latest/dg/versioning-intro.html)를 참조하세요.

별칭 또는 `$LATEST` 한정어를 사용하는 함수 ARN에 S3 배치 작업을 제공하고 해당 버전 중 하나를 업데이트하면 S3 배치 작업에서 Lambda 함수의 새 버전 호출을 시작합니다. 이는 라지 작업을 통해 기능 부분을 업데이트하고자 할 때 유용할 수 있습니다. S3 Batch Operations에서 사용되는 버전을 변경하지 않으려면 작업을 만들 때 `FunctionARN` 파라미터에 특정 버전을 제공합니다.

S3 Batch Operations를 사용한 단일 AWS Lambda 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

### 디렉터리 버킷에 Lambda 및 Batch Operations 사용
<a name="batch-ops-invoke-lambda-directory-buckets"></a>

디렉터리 버킷은 일관되게 10밀리초 미만의 지연 시간이 필요한 워크로드 또는 성능이 중요한 애플리케이션용으로 설계된 Amazon S3 버킷의 유형입니다. 자세한 내용은 [디렉터리 버킷](https://docs.aws.amazon.com//AmazonS3/latest/userguide/directory-buckets-overview.html)을 참조하세요.

배치 작업을 사용하여 디렉터리 버킷에서 작동하는 Lambda 함수를 호출하려면 특별한 요구 사항이 있습니다. 예를 들어, 업데이트된 JSON 스키마를 사용하여 Lambda 요청을 구조화하고 작업을 만들 때 [https://docs.aws.amazon.com//AmazonS3/latest/API/API_control_LambdaInvokeOperation.html#AmazonS3-Type-control_LambdaInvokeOperation-InvocationSchemaVersion](https://docs.aws.amazon.com//AmazonS3/latest/API/API_control_LambdaInvokeOperation.html#AmazonS3-Type-control_LambdaInvokeOperation-InvocationSchemaVersion) 2.0(1.0 아님)을 지정해야 합니다. 이 업데이트된 스키마를 통해 기존 Lambda 함수의 특정 파라미터를 수정하는 데 사용할 수 있는 [https://docs.aws.amazon.com//AmazonS3/latest/API/API_control_LambdaInvokeOperation.html#AmazonS3-Type-control_LambdaInvokeOperation-UserArguments](https://docs.aws.amazon.com//AmazonS3/latest/API/API_control_LambdaInvokeOperation.html#AmazonS3-Type-control_LambdaInvokeOperation-UserArguments)에 대한 선택적 키-값 쌍을 지정할 수 있습니다. 자세한 내용은 AWS 스토리지 블로그에서 [Automate object processing in Amazon S3 directory buckets with S3 Batch Operations and AWS Lambda](https://aws.amazon.com/blogs/storage/automate-object-processing-in-amazon-s3-directory-buckets-with-s3-batch-operations-and-aws-lambda/)를 참조하세요.

### 응답 및 결과 코드
<a name="batch-ops-invoke-lambda-response-codes"></a>

S3 배치 작업은 하나 이상의 키를 사용하여 Lambda 함수를 간접 호출하며, 각각에는 연결된 `TaskID`가 있습니다. S3 배치 작업은 Lambda 함수로부터 키별 결과 코드를 기대합니다. 요청으로 전송되었지만 키별 결과 코드와 함께 반환되지 않은 모든 태스크 ID에는 `treatMissingKeysAs` 필드의 결과 코드가 제공됩니다. `treatMissingKeysAs`는 선택적 요청 필드이며 기본값은 `TemporaryFailure`입니다. 다음 표에는 `treatMissingKeysAs` 필드에 사용할 수 있는 다른 결과 코드와 값이 나와 있습니다.


| 응답 코드 | 설명 | 
| --- | --- | 
| Succeeded | 작업이 정상적으로 완료되었습니다. 작업 완료 보고서를 요청한 경우 작업의 결과 문자열이 보고서에 포함됩니다. | 
| TemporaryFailure | 작업이 일시적으로 실패하여 작업이 완료되기 전에 리드라이브됩니다. 결과 문자열은 무시됩니다. 이것이 최종 리드라이브인 경우 오류 메시지가 최종 보고서에 포함됩니다. | 
| PermanentFailure | 작업에 영구 실패가 발생했습니다. 작업 완료 보고서를 요청한 경우 작업은 Failed로 표시되고 오류 메시지 문자열을 포함합니다. 실패한 작업의 결과 문자열은 무시됩니다. | 

## S3 배치 작업에서 사용할 Lambda 함수 생성
<a name="batch-ops-invoke-lambda-custom-functions"></a>

이 섹션에서는 Lambda 함수와 함께 사용해야 하는 AWS Identity and Access Management(IAM) 권한 예제를 제공합니다. 또한 S3 배치 작업에 사용할 예제 Lambda 함수도 포함되어 있습니다. 이전에 Lambda 함수를 생성한 적이 없다면 *AWS Lambda 개발자 안내서*의 [자습서: Amazon S3에서 AWS Lambda 사용](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)을 참조하세요.

S3 배치 작업 전용으로 Lambda 함수를 만들어야 합니다. S3 Batch Operations에 사용되는 Lambda 함수는 특수 데이터 필드를 받아들여 반환해야 하기 때문에 기존 Amazon S3 이벤트 기반 Lambda 함수를 다시 사용할 수 없습니다.

**중요**  
Java로 작성된 AWS Lambda 함수는 [https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestHandler.java](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestHandler.java) 또는 [https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestStreamHandler.java](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/RequestStreamHandler.java) 핸들러 인터페이스를 받아들입니다. 그러나 S3 배치 작업 요청 및 응답 형식을 지원하려면 AWS Lambda에 요청 및 응답의 사용자 지정 직렬화 및 역직렬화를 위한 `RequestStreamHandler` 인터페이스가 필요합니다. 이 인터페이스를 통해 Lambda에서 InputStream 및 OutputStream을 Java `handleRequest` 메서드에 전달할 수 있습니다.  
S3 배치 작업에 Lambda 함수를 사용할 때는 반드시 `RequestStreamHandler` 인터페이스를 사용해야 합니다. `RequestHandler` 인터페이스를 사용하는 경우 배치 작업이 실패하고 완료 보고서에 “잘못된 JSON이 Lambda 페이로드로 반환됨”이라고 표시됩니다.  
자세한 내용은 *AWS Lambda 사용 설명서*의 [핸들러 인터페이스](https://docs.aws.amazon.com//lambda/latest/dg/java-handler.html#java-handler-interfaces)를 참조하세요.

### 예제 IAM 권한
<a name="batch-ops-invoke-lambda-custom-functions-iam"></a>

다음은 Lambda 함수를 S3 배치 작업에 사용하는 데 필요한 IAM 권한의 예제입니다.

**Example - S3 배치 작업 신뢰 정책**  
다음은 배치 작업 IAM 역할에서 사용할 수 있는 신뢰 정책의 예제입니다. 이 IAM 역할은 작업을 생성할 때 지정되며 IAM 역할을 수임할 배치 작업 권한을 부여합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "batchoperations.s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

**Example - Lambda IAM 정책**  
다음은 Lambda 함수를 호출하고 입력 매니페스트를 읽을 수 있는 S3 배치 작업 권한을 부여하는 IAM 정책의 예제입니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "BatchOperationsLambdaPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:PutObject",
                "lambda:InvokeFunction"
            ],
            "Resource": "*"
        }
    ]
}
```

### 예제 요청 및 응답
<a name="batch-ops-invoke-lambda-custom-functions-request"></a>

이 섹션에는 Lambda 함수에 대한 요청 및 응답 예제가 나와 있습니다.

**Example 요청**  
다음은 Lambda 함수 요청에 대한 JSON 예제입니다.  

```
{
    "invocationSchemaVersion": "1.0",
    "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
    "job": {
        "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce"
    },
    "tasks": [
        {
            "taskId": "dGFza2lkZ29lc2hlcmUK",
            "s3Key": "customerImage1.jpg",
            "s3VersionId": "1",
            "s3BucketArn": "arn:aws:s3:us-east-1:0123456788:amzn-s3-demo-bucket1"
        }
    ]
}
```

**Example 응답**  
다음은 Lambda 함수에 대한 JSON 응답의 예제입니다.  

```
{
  "invocationSchemaVersion": "1.0",
  "treatMissingKeysAs" : "PermanentFailure",
  "invocationId" : "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
  "results": [
    {
      "taskId": "dGFza2lkZ29lc2hlcmUK",
      "resultCode": "Succeeded",
      "resultString": "[\"Mary Major", \"John Stiles\"]"
    }
  ]
}
```

### S3 배치 작업에 대한 Lambda 함수 예제
<a name="batch-ops-invoke-lambda-custom-functions-example"></a>

다음 예제 Python Lambda는 버전이 지정된 객체에서 삭제 마커를 제거합니다.

예제에서 볼 수 있듯이 S3 배치 작업의 키는 URL로 인코딩됩니다. Amazon S3를 다른 AWS 서비스와 함께 사용하려면 S3 배치 작업에서 전달된 키를 URL로 디코딩해야 합니다.

```
import logging
from urllib import parse
import boto3
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)
logger.setLevel("INFO")

s3 = boto3.client("s3")


def lambda_handler(event, context):
    """
    Removes a delete marker from the specified versioned object.

    :param event: The S3 batch event that contains the ID of the delete marker
                  to remove.
    :param context: Context about the event.
    :return: A result structure that Amazon S3 uses to interpret the result of the
             operation. When the result code is TemporaryFailure, S3 retries the
             operation.
    """
    # Parse job parameters from Amazon S3 batch operations
    invocation_id = event["invocationId"]
    invocation_schema_version = event["invocationSchemaVersion"]

    results = []
    result_code = None
    result_string = None

    task = event["tasks"][0]
    task_id = task["taskId"]

    try:
        obj_key = parse.unquote_plus(task["s3Key"], encoding="utf-8")
        obj_version_id = task["s3VersionId"]
        bucket_name = task["s3BucketArn"].split(":")[-1]

        logger.info(
            "Got task: remove delete marker %s from object %s.", obj_version_id, obj_key
        )

        try:
            # If this call does not raise an error, the object version is not a delete
            # marker and should not be deleted.
            response = s3.head_object(
                Bucket=bucket_name, Key=obj_key, VersionId=obj_version_id
            )
            result_code = "PermanentFailure"
            result_string = (
                f"Object {obj_key}, ID {obj_version_id} is not " f"a delete marker."
            )

            logger.debug(response)
            logger.warning(result_string)
        except ClientError as error:
            delete_marker = error.response["ResponseMetadata"]["HTTPHeaders"].get(
                "x-amz-delete-marker", "false"
            )
            if delete_marker == "true":
                logger.info(
                    "Object %s, version %s is a delete marker.", obj_key, obj_version_id
                )
                try:
                    s3.delete_object(
                        Bucket=bucket_name, Key=obj_key, VersionId=obj_version_id
                    )
                    result_code = "Succeeded"
                    result_string = (
                        f"Successfully removed delete marker "
                        f"{obj_version_id} from object {obj_key}."
                    )
                    logger.info(result_string)
                except ClientError as error:
                    # Mark request timeout as a temporary failure so it will be retried.
                    if error.response["Error"]["Code"] == "RequestTimeout":
                        result_code = "TemporaryFailure"
                        result_string = (
                            f"Attempt to remove delete marker from  "
                            f"object {obj_key} timed out."
                        )
                        logger.info(result_string)
                    else:
                        raise
            else:
                raise ValueError(
                    f"The x-amz-delete-marker header is either not "
                    f"present or is not 'true'."
                )
    except Exception as error:
        # Mark all other exceptions as permanent failures.
        result_code = "PermanentFailure"
        result_string = str(error)
        logger.exception(error)
    finally:
        results.append(
            {
                "taskId": task_id,
                "resultCode": result_code,
                "resultString": result_string,
            }
        )
    return {
        "invocationSchemaVersion": invocation_schema_version,
        "treatMissingKeysAs": "PermanentFailure",
        "invocationId": invocation_id,
        "results": results,
    }
```

## Lambda 함수를 호출하는 S3 배치 작업 건 생성
<a name="batch-ops-invoke-lambda-create-job"></a>

Lambda 함수를 호출하기 위해 S3 배치 작업을 생성할 때 다음을 제공해야 합니다.
+ Lambda 함수의 ARN(함수 별칭 또는 특정 버전 번호를 포함할 수도 있음)
+ 함수 호출 권한이 있는 IAM 역할
+ 작업 파라미터 `LambdaInvokeFunction`

S3 배치 작업 생성에 대한 자세한 내용은 [S3 배치 작업 건 생성](batch-ops-create-job.md) 및 [S3 배치 작업에서 지원하는 작업](batch-ops-operations.md) 섹션을 참조하세요.

다음 예제에서는 AWS CLI를 사용하여 Lambda 함수를 간접 호출하는 S3 Batch Operations 작업을 생성합니다. 이 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

```
aws s3control create-job
    --account-id account-id
    --operation  '{"LambdaInvoke": { "FunctionArn": "arn:aws:lambda:region:account-id:function:LambdaFunctionName" } }'
    --manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::amzn-s3-demo-manifest-bucket","ETag":"ManifestETag"}}'
    --report '{"Bucket":"arn:aws:s3:::amzn-s3-demo-bucket","Format":"Report_CSV_20180820","Enabled":true,"Prefix":"ReportPrefix","ReportScope":"AllTasks"}'
    --priority 2
    --role-arn arn:aws:iam::account-id:role/BatchOperationsRole
    --region region
    --description "Lambda Function"
```

## Lambda 매니페스트에서 태스크 수준 정보 제공
<a name="storing-task-level-information-in-lambda"></a>

S3 Batch Operations에서 AWS Lambda 함수를 사용할 때는 작업 중인 각 태스크나 키에 추가 데이터를 포함해야 할 수도 있습니다. 예를 들어, 소스 객체 키와 새로운 객체 키가 모두 제공되도록 하고 싶을 수 있습니다. 이렇게 하면 Lambda 함수는 새 S3 버킷에 원본을 새로운 이름으로 복사할 수 있습니다. 기본적으로 Batch Operations는 작업에 대해 입력 매니페스트의 대상 버킷과 소스 키 목록만 지정할 수 있도록 합니다. 아래 예제에는 보다 복잡한 Lambda 함수를 실행할 수 있도록 매니페스트에 추가 데이터를 포함시킬 수 있는 방법이 나와 있습니다.

S3 배치 작업 매니페스트에 Lambda 함수 코드에서 사용할 키별 파라미터를 지정하려면 다음과 같이 URL 인코딩된 JSON 형식을 사용하세요. `key` 필드는 마치 Amazon S3 객체 키인 것처럼 Lambda 함수로 전달됩니다. 그러나 아래 예제와 같이 Lambda 함수로 다른 값이나 여러 키를 포함하도록 해석할 수 있습니다.

**참고**  
매니페스트에서 `key` 필드의 최대 문자 수는 1,024자입니다.

**Example - 'Amazon S3 키'를 JSON 문자열로 대체하는 매니페스트**  
URL 인코딩 버전을 S3 배치 작업에 제공해야 합니다.  

```
amzn-s3-demo-bucket,{"origKey": "object1key", "newKey": "newObject1Key"}
amzn-s3-demo-bucket,{"origKey": "object2key", "newKey": "newObject2Key"}
amzn-s3-demo-bucket,{"origKey": "object3key", "newKey": "newObject3Key"}
```

**Example - URL 인코딩된 매니페스트**  
이러한 URL 인코딩 버전을 S3 배치 작업에 제공해야 합니다. URL 인코딩 버전이 아니면 작동하지 않습니다.  

```
amzn-s3-demo-bucket,%7B%22origKey%22%3A%20%22object1key%22%2C%20%22newKey%22%3A%20%22newObject1Key%22%7D
amzn-s3-demo-bucket,%7B%22origKey%22%3A%20%22object2key%22%2C%20%22newKey%22%3A%20%22newObject2Key%22%7D
amzn-s3-demo-bucket,%7B%22origKey%22%3A%20%22object3key%22%2C%20%22newKey%22%3A%20%22newObject3Key%22%7D
```

**Example - 작업 보고서에 결과를 기록하는 매니페스트 형식을 지원하는 Lambda 함수**  
URL로 인코딩된 이 매니페스트 예시에는 다음 Lambda 함수에서 구문 분석을 할 수 있는 파이프로 구분된 객체 키가 포함되어 있습니다.  

```
amzn-s3-demo-bucket,object1key%7Clower
amzn-s3-demo-bucket,object2key%7Cupper
amzn-s3-demo-bucket,object3key%7Creverse
amzn-s3-demo-bucket,object4key%7Cdelete
```
이 Lambda 함수는 파이프로 제한된 태스크를 S3 Batch Operations 매니페스트에 인코딩하여 구문 분석하는 방법을 보여줍니다. 이 태스크는 지정된 객체에 적용되는 개정 작업을 나타냅니다.  

```
import logging
from urllib import parse
import boto3
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)
logger.setLevel("INFO")

s3 = boto3.resource("s3")


def lambda_handler(event, context):
    """
    Applies the specified revision to the specified object.

    :param event: The Amazon S3 batch event that contains the ID of the object to
                  revise and the revision type to apply.
    :param context: Context about the event.
    :return: A result structure that Amazon S3 uses to interpret the result of the
             operation.
    """
    # Parse job parameters from Amazon S3 batch operations
    invocation_id = event["invocationId"]
    invocation_schema_version = event["invocationSchemaVersion"]

    results = []
    result_code = None
    result_string = None

    task = event["tasks"][0]
    task_id = task["taskId"]
    # The revision type is packed with the object key as a pipe-delimited string.
    obj_key, revision = parse.unquote_plus(task["s3Key"], encoding="utf-8").split("|")
    bucket_name = task["s3BucketArn"].split(":")[-1]

    logger.info("Got task: apply revision %s to %s.", revision, obj_key)

    try:
        stanza_obj = s3.Bucket(bucket_name).Object(obj_key)
        stanza = stanza_obj.get()["Body"].read().decode("utf-8")
        if revision == "lower":
            stanza = stanza.lower()
        elif revision == "upper":
            stanza = stanza.upper()
        elif revision == "reverse":
            stanza = stanza[::-1]
        elif revision == "delete":
            pass
        else:
            raise TypeError(f"Can't handle revision type '{revision}'.")

        if revision == "delete":
            stanza_obj.delete()
            result_string = f"Deleted stanza {stanza_obj.key}."
        else:
            stanza_obj.put(Body=bytes(stanza, "utf-8"))
            result_string = (
                f"Applied revision type '{revision}' to " f"stanza {stanza_obj.key}."
            )

        logger.info(result_string)
        result_code = "Succeeded"
    except ClientError as error:
        if error.response["Error"]["Code"] == "NoSuchKey":
            result_code = "Succeeded"
            result_string = (
                f"Stanza {obj_key} not found, assuming it was deleted "
                f"in an earlier revision."
            )
            logger.info(result_string)
        else:
            result_code = "PermanentFailure"
            result_string = (
                f"Got exception when applying revision type '{revision}' "
                f"to {obj_key}: {error}."
            )
            logger.exception(result_string)
    finally:
        results.append(
            {
                "taskId": task_id,
                "resultCode": result_code,
                "resultString": result_string,
            }
        )
    return {
        "invocationSchemaVersion": invocation_schema_version,
        "treatMissingKeysAs": "PermanentFailure",
        "invocationId": invocation_id,
        "results": results,
    }
```

## S3 배치 작업 자습서
<a name="batch-ops-tutorials-lambda"></a>

다음 자습서는 Lambda를 사용한 일부 배치 작업 태스크 절차를 끝까지 완전히 보여줍니다. 이 자습서에서는 S3 소스 버킷에 저장된 비디오의 일괄 트랜스코딩을 위해 Lambda 함수를 간접 호출하도록 Batch Operations를 설정하는 방법에 대해 알아봅니다. Lambda 함수는 AWS Elemental MediaConvert를 직접 호출하여 비디오를 트랜스코딩합니다.
+ [자습서: S3 Batch Operations를 통해 비디오 일괄 트랜스코딩](tutorial-s3-batchops-lambda-mediaconvert-video.md)

# 모든 객체 태그 교체
<a name="batch-ops-put-object-tagging"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **모든 객체 태그 교체** 작업은 매니페스트에 나열된 모든 객체의 객체 태그를 교체합니다. 객체 태그는 객체에 대한 메타데이터를 저장하는 데 사용할 수 있는 문자열의 키-값 쌍입니다.

**모든 객체 태그 교체** 작업을 만들려면 적용할 태그 집합을 제공합니다. S3 배치 작업은 모든 객체에 동일한 태그 세트를 적용합니다. 사용자가 제공한 태그 세트는 매니페스트에서 이미 객체에 연결된 모든 태그 세트를 대체합니다. S3 Batch Operations는 기존 태그는 그대로 두고 객체에 태그를 추가하는 것은 지원하지 않습니다.

매니페스트의 객체가 버전 지정된 버킷에 있는 경우 모든 객체의 특정 버전에 태그 세트를 적용할 수 있습니다. 그렇게 하려면 매니페스트의 모든 객체에 대한 버전 ID를 지정합니다. 객체에 대한 버전 ID를 포함하지 않을 경우 S3 Batch Operations가 모든 객체의 최신 버전에 태그 집합을 적용합니다. 배치 작업 매니페스트에 대한 자세한 내용은 [매니페스트 지정](batch-ops-create-job.md#specify-batchjob-manifest) 섹션을 참조하세요.

객체 태그 지정에 대한 자세한 내용을 알아보려면 이 가이드의 [태그를 사용하여 객체 분류](object-tagging.md) 섹션을 살펴보고, **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html) 섹션을 참조하세요.

콘솔을 사용하여 **모든 객체 태그 교체** 작업을 만들려면 [S3 배치 작업 건 생성](batch-ops-create-job.md) 섹션을 참조하세요.

## 규제 및 제한
<a name="batch-ops-set-tagging-restrictions"></a>

Batch Operations를 사용하여 객체 태그를 교체하는 경우 다음 규제와 제한 사항이 적용됩니다.
+ Batch Operations 작업을 실행하기 위해 지정하는 AWS Identity and Access Management(IAM) 역할에는 기본 `PutObjectTagging` 작업을 수행할 수 있는 권한이 있어야 합니다. 필요한 권한에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html) 섹션을 참조하세요.
+ S3 Batch Operations는 Amazon S3 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html) 작업을 사용하여 매니페스트 내 각 객체에 태그를 적용합니다. 기본 작업에 적용되는 모든 규제 및 제한은 S3 배치 작업에도 적용됩니다.
+ 단일 모든 객체 태그 교체 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

# 액세스 제어 목록(ACL) 대체
<a name="batch-ops-put-object-acl"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **액세스 제어 목록(ACL) 교체** 작업은 매니페스트에 나열된 모든 객체에 대해 액세스 제어 목록(ACL)을 교체합니다. ACL을 통해 사용자가 액세스할 수 있는 객체와 수행할 수 있는 작업을 정의할 수 있습니다.

**참고**  
Amazon S3의 최신 사용 사례 대부분은 더 이상 ACL을 사용할 필요가 없습니다. 각 객체에 대해 액세스를 개별적으로 제어할 필요가 있는 상황을 제외하고는 ACL을 비활성화한 채로 두는 것이 좋습니다. ACL을 비활성화하면 누가 객체를 버킷에 업로드했는지에 관계없이 정책을 사용하여 버킷의 모든 객체에 대한 액세스를 제어할 수 있습니다. 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하세요.

S3 Batch Operations는 사용자가 정의하는 사용자 지정 ACL과 Amazon S3가 사전 정의한 액세스 권한 집합을 포함하는 미리 제공된 ACL을 지원합니다.

매니페스트의 객체가 버전 지정된 버킷에 있는 경우 모든 객체의 특정 버전에 ACL을 적용할 수 있습니다. 그렇게 하려면 매니페스트의 모든 객체에 대한 버전 ID를 지정합니다. 객체에 대한 버전 ID를 포함하지 않을 경우 S3 Batch Operations가 해당 객체의 최신 버전에 ACL을 적용합니다.

Amazon S3의 ACL에 대한 자세한 내용은 [ACL(액세스 제어 목록) 개요](acl-overview.md) 섹션을 참조하세요.

**S3 Block Public Access**  
버킷의 모든 객체에 대한 퍼블릭 액세스를 제한하려면 S3 Batch Operations를 사용하여 ACL을 적용하는 대신 Amazon S3 Block Public Access를 사용하는 것이 좋습니다. 퍼블릭 액세스 차단은 빠르게 효과를 발휘하는 간단한 단일 작업으로 버킷별로 또는 계정 전체에서 퍼블릭 액세스를 제한할 수 있습니다. 이러한 동작으로 인해 버킷이나 계정의 모든 객체에 대한 퍼블릭 액세스를 제어하는 것이 목표일 경우 Amazon S3 Block Public Access가 더 나은 선택이 됩니다. 매니페스트의 모든 객체에 대해 사용자 지정된 ACL을 적용해야 할 경우에는 S3 Batch Operations만 사용합니다. S3 퍼블릭 액세스 차단에 대한 자세한 내용은 [Amazon S3 스토리지에 대한 퍼블릭 액세스 차단](access-control-block-public-access.md) 섹션을 참조하세요.

**S3 객체 소유권**  
매니페스트의 객체가 객체 소유권에 대한 **버킷 소유자 적용** 설정을 사용하는 버킷에 있는 경우, **액세스 제어 목록(ACL) 교체** 작업은 버킷 소유자에게 전체 제어권을 부여하는 객체 ACL만 지정할 수 있습니다. 이 경우 **액세스 제어 목록(ACL) 교체** 작업은 다른 AWS 계정 또는 그룹에 객체 ACL 권한을 부여할 수 없습니다. 자세한 내용은 [객체 소유권 제어 및 버킷에 대해 ACL 사용 중지](about-object-ownership.md) 섹션을 참조하세요.

## 규제 및 제한
<a name="batch-ops-put-object-acl-restrictions"></a>

Batch Operations를 사용하여 ACL을 교체하는 경우 다음 규제와 제한 사항이 적용됩니다.
+ **액세스 제어 목록(ACL) 교체** 작업을 실행하기 위해 지정하는 AWS Identity and Access Management(IAM) 역할에는 기본 Amazon S3 `PutObjectAcl` 작업을 수행할 수 있는 권한이 있어야 합니다. 필요한 권한에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html) 섹션을 참조하세요.
+ S3 배치 작업은 Amazon S3 `PutObjectAcl` 작업을 사용하여 매니페스트의 모든 객체에 지정된 ACL을 적용합니다. 따라서 기본 `PutObjectAcl` 작업에 적용되는 모든 규제 및 제한은 S3 Batch Operations **액세스 제어 목록(ACL) 교체** 작업에도 적용됩니다.
+ 단일 액세스 제어 목록 교체 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

# 배치 작업을 통한 객체 복원
<a name="batch-ops-initiate-restore-object"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **복원** 작업은 매니페스트에 나열되어 있는 아카이브된 객체에 대한 복원 요청을 시작합니다. 다음 아카이브된 객체는 먼저 복원해야 실시간으로 액세스할 수 있습니다.
+ S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive 스토리지 클래스에 아카이브된 객체
+ Archive Access 또는 Deep Archive Access 계층의 S3 Intelligent-Tiering 스토리지 클래스를 통해 보관된 객체

S3 Batch Operations 작업에서 **복원**([https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_S3InitiateRestoreObjectOperation.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_S3InitiateRestoreObjectOperation.html)) 작업을 사용하면 매니페스트에 지정된 모든 객체에 대해 `RestoreObject` 요청이 이루어집니다.

**중요**  
**복원** 작업은 객체 복원 요청만 *시작*합니다. 각 객체에 대해 요청이 시작되면 S3 배치 작업이 각 객체에 대해 작업을 완료로 보고합니다. Amazon S3는 객체 복원 시 작업을 업데이트하거나 알림을 제공하지 않습니다. 하지만 S3 이벤트 알림을 사용하여 Amazon S3에서 객체를 사용할 수 있을 때 알림을 받을 수 있습니다. 자세한 내용은 [Amazon S3 이벤트 알림](EventNotifications.md) 섹션을 참조하세요.

**복원** 작업을 만들 때 다음 인수를 사용할 수 있습니다.

**ExpirationInDays**  
이 인수는 S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive 객체를 Amazon S3에서 사용할 수 있는 기간을 지정합니다. S3 Glacier Flexible Retrieval 및 S3 Glacier Deep Archive 객체를 대상으로 하는 객체 **복원** 작업에는 `1` 이상으로 설정한 `ExpirationInDays`가 필요합니다.  
S3 Intelligent-Tiering Archive Access 및 Deep Archive Access 계층 객체를 대상으로 하는 **복원** 작업을 만들 때 `ExpirationInDays`를 설정하지 마세요. S3 Intelligent-Tiering Archive Access 계층의 객체는 복원 만료 대상이 아니므로, `ExpirationInDays`를 지정하면 `RestoreObject` 요청이 실패합니다.

**GlacierJobTier**  
Amazon S3는 3가지 검색 계층(`EXPEDITED`, `STANDARD`, `BULK`) 중 하나를 사용하여 객체를 복원할 수 있습니다. 그러나 S3 배치 작업 기능은 `STANDARD` 및 `BULK` 검색 계층만 지원합니다. 검색 계층 간의 차이점에 대한 자세한 내용은 [아카이브 가져오기 옵션 이해](restoring-objects-retrieval-options.md) 섹션을 참조하세요.  
각 계층의 요금에 대한 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/) 페이지의 **요청 및 데이터 검색** 섹션을 참조하세요.

## S3 Glacier와 S3 Intelligent-Tiering에서 복원할 때의 차이점
<a name="batch-ops-initiate-restore-diff"></a>

S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive 스토리지 클래스에서 아카이브된 파일을 복원하는 것은 Archive Access 또는 Deep Archive Access 계층의 S3 Intelligent-Tiering 스토리지 클래스에서 파일을 복원하는 것과 다릅니다.
+ S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive에서 복원하면 객체의 임시 *사본*이 생성됩니다. Amazon S3는 `ExpirationInDays` 인수에 지정한 값이 경과된 후 이 사본을 삭제합니다. 이 임시 사본이 삭제된 후, 사용자는 추가 복원 요청을 제출하여 객체에 액세스해야 합니다.
+ 아카이브된 S3 Intelligent-Tiering 객체를 복원할 때는 `ExpirationInDays` 인수를 지정하지 *마세요*. S3 Intelligent-Tiering Archive Access 또는 Deep Archive Access 계층에서 객체를 복원하면 객체가 S3 Intelligent-Tiering Frequent Access 계층으로 다시 전환됩니다. 액세스하지 않은 기간이 최소 연속 90일이 넘으면 객체가 자동으로 Archive Access 계층으로 전환됩니다. 액세스하지 않은 기간이 최소 연속 180일이 넘으면 객체가 자동으로 Deep Archive Access 계층으로 이동합니다.
+ 배치 작업 건은 S3 Glacier Flexible Retrieval 및 S3 Glacier Deep Archive 스토리지 클래스 객체 *또는* S3 Intelligent-Tiering Archive Access 및 Deep Archive Access 스토리지 계층 객체에서 작동할 수 있습니다. 배치 작업은 동일한 작업 건에 있는 두 가지 유형의 아카이브된 객체 모두에서 작동할 수 없습니다. 두 유형의 객체를 복원하려면 별도의 배치 작업을 생성*해야* 합니다.

## 중복 복원
<a name="batch-ops-initiate-restore-object-in-progress"></a>

[https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_S3InitiateRestoreObjectOperation.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_S3InitiateRestoreObjectOperation.html) 작업이 이미 복원 과정 중에 있는 객체를 복원하려고 시도할 경우 S3 Batch Operations가 다음과 같이 진행합니다.

다음 조건 중 하나가 true일 경우 해당 객체의 복원 작업은 성공합니다.
+ 이미 진행 중인 복원 요청과 비교해, 이 작업의 `ExpirationInDays` 값이 동일하고 `GlacierJobTier` 값이 더 빠른 경우.
+ 이전 복원 요청이 이미 완료되었으며 현재 객체를 사용할 수 있습니다. 이 경우, 배치 작업은 복원된 객체의 만료 날짜를 진행 중인 복원 요청에 지정된 `ExpirationInDays` 값과 일치하도록 업데이트합니다.

다음 조건 중 하나가 true일 경우 해당 객체의 복원 작업은 실패합니다.
+ 이미 진행 중인 복원 요청이 아직 완료되지 않고 이 작업의 복원 기간(`ExpirationInDays` 값으로 지정됨)이 진행 중인 복원 요청에 지정된 복원 기간과 다릅니다.
+ 이 작업의 복원 계층(`GlacierJobTier` 값으로 지정됨)이 이미 진행 중인 복원 요청에 지정된 복원 계층보다 느리거나 같습니다.

## 제한 사항
<a name="batch-ops-initiate-restore-object-limitations"></a>

`S3InitiateRestoreObjectOperation` 작업에는 다음과 같은 제한 사항이 있습니다.
+ 보관된 객체와 동일한 리전에서 작업을 생성해야 합니다.
+ S3 Batch Operations는 `EXPEDITED` 검색 계층을 지원하지 않습니다.
+ 단일 Batch Operations 복원 작업은 최대 40억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

객체 복원에 대한 자세한 내용은 [아카이브된 객체 복원](restoring-objects.md) 섹션을 참조하세요.

# 객체 암호화 업데이트
<a name="batch-ops-update-encryption"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. Batch Operations [https://docs.aws.amazon.com//AmazonS3/latest/API/API_control_UpdateObjectEncryptionOperation.html](https://docs.aws.amazon.com//AmazonS3/latest/API/API_control_UpdateObjectEncryptionOperation.html) 작업은 단일 요청으로 둘 이상의 Amazon S3 객체의 서버 측 암호화 유형을 업데이트합니다. 단일 `UpdateObjectEncryption` 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

`UpdateObjectEncryption` 작업은 범용 버킷이 지원하는 모든 Amazon S3 스토리지 클래스에서 지원됩니다. `UpdateObjectEncryption` 작업을 사용하여 암호화된 객체를 [Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE- S3)](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingServerSideEncryption.html)에서 [AWS Key Management Service(AWS KMS) 키(SSE-KMS)](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingKMSEncryption.html)로 변경하거나 S3 버킷 키를 적용할 수 있습니다. 또한 사용자 지정 키 교체 표준을 준수하도록 `UpdateObjectEncryption` 작업을 사용하여 데이터를 암호화하는 데 사용되는 고객 관리형 KMS 키를 변경할 수 있습니다.

 Batch Operations 작업을 생성할 때 지정한 소스 위치 및 필터 기준에 따라 객체 목록을 생성할 수 있습니다. `MatchAnyObjectEncryption` 필터를 사용하여 버킷에서 업데이트하고 매니페스트에 포함할 객체 목록을 생성할 수 있습니다. 생성된 객체 목록에는 표시된 서버 측 암호화 유형이 있는 소스 버킷 객체만 포함됩니다. SSE-KMS를 선택하는 경우 원하는 대로 특정 KMS 키 ARN 및 버킷 키 활성화 상태를 지정하여 결과를 추가로 필터링할 수 있습니다. 자세한 내용은 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobManifestGeneratorFilter.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobManifestGeneratorFilter.html) 및 [*Amazon S3 API 참조*의 `SSEKMSFilter`](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_SSEKMSFilter.html) 섹션을 참조하세요.

## 제한 및 고려 사항
<a name="batch-ops-encrypt-object-restrictions"></a>

Batch Operations `UpdateObjectEncryption` 작업을 사용하는 경우 다음과 같은 제한 및 고려 사항이 적용됩니다.
+ `UpdateObjectEncryption` 작업은 암호화되지 않은 객체 또는 AWS KMS keys를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 또는 고객 제공 암호화 키(SSE-C)로 암호화된 객체를 지원하지 않습니다. 또한 SSE-S3 암호화 유형 `UpdateObjectEncryption` 요청을 지정할 수 없습니다.
+ `UpdateObjectEncryption` 작업을 사용하여 S3 버전 관리가 활성화된 버킷의 객체를 업데이트할 수 있습니다. 특정 버전의 암호화 유형을 업데이트하려면 `UpdateObjectEncryption` 요청에 버전 ID를 지정해야 합니다. 버전 ID를 지정하지 않으면 `UpdateObjectEncryption` 요청이 객체의 현재 버전에 적용됩니다. S3 버전 관리에 대한 자세한 내용은 [S3 버전 관리로 여러 버전의 객체 유지](Versioning.md) 섹션을 참조하십시오.
+ S3 Object Lock 보존 모드 또는 법적 보존이 적용된 객체에서는 `UpdateObjectEncryption` 작업이 실패합니다. 객체에 거버넌스 모드 보존 기간 또는 법적 보존이 있는 경우 `UpdateObjectEncryption` 요청을 실행하기 전에 먼저 객체의 Object Lock 상태를 해제해야 합니다. Object Lock 규정 준수 모드 보존 기간이 적용된 객체에는 `UpdateObjectEncryption` 작업을 사용할 수 없습니다. S3 객체 잠금에 대한 자세한 내용은 [Object Lock으로 객체 잠금](object-lock.md) 섹션을 참조하세요.
+ 라이브 복제가 활성화된 소스 버킷에 대한 `UpdateObjectEncryption` 요청은 대상 버킷에서 복제본 이벤트를 시작하지 않습니다. 소스 버킷과 대상 버킷 모두에서 객체의 암호화 유형을 변경하려면 소스 버킷과 대상 버킷의 객체에 대해 별도의 `UpdateObjectEncryption` 요청을 시작해야 합니다.
+ 기본적으로 고객 관리형 KMS 키를 지정하는 모든 `UpdateObjectEncryption` 요청은 버킷 소유자의 AWS 계정이 소유한 KMS 키로 제한됩니다. AWS Organizations를 사용하는 경우 AWS Support에 문의하여 조직 내 다른 멤버 계정이 소유한 AWS KMS keys를 사용할 수 있는 기능을 요청할 수 있습니다.
+ S3 배치 복제를 사용하여 리전 간 데이터세트를 복제하며 이전에 객체의 서버 측 암호화 유형이 SSE-S3에서 SSE-KMS로 업데이트된 경우 추가 권한이 필요할 수 있습니다. 소스 리전 버킷에는 `kms:decrypt` 권한이 있어야 합니다. 그런 다음 대상 리전의 버킷에 대한 `kms:decrypt` 및 `kms:encrypt` 권한이 필요합니다.
+ `UpdateObjectEncryption` 요청에 전체 KMS 키 ARN을 제공합니다. 별칭 이름이나 별칭 ARN은 사용할 수 없습니다. AWS KMS 콘솔에서 또는 AWS KMS `DescribeKey` API를 사용하여 전체 KMS 키 ARN을 확인할 수 있습니다.

`UpdateObjectEncryption`에 대한 자세한 내용은 [기존 데이터에 대한 서버 측 암호화 업데이트](update-sse-encryption.md) 섹션을 참조하세요.

## 필수 권한
<a name="batch-ops-required-permissions"></a>

`UpdateObjectEncryption` 작업을 수행하려면 IAM 위탁자(사용자, 역할 또는 그룹)에 다음 AWS Identity and Access Management(IAM) 정책을 추가합니다. 이 정책을 사용하려면 *`amzn-s3-demo-bucket`*을 암호화를 업데이트할 객체가 포함된 버킷의 이름으로 바꿉니다. `amzn-s3-demo-manifest-bucket`을 매니페스트가 포함된 버킷의 이름으로 바꾸고 `amzn-s3-demo-completion-report-bucket`을 완료 보고서를 저장할 버킷의 이름으로 바꿉니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BatchOperationsUpdateEncryption",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:PutObject",
                "s3:UpdateObjectEncryption"
            ],
            "Resource": [
                 "arn:aws:s3:::amzn-s3-demo-bucket-target"
                "arn:aws:s3:::amzn-s3-demo-bucket-target-target/*"
            ]
        },
        {
            "Sid": "S3BatchOperationsPolicyForManifestFile",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-manifest/*"
            ]
        },
        {
            "Sid": "S3BatchOperationsPolicyForCompletionReport",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-completion-report/*"
            ]
        },
        {
            "Sid": "S3BatchOperationsPolicyManifestGeneration",
            "Effect": "Allow",
            "Action": [
                "s3:PutInventoryConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-target"
            ]
        },
        {
            "Sid": "AllowKMSOperationsForS3BatchOperations",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:Encrypt",
                "kms:ReEncrypt*"
            ],
            "Resource": [                "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
            ]
        }
    ]
}
```

S3 Batch Operations 서비스 위탁자가 사용자를 대신하여 Batch Operations 작업을 실행하기 위해 맡는 IAM 역할에 연결해야 하는 신뢰 정책 및 권한 정책은 [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md) 및 [객체 암호화 업데이트](batch-ops-iam-role-policies.md#batch-ops-update-encryption-policies) 섹션을 참조하세요.

# 객체 암호화를 업데이트하는 Batch Operations 작업 생성
<a name="batch-ops-update"></a>

단일 요청으로 둘 이상의 Amazon S3 객체의 서버 측 암호화 유형을 업데이트하려면 S3 Batch Operations를 사용합니다. Amazon S3 콘솔, AWS Command Line Interface(AWS CLI) AWS SDK 또는 Amazon S3 REST API를 통해 S3 Batch Operations를 사용할 수 있습니다.

## AWS CLI 사용
<a name="batch-ops-example-cli-update-job"></a>

다음 명령을 실행하려면 AWS CLI를 설치하고 구성해야 합니다. AWS CLI를 설치하지 않은 경우 *AWS Command Line Interface 사용 설명서*에서 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-install.html)를 참조하세요.

또는 AWS CloudShell을 사용하여 콘솔에서 AWS CLI 명령을 실행할 수 있습니다. AWS CloudShell은 브라우저 기반의 사전 인증된 쉘로, AWS Management Console에서 직접 시작할 수 있습니다. 자세한 내용은 *AWS CloudShell 사용 설명서*에서 [CloudShell이란 무엇인가요?](https://docs.aws.amazon.com//cloudshell/latest/userguide/welcome.html) 및 [AWS CloudShell 시작하기](https://docs.aws.amazon.com//cloudshell/latest/userguide/getting-started.html)를 참조하세요.

**Example 1 - 암호화된 객체를 한 AWS KMS key에서 다른 KMS 키로 업데이트하는 Batch Operations 작업 생성**  
다음 예제에서는 범용 버킷의 여러 객체에 대한 암호화 설정을 업데이트하는 S3 Batch Operations 작업을 생성하는 방법을 보여줍니다. 이 명령은 한 AWS Key Management Service(AWS KMS) 키로 암호화된 객체가 다른 KMS 키를 사용하도록 변경하는 작업을 생성합니다. 또한 이 작업은 영향을 받는 객체의 매니페스트를 생성 및 저장하고 결과 보고서를 생성합니다. 이 명령을 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다.  

```
aws s3control create-job --account-id account-id \
--no-confirmation-required \
--operation '{"S3UpdateObjectEncryption": {  "ObjectEncryption": { "SSEKMS": { "KMSKeyArn": "KMS-key-ARN-to-apply", "BucketKeyEnabled": false  }  }  } }' \
--report '{ "Enabled": true, "Bucket": "report-bucket-ARN",  "Format": "Report_CSV_20180820", "Prefix": "report", "ReportScope": "AllTasks" }' \
--manifest-generator '{ "S3JobManifestGenerator": { "ExpectedBucketOwner": "account-id", "SourceBucket": "source-bucket-ARN", "EnableManifestOutput": true, "ManifestOutputLocation": { "Bucket": "manifest-bucket-ARN", "ManifestFormat": "S3InventoryReport_CSV_20211130", "ManifestPrefix": "manifest-prefix" }, "Filter": {   "MatchAnyObjectEncryption": [{ "SSEKMS": { "KmsKeyArn": "kms-key-ARN-to-match" } }] } } }' \
--priority 1 \
--role-arn batch-operations-role-ARN
```
최상의 성능을 위해 `KmsKeyArn` 필터를 `MatchAnyPrefix`, `CreatedAfter` 또는 `MatchAnyStorageClass` 등의 다른 객체 메타데이터 필터와 함께 사용하는 것이 좋습니다.

**Example 2 - SSE-S3로 암호화된 객체를 SSE-KMS로 업데이트하는 Batch Operations 작업 생성**  
다음 예제에서는 범용 버킷의 여러 객체에 대한 암호화 설정을 업데이트하는 S3 Batch Operations 작업을 생성하는 방법을 보여줍니다. 이 명령은 Amazon S3 관리형 키를 통한 서버 측 암호화(SSE-S3)를 사용하여 암호화된 객체가 AWS Key Management Service (AWS KMS) 키를 통한 서버 측 암호화(SSE-KMS)를 사용하도록 변경하는 작업을 생성합니다. 또한 이 작업은 영향을 받는 객체의 매니페스트를 생성 및 저장하고 결과 보고서를 생성합니다. 이 명령을 사용하려면 `user input placeholders`를 사용자의 정보로 대체합니다.  

```
aws s3control create-job --account-id account-id \
--no-confirmation-required \
--operation '{"S3UpdateObjectEncryption": {  "ObjectEncryption": { "SSEKMS": { "KMSKeyArn": "KMS-key-ARN-to-apply", "BucketKeyEnabled": false  }  }  } }' \
--report '{ "Enabled": true, "Bucket": "report-bucket-ARN",  "Format": "Report_CSV_20180820", "Prefix": "report", "ReportScope": "AllTasks" }' \
--manifest-generator '{ "S3JobManifestGenerator": { "ExpectedBucketOwner": "account-id", "SourceBucket": "source-bucket-ARN", "EnableManifestOutput": true, "ManifestOutputLocation": { "Bucket": "manifest-bucket-ARN", "ManifestFormat": "S3InventoryReport_CSV_20211130", "ManifestPrefix": "manifest-prefix" }, "Filter": {   "MatchAnyObjectEncryption": [{ "SSES3": {} }] } } }' \
--priority 1 \
--role-arn batch-operations-role-ARN
```
최상의 성능을 위해 `KmsKeyArn` 필터를 `MatchAnyPrefix`, `CreatedAfter` 또는 `MatchAnyStorageClass` 등의 다른 객체 메타데이터 필터와 함께 사용하는 것이 좋습니다.

# S3 객체 잠금 보존
<a name="batch-ops-retention-date"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **Object Lock 보존** 작업을 사용하여 *거버넌스* 모드 또는 *규정 준수* 모드를 통해 객체에 대한 보존 날짜를 적용할 수 있습니다. 이러한 보관 모드는 다양한 수준의 보호를 적용합니다. 두 보관 모드를 모든 객체 버전에 적용할 수 있습니다. 법적 보존과 마찬가지로 보관 날짜를 사용하면 객체를 덮어쓰거나 삭제할 수 없습니다. Amazon S3는 객체의 메타데이터에 지정된 **보존 종료일을 저장하고 보존 기간이 만료될 때까지 지정된 버전의 객체 버전을 보호합니다.

Object Lock을 적용한 S3 Batch Operations를 사용하여 여러 Amazon S3 객체의 보존 날짜를 한 번에 관리할 수 있습니다. 매니페스트에서 대상 객체 목록을 지정하고 매니페스트를 Batch Operations에 제출하여 완료할 수 있습니다. 자세한 내용은 S3 객체 잠금 [보관 기간](object-lock.md#object-lock-retention-periods) 섹션을 참조하세요.

보관 날짜가 있는 S3 배치 작업은 완료될 때까지, 취소될 때까지 또는 실패 상태에 도달할 때까지 실행됩니다. 단일 요청으로 많은 객체에 대한 보존 날짜를 추가, 변경 또는 제거하려는 경우 S3 Batch Operations 및 S3 Object Lock 보존을 사용하는 것이 좋습니다.

배치 작업은 매니페스트의 키를 처리하기 전에 버킷에서 객체 잠금이 사용 설정되어 있는지 확인합니다. 작업 및 유효성 검사를 수행하려면 Batch Operations가 사용자를 대신하여 Object Lock을 직접 호출할 수 있도록 Batch Operations에 AWS Identity and Access Management(IAM) 역할의 `s3:GetBucketObjectLockConfiguration` 및 `s3:PutObjectRetention` 권한이 필요합니다. 자세한 내용은 [객체 잠금 고려 사항](object-lock-managing.md) 섹션을 참조하세요.

REST API에서 이 작업을 사용하는 방법에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html) 작업에 있는 `S3PutObjectRetention` 섹션을 참조하세요.

이 작업을 사용하는 AWS Command Line Interface(AWS CLI) 예제는 [AWS CLI 사용](batch-ops-object-lock-retention.md#batch-ops-cli-object-lock-retention-example) 섹션을 참조하세요. AWS SDK for Java 예제는 [Java용 AWS SDK 사용](batch-ops-object-lock-retention.md#batch-ops-examples-java-object-lock-retention) 섹션을 참조하세요.

## 규제 및 제한
<a name="batch-ops-retention-date-restrictions"></a>

Batch Operations를 사용하여 Object Lock 보존 기간을 적용하는 경우 다음과 같은 규제와 제한 사항이 적용됩니다.
+ S3 Batch Operations는 버킷 수준을 변경하지 않습니다.
+ 버전 관리 및 S3 객체 잠금은 작업이 수행되는 버킷에서 구성해야 합니다.
+ 매니페스트에 나열된 모든 객체는 동일한 버킷에 있어야 합니다.
+ 매니페스트에 버전이 명시적으로 지정되지 않은 경우 이 작업은 최신 버전의 객체에서 작동합니다.
+ **Object Lock 보존** 작업을 사용하려면 IAM 역할의 `s3:PutObjectRetention` 권한이 필요합니다.
+ 작업을 수행 중인 S3 버킷에 대해 Object Lock이 활성화되어 있는지 확인하려면 `s3:GetBucketObjectLockConfiguration` IAM 권한이 필요합니다.
+ `COMPLIANCE` 모드 보존 날짜가 적용된 객체의 보존 기간만 연장할 수 있으며, 이 보존 기간은 단축할 수 없습니다.
+ 단일 S3 Object Lock 보존 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.

# S3 객체 잠금 법적 보존
<a name="batch-ops-legal-hold"></a>

Amazon S3 Batch Operations를 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. **Object Lock 법적 보존** 작업을 사용하여 객체 버전에 법적 보존을 설정할 수 있습니다. 보관 기간 설정과 마찬가지로 법적 보존을 사용하면 객체 버전을 덮어쓰거나 삭제할 수 없습니다. 그러나 법적 보존에는 연결된 보존 기간이 없고, 제거될 때까지 유효합니다.

객체 잠금을 적용한 S3 배치 작업을 사용하여 법적 보존을 한 번에 여러 Amazon S3 객체에 추가할 수 있습니다. 그렇게 하려면 매니페스트에서 대상 객체 목록을 지정하고 해당 목록을 Batch Operations에 제출하면 됩니다. S3 Batch Operations **Object Lock 법적 보존** 작업은 완료, 취소 또는 실패 상태에 도달할 때까지 실행됩니다.

S3 Batch Operations는 매니페스트의 객체를 처리하기 전에 S3 버킷에서 Object Lock이 활성화되어 있는지 확인합니다. 객체 작업 및 버킷 수준 검증을 수행하려면 S3 Batch Operations의 AWS Identity and Access Management(IAM) 역할에 `s3:PutObjectLegalHold` 및 `s3:GetBucketObjectLockConfiguration`이 필요합니다. 이러한 권한을 통해 S3 Batch Operations는 사용자를 대신하여 S3 Object Lock을 직접 호출할 수 있습니다.

법적 보존을 제거하기 위해 S3 Batch Operations 작업을 만들 때 법적 보존 상태로 `Off`를 지정하면 됩니다. 자세한 내용은 [객체 잠금 고려 사항](object-lock-managing.md) 섹션을 참조하세요.

Amazon S3 REST API에서 이 작업을 사용하는 방법에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html) 작업에 있는 `S3PutObjectLegalHold` 섹션을 참조하세요.

이 작업을 사용하는 예제는 [Java용 AWS SDK 사용](batch-ops-legal-hold-off.md#batch-ops-examples-java-object-lock-legalhold) 섹션을 참조하세요.

## 규제 및 제한
<a name="batch-ops-legal-hold-restrictions"></a>

Batch Operations를 사용하여 Object Lock 법적 보존을 적용하거나 제거하는 경우 다음과 같은 규제와 제한 사항이 적용됩니다.
+ S3 Batch Operations는 버킷 수준을 변경하지 않습니다.
+ 매니페스트에 나열된 모든 객체는 동일한 버킷에 있어야 합니다.
+ 버전 관리 및 S3 객체 잠금은 작업이 수행되는 버킷에서 구성해야 합니다.
+ 매니페스트에 버전이 명시적으로 지정되지 않은 경우 **Object Lock 법적 보존** 작업은 최신 버전의 객체에서 작동합니다.
+ 객체에 대한 법적 보존을 추가하거나 제거하려면 IAM 역할에 `s3:PutObjectLegalHold` 권한이 필요합니다.
+ 작업이 수행되는 S3 버킷에 대해 S3 Object Lock이 활성화되어 있는지 확인하려면 `s3:GetBucketObjectLockConfiguration` IAM 권한이 필요합니다.
+ 단일 S3 Object Lock 법적 보존 작업은 최대 200억 개의 객체가 포함된 매니페스트를 지원할 수 있습니다.
+ [객체 복사](batch-ops-copy-object.md)
+ [체크섬 계산](batch-ops-compute-checksums.md)
+ [모든 객체 태그 삭제](batch-ops-delete-object-tagging.md)
+ [AWS Lambda 함수 호출](batch-ops-invoke-lambda.md)
+ [모든 객체 태그 교체](batch-ops-put-object-tagging.md)
+ [액세스 제어 목록(ACL) 대체](batch-ops-put-object-acl.md)
+ [배치 작업을 통한 객체 복원](batch-ops-initiate-restore-object.md)
+ [객체 암호화 업데이트](batch-ops-update-encryption.md)
+ [배치 복제를 사용한 기존 객체 복제](s3-batch-replication-batch.md)
+ [S3 객체 잠금 보존](batch-ops-retention-date.md)
+ [S3 객체 잠금 법적 보존](batch-ops-legal-hold.md)

# S3 배치 작업 건 관리
<a name="batch-ops-managing-jobs"></a>

Amazon S3는 S3 배치 작업을 생성한 후 관리하는 데 도움이 되는 강력한 도구 세트를 제공합니다. 이 섹션에서는 Amazon S3 콘솔, AWS Command Line Interface(AWS CLI), AWS SDK 또는 Amazon S3 REST API를 사용하여 작업을 관리하고 추적하는 데 사용할 수 있는 작업에 대해 설명합니다.

**Topics**
+ [

## Amazon S3 콘솔을 사용하여 S3 배치 작업 관리
](#batch-ops-manage-console)
+ [

# 작업 나열
](batch-ops-list-jobs.md)
+ [

# 작업 세부 정보 보기
](batch-ops-job-details.md)
+ [

# 작업 우선 순위 지정
](batch-ops-job-priority.md)

## Amazon S3 콘솔을 사용하여 S3 배치 작업 관리
<a name="batch-ops-manage-console"></a>

콘솔을 사용하여 S3 배치 작업을 관리할 수 있습니다. 예를 들어, 다음을 수행할 수 있습니다.
+ 활성 및 대기 중인 작업 보기
+ 작업 상태 확인
+ 작업의 우선 순위 변경
+ 작업 확인 및 실행
+ 작업 복제
+ 작업 취소

**콘솔을 사용하여 배치 작업 관리**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **배치 작업**을 선택합니다.

1. 관리하려는 작업을 선택합니다.

# 작업 나열
<a name="batch-ops-list-jobs"></a>

S3 배치 작업 건의 목록을 검색할 수 있습니다. 목록에는 진행 중이거나 지난 90일 이내에 완료된 작업에 대한 정보가 제공됩니다. 각 작업의 목록에는 작업 ID, 설명, 우선순위, 현재 상태 및 성공 및 실패한 작업(task) 수 등에 대한 세부 정보가 포함됩니다.

상태를 기준으로 작업 목록을 필터링할 수 있습니다. 콘솔을 사용하여 목록을 검색하면 설명 또는 ID 기준으로 작업을 검색하고 AWS 리전별로 필터링할 수도 있습니다.

## `Active` 및 `Complete` 작업 목록 가져오기
<a name="batch-ops-example-cli-active-jobs"></a>

다음 AWS CLI 예제에서는 `Active` 및 `Complete` 작업의 목록을 가져옵니다. 이 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

```
aws s3control list-jobs \
    --region us-west-2 \
    --account-id account-id \
    --job-statuses '["Active","Complete"]' \
    --max-results 20
```

자세한 내용과 예제는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/list-jobs.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/list-jobs.html)list-jobs 명령 참조에서 *AWS CLI*를 참조하세요.

# 작업 세부 정보 보기
<a name="batch-ops-job-details"></a>

작업을 나열하여 검색할 수 있는 것보다 Amazon S3 Batch Operations 작업에 대한 더 많은 정보를 원하는 경우, 단일 작업에 대한 모든 세부 정보를 확인하면 됩니다. 아직 완료되지 않은 작업이나 지난 90일 이내에 완료된 작업에 대한 세부 정보를 볼 수 있습니다. 작업 목록에서 반환되는 정보 이외에 단일 작업의 세부 정보는 다음과 같은 정보도 포함합니다.
+ 작업 파라미터.
+ 매니페스트에 대한 세부 정보.
+ 완료 보고서에 대한 정보(작업을 생성할 때 보고서를 구성한 경우).
+ 작업을 실행하도록 할당된 AWS Identity and Access Management(IAM) 사용자 역할의 Amazon 리소스 이름(ARN).

개별 작업의 세부 정보를 보면서 작업의 전체 구성에 액세스할 수 있습니다. 작업의 세부 정보를 보려면 Amazon S3 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용할 수 있습니다.

## Amazon S3 콘솔에서 S3 배치 작업에 대한 작업 설명 가져오기
<a name="batch-ops-console-job-description"></a>

**콘솔을 사용하여 배치 작업에 대한 작업 설명을 보는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **배치 작업**을 선택합니다.

1. 세부 정보를 보려면 특정 작업의 작업 ID를 선택합니다.

## AWS CLI에서 S3 배치 작업에 대한 작업 설명 가져오기
<a name="batch-ops-example-cli-job-description"></a>

다음 예시에서는 AWS CLI를 사용하여 S3 배치 작업에 대한 작업 설명을 가져옵니다. 다음 예시 명령을 사용하려면 *`user input placeholders`*를 실제 정보로 대체하세요.

```
aws s3control describe-job \
--region us-west-2 \
--account-id account-id \
--job-id 00e123a4-c0d8-41f4-a0eb-b46f9ba5b07c
```

자세한 내용과 예제는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/describe-job.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/describe-job.html)describe-job 명령 참조에서 *AWS CLI*를 참조하세요.

# 작업 우선 순위 지정
<a name="batch-ops-job-priority"></a>

각 Amazon S3 Batch Operations 작업에 우선순위 번호(임의의 양수)를 지정할 수 있습니다. S3 Batch Operations는 할당된 우선순위에 따라 작업의 우선순위를 지정합니다. 우선순위가 높은(즉 우선 순위 파라미터의 숫자 값이 높은) 작업이 먼저 평가됩니다. 우선 순위는 내림차순으로 결정됩니다. 예를 들어, 우선 순위 값이 1인 작업 대기열은 우선 순위 값이 10인 작업 대기열보다 먼저 일정이 예약됩니다.

작업이 실행되는 동안 작업의 우선순위를 변경할 수 있습니다. 작업이 실행되는 동안 더 높은 우선 순위로 새 작업을 제출하면 우선 순위가 낮은 작업이 일시 중지되어 우선 순위가 높은 작업이 실행될 수 있습니다.

작업의 우선순위를 변경해도 작업 처리 속도에 영향을 미치지 않습니다.

**참고**  
S3 Batch Operations는 최대 효과에 기초하여 작업 우선순위를 준수합니다. 우선순위가 높은 작업이 일반적으로 우선순위가 낮은 작업보다 우선하지만, Amazon S3는 엄격한 작업 순서를 보장하지 않습니다.

## S3 콘솔 사용
<a name="batch-ops-example-console-update-job-priority"></a>

**Amazon S3 콘솔에서 작업 우선순위를 업데이트하는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **배치 작업**을 선택합니다.

1. 관리할 특정 작업을 선택합니다.

1. **작업**을 선택합니다. 드롭다운 목록에서 **업데이트 우선 순위(Update priority)**를 선택합니다.

## AWS CLI 사용
<a name="batch-ops-example-cli-update-job-priority"></a>

다음 예제에서는 AWS CLI를 사용하여 작업의 우선순위를 업데이트합니다. 숫자가 높을 수록 실행 우선 순위가 높아집니다. 다음 예시 명령을 사용하려면 *`user input placeholders`*를 실제 정보로 대체하세요.

```
aws s3control update-job-priority \
    --region us-west-2 \
    --account-id account-id \
    --priority 98 \
    --job-id 00e123a4-c0d8-41f4-a0eb-b46f9ba5b07c
```

## AWS SDK for Java 사용
<a name="batch-ops-examples-java-update-job-priority."></a>

AWS SDK for Java를 사용하여 S3 Batch Operations 작업의 우선순위를 업데이트하려면 S3Control 클라이언트를 사용하여 작업의 실행 우선순위를 수정할 수 있습니다.이 우선순위는 대기열의 다른 작업과 비교하여 작업이 처리되는 순서를 결정합니다.

작업 우선 순위에 대한 자세한 내용은 [작업 우선 순위 지정](#batch-ops-job-priority) 섹션을 참조하세요.

AWS SDK for Java를 사용하여 작업 우선순위를 업데이트하는 방법의 예는 *Amazon S3 API 참조*의 [Update the priority of a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_UpdateJobPriority_section.html)을 참조하세요.

# 작업 상태 및 완료 보고서 추적
<a name="batch-ops-job-status"></a>

S3 배치 작업에서는 작업 상태를 보고 업데이트하고, 알림 및 로깅을 추가하고, 작업 실패를 추적하고, 완료 보고서를 생성할 수 있습니다.

**Topics**
+ [

## 작업 상태
](#batch-ops-job-status-table)
+ [

## 작업 상태 업데이트
](#updating-job-statuses)
+ [

## 알림 및 로깅
](#batch-ops-notifications)
+ [

## 작업 실패 추적
](#batch-ops-job-status-failure)
+ [

## 완료 보고서
](#batch-ops-completion-report)
+ [

# 예: AWS CloudTrail을(를) 통해 Amazon EventBridge에서 S3 배치 작업 추적
](batch-ops-examples-event-bridge-cloud-trail.md)
+ [

# 예: S3 배치 작업 완료 보고서
](batch-ops-examples-reports.md)

## 작업 상태
<a name="batch-ops-job-status-table"></a>

작업을 생성하고 실행하면 작업은 일련의 상태를 거칩니다. 다음 테이블에서는 상태 및 상태 간의 가능한 전환에 대해 설명합니다.


| Status | 설명 | Transitions | 
| --- | --- | --- | 
| `New` | 생성된 작업은 `New` 상태에서 시작합니다. | Amazon S3가 매니페스트 객체를 처리하기 시작하면 작업이 자동으로 `Preparing` 상태로 이동합니다. | 
| `Preparing` | Amazon S3는 작업을 설정 및 실행하기 위한 매니페스트 객체 및 기타 작업 파라미터를 처리합니다. | Amazon S3가 매니페스트 및 기타 파라미터 처리를 완료하면 작업이 자동으로 `Ready` 상태로 이동합니다. 그러면 작업은 매니페스트에 나열된 객체에 대해 지정된 작업을 실행할 준비가 된 것입니다.예를 들어 Amazon S3 콘솔에서 작업을 생성했을 때와 같이 작업을 실행하기 전에 확인이 필요한 경우 작업이 `Preparing` 상태에서 `Suspended` 상태로 전환합니다. 작업은 사용자가 실행을 확인할 때까지 `Suspended` 상태로 유지됩니다. | 
| `Suspended` | 작업이 확인을 필요로 하지만, 사용자가 아직 실행을 확인하지 않았습니다. Amazon S3 콘솔을 사용하여 생성하는 작업만 확인이 필요합니다. 콘솔을 통해 만든 작업은 `Suspended` 상태에서 바로 `Preparing` 상태로 들어갑니다. 사용자가 작업 실행을 확인하여 `Ready` 상태가 된 이후에는 작업이 절대로 `Suspended` 상태로 되돌아가지 않습니다. | 작업 실행을 확인하면 작업 상태가 `Ready`로 변경됩니다. | 
| `Ready` | Amazon S3가 요청된 객체 작업을 시작할 준비가 되었습니다. | Amazon S3가 작업을 실행하기 시작하면 작업이 작동으로 `Active` 상태로 이동합니다. 작업이 `Ready` 상태를 유지하는 시간은 이미 우선 순위가 높은 작업이 실행 중인지 여부와 이들 작업을 완료하는 데 얼마나 걸리는지에 따라 달라집니다. | 
| `Active` | Amazon S3가 매니페스트에 나열된 객체에 대해 요청된 작업을 실행합니다. 작업이 `Active` 상태일 때 Amazon S3 콘솔을 사용하거나 REST API, AWS CLI 또는 AWS SDK를 통해 `DescribeJob` 작업을 사용하여 진행률을 모니터링할 수 있습니다. | 작업이 더 이상 객체에 대한 작업을 실행하지 않으면 `Active` 상태에서 다른 상태로 이동합니다. 이 동작은 작업이 성공적으로 완료되거나 실패한 경우와 같이 자동으로 발생할 수 있습니다. 또는 작업 취소와 같이 사용자 작업의 결과로 동작이 발생할 수 있습니다. 이후 작업이 이동하는 상태는 전환 이유에 따라 다릅니다. | 
| `Pausing` | 작업이 다른 상태에서 `Paused` 상태로 전환합니다. | `Paused` 단계가 완료되면 작업이 자동으로 `Pausing` 상태로 이동합니다. | 
| `Paused` | 작업이 실행되는 동안 더 높은 우선 순위로 새 작업을 제출하면 현재 작업이 `Paused` 상태가 될 수 있습니다. | 작업 실행을 차단하는 더 높은 우선 순위의 작업이 완료, 실패 또는 일시 중지되면 `Paused` 작업이 자동으로 `Active` 상태로 되돌아갑니다. | 
| `Completing` | 작업이 다른 상태에서 `Complete` 상태로 전환합니다. | `Complete` 단계가 완료되면 작업이 자동으로 `Completing` 상태로 이동합니다. | 
| `Complete` | 작업이 매니페스트의 모든 객체에 대해 요청된 작업을 완료했습니다. 모든 객체에 대해 작업이 성공했거나 실패했을 수 있습니다. 작업이 완료 보고서를 생성하도록 구성한 경우 작업이 `Complete` 상태가 되는 즉시 보고서가 생성됩니다. | `Complete`는 최종 상태입니다. 작업이 `Complete` 상태에 도달하면 다른 어떤 상태로도 전환하지 않습니다. | 
| `Cancelling` | 작업이 `Cancelled` 상태로 전환 중입니다. | `Cancelled` 단계가 완료되면 작업이 자동으로 `Cancelling` 상태로 이동합니다. | 
| `Cancelled` | 사용자가 작업 취소를 요청했고 S3 Batch Operations가 성공적으로 작업을 취소했습니다. 작업이 Amazon S3에 새로운 요청을 제출하지 않습니다. | `Cancelled`는 최종 상태입니다. 작업이 `Cancelled` 상태에 도달하면 다른 어떤 상태로도 전환하지 않습니다. | 
| `Failing` | 작업이 `Failed` 상태로 전환 중입니다. | `Failed` 단계가 완료되면 작업이 자동으로 `Failing` 상태로 이동합니다. | 
| `Failed` | 작업이 실패했고 더 이상 실행되지 않습니다. 작업 실패에 대한 자세한 내용은 [작업 실패 추적](#batch-ops-job-status-failure) 섹션을 참조하세요. | `Failed`는 최종 상태입니다. 작업이 `Failed` 상태에 도달하면 다른 어떤 상태로도 전환하지 않습니다. | 

## 작업 상태 업데이트
<a name="updating-job-statuses"></a>

다음 AWS CLI 및 AWS SDK for Java 예제는 Batch Operations 작업의 상태를 업데이트합니다. Amazon S3 콘솔을 사용하여 Batch Operations 작업을 관리하는 방법에 대한 자세한 내용은 [Amazon S3 콘솔을 사용하여 S3 배치 작업 관리](batch-ops-managing-jobs.md#batch-ops-manage-console) 섹션을 참조하세요.

### AWS CLI 사용
<a name="batch-ops-example-cli-update-job-status"></a>

다음 예제 명령을 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체하세요.
+ `create-job` 명령에 `--no-confirmation-required` 파라미터를 지정하지 않았다면 작업은 사용자가 그 상태를 `Ready`로 설정하여 확인할 때까지 보류 상태로 유지됩니다. 그러면 Amazon S3이 작업을 실행 가능하도록 만듭니다.

  ```
  aws s3control update-job-status \
      --region us-west-2 \
      --account-id 123456789012 \
      --job-id 00e123a4-c0d8-41f4-a0eb-b46f9ba5b07c \
      --requested-job-status 'Ready'
  ```
+ 작업 상태를 `Cancelled`로 설정하여 작업을 취소합니다.

  ```
  aws s3control update-job-status \
       --region us-west-2 \
       --account-id 123456789012 \
       --job-id 00e123a4-c0d8-41f4-a0eb-b46f9ba5b07c \
       --status-update-reason "No longer needed" \
       --requested-job-status Cancelled
  ```

### Java용 AWS SDK 사용
<a name="batch-ops-examples-java-update-job-status"></a>

AWS SDK for Java를 사용하여 작업 상태를 업데이트하는 방법의 예는 *Amazon S3 API 참조*의 [Update the status of a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_UpdateJobStatus_section.html)을 참조하세요.

## 알림 및 로깅
<a name="batch-ops-notifications"></a>

AWS CloudTrail을 사용하여 완료 보고서를 요청할 뿐만 아니라 Batch Operations 활동을 캡처, 검토 및 감사할 수 있습니다. Batch Operations는 기존 Amazon S3 API 작업을 사용하여 태스크를 수행하기 때문에 이러한 태스크 역시 직접 호출한 경우와 동일한 이벤트를 방출합니다. 따라서 이미 Amazon S3에서 사용하는 것과 동일한 알림, 로깅 및 감사 도구와 프로세스를 사용하여 작업 진행률 및 모든 태스크를 추적하고 기록할 수 있습니다. 자세한 내용은 다음 섹션의 예제를 참조하세요.

**참고**  
Batch Operations는 작업 실행 중에 CloudTrail에서 관리 이벤트와 데이터 이벤트를 둘 다 생성합니다. 이러한 이벤트의 볼륨은 각 작업의 매니페스트에 있는 키의 수에 따라 규모가 조정됩니다. 자세한 내용은 계정에 구성한 추적 수에 따라 달라지는 요금 변경의 예제가 포함된 [CloudTrail 요금](https://aws.amazon.com/cloudtrail/pricing/) 페이지를 참조하세요. 필요에 따라 이벤트를 구성하고 기록하는 방법을 알아보려면 *AWS CloudTrail 사용 설명서*의 [첫 번째 추적 생성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-tutorial.html#tutorial-step2)을 참조하세요.

Amazon S3 이벤트에 대한 자세한 정보는 [Amazon S3 이벤트 알림](EventNotifications.md) 섹션을 참조하세요.

## 작업 실패 추적
<a name="batch-ops-job-status-failure"></a>

S3 배치 작업 건이 지정된 매니페스트를 읽을 수 없는 경우처럼 성공적으로 실행되지 못하게 하는 문제가 발생하면 해당 작업이 실패합니다. 작업이 실패하면 하나 이상의 실패 코드 또는 실패 이유를 생성합니다. S3 Batch Operations는 작업의 세부 정보를 요청하여 볼 수 있도록 작업과 함께 실패 코드 및 이유를 저장합니다. 해당 작업에 대한 완료 보고서를 요청한 경우 실패 코드와 이유도 여기에 나타납니다.

작업이 실패한 작업(operation)을 대량으로 실행하는 것을 방지하기 위해 Amazon S3가 모든 배치 작업에 태스크(task) 실패 임계값을 부여합니다. 하나의 작업이 최소 1,000개의 태스크를 실행하면 Amazon S3가 태스크 실패율을 모니터링합니다. 언제든 실패율(실행된 총 작업 수 대비 실패한 작업 수의 비율)이 50%를 초과하면 작업이 실패합니다. 작업(task) 실패율 임계값이 초과되어 작업이 실패할 경우 실패의 원인을 식별할 수 있습니다. 예를 들어 지정된 버킷에 없는 일부 객체를 실수로 매니페스트에 포함했을 수 있습니다. 오류를 수정한 후에 작업을 다시 제출할 수 있습니다.

**참고**  
S3 Batch Operations는 비동기식으로 작동하며, 반드시 매니페스트에 객체가 나열된 순서대로 태스크를 실행하지는 않습니다. 그러므로 매니페스트 순서를 사용하여 어떤 객체의 작업(task)이 성공했거나 실패했는지 판단할 수 없습니다. 대신, 작업 완료 보고서(요청한 경우)를 검토하거나 AWS CloudTrail 이벤트 로그를 검토하여 실패의 원인을 확인할 수 있습니다.

## 완료 보고서
<a name="batch-ops-completion-report"></a>

작업을 생성할 때 완료 보고서를 요청할 수 있습니다. S3 Batch Operations가 하나 이상의 태스크를 성공적으로 간접 호출하는 한, Amazon S3가 작업이 태스크 실행을 마치거나 실패하거나 취소된 후 완료 보고서를 생성합니다. 모든 작업 또는 실패한 작업만 포함하도록 완료 보고서를 구성할 수 있습니다.

완료 보고서에는 작업 구성, 상태, 그리고 객체 키와 버전, 상태, 오류 코드 및 오류 설명 등 각 태스크의 정보가 포함됩니다. 완료 보고서를 사용하면 추가 설정을 하지 않아도 통합된 형식으로 작업 결과를 손쉽게 볼 수 있습니다. 완료 보고서는 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 통해 암호화됩니다. 완료 보고서의 예는 [예: S3 배치 작업 완료 보고서](batch-ops-examples-reports.md) 섹션을 참조하세요.

완료 보고서를 구성하지 않은 경우에도 여전히 CloudTrail 및 Amazon CloudWatch를 사용하여 작업 및 그 태스크를 모니터링하고 감사할 수 있습니다. 자세한 내용은 다음 항목을 참조하세요.

**Topics**
+ [

## 작업 상태
](#batch-ops-job-status-table)
+ [

## 작업 상태 업데이트
](#updating-job-statuses)
+ [

## 알림 및 로깅
](#batch-ops-notifications)
+ [

## 작업 실패 추적
](#batch-ops-job-status-failure)
+ [

## 완료 보고서
](#batch-ops-completion-report)
+ [

# 예: AWS CloudTrail을(를) 통해 Amazon EventBridge에서 S3 배치 작업 추적
](batch-ops-examples-event-bridge-cloud-trail.md)
+ [

# 예: S3 배치 작업 완료 보고서
](batch-ops-examples-reports.md)

# 예: AWS CloudTrail을(를) 통해 Amazon EventBridge에서 S3 배치 작업 추적
<a name="batch-ops-examples-event-bridge-cloud-trail"></a>

Amazon S3 배치 작업 활동은 AWS CloudTrail에 이벤트로 기록됩니다. Amazon EventBridge에서 사용자 정의 규칙을 생성하고 이러한 이벤트를 원하는 대상 알림 리소스(예: Amazon Simple Notification Service(Amazon SNS))로 보낼 수 있습니다.

**참고**  
Amazon EventBridge는 이벤트를 관리하는 데 선호되는 방법입니다. Amazon CloudWatch Events와 EventBridge는 기본 서비스 및 API가 동일하지만 EventBridge가 더 많은 기능을 제공합니다. CloudWatch 또는 EventBridge에서 변경한 내용은 각 콘솔에 나타납니다. 자세한 내용은 *[Amazon EventBridge 사용 설명서](https://docs.aws.amazon.com/eventbridge/latest/userguide/)*를 참조하세요.

**Topics**
+ [

## CloudTrail에 기록된 S3 배치 작업 이벤트
](#batch-ops-examples-cloud-trail-events)
+ [

## S3 배치 작업 이벤트 추적을 위한 EventBridge 규칙
](#batch-ops-examples-event-bridge)

## CloudTrail에 기록된 S3 배치 작업 이벤트
<a name="batch-ops-examples-cloud-trail-events"></a>



배치 작업이 생성되면 CloudTrail에 `JobCreated` 이벤트로 기록됩니다. 작업이 실행되면 처리 중에 상태가 변경되고 다른 `JobStatusChanged` 이벤트가 CloudTrail에 기록됩니다. [CloudTrail 콘솔](https://console.aws.amazon.com/cloudtrail)에서 이러한 이벤트를 볼 수 있습니다. CloudTrail에 대한 자세한 내용은 [https://docs.aws.amazon.com/awscloudtrail/latest/userguide/how-cloudtrail-works.html](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/how-cloudtrail-works.html)를 참조하세요.

**참고**  
S3 배치 작업 `status-change` 이벤트만 CloudTrail에 기록됩니다.

**Example - CloudTrail에 의해 기록된 S3 배치 작업 완료 이벤트**  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "accountId": "123456789012",
        "invokedBy": "s3.amazonaws.com"
    },
    "eventTime": "2020-02-05T18:25:30Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "JobStatusChanged",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "s3.amazonaws.com",
    "userAgent": "s3.amazonaws.com",
    "requestParameters": null,
    "responseElements": null,
    "eventID": "f907577b-bf3d-4c53-b9ed-8a83a118a554",
    "readOnly": false,
    "eventType": "AwsServiceEvent",
    "recipientAccountId": "123412341234",
    "serviceEventDetails": {
        "jobId": "d6e58ec4-897a-4b6d-975f-10d7f0fb63ce",
        "jobArn": "arn:aws:s3:us-west-2:181572960644:job/d6e58ec4-897a-4b6d-975f-10d7f0fb63ce",
        "status": "Complete",
        "jobEventId": "b268784cf0a66749f1a05bce259804f5",
        "failureCodes": [],
        "statusChangeReason": []
    }
}
```

## S3 배치 작업 이벤트 추적을 위한 EventBridge 규칙
<a name="batch-ops-examples-event-bridge"></a>

다음 예제에서는 Amazon EventBridge에서 규칙을 생성하여 AWS CloudTrail에 의해 기록된 S3 배치 작업 이벤트를 선택한 대상으로 캡처하는 방법을 보여 줍니다.

이렇게 하려면 [이벤트에 반응하는 EventBridge 규칙 생성](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)의 모든 단계에 따라 규칙을 생성합니다. 해당하는 경우 다음 S3 배치 작업 사용자 지정 이벤트 패턴 정책을 붙여넣고 원하는 대상 서비스를 선택합니다.

**S3 배치 작업 사용자 지정 이벤트 패턴 정책**

```
{
    "source": [
        "aws.s3"
    ],
    "detail-type": [
        "AWS Service Event via CloudTrail"
    ],
    "detail": {
        "eventSource": [
            "s3.amazonaws.com"
        ],
        "eventName": [
            "JobCreated",
            "JobStatusChanged"
        ]
    }
}
```

 다음 예제는 EventBridge 이벤트 규칙에서 Amazon Simple Queue Service(Amazon SQS)로 전송된 두 개의 배치 작업 이벤트입니다. 배치 작업은 처리 중에 여러 가지 상태(`New`, `Preparing`, `Active` 등)를 거치므로 각 작업에 대해 여러 메시지를 수신할 수 있습니다.

**Example - JobCreated 샘플 이벤트**  

```
{
    "version": "0",
    "id": "51dc8145-541c-5518-2349-56d7dffdf2d8",
    "detail-type": "AWS Service Event via CloudTrail",
    "source": "aws.s3",
    "account": "123456789012",
    "time": "2020-02-27T15:25:49Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.05",
        "userIdentity": {
            "accountId": "11112223334444",
            "invokedBy": "s3.amazonaws.com"
        },
        "eventTime": "2020-02-27T15:25:49Z",
        "eventSource": "s3.amazonaws.com",
        "eventName": "JobCreated",
        "awsRegion": "us-east-1",
        "sourceIPAddress": "s3.amazonaws.com",
        "userAgent": "s3.amazonaws.com",
        "eventID": "7c38220f-f80b-4239-8b78-2ed867b7d3fa",
        "readOnly": false,
        "eventType": "AwsServiceEvent",
        "serviceEventDetails": {
            "jobId": "e849b567-5232-44be-9a0c-40988f14e80c",
            "jobArn": "arn:aws:s3:us-east-1:181572960644:job/e849b567-5232-44be-9a0c-40988f14e80c",
            "status": "New",
            "jobEventId": "f177ff24f1f097b69768e327038f30ac",
            "failureCodes": [],
            "statusChangeReason": []
        }
    }
}
```

**Example - JobStatusChanged 작업 완료 이벤트**  

```
{
  "version": "0",
  "id": "c8791abf-2af8-c754-0435-fd869ce25233",
  "detail-type": "AWS Service Event via CloudTrail",
  "source": "aws.s3",
  "account": "123456789012",
  "time": "2020-02-27T15:26:42Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "1.05",
    "userIdentity": {
      "accountId": "1111222233334444",
      "invokedBy": "s3.amazonaws.com"
    },
    "eventTime": "2020-02-27T15:26:42Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "JobStatusChanged",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "s3.amazonaws.com",
    "userAgent": "s3.amazonaws.com",
    "eventID": "0238c1f7-c2b0-440b-8dbd-1ed5e5833afb",
    "readOnly": false,
    "eventType": "AwsServiceEvent",
    "serviceEventDetails": {
      "jobId": "e849b567-5232-44be-9a0c-40988f14e80c",
      "jobArn": "arn:aws:s3:us-east-1:181572960644:job/e849b567-5232-44be-9a0c-40988f14e80c",
      "status": "Complete",
      "jobEventId": "51f5ac17dba408301d56cd1b2c8d1e9e",
      "failureCodes": [],
      "statusChangeReason": []
    }
  }
}
```

# 예: S3 배치 작업 완료 보고서
<a name="batch-ops-examples-reports"></a>

S3 배치 작업을 생성할 때 모든 작업 또는 실패한 작업에 대한 완료 보고서를 요청할 수 있습니다. 하나 이상의 작업이 성공적으로 호출되면 S3 배치 작업은 완료, 실패 또는 취소된 작업에 대한 보고서를 생성합니다.

완료 보고서에는 객체 키 이름 및 버전, 상태, 오류 코드 및 오류 설명을 포함한 각 작업에 대한 추가 정보가 수록됩니다. 실패한 각 작업의 오류 설명은 작업 생성 중 발생한 문제(예: 권한)를 진단하는 데 사용할 수 있습니다. **체크섬 계산** 작업의 경우 완료 보고서에는 모든 객체에 대한 체크섬 값이 포함됩니다.

**참고**  
완료 보고서는 항상 Amazon S3 관리형 키(SSE-S3)를 사용하여 암호화됩니다.

**Example - 상위 매니페스트 결과 파일**  
상위 `manifest.json` 파일에는 다음 예제와 같이 성공한 각 보고서의 위치와 (작업이 실패한 경우) 실패한 보고서의 위치가 포함됩니다.  

```
{
    "Format": "Report_CSV_20180820",
    "ReportCreationDate": "2019-04-05T17:48:39.725Z",
    "Results": [
        {
            "TaskExecutionStatus": "succeeded",
            "Bucket": "my-job-reports",
            "MD5Checksum": "83b1c4cbe93fc893f54053697e10fd6e",
            "Key": "job-f8fb9d89-a3aa-461d-bddc-ea6a1b131955/results/6217b0fab0de85c408b4be96aeaca9b195a7daa5.csv"
        },
        {
            "TaskExecutionStatus": "failed",
            "Bucket": "my-job-reports",
            "MD5Checksum": "22ee037f3515975f7719699e5c416eaa",
            "Key": "job-f8fb9d89-a3aa-461d-bddc-ea6a1b131955/results/b2ddad417e94331e9f37b44f1faf8c7ed5873f2e.csv"
        }
    ],
    "ReportSchema": "Bucket, Key, VersionId, TaskStatus, ErrorCode, HTTPStatusCode, ResultMessage"
}
```

**성공한 작업 보고서**

성공한 작업 보고서에는 *성공적인* 작업에 대한 다음 정보가 포함됩니다.
+ `Bucket`
+ `Key`
+ `VersionId`
+ `TaskStatus`
+ `ErrorCode`
+ `HTTPStatusCode`
+ `ResultMessage`

**실패한 작업 보고서**

실패한 작업 보고서에는 *실패한* 모든 작업에 대한 다음 정보가 포함됩니다.
+ `Bucket`
+ `Key`
+ `VersionId`
+ `TaskStatus`
+ `ErrorCode`
+ `HTTPStatusCode`
+ `ResultMessage`

**Example - Lambda 함수 작업 보고서**  
다음 예제에서 Lambda 함수는 Amazon S3 객체를 다른 버킷에 성공적으로 복사했습니다. 반환된 Amazon S3 응답은 S3 배치 작업으로 다시 전달된 다음 최종 완료 보고서에 기록됩니다.  

```
amzn-s3-demo-bucket1,image_17775,,succeeded,200,,"{u'CopySourceVersionId': 'xVR78haVKlRnurYofbTfYr3ufYbktF8h', u'CopyObjectResult': {u'LastModified': datetime.datetime(2019, 4, 5, 17, 35, 39, tzinfo=tzlocal()), u'ETag': '""fe66f4390c50f29798f040d7aae72784""'}, 'ResponseMetadata': {'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': 'nXNaClIMxEJzWNmeMNQV2KpjbaCJLn0OGoXWZpuVOFS/iQYWxb3QtTvzX9SVfx2lA3oTKLwImKw=', 'RequestId': '3ED5852152014362', 'HTTPHeaders': {'content-length': '234', 'x-amz-id-2': 'nXNaClIMxEJzWNmeMNQV2KpjbaCJLn0OGoXWZpuVOFS/iQYWxb3QtTvzX9SVfx2lA3oTKLwImKw=', 'x-amz-copy-source-version-id': 'xVR78haVKlRnurYofbTfYr3ufYbktF8h', 'server': 'AmazonS3', 'x-amz-request-id': '3ED5852152014362', 'date': 'Fri, 05 Apr 2019 17:35:39 GMT', 'content-type': 'application/xml'}}}"
amzn-s3-demo-bucket1,image_17763,,succeeded,200,,"{u'CopySourceVersionId': '6HjOUSim4Wj6BTcbxToXW44pSZ.40pwq', u'CopyObjectResult': {u'LastModified': datetime.datetime(2019, 4, 5, 17, 35, 39, tzinfo=tzlocal()), u'ETag': '""fe66f4390c50f29798f040d7aae72784""'}, 'ResponseMetadata': {'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': 'GiCZNYr8LHd/Thyk6beTRP96IGZk2sYxujLe13TuuLpq6U2RD3we0YoluuIdm1PRvkMwnEW1aFc=', 'RequestId': '1BC9F5B1B95D7000', 'HTTPHeaders': {'content-length': '234', 'x-amz-id-2': 'GiCZNYr8LHd/Thyk6beTRP96IGZk2sYxujLe13TuuLpq6U2RD3we0YoluuIdm1PRvkMwnEW1aFc=', 'x-amz-copy-source-version-id': '6HjOUSim4Wj6BTcbxToXW44pSZ.40pwq', 'server': 'AmazonS3', 'x-amz-request-id': '1BC9F5B1B95D7000', 'date': 'Fri, 05 Apr 2019 17:35:39 GMT', 'content-type': 'application/xml'}}}"
amzn-s3-demo-bucket1,image_17860,,succeeded,200,,"{u'CopySourceVersionId': 'm.MDD0g_QsUnYZ8TBzVFrp.TmjN8PJyX', u'CopyObjectResult': {u'LastModified': datetime.datetime(2019, 4, 5, 17, 35, 40, tzinfo=tzlocal()), u'ETag': '""fe66f4390c50f29798f040d7aae72784""'}, 'ResponseMetadata': {'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': 'F9ooZOgpE5g9sNgBZxjdiPHqB4+0DNWgj3qbsir+sKai4fv7rQEcF2fBN1VeeFc2WH45a9ygb2g=', 'RequestId': '8D9CA56A56813DF3', 'HTTPHeaders': {'content-length': '234', 'x-amz-id-2': 'F9ooZOgpE5g9sNgBZxjdiPHqB4+0DNWgj3qbsir+sKai4fv7rQEcF2fBN1VeeFc2WH45a9ygb2g=', 'x-amz-copy-source-version-id': 'm.MDD0g_QsUnYZ8TBzVFrp.TmjN8PJyX', 'server': 'AmazonS3', 'x-amz-request-id': '8D9CA56A56813DF3', 'date': 'Fri, 05 Apr 2019 17:35:40 GMT', 'content-type': 'application/xml'}}}"
```
다음 예제 보고서는 AWS Lambda 함수가 시간을 초과하여 실패 임계값을 초과한 경우를 보여줍니다. 그런 다음 `PermanentFailure`로 표시되었습니다.  

```
amzn-s3-demo-bucket1,image_14975,,failed,200,PermanentFailure,"Lambda returned function error: {""errorMessage"":""2019-04-05T17:35:21.155Z 2845ca0d-38d9-4c4b-abcf-379dc749c452 Task timed out after 3.00 seconds""}"
amzn-s3-demo-bucket1,image_15897,,failed,200,PermanentFailure,"Lambda returned function error: {""errorMessage"":""2019-04-05T17:35:29.610Z 2d0a330b-de9b-425f-b511-29232fde5fe4 Task timed out after 3.00 seconds""}"
amzn-s3-demo-bucket1,image_14819,,failed,200,PermanentFailure,"Lambda returned function error: {""errorMessage"":""2019-04-05T17:35:22.362Z fcf5efde-74d4-4e6d-b37a-c7f18827f551 Task timed out after 3.00 seconds""}"
amzn-s3-demo-bucket1,image_15930,,failed,200,PermanentFailure,"Lambda returned function error: {""errorMessage"":""2019-04-05T17:35:29.809Z 3dd5b57c-4a4a-48aa-8a35-cbf027b7957e Task timed out after 3.00 seconds""}"
amzn-s3-demo-bucket1,image_17644,,failed,200,PermanentFailure,"Lambda returned function error: {""errorMessage"":""2019-04-05T17:35:46.025Z 10a764e4-2b26-4d8c-9056-1e1072b4723f Task timed out after 3.00 seconds""}"
amzn-s3-demo-bucket1,image_17398,,failed,200,PermanentFailure,"Lambda returned function error: {""errorMessage"":""2019-04-05T17:35:44.661Z 1e306352-4c54-4eba-aee8-4d02f8c0235c Task timed out after 3.00 seconds""}"
```

**Example - 체크섬 계산 작업 보고서**  
다음 예제에서 **체크섬 계산** 작업은 업로드된 객체의 체크섬을 저장 중에 성공적으로 계산했습니다. 반환된 Amazon S3 응답은 S3 Batch Operations로 다시 전달된 다음 최종 완료 보고서에 기록됩니다.  

```
amzn-s3-demo-bucket1,s3-standard-1mb-test-object,,succeeded,200,,"{""checksum_base64"":""bS9TOQ\u003d\u003d"",""etag"":""3c3c1813042989094598e4b57ecbdc82"",""checksumAlgorithm"":""CRC32"",""checksumType"":""FULL_OBJECT"",""checksum_hex"":""6D2F5339""}"
```
다음 예제 보고서는 **체크섬 계산** 작업이 실패하여 작업 보고서가 실패할 때 발생하는 상황을 보여줍니다.  

```
amzn-s3-demo-bucket1,image_14975,,failed,200,PermanentFailure,"error details: {""failureMessage"":"Task 2845ca0d-38d9-4c4b-abcf-379dc749c452 SSE-C encryption type is not supported for this operation", ""errorCode"": "400"}"
amzn-s3-demo-bucket1,image_14975,,failed,200,PermanentFailure,"error details: {""failureMessage"":"Task 2845ca0d-38d9-4c4b-abcf-379dc749c452 Key not found", ""errorCode"": "404"}"
amzn-s3-demo-bucket1,image_14975,,failed,200,PermanentFailure,"error details: {""failureMessage"":"Task 2845ca0d-38d9-4c4b-abcf-379dc749c452 Internal server error, please retry", ""errorCode"": "500"}"
```

# 태그를 사용하여 액세스 제어 및 작업 레이블 지정
<a name="batch-ops-job-tags"></a>

*태그*를 추가하여 S3 배치 작업 건에 대한 레이블을 지정하고 액세스를 제어할 수 있습니다. 태그는 배치 작업 건을 담당하는 사용자를 식별하는 데 사용할 수 있습니다. 작업 태그가 있을 경우 사용자가 작업을 취소하고, 확인 상태의 작업을 활성화하거나 작업의 우선 순위 레벨을 바꿀 수 있는 능력을 부여하거나 제한할 수 있습니다. 태그가 연결된 작업을 만들 수 있으며 작업을 만든 후 작업에 태그를 추가할 수 있습니다. 각 태그는 작업을 생성하거나 나중에 업데이트할 때 포함할 수 있는 키-값 페어입니다.

**주의**  
작업 태그에 기밀 정보나 개인 데이터가 포함되어 있지 않은지 확인하세요.

다음 태깅 예를 참조하세요. 재무 부서에서 배치 작업을 생성하려고 한다고 가정합니다. `Finance` 값이 할당된 `Department` 태그로 작업을 생성하는 경우 사용자가 `CreateJob`을 호출할 수 있도록 허용하는 AWS Identity and Access Management(IAM) 정책을 작성할 수 있습니다. 또한 재무 부서의 구성원인 모든 사용자에게 해당 정책을 연결할 수 있습니다.

이 예에서는 사용자가 원하는 태그가 있는 작업의 우선 순위를 업데이트하거나 해당 태그가 있는 작업을 취소할 수 있도록 허용하는 정책을 생성할 수 있습니다. 자세한 내용은 [작업 태그를 사용하여 Batch Operations에 대한 권한 제어](batch-ops-job-tags-examples.md) 섹션을 참조하세요.

새 S3 배치 작업을 생성할 때 태그를 추가하거나 기존 작업에 추가할 수 있습니다.

다음과 같은 태그 제한 사항이 있습니다.
+ 고유한 태그 키가 있는 경우 작업에 최대 50개의 태그를 연결할 수 있습니다.
+ 태그 키의 최대 길이는 128개 유니코드 문자이며, 태그 값의 최대 길이는 256개 유니코드 문자입니다.
+ 키와 값은 대/소문자를 구분합니다.

태그 제한에 대한 자세한 내용은 *AWS 결제 및 비용 관리 사용 설명서*의 [사용자 정의 태그 제한](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html)을 참조하세요.

## S3 배치 작업 건 태깅과 관련된 API 작업
<a name="batch-ops-job-tags-api"></a>

Amazon S3는 S3 배치 작업 건 태깅을 위해 다음 API 작업을 지원합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html) – Batch Operations 작업과 연결된 태그 집합을 반환합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutJobTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutJobTagging.html) – 작업과 연결된 태그 집합을 대체합니다. 이 API 작업을 사용하는 S3 배치 작업 건 태그 관리에 대한 시나리오 두 가지가 있습니다.
  + 작업에 태그가 없는 경우 - 작업에 태그 집합을 추가할 수 있습니다(작업에 이전 태그가 없음).
  + 작업에 기존 태그 집합이 있는 경우 - 기존 태그 집합을 수정하려면 기존 태그 집합을 완전히 바꾸거나, [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html)을 사용하여 기존 태그 집합을 검색한 다음 기존 태그 집합 내에서 변경하고, 해당 태그 집합을 수정하고, 이 API 작업을 사용하여 수정한 태그 집합으로 바꿉니다.
**참고**  
빈 태그 세트로 이 요청을 전송하는 경우 S3 배치 작업은 객체에 있는 기존 태그 세트를 삭제합니다. 이 방법을 사용하면 계층 1 요청(`PUT`)에 대한 요금이 부과됩니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing)을 참조하세요.  
배치 작업에 대한 기존 태그를 삭제하려면 비용이 발생하지 않고 동일한 결과를 얻을 수 있는 `DeleteJobTagging` 작업이 선호됩니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteJobTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteJobTagging.html) - Batch Operations 작업과 연결된 태그 집합을 삭제합니다.

# 레이블 지정에 작업 태그를 사용하는 배치 작업 생성
<a name="batch-ops-tags-create"></a>

**태그를 추가하여 Amazon S3 Batch Operations 작업에 대한 레이블을 지정하고 액세스를 제어할 수 있습니다. 태그는 배치 작업 건을 담당하는 사용자를 식별하는 데 사용할 수 있습니다. 태그가 연결된 작업을 생성할 수 있으며 작업을 생성한 후 작업에 태그를 추가할 수 있습니다. 자세한 내용은 [태그를 사용하여 액세스 제어 및 작업 레이블 지정](batch-ops-job-tags.md) 섹션을 참조하세요.

## AWS CLI 사용
<a name="batch-ops-example-cli-job-tags-create-job"></a>

다음 AWS CLI 예제에서는 작업 태그를 작업의 레이블로 사용하여 S3 배치 작업 `S3PutObjectCopy` 작업을 생성합니다.

1. 배치 작업에서 수행하려는 작업 또는 `OPERATION`을 선택하고 `TargetResource`를 선택합니다.

   ```
   read -d '' OPERATION <<EOF
   {
     "S3PutObjectCopy": {
       "TargetResource": "arn:aws:s3:::amzn-s3-demo-destination-bucket"
     }
   }
   EOF
   ```

1. 작업에 대해 원하는 작업 `TAGS`를 식별합니다. 이 경우 두 개의 태그 `department` 및 `FiscalYear`를 각각 `Marketing` 및 `2020` 값과 함께 적용합니다.

   ```
   read -d '' TAGS <<EOF
   [
     {
       "Key": "department",
       "Value": "Marketing"
     },
     {
       "Key": "FiscalYear",
       "Value": "2020"
     }
   ]
   EOF
   ```

1. 배치 작업에 대해 `MANIFEST`를 지정합니다.

   ```
   read -d '' MANIFEST <<EOF
   {
     "Spec": {
       "Format": "EXAMPLE_S3BatchOperations_CSV_20180820",
       "Fields": [
         "Bucket",
         "Key"
       ]
     },
     "Location": {
       "ObjectArn": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/example_manifest.csv",
       "ETag": "example-5dc7a8bfb90808fc5d546218"
     }
   }
   EOF
   ```

1. 배치 작업에 대해 `REPORT`를 구성합니다.

   ```
   read -d '' REPORT <<EOF
   {
     "Bucket": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
     "Format": "Example_Report_CSV_20180820",
     "Enabled": true,
     "Prefix": "reports/copy-with-replace-metadata",
     "ReportScope": "AllTasks"
   }
   EOF
   ```

1. `create-job` 작업을 실행하여 이전 단계에서 설정된 입력으로 배치 작업을 생성합니다.

   ```
   aws \
       s3control create-job \
       --account-id 123456789012 \
       --manifest "${MANIFEST//$'\n'}" \
       --operation "${OPERATION//$'\n'/}" \
       --report "${REPORT//$'\n'}" \
       --priority 10 \
       --role-arn arn:aws:iam::123456789012:role/batch-operations-role \
       --tags "${TAGS//$'\n'/}" \
       --client-request-token "$(uuidgen)" \
       --region us-west-2 \
       --description "Copy with Replace Metadata";
   ```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-job-with-tags-create"></a>

AWS SDK for Java를 사용하여 태그가 있는 S3 Batch Operations 작업을 만들려면 S3Control 클라이언트를 사용하여 매니페스트 위치, 작업, 보고 설정과 조직 및 추적용 태그 등의 작업 파라미터를 구성할 수 있습니다.

AWS SDK for Java를 사용하여 태그가 있는 S3 Batch Operations 작업을 만드는 방법의 예는 *Amazon S3 API 참조*의 [Create a batch job to copy objects](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_CreateJob_section.html)를 참조하세요.

# S3 배치 작업에서 태그 삭제
<a name="delete-job-tags"></a>

다음 예제를 사용하여 Amazon S3 Batch Operations 작업에서 태그를 삭제할 수 있습니다.

## AWS CLI 사용
<a name="batch-ops-example-cli-job-tags-delete-job-tagging"></a>

다음 예제에서는 AWS CLI를 사용하여 배치 작업에서 태그를 삭제합니다.

```
aws \
    s3control delete-job-tagging \
    --account-id 123456789012 \
    --job-id Example-e25a-4ed2-8bee-7f8ed7fc2f1c \
    --region us-east-1
```

## 배치 작업의 작업 태그 삭제
<a name="batch-ops-examples-java-job-with-tags-delete"></a>

AWS SDK for Java를 사용하여 S3 Batch Operations 작업의 태그를 삭제하려면 작업 ID와 함께 S3Control 클라이언트를 사용하여 배치 작업과 연결된 모든 태그를 제거할 수 있습니다.

AWS SDK for Java를 사용하여 작업 태그를 삭제하는 방법의 예는 *Amazon S3 API 참조*의 [Delete tags from a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_DeleteJobTagging_section.html)을 참조하세요.

# 기존 Batch Operations 작업에 작업 태그 추가
<a name="put-job-tags"></a>

[https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutJobTagging.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutJobTagging.html) API 작업을 사용하여 기존 Amazon S3 Batch Operations 작업에 작업 태그를 추가할 수 있습니다. 자세한 정보는 다음 예를 참조하세요.

## AWS CLI 사용
<a name="batch-ops-example-cli-job-tags-put-job-tagging"></a>

다음은 AWS CLI에서 `s3control put-job-tagging`을 사용하여 S3 Batch Operations 작업에 작업 태그를 추가하는 예제입니다. 예제를 사용하려면 *`user input placeholders`*를 실제 정보로 대체하세요.

**참고**  
빈 태그 집합으로 이 요청을 전송하는 경우 Batch Operations는 객체에 있는 기존 태그 집합을 삭제합니다. 그러나 이 접근 방식을 사용하는 경우 계층 1 요청(`PUT`)에 대한 요금이 부과됩니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing)을 참조하세요.  
대신 Batch Operations 작업에 대한 기존 태그를 삭제하려면 비용을 부담하지 않고 동일한 결과를 얻을 수 있으므로 `DeleteJobTagging` 작업을 사용하는 것이 좋습니다.

1. 작업에 대해 원하는 작업 `TAGS`를 식별합니다. 이 경우 두 개의 태그 `department` 및 `FiscalYear`를 각각 `Marketing` 및 `2020` 값과 함께 적용합니다.

   ```
   read -d '' TAGS <<EOF
   [
     {
       "Key": "department",
       "Value": "Marketing"
     },
     {
       "Key": "FiscalYear",
       "Value": "2020"
     }
   ]
   EOF
   ```

1. 필요한 파라미터를 사용하여 다음 `put-job-tagging` 명령을 실행합니다.

   ```
   aws \
       s3control put-job-tagging \
       --account-id 123456789012 \
       --tags "${TAGS//$'\n'/}" \
       --job-id Example-e25a-4ed2-8bee-7f8ed7fc2f1c \
       --region us-east-1
   ```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-job-with-tags-put"></a>

AWS SDK for Java를 사용하여 S3 Batch Operations 작업에 태그를 지정하려면 S3Control 클라이언트를 사용하여 구성 및 추적 목적으로 키-값 페어가 있는 태그를 추가하거나 업데이트할 수 있습니다.

AWS SDK for Java를 사용하여 작업 태그를 지정하는 방법의 예는 *Amazon S3 API 참조*의 [Add tags to a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_PutJobTagging_section.html)을 참조하세요.

# S3 배치 작업의 작업 태그 가져오기
<a name="get-job-tags"></a>

Amazon S3 Batch Operations 작업의 태그를 검색하려면 `GetJobTagging` API 작업을 사용하면 됩니다. 자세한 정보는 다음 예를 참조하세요.

## AWS CLI 사용
<a name="batch-ops-example-cli-job-tags-get-job-tagging"></a>

다음 예제에서는 AWS CLI를 사용하여 배치 작업의 태그를 가져옵니다. 이 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

```
aws \
    s3control get-job-tagging \
    --account-id 123456789012 \
    --job-id Example-e25a-4ed2-8bee-7f8ed7fc2f1c \
    --region us-east-1
```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-job-with-tags-get"></a>

AWS SDK for Java를 사용하여 S3 Batch Operations 작업의 태그를 가져오려면 작업 ID와 함께 S3Control 클라이언트를 사용하여 배치 작업과 연결된 모든 태그를 검색하고 목록으로 반환할 수 있습니다.

AWS SDK for Java를 사용하여 작업 태그를 가져오는 방법의 예는 *Amazon S3 API 참조*의 [Get tags from a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_GetJobTagging_section.html)을 참조하세요.

# 작업 태그를 사용하여 Batch Operations에 대한 권한 제어
<a name="batch-ops-job-tags-examples"></a>

Amazon S3 Batch Operations 작업 관리를 돕기 위해 **작업 태그를 추가할 수 있습니다. 작업 태그를 사용하여 배치 작업에 대한 액세스를 제어하고 작업이 생성될 때 태그를 적용할 수 있습니다.

각 배치 작업에 최대 50개의 작업 태그를 적용할 수 있습니다. 태그를 통해 세분화된 정책을 설정하여 작업을 편집할 수 있는 사용자 집합을 제한할 수 있습니다. 작업 태그가 있을 경우 사용자가 작업을 취소하고, 확인 상태의 작업을 활성화하거나 작업의 우선 순위 레벨을 변경할 수 있는 능력을 부여하거나 제한할 수 있습니다. 또한 모든 새 작업에 태그를 적용하고 태그에 대해 허용되는 키-값 페어를 지정할 수 있습니다. [AWS Identity and Access Management (IAM) 정책 언어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_iam-tags.html)를 사용하여 이러한 모든 조건을 표현할 수 있습니다. 자세한 정보는 **서비스 승인 참조에서 [Amazon S3에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

다음 예제에서는 S3 배치 작업 태그를 사용하여 특정 부서(예: 재무 또는 규정 준수 부서)에서 실행되는 작업만 생성 및 편집할 수 있는 권한을 사용자에게 부여하는 방법을 보여줍니다. QA 또는 Production 등 관련된 development의 단계에 따라 작업을 할당할 수도 있습니다.

이 예제에서는 IAM 정책의 S3 Batch Operations 작업 태그를 사용하여 사용자에게 부서 내에서 실행 중인 작업만 만들고 편집할 수 있는 권한을 부여합니다. QA 또는 Production 등 관련된 개발의 단계에 따라 작업을 할당합니다.

다음 예제에서는 다음 부서를 사용하며 각 부서는 Batch Operations를 다양한 방식으로 활용합니다.
+ 재무
+ 규정 준수
+ 비즈니스 인텔리전스
+ 엔지니어링

**Topics**
+ [

## 사용자 및 리소스에 태그를 할당하여 액세스 제어
](#job-tags-examples-attaching-tags)
+ [

## 단계별 배치 작업 태그 지정 및 작업 우선 순위 제한 적용
](#tagging-jobs-by-stage-and-enforcing-limits-on-job-priority)

## 사용자 및 리소스에 태그를 할당하여 액세스 제어
<a name="job-tags-examples-attaching-tags"></a>

이 시나리오에서는 관리자가 [속성 기반 액세스 제어(ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)를 사용하고 있습니다. ABAC는 사용자와 AWS 리소스 모두에 태그를 연결하여 권한을 정의하는 IAM 권한 부여 전략입니다.

사용자 및 작업에는 다음 부서 태그 중 하나가 할당됩니다.

**키 : 값**
+ `department : Finance`
+ `department : Compliance`
+ `department : BusinessIntelligence`
+ `department : Engineering`
**참고**  
작업 태그 키와 값은 대/소문자를 구분합니다.

ABAC 액세스 제어 전략을 사용하여 재무 부서의 사용자에게 `department=Finance` 태그를 사용자와 연결하여 부서 내에서 S3 배치 작업을 생성하고 관리할 수 있는 권한을 부여합니다.

또한 회사의 모든 사용자가 해당 부서 내에서 S3 배치 작업을 생성하거나 수정할 수 있도록 허용하는 관리형 정책을 IAM 사용자에게 연결할 수 있습니다.

이 예제의 정책에는 다음과 같은 세 가지 정책 문이 포함되어 있습니다.
+ 정책의 첫 번째 문은 작업 생성 요청에 해당 부서와 일치하는 작업 태그가 포함되어 있는 경우 사용자가 배치 작업을 생성할 수 있도록 허용합니다. 이는 정책 평가 시 사용자의 부서 태그로 대체되는 `"${aws:PrincipalTag/department}"` 구문을 사용하여 표현됩니다. `("aws:RequestTag/department")` 요청에서 부서 태그에 대해 제공된 값이 사용자의 부서와 일치하면 조건이 충족됩니다.
+ 정책의 두 번째 문은 사용자가 업데이트 중인 작업이 사용자의 부서와 일치하는 경우 사용자가 작업의 우선 순위를 변경하거나 작업 상태를 업데이트할 수 있도록 허용합니다.
+ 세 번째 문은 (1) 부서 태그가 보존되고 (2) 업데이트하려는 작업이 해당 부서 내에 있는 한 사용자가 `PutJobTagging` 요청을 통해 언제든지 배치 작업 태그를 업데이트할 수 있도록 허용합니다.

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

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": [
            {
                  "Effect": "Allow",
                  "Action": "s3:CreateJob",
                  "Resource": "*",
                  "Condition": {
                        "StringEquals": {
                              "aws:RequestTag/department": "${aws:PrincipalTag/department}"        
                }      
            }    
        },
            {
                  "Effect": "Allow",
                  "Action": [
                        "s3:UpdateJobPriority",
                        "s3:UpdateJobStatus"      
            ],
                  "Resource": "*",
                  "Condition": {
                        "StringEquals": {
                              "aws:ResourceTag/department": "${aws:PrincipalTag/department}"        
                }      
            }    
        },
            {
                  "Effect": "Allow",
                  "Action": "s3:PutJobTagging",
                  "Resource": "*",
                  "Condition": {
                        "StringEquals": {
                              "aws:RequestTag/department": "${aws:PrincipalTag/department}",
                              "aws:ResourceTag/department": "${aws:PrincipalTag/department}"        
                }      
            }    
        }  
    ]
}
```

------

## 단계별 배치 작업 태그 지정 및 작업 우선 순위 제한 적용
<a name="tagging-jobs-by-stage-and-enforcing-limits-on-job-priority"></a>

모든 S3 배치 작업에는 Amazon S3이 작업을 실행할 순서를 결정하는 데 사용하는 숫자 우선 순위가 있습니다. 이 예제에서는 다음과 같이 대부분의 사용자가 작업에 할당할 수 있는 최대 우선 순위를 제한하고, 제한된 권한 사용자 집합에 대해 높은 우선 순위 범위를 예약합니다.
+ QA 스테이지 우선 순위 범위(낮음): 1-100
+ 프로덕션 단계 우선 순위 범위(높음): 1-300

이를 위해 작업의 단계를 나타내는 새 태그 세트를 도입합니다.

**키 : 값**
+ `stage : QA`
+ `stage : Production`

### 부서 내에서 우선 순위가 낮은 작업 생성 및 업데이트
<a name="creating-and-updating-low-priority-jobs"></a>

이 정책은 부서 기반 제한 외에 S3 배치 작업 생성 및 업데이트에 대한 두 가지 새로운 제한을 적용합니다.
+ 사용자는 해당 부서에서 작업에 `stage=QA` 태그를 포함해야 하는 새 조건으로 작업을 생성하거나 업데이트할 수 있습니다.
+ 사용자는 작업의 우선 순위를 새로운 최대값인 100개까지 생성하거나 업데이트할 수 있습니다.

```
{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
        {
        "Effect": "Allow",
        "Action": "s3:CreateJob",
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:RequestTag/department": "${aws:PrincipalTag/department}",
                "aws:RequestTag/stage": "QA"
            },
            "NumericLessThanEquals": {
                "s3:RequestJobPriority": 100
            }
        }
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:UpdateJobStatus"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:ResourceTag/department": "${aws:PrincipalTag/department}"
            }
        }
    },
    {
        "Effect": "Allow",
        "Action": "s3:UpdateJobPriority",
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:ResourceTag/department": "${aws:PrincipalTag/department}",
                "aws:ResourceTag/stage": "QA"
            },
            "NumericLessThanEquals": {
                "s3:RequestJobPriority": 100
            }
        }
    },
    {
        "Effect": "Allow",
        "Action": "s3:PutJobTagging",
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "aws:RequestTag/department" : "${aws:PrincipalTag/department}",
                "aws:ResourceTag/department": "${aws:PrincipalTag/department}",
                "aws:RequestTag/stage": "QA",
                "aws:ResourceTag/stage": "QA"
            }
        }
    },
    {
        "Effect": "Allow",
        "Action": "s3:GetJobTagging",
        "Resource": "*"
    }
    ]
}
```

### 부서 내에서 우선 순위가 높은 작업 생성 및 업데이트
<a name="creating-and-updating-high-priority-jobs"></a>

일부 사용자는 QA 또는 Production 중 하나에서 우선 순위가 높은 작업을 생성할 수 있어야 합니다. 이 요구를 지원하기 위해 이전 섹션의 우선 순위가 낮은 정책에 맞게 조정된 관리형 정책을 생성합니다.

이 정책은 다음을 수행합니다.
+ 사용자가 `stage=QA` 태그 또는 `stage=Production` 태그를 사용하여 부서에서 작업을 생성하거나 업데이트할 수 있습니다.
+ 사용자는 작업의 우선 순위를 최대 300개까지 생성하거나 업데이트할 수 있습니다.

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

****  

```
{
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
                "Effect": "Allow",
                "Action": "s3:CreateJob",
                "Resource": "*",
                "Condition": {
                      "ForAnyValue:StringEquals": {
                            "aws:RequestTag/stage": [
                                  "QA",
                                  "Production"        
                    ]      
                },
                      "StringEquals": {
                            "aws:RequestTag/department": "${aws:PrincipalTag/department}"      
                },
                      "NumericLessThanEquals": {
                            "s3:RequestJobPriority": 300      
                }    
            }  
        },
          {
                "Effect": "Allow",
                "Action": [
                      "s3:UpdateJobStatus"    
            ],
                "Resource": "*",
                "Condition": {
                      "StringEquals": {
                            "aws:ResourceTag/department": "${aws:PrincipalTag/department}"      
                }    
            }  
        },
          {
                "Effect": "Allow",
                "Action": "s3:UpdateJobPriority",
                "Resource": "*",
                "Condition": {
                      "ForAnyValue:StringEquals": {
                            "aws:ResourceTag/stage": [
                                  "QA",
                                  "Production"        
                    ]      
                },
                      "StringEquals": {
                            "aws:ResourceTag/department": "${aws:PrincipalTag/department}"      
                },
                      "NumericLessThanEquals": {
                            "s3:RequestJobPriority": 300      
                }    
            }  
        },
          {
                "Effect": "Allow",
                "Action": "s3:PutJobTagging",
                "Resource": "*",
                "Condition": {
                      "StringEquals": {
                            "aws:RequestTag/department": "${aws:PrincipalTag/department}",
                            "aws:ResourceTag/department": "${aws:PrincipalTag/department}"      
                },
                      "ForAnyValue:StringEquals": {
                            "aws:RequestTag/stage": [
                                  "QA",
                                  "Production"        
                    ],
                            "aws:ResourceTag/stage": [
                                  "QA",
                                  "Production"        
                    ]      
                }    
            }  
        }  
    ]
}
```

------

# S3 배치 작업을 사용하여 S3 객체 잠금 관리
<a name="managing-object-lock-batchops"></a>

S3 배치 작업을 사용하여 Amazon S3 객체에 대해 대규모 배치 작업을 수행할 수 있습니다. S3 배치 작업은 지정된 Amazon S3 객체 목록에 대해 단일 작업을 수행할 수 있습니다. 단일 작업으로 엑사바이트 규모의 데이터가 포함된 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다. Amazon S3는 진행 상황을 추적하고 알림을 보내며 모든 작업에 대한 자세한 완료 보고서를 저장하여 감사 가능한 완전관리형 서버리스 환경을 제공합니다. Amazon S3 콘솔, AWS CLI, AWS SDK 또는 Amazon S3 REST API를 통해 S3 Batch Operations를 사용할 수 있습니다.

S3 객체 잠금을 사용하면 객체 버전에 법적 보존을 적용할 수도 있습니다. 보관 기간 설정과 마찬가지로 법적 보존을 사용하면 객체 버전을 덮어쓰거나 삭제할 수 없습니다. 그러나 법적 보존에는 연결된 보존 기간이 없고, 법적 보존이 제거될 때까지 유효합니다. 자세한 내용은 [S3 객체 잠금 법적 보존](batch-ops-legal-hold.md) 섹션을 참조하세요.

Object Lock과 함께 S3 Batch Operations를 사용하여 많은 Amazon S3 객체에 법적 보존을 한 번에 추가하려면 다음 주제를 참조하세요.

**Topics**
+ [

# S3 배치 작업을 사용하여 S3 객체 잠금 사용 설정
](batch-ops-object-lock.md)
+ [

# 배치 작업을 사용한 객체 잠금 보존 설정
](batch-ops-object-lock-retention.md)
+ [

# S3 객체 잠금 보존 규정 준수 모드에서 S3 배치 작업 사용
](batch-ops-compliance-mode.md)
+ [

# S3 객체 잠금 보존 거버넌스 모드에서 S3 배치 작업 사용
](batch-ops-governance-mode.md)
+ [

# S3 Batch Operations를 사용하여 S3 Object Lock 법적 보존 해제
](batch-ops-legal-hold-off.md)

# S3 배치 작업을 사용하여 S3 객체 잠금 사용 설정
<a name="batch-ops-object-lock"></a>

S3 Object Lock과 함께 Amazon S3 Batch Operations를 사용하여 보존을 관리하거나 여러 Amazon S3 객체에 대해 한 번에 법적 보존을 활성화할 수 있습니다. 매니페스트에서 대상 객체 목록을 지정하고 완료를 위해 배치 작업에 제출합니다. 자세한 내용은 [S3 객체 잠금 보존](batch-ops-retention-date.md) 및 [S3 객체 잠금 법적 보존](batch-ops-legal-hold.md)(을)를 참조하세요.

다음 예제에서는 Object Lock을 활성화하는 작업을 만들기 위해 S3 Batch Operations 권한이 있는 AWS Identity and Access Management(IAM) 역할을 만들고 역할 권한을 업데이트하는 방법을 보여줍니다. S3 Batch Operations 작업에 대한 객체를 식별하는 `CSV` 매니페스트도 있어야 합니다. 자세한 내용은 [매니페스트 지정](batch-ops-create-job.md#specify-batchjob-manifest) 섹션을 참조하세요.

다음 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

## AWS CLI 사용
<a name="batchops-example-cli-object-lock"></a>

1. IAM 역할을 생성하고 실행할 S3 배치 작업 권한을 할당합니다.

   이 단계는 모든 S3 배치 작업에 필요합니다.

   ```
   export AWS_PROFILE='aws-user'
   
   read -d '' batch_operations_trust_policy <<EOF
   {
     "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "batchoperations.s3.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   EOF
   aws iam create-role --role-name batch_operations-objectlock \
   --assume-role-policy-document "${batch_operations_trust_policy}"
   ```

1. S3 객체 잠금을 사용하여 S3 배치 작업을 실행하도록 설정합니다.

   이 단계에서는 역할에서 다음 작업을 수행하도록 허용합니다.

   1. 배치 작업을 실행할 대상 객체가 포함된 S3 버킷에서 객체 잠금을 실행합니다.

   1. 매니페스트 CSV 파일과 객체가 있는 S3 버킷을 읽습니다.

   1. S3 배치 작업의 결과를 보고 버킷에 기록합니다.

   ```
   read -d '' batch_operations_permissions <<EOF
   {
       "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:GetBucketObjectLockConfiguration",
               "Resource": [
                   "arn:aws:s3:::{{amzn-s3-demo-manifest-bucket}}"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::{{amzn-s3-demo-manifest-bucket}}/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::{{amzn-s3-demo-completion-report-bucket}}/*"
               ]
           }
       ]
   }
   EOF
   
   aws iam put-role-policy --role-name batch_operations-objectlock \
   --policy-name object-lock-permissions \
   --policy-document "${batch_operations_permissions}"
   ```

## Java용 AWS SDK 사용
<a name="batchops-examples-java-object-lock"></a>

AWS SDK for Java를 사용하여 Object Lock을 활성화하는 작업을 만들기 위해 S3 Batch Operations 권한이 있는 IAM 역할을 만들고 역할 권한을 업데이트할 수 있습니다. S3 배치 작업에 대한 객체를 식별하는 `CSV` 매니페스트도 있어야 합니다. 자세한 내용은 [매니페스트 지정](batch-ops-create-job.md#specify-batchjob-manifest) 섹션을 참조하세요.

다음 단계를 수행합니다.

1. IAM 역할을 생성하고 실행할 S3 배치 작업 권한을 할당합니다. 이 단계는 모든 S3 배치 작업에 필요합니다.

1. S3 객체 잠금을 사용하여 S3 배치 작업을 실행하도록 설정합니다.

   역할에서 다음 작업을 수행하도록 허용합니다.

   1. 배치 작업을 실행할 대상 객체가 포함된 S3 버킷에서 객체 잠금을 실행합니다.

   1. 매니페스트 CSV 파일과 객체가 있는 S3 버킷을 읽습니다.

   1. S3 배치 작업의 결과를 보고 버킷에 기록합니다.

AWS SDK for Java에서 S3 Batch Operations를 사용하여 S3 Object Lock을 활성화하기 위한 IAM 역할을 만드는 방법을 보여주는 코드 예제는 *AWS SDK for Java 2.x 코드 예제*의 [CreateObjectLockRole.java](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java)를 참조하세요.

# 배치 작업을 사용한 객체 잠금 보존 설정
<a name="batch-ops-object-lock-retention"></a>

S3 Object Lock과 함께 Amazon S3 Batch Operations를 사용하여 여러 Amazon S3 객체에 대한 보존을 한 번에 관리할 수 있습니다. 매니페스트에서 대상 객체 목록을 지정하고 완료를 위해 배치 작업에 제출합니다. 자세한 내용은 [S3 객체 잠금 보존](batch-ops-retention-date.md) 및 [S3 객체 잠금 법적 보존](batch-ops-legal-hold.md)(을)를 참조하세요.

다음 예제에서는 매니페스트 버킷에서 객체에 대한 S3 Object Lock 보존을 실행할 수 있도록 S3 Batch Operations 권한이 있는 AWS Identity and Access Management(IAM) 역할을 만들고 `s3:PutObjectRetention` 권한이 포함되도록 역할 권한을 업데이트하는 방법을 보여줍니다. S3 Batch Operations 작업에 대한 객체를 식별하는 `CSV` 매니페스트도 있어야 합니다. 자세한 내용은 [매니페스트 지정](batch-ops-create-job.md#specify-batchjob-manifest) 섹션을 참조하세요.

다음 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

## AWS CLI 사용
<a name="batch-ops-cli-object-lock-retention-example"></a>

다음 AWS CLI 예제에서는 Batch Operations를 사용하여 여러 객체에 S3 Object Lock 보존을 적용하는 방법을 보여줍니다.

```
export AWS_PROFILE='aws-user'

read -d '' retention_permissions <<EOF
{
    "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectRetention"
            ],
            "Resource": [
                "arn:aws:s3:::{{amzn-s3-demo-manifest-bucket}}/*"
            ]
        }
    ]
}
EOF

aws iam put-role-policy --role-name batch_operations-objectlock --policy-name retention-permissions --policy-document "${retention_permissions}"
```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-object-lock-retention"></a>

Batch Operations를 사용하여 AWS SDK for Java로 여러 객체에 S3 Object Lock 보존을 적용하는 방법의 예는 *Amazon S3 API 참조*의 [Use CreateJob with an AWS SDK or CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_CreateJob_section.html)를 참조하세요.

# S3 객체 잠금 보존 규정 준수 모드에서 S3 배치 작업 사용
<a name="batch-ops-compliance-mode"></a>

다음 예제는 신뢰 정책을 생성하고 객체에 대해 S3 배치 작업 및 S3 객체 잠금 구성 권한을 설정하는 이전 예제를 기반으로 합니다. 다음 예시는 보존 모드를 `COMPLIANCE`로 설정하고 `retain until date`를 2025년 1월 1일로 설정합니다. 이 예제에서는 매니페스트 버킷의 객체를 대상으로 하는 작업을 만들고 사용자가 식별한 보고서 버킷에 결과를 보고합니다.

다음 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

## AWS CLI 사용
<a name="batch-ops-cli-object-lock-compliance-example"></a>

다음 AWS CLI 예제에서는 Batch Operations를 사용하여 여러 객체에 S3 Object Lock 보존 규정 준수 모드를 적용하는 방법을 보여줍니다.

**Example - 여러 객체에 대해 S3 Object Lock 보존 규정 준수 모드 설정**  

```
export AWS_PROFILE='aws-user'
export AWS_DEFAULT_REGION='us-west-2'
export ACCOUNT_ID=123456789012
export ROLE_ARN='arn:aws:iam::123456789012:role/batch_operations-objectlock'

read -d '' OPERATION <<EOF
{
  "S3PutObjectRetention": {
    "Retention": {
      "RetainUntilDate":"2025-01-01T00:00:00",
      "Mode":"COMPLIANCE"
    }
  }
}
EOF

read -d '' MANIFEST <<EOF
{
  "Spec": {
    "Format": "S3BatchOperations_CSV_20180820",
    "Fields": [
      "Bucket",
      "Key"
    ]
  },
  "Location": {
    "ObjectArn": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/compliance-objects-manifest.csv",
    "ETag": "Your-manifest-ETag"
  }
}
EOF

read -d '' REPORT <<EOF
{
  "Bucket": "arn:aws:s3:::ReportBucket",
  "Format": "Report_CSV_20180820",
  "Enabled": true,
  "Prefix": "amzn-s3-demo-completion-report-bucket/compliance-objects-batch-operations",
  "ReportScope": "AllTasks"
}
EOF

aws \
    s3control create-job \
    --account-id "${ACCOUNT_ID}" \
    --manifest "${MANIFEST//$'\n'}" \
    --operation "${OPERATION//$'\n'/}" \
    --report "${REPORT//$'\n'}" \
    --priority 10 \
    --role-arn "${ROLE_ARN}" \
    --client-request-token "$(uuidgen)" \
    --region "${AWS_DEFAULT_REGION}" \
    --description "Set compliance retain-until to 1 Jul 2030";
```

**Example - `COMPLIANCE` 모드의 `retain until date`를 2025년 1월 15일로 연장**  
다음 예제에서는 `COMPLIANCE` 모드의 `retain until date`을(를) 2025년 1월 15일로 연장합니다.  

```
export AWS_PROFILE='aws-user'
export AWS_DEFAULT_REGION='us-west-2'
export ACCOUNT_ID=123456789012
export ROLE_ARN='arn:aws:iam::123456789012:role/batch_operations-objectlock'

read -d '' OPERATION <<EOF
{
  "S3PutObjectRetention": {
    "Retention": {
      "RetainUntilDate":"2025-01-15T00:00:00",
      "Mode":"COMPLIANCE"
    }
  }
}
EOF

read -d '' MANIFEST <<EOF
{
  "Spec": {
    "Format": "S3BatchOperations_CSV_20180820",
    "Fields": [
      "Bucket",
      "Key"
    ]
  },
  "Location": {
    "ObjectArn": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/compliance-objects-manifest.csv",
    "ETag": "Your-manifest-ETag"
  }
}
EOF

read -d '' REPORT <<EOF
{
  "Bucket": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
  "Format": "Report_CSV_20180820",
  "Enabled": true,
  "Prefix": "reports/compliance-objects-batch_operations",
  "ReportScope": "AllTasks"
}
EOF

aws \
    s3control create-job \
    --account-id "${ACCOUNT_ID}" \
    --manifest "${MANIFEST//$'\n'}" \
    --operation "${OPERATION//$'\n'/}" \
    --report "${REPORT//$'\n'}" \
    --priority 10 \
    --role-arn "${ROLE_ARN}" \
    --client-request-token "$(uuidgen)" \
    --region "${AWS_DEFAULT_REGION}" \
    --description "Extend compliance retention to 15 Jan 2025";
```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-object-lock-compliance"></a>

다음 AWS SDK for Java 예제는 Batch Operations를 사용해 여러 객체에 대해 S3 Object Lock 보존 규정 준수 모드를 적용하는 방법을 보여줍니다. 여기에는 보존 모드를 COMPLIANCE로 설정하고 보존 종료 날짜를 지정하는 방법과 COMPLIANCE 모드의 보존 종료 날짜를 연장하는 방법이 포함됩니다.

Batch Operations를 사용하여 AWS SDK for Java로 여러 객체에 S3 Object Lock 보존 규정 준수 모드를 적용하는 방법의 예는 *Amazon S3 API 참조*의 [Use CreateJob with an AWS SDK or CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_CreateJob_section.html)를 참조하세요.

# S3 객체 잠금 보존 거버넌스 모드에서 S3 배치 작업 사용
<a name="batch-ops-governance-mode"></a>

다음 예제는 신뢰 정책을 생성하고 S3 배치 작업 및 S3 객체 잠금 구성 권한을 설정하는 이전 예제를 기반으로 합니다. 이 예제에서는 여러 객체에 대해 `retain until date`가 2025년 1월 30일인 S3 Object Lock 보존 거버넌스를 적용하는 방법을 보여줍니다. 매니페스트 버킷을 사용하는 배치 작업을 생성하고 보고서 버킷에 결과를 보고합니다.

다음 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

## AWS CLI 사용
<a name="batch-ops-cli-object-lock-governance-example"></a>

다음 AWS CLI 예제에서는 Batch Operations를 사용하여 여러 객체에 S3 Object Lock 보존 거버넌스 모드를 적용하는 방법을 보여줍니다.

**Example - 여러 객체에 보존 종료 날짜가 2025년 1월 30일인 S3 Object Lock 보존 거버넌스 적용**  

```
export AWS_PROFILE='aws-user'
export AWS_DEFAULT_REGION='us-west-2'
export ACCOUNT_ID=123456789012
export ROLE_ARN='arn:aws:iam::123456789012:role/batch_operations-objectlock'

read -d '' OPERATION <<EOF
{
  "S3PutObjectRetention": {
    "Retention": {
      "RetainUntilDate":"2025-01-30T00:00:00",
      "Mode":"GOVERNANCE"
    }
  }
}
EOF

read -d '' MANIFEST <<EOF
{
  "Spec": {
    "Format": "S3BatchOperations_CSV_20180820",
    "Fields": [
      "Bucket",
      "Key"
    ]
  },
  "Location": {
    "ObjectArn": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/governance-objects-manifest.csv",
    "ETag": "Your-manifest-ETag"
  }
}
EOF

read -d '' REPORT <<EOF
{
  "Bucket": "arn:aws:s3:::amzn-s3-demo-completion-report-bucketT",
  "Format": "Report_CSV_20180820",
  "Enabled": true,
  "Prefix": "reports/governance-objects",
  "ReportScope": "AllTasks"
}
EOF

aws \
    s3control create-job \
    --account-id "${ACCOUNT_ID}" \
    --manifest "${MANIFEST//$'\n'}" \
    --operation "${OPERATION//$'\n'/}" \
    --report "${REPORT//$'\n'}" \
    --priority 10 \
    --role-arn "${ROLE_ARN}" \
    --client-request-token "$(uuidgen)" \
    --region "${AWS_DEFAULT_REGION}" \
    --description "Put governance retention";
```

**Example - 여러 객체에 대한 보존 거버넌스 무시**  
다음 예제는 신뢰 정책을 생성하고 S3 배치 작업 및 S3 객체 잠금 구성 권한을 설정하는 이전 예제를 기반으로 합니다. 여러 객체에 대해 보존 거버넌스를 무시한 다음, 매니페스트 버킷을 사용하는 배치 작업을 생성하고 보고서 버킷에 결과를 보고하는 방법을 보여줍니다.  

```
export AWS_PROFILE='aws-user'

read -d '' bypass_governance_permissions <<EOF
{
    "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:BypassGovernanceRetention"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
        }
    ]
}
EOF

aws iam put-role-policy --role-name batch-operations-objectlock --policy-name bypass-governance-permissions --policy-document "${bypass_governance_permissions}"

export AWS_PROFILE='aws-user'
export AWS_DEFAULT_REGION='us-west-2'
export ACCOUNT_ID=123456789012
export ROLE_ARN='arn:aws:iam::123456789012:role/batch_operations-objectlock'

read -d '' OPERATION <<EOF
{
  "S3PutObjectRetention": {
    "BypassGovernanceRetention": true,
    "Retention": {
    }
  }
}
EOF

read -d '' MANIFEST <<EOF
{
  "Spec": {
    "Format": "S3BatchOperations_CSV_20180820",
    "Fields": [
      "Bucket",
      "Key"
    ]
  },
  "Location": {
    "ObjectArn": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/governance-objects-manifest.csv",
    "ETag": "Your-manifest-ETag"
  }
}
EOF

read -d '' REPORT <<EOF
{
  "Bucket": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
  "Format": "Report_CSV_20180820",
  "Enabled": true,
  "Prefix": "reports/batch_operations-governance",
  "ReportScope": "AllTasks"
}
EOF

aws \
    s3control create-job \
    --account-id "${ACCOUNT_ID}" \
    --manifest "${MANIFEST//$'\n'}" \
    --operation "${OPERATION//$'\n'/}" \
    --report "${REPORT//$'\n'}" \
    --priority 10 \
    --role-arn "${ROLE_ARN}" \
    --client-request-token "$(uuidgen)" \
    --region "${AWS_DEFAULT_REGION}" \
    --description "Remove governance retention";
```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-object-lock-governance"></a>

다음 AWS SDK for Java 예제에서는 `retain until date`가 2025년 1월 30일로 설정된 S3 Object Lock 보존 거버넌스를 여러 객체에 적용하는 방법을 보여줍니다. 여기에는 보존 종료 날짜가 지정된 여러 객체에 Object Lock 보존 거버넌스를 적용하고 여러 객체에서 보존 거버넌스를 우회하는 방법이 포함됩니다.

AWS SDK for Java로 Batch Operations를 S3 Object Lock 보존 거버넌스 모드와 함께 사용하는 방법의 예는 *Amazon S3 API 참조*의 [Use CreateJob with an AWS SDK or CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_CreateJob_section.html)를 참조하세요.

# S3 Batch Operations를 사용하여 S3 Object Lock 법적 보존 해제
<a name="batch-ops-legal-hold-off"></a>

다음 예제는 신뢰 정책을 생성하고 S3 배치 작업 및 S3 객체 잠금 구성 권한을 설정하는 이전 예제를 기반으로 합니다. 이 예제에서는 Batch Operations를 사용하여 객체에 대한 Object Lock 법적 보존을 비활성화하는 방법을 보여줍니다.

이 예제에서는 먼저 역할을 업데이트하여 `s3:PutObjectLegalHold` 권한을 부여하고, 매니페스트에서 식별된 객체의 법적 보존을 해제(제거)하는 배치 작업을 생성한 다음 보고합니다.

다음 예제를 사용하려면 *`user input placeholders`*를 사용자의 정보로 대체합니다.

## AWS CLI 사용
<a name="batch-ops-cli-object-lock-legalhold-example"></a>

다음 AWS CLI 예제에서는 Batch Operations를 사용하여 여러 객체에서 S3 Object Lock의 법적 보존을 해제하는 방법을 보여줍니다.

**Example - `s3:PutObjectLegalHold` 권한을 부여하도록 역할 업데이트**  

```
export AWS_PROFILE='aws-user'

read -d '' legal_hold_permissions <<EOF
{
    "Version": "2012-10-17"		 	 	 ,		 	 	 TCX5-2025-waiver;,
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectLegalHold"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
        }
    ]

EOF

aws iam put-role-policy --role-name batch_operations-objectlock --policy-name legal-hold-permissions --policy-document "${legal_hold_permissions}"
```

**Example - 법적 보존 해제**  
다음 예제에서는 법적 보존을 해제합니다.  

```
export AWS_PROFILE='aws-user'
export AWS_DEFAULT_REGION='us-west-2'
export ACCOUNT_ID=123456789012
export ROLE_ARN='arn:aws:iam::123456789012:role/batch_operations-objectlock'

read -d '' OPERATION <<EOF
{
  "S3PutObjectLegalHold": {
    "LegalHold": {
      "Status":"OFF"
    }
  }
}
EOF

read -d '' MANIFEST <<EOF
{
  "Spec": {
    "Format": "S3BatchOperations_CSV_20180820",
    "Fields": [
      "Bucket",
      "Key"
    ]
  },
  "Location": {
    "ObjectArn": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/legalhold-object-manifest.csv",
    "ETag": "Your-manifest-ETag"
  }
}
EOF

read -d '' REPORT <<EOF
{
  "Bucket": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket",
  "Format": "Report_CSV_20180820",
  "Enabled": true,
  "Prefix": "reports/legalhold-objects-batch_operations",
  "ReportScope": "AllTasks"
}
EOF

aws \
    s3control create-job \
    --account-id "${ACCOUNT_ID}" \
    --manifest "${MANIFEST//$'\n'}" \
    --operation "${OPERATION//$'\n'/}" \
    --report "${REPORT//$'\n'}" \
    --priority 10 \
    --role-arn "${ROLE_ARN}" \
    --client-request-token "$(uuidgen)" \
    --region "${AWS_DEFAULT_REGION}" \
    --description "Turn off legal hold";
```

## Java용 AWS SDK 사용
<a name="batch-ops-examples-java-object-lock-legalhold"></a>

AWS SDK for Java로 S3 Batch Operations를 사용하여 S3 Object Lock 법적 보존을 해제하는 방법의 예는 *Amazon S3 API 참조*의 [Use CreateJob with an AWS SDK or CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_CreateJob_section.html)를 참조하세요.

# 자습서: S3 Batch Operations를 통해 비디오 일괄 트랜스코딩
<a name="tutorial-s3-batchops-lambda-mediaconvert-video"></a>

비디오 소비자는 모든 모양, 크기 및 빈티지의 디바이스를 사용하여 미디어 콘텐츠를 즐길 수 있습니다. 이 다수의 디바이스는 콘텐츠 제작자 및 배포자에게 어려운 과제를 제기합니다. 비디오는 하나의 크기에 맞는 형식이 아닌 다양한 크기, 형식 및 비트레이트로 변환되어야 합니다. 이 변환 작업은 변환해야 하는 비디오가 많을 때 더욱 까다롭습니다.

AWS에서는 다음을 수행하는 확장 가능한 분산 아키텍처를 빌드하는 방법을 제공합니다.
+ 입력 비디오 수집
+ 다양한 장치에서 재생할 수 있도록 비디오를 처리
+ 트랜스코딩된 미디어 파일 저장
+ 수요를 충족하기 위해 출력 미디어 파일 제공

Amazon S3에 저장된 광범위한 비디오 리포지토리가 있는 경우, 이러한 비디오를 소스 형식에서 (특정 비디오 플레이어 또는 디바이스에 필요한 크기, 해상도 및 형식의) 여러 파일 형식으로 트랜스코딩할 수 있습니다. 특히, [S3 배치 작업은](https://aws.amazon.com/s3/features/batch-operations) S3 소스 버킷의 기존 입력 비디오에 대한 AWS Lambda 함수를 호출할 수 있는 솔루션을 제공합니다. 그런 다음 Lambda 함수는 [AWS Elemental MediaConvert](https://aws.amazon.com/mediaconvert/)를 호출하여 대규모 비디오 트랜스코딩 작업을 수행할 수 있습니다. 변환된 출력 미디어 파일은 S3 대상 버킷에 저장됩니다.

![\[일괄 트랜스코딩 워크플로 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/images/batchops-example-image-global.png)


**목표**  
이 자습서에서는 S3 소스 버킷에 저장된 비디오의 일괄 트랜스코딩을 위해 Lambda 함수를 호출하도록 S3 배치 작업을 설정하는 방법에 대해 알아봅니다. Lambda 함수는 MediaConvert를 호출하여 비디오를 트랜스코딩합니다. S3 소스 버킷의 각 비디오에 대한 출력은 다음과 같습니다.
+ 다양한 크기의 디바이스 및 다양한 대역폭에서 재생할 수 있는 적응형 비트레이트 스트림인 [HLS(HTTP Live Streaming)](http://wikipedia.org/wiki/HTTP_Live_Streaming)
+ MP4 비디오 파일
+ 간격에 따라 수집된 썸네일 이미지

**Topics**
+ [

## 사전 조건
](#batchops-s3-prerequisites)
+ [

## 1단계: 출력 미디어 파일용 S3 버킷 생성
](#batchops-s3-step1)
+ [

## 2단계: MediaConvert용 IAM 역할 생성
](#batchops-s3-step2)
+ [

## 3단계: Lambda 함수용 IAM 역할 생성
](#batchops-s3-step3)
+ [

## 4단계: 비디오 트랜스코딩용 Lambda 함수 생성
](#batchops-s3-step4)
+ [

## 5단계: S3 소스 버킷용 Amazon S3 인벤토리 구성
](#batchops-s3-step5)
+ [

## 6단계: S3 배치 작업용 IAM 역할 생성
](#batchops-s3-step6)
+ [

## 7단계: S3 배치 작업 생성 및 실행
](#batchops-s3-step7)
+ [

## 8단계: S3 대상 버킷의 출력 미디어 파일 확인
](#batchops-s3-step8)
+ [

## 9단계: 정리
](#batchops-s3-step9)
+ [

## 다음 단계
](#batchops-s3-next-steps)

## 사전 조건
<a name="batchops-s3-prerequisites"></a>

이 자습서를 시작하려면 트랜스코딩할 비디오가 이미 저장된 Amazon S3 소스 버킷(예: `amzn-s3-demo-source-bucket`)이 있어야 합니다.

원하는 경우 버킷에 다른 이름을 지정할 수 있습니다. Amazon S3 버킷 이름 지정 규칙에 대한 자세한 내용은 [범용 버킷 이름 지정 규칙](bucketnamingrules.md) 섹션을 참조하십시오.

S3 소스 버킷의 경우 **이 버킷에 대한 퍼블릭 액세스 차단 설정**과 관련된 설정을 기본값으로 유지합니다***모든* 퍼블릭 액세스 차단**이 사용 설정됨). 자세한 내용은 [범용 버킷 생성](create-bucket-overview.md) 섹션을 참조하세요.

S3 소스 버킷에 비디오를 업로드하는 방법에 대한 자세한 내용은 [객체 업로드](upload-objects.md) 단원을 참조하십시오. S3에 많은 대용량 비디오파일을 업로드하는 경우 [Amazon S3 Transfer Acceleration](https://aws.amazon.com/s3/transfer-acceleration)을 사용하여 빠르고 안전한 파일 전송을 구성할 수 있습니다. Transfer Acceleration을 사용하면 S3 버킷에 비디오를 빠르게 업로드하여 대용량의 비디오를 장거리 전송할 수 있습니다. 자세한 내용은 [Amazon S3 Transfer Acceleration을 사용하여 빠르고 안전한 파일 전송 구성](transfer-acceleration.md) 섹션을 참조하세요.

## 1단계: 출력 미디어 파일용 S3 버킷 생성
<a name="batchops-s3-step1"></a>

이 단계에서는 변환된 출력 미디어 파일을 저장할 S3 대상 버킷을 생성합니다. 또한 교차 오리진 리소스 공유(CORS) 구성을 생성하여 S3 대상 버킷에 저장된 트랜스코딩된 미디어 파일에 대한 교차 오리진 액세스를 허용합니다.

**Topics**
+ [

### 출력 미디어 파일용 버킷 생성
](#batchops-s3-step1-create-bucket)
+ [

### S3 출력 버킷에 CORS 구성 추가
](#batchops-s3-step1-cors)

### 출력 미디어 파일용 버킷 생성
<a name="batchops-s3-step1-create-bucket"></a>



1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. **버킷 이름**에 버킷 이름을 입력합니다(예: `amzn-s3-demo-destination-bucket1`).

1. **리전(Region)**에서 버킷이 속할 AWS 리전을 선택합니다.

1. 출력 미디어 파일에 대한 퍼블릭 액세스를 보장하려면 **이 버킷에 대한 퍼블릭 액세스 차단 설정(Block Public Access settings for this bucket)**에서 ***모든* 퍼블릭 액세스 차단(Block all public access)**을 선택 취소합니다.
**주의**  
이 단계를 완료하기 전에 [Amazon S3 스토리지에 대한 퍼블릭 액세스 차단](access-control-block-public-access.md)을 검토하여 퍼블릭 액세스 허용과 관련된 위험을 이해하고 이에 동의하는지 확인하십시오. 퍼블릭 액세스 차단 설정을 해제하여 버킷을 퍼블릭으로 만들면 인터넷상의 모든 사용자가 버킷에 액세스할 수 있습니다. 버킷에 대한 모든 퍼블릭 액세스를 차단하는 것이 좋습니다.  
퍼블릭 액세스 차단 설정을 지우지 않으려면 Amazon CloudFront를 사용하여 트랜스코딩된 미디어 파일을 뷰어(최종 사용자)에게 전달할 수 있습니다. 자세한 내용은 [자습서: Amazon S3, Amazon CloudFront 및 Amazon Route 53로 온디맨드 스트리밍 비디오 호스팅](tutorial-s3-cloudfront-route53-video-streaming.md) 섹션을 참조하세요.

1. **현재 설정으로 인해 이 버킷과 그 안에 포함된 객체가 퍼블릭 상태가 될 수 있음을 알고 있습니다(I acknowledge that the current settings might result in this bucket and the objects within becoming public)** 옆의 확인란을 선택합니다.

1. 나머지 설정은 기본값으로 유지합니다.

1. **버킷 생성**을 선택합니다.

### S3 출력 버킷에 CORS 구성 추가
<a name="batchops-s3-step1-cors"></a>

JSON CORS 구성은 하나의 도메인에서 로드되는 클라이언트 웹 애플리케이션(여기서는 비디오 플레이어)이 다른 도메인에 있는 트랜스코딩된 출력 미디어 파일을 재생하는 방법을 정의합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷** 목록에서 이전에 생성한 버킷의 이름을 선택합니다(예: `amzn-s3-demo-destination-bucket1`).

1. **권한** 탭을 선택합니다.

1. **CORS(Cross-Origin 리소스 공유)** 섹션에서 **편집**을 선택합니다.

1. CORS 구성 텍스트 상자에서 다음의 CORS 구성을 복사하여 붙여 넣습니다.

   CORS 구성은 JSON 형식이어야 합니다. 이 예제에서 `AllowedOrigins` 속성은 와일드카드 문자(`*`)를 사용하여 모든 오리진을 지정합니다. 특정 오리진을 알고 있는 경우 `AllowedOrigins` 속성을 특정 플레이어 URL로 제한할 수 있습니다. 이 속성과 다른 속성의 구성에 대한 자세한 내용은 [CORS 구성의 요소](ManageCorsUsing.md)을(를) 참조하십시오.

   ```
   [
       {
           "AllowedOrigins": [
               "*"
           ],
           "AllowedMethods": [
               "GET"
           ],
           "AllowedHeaders": [
               "*"
           ],
           "ExposeHeaders": []
   
       }
   ]
   ```

1. **변경 사항 저장**을 선택합니다.

## 2단계: MediaConvert용 IAM 역할 생성
<a name="batchops-s3-step2"></a>

AWS Elemental MediaConvert를 사용하여 S3 버킷에 저장된 입력 비디오를 트랜스코딩하려면 S3 소스 및 대상 버킷에서/으로 파일을 읽고 쓸 수 있는 MediaConvert 권한을 부여하는 AWS Identity and Access Management(IAM) 서비스 역할이 있어야 합니다. 트랜스코딩 작업을 실행하면 MediaConvert 콘솔에서 이 역할을 사용합니다.

**MediaConvert용 IAM 역할 생성**

1. 선택한 역할 이름을 사용하여 IAM 역할을 생성합니다(예: **tutorial-mediaconvert-role**). 이 역할을 생성하려면 *AWS Elemental MediaConvert 사용 설명서*의 [IAM(콘솔)에서 MediaConvert 역할 생성](https://docs.aws.amazon.com/mediaconvert/latest/ug/creating-the-iam-role-in-iam.html)에 있는 절차를 따릅니다.

1. MediaConvert에 대한 IAM 역할을 생성한 후 **역할(Roles)** 목록에서 생성한 MediaConvert에 대한 역할 이름을 선택합니다(예: **tutorial-mediaconvert-role**).

1. **요약** 페이지에서, `arn:aws:iam::`으로 시작되는 **역할 ARN**을 복사하여 나중에 사용할 수 있도록 해당 ARN을 저장합니다.

   ARN에 대한 자세한 내용은 *AWS 일반 참조*의 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)을 참조하십시오.

## 3단계: Lambda 함수용 IAM 역할 생성
<a name="batchops-s3-step3"></a>

MediaConvert 및 S3 Batch Operations를 사용하여 비디오를 일괄 트랜스코딩하려면 비디오를 변환하기 위해 이러한 두 서비스를 연결하는 Lambda 함수가 있어야 합니다. 이 Lambda 함수에는 MediaConvert 및 S3 Batch Operations에 액세스할 수 있는 Lambda 함수 권한을 부여하는 IAM 역할이 있어야 합니다.

**Topics**
+ [

### Lambda 함수용 IAM 역할 생성
](#batchops-s3-step3-role)
+ [

### Lambda 함수의 IAM 역할에 대한 인라인 정책 포함
](#batchops-s3-step3-inline-policy)

### Lambda 함수용 IAM 역할 생성
<a name="batchops-s3-step3-role"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택한 다음, **역할 생성**을 선택합니다.

1. **AWS 서비스** 역할 유형을 선택한 후 **일반적인 사용 사례**에서 **Lambda**를 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **필터 정책**에 **AWSLambdaBasicExecutionRole**을(를) 입력합니다. 관리형 정책 **AWSLambdaBasicExecutionRole**을 이 역할에 연결하여 Amazon CloudWatch Logs에 쓰기 권한을 부여하려면, **AWSLambdaBasicExecutionRole** 옆의 확인란을 선택합니다.

1. **다음**을 선택합니다.

1. **역할 이름**에 **tutorial-lambda-transcode-role**을 입력합니다.

1. (선택 사항) 관리형 정책에 태그를 추가합니다.

1. **역할 생성**을 선택합니다.

### Lambda 함수의 IAM 역할에 대한 인라인 정책 포함
<a name="batchops-s3-step3-inline-policy"></a>

Lambda 함수를 실행하는 데 필요한 MediaConvert 리소스에 권한을 부여하려면 인라인 정책을 사용해야 합니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택합니다.

1. **역할** 목록에서, Lambda 함수에 대해 이전에 생성한 IAM 역할의 이름을 선택합니다(예: **tutorial-lambda-transcode-role**).

1. **권한** 탭을 선택합니다.

1. **인라인 정책 추가**를 선택합니다.

1. **JSON** 탭을 선택한 후 다음 JSON 정책을 붙여 넣습니다.

   JSON 정책에서 `Resource`의 예제 ARN 값을 [2단계](#batchops-s3-step2)에서 생성한 MediaConvert에 대한 IAM 역할의 역할 ARN으로 바꿉니다(예: **tutorial-mediaconvert-role**).

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:PutLogEvents"
               ],
               "Resource": "*",
               "Effect": "Allow",
               "Sid": "Logging"
           },
           {
               "Action": [
                   "iam:PassRole"
               ],
               "Resource": [
                   "arn:aws:iam::111122223333:role/tutorial-mediaconvert-role"
               ],
               "Effect": "Allow",
               "Sid": "PassRole"
           },
           {
               "Action": [
                   "mediaconvert:*"
               ],
               "Resource": [
                   "*"
               ],
               "Effect": "Allow",
               "Sid": "MediaConvertService"
           },
           {
               "Action": [
                   "s3:*"
               ],
               "Resource": [
                   "*"
               ],
               "Effect": "Allow",
               "Sid": "S3Service"
           }
       ]
   }
   ```

------

1. **정책 검토**를 선택합니다.

1. **이름**에서 **tutorial-lambda-policy**을 입력합니다.

1. **정책 생성**을 선택합니다.

   인라인 정책을 생성하면 이 정책이 Lambda 함수의 IAM 역할에 자동으로 포함됩니다.

## 4단계: 비디오 트랜스코딩용 Lambda 함수 생성
<a name="batchops-s3-step4"></a>

자습서의 이 섹션에서는 S3 Batch Operations 및 MediaConvert와 통합하기 위해 SDK for Python을 사용하여 Lambda 함수를 구축해야 합니다. S3 소스 버킷에 이미 저장된 비디오를 트랜스코딩하려면 S3 소스 버킷의 각 비디오에 대해 Lambda 함수를 직접 호출하는 S3 Batch Operations 작업을 실행합니다. 그런 다음 Lambda 함수는 각 비디오에 대한 트랜스코딩 작업을 MediaConvert에 제출합니다.

**Topics**
+ [

### Lambda 함수 코드 작성 및 배포 패키지 생성
](#batchops-s3-step4-write-function)
+ [

### 실행 역할을 사용하여 Lambda 함수 생성(콘솔)
](#batchops-s3-step4-create-function)
+ [

### .zip 파일 아카이브를 사용하여 Lambda 함수를 배포하고 Lambda 함수 구성(콘솔)
](#batchops-s3-step4-deploy-function)

### Lambda 함수 코드 작성 및 배포 패키지 생성
<a name="batchops-s3-step4-write-function"></a>

1. 로컬 시스템에 `batch-transcode`이라는 폴더를 생성하십시오.

1. `batch-transcode` 폴더에서 JSON 작업 설정을 사용하여 파일을 생성합니다. 예를 들어 이 섹션에 제공된 설정을 사용하고 파일 이름을 `job.json`으로 지정할 수 있습니다.

   `job.json` 파일이 지정하는 것은 다음과 같습니다.
   + 트랜스코딩할 파일
   + 입력 비디오를 트랜스코딩하는 방법
   + 생성하려는 출력 미디어 파일
   + 트랜스코딩된 파일에 지정할 이름
   + 트랜스코딩된 파일을 저장할 위치
   + 적용할 고급 기능 등

   이 자습서에서는 다음 `job.json` 파일을 사용하여 S3 소스 버킷의 각 비디오에 대해 다음과 같은 출력을 생성합니다.
   + 다양한 크기의 디바이스 및 다양한 대역폭에서 재생할 수 있는 적응형 비트레이트 스트림인 HLS(HTTP Live Streaming)
   + MP4 비디오 파일
   + 간격에 따라 수집된 썸네일 이미지

   이 예제 `job.json` 파일은 품질 정의 가변 비트레이트(QVCR)를 사용하여 비디오 품질을 최적화합니다. HLS 출력은 Apple과 호환됩니다(비디오에서 혼합되지 않은 오디오, 6초의 세그먼트 지속 및 자동 QVBR을 통한 최적화된 비디오 품질).

   여기에 제공된 예제 설정을 사용하지 않으려는 경우 사용 사례를 기반으로 `job.json` 사양을 생성할 수 있습니다. 출력 간에 일관성을 유지하려면 입력 파일의 비디오 및 오디오 구성이 비슷한지 확인합니다. 다른 비디오 및 오디오 구성을 가진 입력 파일에 대해 별도의 자동화(고유 `job.json` 설정)를 생성할 수 있습니다. 자세한 내용은 *AWS Elemental MediaConvert 사용 설명서*의 [JSON의 예제 AWS Elemental MediaConvert 작업 설정](https://docs.aws.amazon.com/mediaconvert/latest/ug/example-job-settings.html)을 참조하십시오.

   ```
   {
     "OutputGroups": [
       {
         "CustomName": "HLS",
         "Name": "Apple HLS",
         "Outputs": [
           {
             "ContainerSettings": {
               "Container": "M3U8",
               "M3u8Settings": {
                 "AudioFramesPerPes": 4,
                 "PcrControl": "PCR_EVERY_PES_PACKET",
                 "PmtPid": 480,
                 "PrivateMetadataPid": 503,
                 "ProgramNumber": 1,
                 "PatInterval": 0,
                 "PmtInterval": 0,
                 "TimedMetadata": "NONE",
                 "VideoPid": 481,
                 "AudioPids": [
                   482,
                   483,
                   484,
                   485,
                   486,
                   487,
                   488,
                   489,
                   490,
                   491,
                   492
                 ]
               }
             },
             "VideoDescription": {
               "Width": 640,
               "ScalingBehavior": "DEFAULT",
               "Height": 360,
               "TimecodeInsertion": "DISABLED",
               "AntiAlias": "ENABLED",
               "Sharpness": 50,
               "CodecSettings": {
                 "Codec": "H_264",
                 "H264Settings": {
                   "InterlaceMode": "PROGRESSIVE",
                   "NumberReferenceFrames": 3,
                   "Syntax": "DEFAULT",
                   "Softness": 0,
                   "GopClosedCadence": 1,
                   "GopSize": 2,
                   "Slices": 1,
                   "GopBReference": "DISABLED",
                   "MaxBitrate": 1200000,
                   "SlowPal": "DISABLED",
                   "SpatialAdaptiveQuantization": "ENABLED",
                   "TemporalAdaptiveQuantization": "ENABLED",
                   "FlickerAdaptiveQuantization": "DISABLED",
                   "EntropyEncoding": "CABAC",
                   "FramerateControl": "INITIALIZE_FROM_SOURCE",
                   "RateControlMode": "QVBR",
                   "CodecProfile": "MAIN",
                   "Telecine": "NONE",
                   "MinIInterval": 0,
                   "AdaptiveQuantization": "HIGH",
                   "CodecLevel": "AUTO",
                   "FieldEncoding": "PAFF",
                   "SceneChangeDetect": "TRANSITION_DETECTION",
                   "QualityTuningLevel": "SINGLE_PASS_HQ",
                   "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                   "UnregisteredSeiTimecode": "DISABLED",
                   "GopSizeUnits": "SECONDS",
                   "ParControl": "INITIALIZE_FROM_SOURCE",
                   "NumberBFramesBetweenReferenceFrames": 2,
                   "RepeatPps": "DISABLED"
                 }
               },
               "AfdSignaling": "NONE",
               "DropFrameTimecode": "ENABLED",
               "RespondToAfd": "NONE",
               "ColorMetadata": "INSERT"
             },
             "OutputSettings": {
               "HlsSettings": {
                 "AudioGroupId": "program_audio",
                 "AudioRenditionSets": "program_audio",
                 "SegmentModifier": "$dt$",
                 "IFrameOnlyManifest": "EXCLUDE"
               }
             },
             "NameModifier": "_360"
           },
           {
             "ContainerSettings": {
               "Container": "M3U8",
               "M3u8Settings": {
                 "AudioFramesPerPes": 4,
                 "PcrControl": "PCR_EVERY_PES_PACKET",
                 "PmtPid": 480,
                 "PrivateMetadataPid": 503,
                 "ProgramNumber": 1,
                 "PatInterval": 0,
                 "PmtInterval": 0,
                 "TimedMetadata": "NONE",
                 "TimedMetadataPid": 502,
                 "VideoPid": 481,
                 "AudioPids": [
                   482,
                   483,
                   484,
                   485,
                   486,
                   487,
                   488,
                   489,
                   490,
                   491,
                   492
                 ]
               }
             },
             "VideoDescription": {
               "Width": 960,
               "ScalingBehavior": "DEFAULT",
               "Height": 540,
               "TimecodeInsertion": "DISABLED",
               "AntiAlias": "ENABLED",
               "Sharpness": 50,
               "CodecSettings": {
                 "Codec": "H_264",
                 "H264Settings": {
                   "InterlaceMode": "PROGRESSIVE",
                   "NumberReferenceFrames": 3,
                   "Syntax": "DEFAULT",
                   "Softness": 0,
                   "GopClosedCadence": 1,
                   "GopSize": 2,
                   "Slices": 1,
                   "GopBReference": "DISABLED",
                   "MaxBitrate": 3500000,
                   "SlowPal": "DISABLED",
                   "SpatialAdaptiveQuantization": "ENABLED",
                   "TemporalAdaptiveQuantization": "ENABLED",
                   "FlickerAdaptiveQuantization": "DISABLED",
                   "EntropyEncoding": "CABAC",
                   "FramerateControl": "INITIALIZE_FROM_SOURCE",
                   "RateControlMode": "QVBR",
                   "CodecProfile": "MAIN",
                   "Telecine": "NONE",
                   "MinIInterval": 0,
                   "AdaptiveQuantization": "HIGH",
                   "CodecLevel": "AUTO",
                   "FieldEncoding": "PAFF",
                   "SceneChangeDetect": "TRANSITION_DETECTION",
                   "QualityTuningLevel": "SINGLE_PASS_HQ",
                   "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                   "UnregisteredSeiTimecode": "DISABLED",
                   "GopSizeUnits": "SECONDS",
                   "ParControl": "INITIALIZE_FROM_SOURCE",
                   "NumberBFramesBetweenReferenceFrames": 2,
                   "RepeatPps": "DISABLED"
                 }
               },
               "AfdSignaling": "NONE",
               "DropFrameTimecode": "ENABLED",
               "RespondToAfd": "NONE",
               "ColorMetadata": "INSERT"
             },
             "OutputSettings": {
               "HlsSettings": {
                 "AudioGroupId": "program_audio",
                 "AudioRenditionSets": "program_audio",
                 "SegmentModifier": "$dt$",
                 "IFrameOnlyManifest": "EXCLUDE"
               }
             },
             "NameModifier": "_540"
           },
           {
             "ContainerSettings": {
               "Container": "M3U8",
               "M3u8Settings": {
                 "AudioFramesPerPes": 4,
                 "PcrControl": "PCR_EVERY_PES_PACKET",
                 "PmtPid": 480,
                 "PrivateMetadataPid": 503,
                 "ProgramNumber": 1,
                 "PatInterval": 0,
                 "PmtInterval": 0,
                 "TimedMetadata": "NONE",
                 "VideoPid": 481,
                 "AudioPids": [
                   482,
                   483,
                   484,
                   485,
                   486,
                   487,
                   488,
                   489,
                   490,
                   491,
                   492
                 ]
               }
             },
             "VideoDescription": {
               "Width": 1280,
               "ScalingBehavior": "DEFAULT",
               "Height": 720,
               "TimecodeInsertion": "DISABLED",
               "AntiAlias": "ENABLED",
               "Sharpness": 50,
               "CodecSettings": {
                 "Codec": "H_264",
                 "H264Settings": {
                   "InterlaceMode": "PROGRESSIVE",
                   "NumberReferenceFrames": 3,
                   "Syntax": "DEFAULT",
                   "Softness": 0,
                   "GopClosedCadence": 1,
                   "GopSize": 2,
                   "Slices": 1,
                   "GopBReference": "DISABLED",
                   "MaxBitrate": 5000000,
                   "SlowPal": "DISABLED",
                   "SpatialAdaptiveQuantization": "ENABLED",
                   "TemporalAdaptiveQuantization": "ENABLED",
                   "FlickerAdaptiveQuantization": "DISABLED",
                   "EntropyEncoding": "CABAC",
                   "FramerateControl": "INITIALIZE_FROM_SOURCE",
                   "RateControlMode": "QVBR",
                   "CodecProfile": "MAIN",
                   "Telecine": "NONE",
                   "MinIInterval": 0,
                   "AdaptiveQuantization": "HIGH",
                   "CodecLevel": "AUTO",
                   "FieldEncoding": "PAFF",
                   "SceneChangeDetect": "TRANSITION_DETECTION",
                   "QualityTuningLevel": "SINGLE_PASS_HQ",
                   "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                   "UnregisteredSeiTimecode": "DISABLED",
                   "GopSizeUnits": "SECONDS",
                   "ParControl": "INITIALIZE_FROM_SOURCE",
                   "NumberBFramesBetweenReferenceFrames": 2,
                   "RepeatPps": "DISABLED"
                 }
               },
               "AfdSignaling": "NONE",
               "DropFrameTimecode": "ENABLED",
               "RespondToAfd": "NONE",
               "ColorMetadata": "INSERT"
             },
             "OutputSettings": {
               "HlsSettings": {
                 "AudioGroupId": "program_audio",
                 "AudioRenditionSets": "program_audio",
                 "SegmentModifier": "$dt$",
                 "IFrameOnlyManifest": "EXCLUDE"
               }
             },
             "NameModifier": "_720"
           },
           {
             "ContainerSettings": {
               "Container": "M3U8",
               "M3u8Settings": {}
             },
             "AudioDescriptions": [
               {
                 "AudioSourceName": "Audio Selector 1",
                 "CodecSettings": {
                   "Codec": "AAC",
                   "AacSettings": {
                     "Bitrate": 96000,
                     "CodingMode": "CODING_MODE_2_0",
                     "SampleRate": 48000
                   }
                 }
               }
             ],
             "OutputSettings": {
               "HlsSettings": {
                 "AudioGroupId": "program_audio",
                 "AudioTrackType": "ALTERNATE_AUDIO_AUTO_SELECT_DEFAULT"
               }
             },
             "NameModifier": "_audio"
           }
         ],
         "OutputGroupSettings": {
           "Type": "HLS_GROUP_SETTINGS",
           "HlsGroupSettings": {
             "ManifestDurationFormat": "INTEGER",
             "SegmentLength": 6,
             "TimedMetadataId3Period": 10,
             "CaptionLanguageSetting": "OMIT",
             "Destination": "s3://EXAMPLE-BUCKET/HLS/",
             "DestinationSettings": {
               "S3Settings": {
                 "AccessControl": {
                   "CannedAcl": "PUBLIC_READ"
                 }
               }
             },
             "TimedMetadataId3Frame": "PRIV",
             "CodecSpecification": "RFC_4281",
             "OutputSelection": "MANIFESTS_AND_SEGMENTS",
             "ProgramDateTimePeriod": 600,
             "MinSegmentLength": 0,
             "DirectoryStructure": "SINGLE_DIRECTORY",
             "ProgramDateTime": "EXCLUDE",
             "SegmentControl": "SEGMENTED_FILES",
             "ManifestCompression": "NONE",
             "ClientCache": "ENABLED",
             "StreamInfResolution": "INCLUDE"
           }
         }
       },
       {
         "CustomName": "MP4",
         "Name": "File Group",
         "Outputs": [
           {
             "ContainerSettings": {
               "Container": "MP4",
               "Mp4Settings": {
                 "CslgAtom": "INCLUDE",
                 "FreeSpaceBox": "EXCLUDE",
                 "MoovPlacement": "PROGRESSIVE_DOWNLOAD"
               }
             },
             "VideoDescription": {
               "Width": 1280,
               "ScalingBehavior": "DEFAULT",
               "Height": 720,
               "TimecodeInsertion": "DISABLED",
               "AntiAlias": "ENABLED",
               "Sharpness": 100,
               "CodecSettings": {
                 "Codec": "H_264",
                 "H264Settings": {
                   "InterlaceMode": "PROGRESSIVE",
                   "ParNumerator": 1,
                   "NumberReferenceFrames": 3,
                   "Syntax": "DEFAULT",
                   "Softness": 0,
                   "GopClosedCadence": 1,
                   "HrdBufferInitialFillPercentage": 90,
                   "GopSize": 2,
                   "Slices": 2,
                   "GopBReference": "ENABLED",
                   "HrdBufferSize": 10000000,
                   "MaxBitrate": 5000000,
                   "ParDenominator": 1,
                   "EntropyEncoding": "CABAC",
                   "RateControlMode": "QVBR",
                   "CodecProfile": "HIGH",
                   "MinIInterval": 0,
                   "AdaptiveQuantization": "AUTO",
                   "CodecLevel": "AUTO",
                   "FieldEncoding": "PAFF",
                   "SceneChangeDetect": "ENABLED",
                   "QualityTuningLevel": "SINGLE_PASS_HQ",
                   "UnregisteredSeiTimecode": "DISABLED",
                   "GopSizeUnits": "SECONDS",
                   "ParControl": "SPECIFIED",
                   "NumberBFramesBetweenReferenceFrames": 3,
                   "RepeatPps": "DISABLED",
                   "DynamicSubGop": "ADAPTIVE"
                 }
               },
               "AfdSignaling": "NONE",
               "DropFrameTimecode": "ENABLED",
               "RespondToAfd": "NONE",
               "ColorMetadata": "INSERT"
             },
             "AudioDescriptions": [
               {
                 "AudioTypeControl": "FOLLOW_INPUT",
                 "AudioSourceName": "Audio Selector 1",
                 "CodecSettings": {
                   "Codec": "AAC",
                   "AacSettings": {
                     "AudioDescriptionBroadcasterMix": "NORMAL",
                     "Bitrate": 160000,
                     "RateControlMode": "CBR",
                     "CodecProfile": "LC",
                     "CodingMode": "CODING_MODE_2_0",
                     "RawFormat": "NONE",
                     "SampleRate": 48000,
                     "Specification": "MPEG4"
                   }
                 },
                 "LanguageCodeControl": "FOLLOW_INPUT",
                 "AudioType": 0
               }
             ]
           }
         ],
         "OutputGroupSettings": {
           "Type": "FILE_GROUP_SETTINGS",
           "FileGroupSettings": {
             "Destination": "s3://EXAMPLE-BUCKET/MP4/",
             "DestinationSettings": {
               "S3Settings": {
                 "AccessControl": {
                   "CannedAcl": "PUBLIC_READ"
                 }
               }
             }
           }
         }
       },
       {
         "CustomName": "Thumbnails",
         "Name": "File Group",
         "Outputs": [
           {
             "ContainerSettings": {
               "Container": "RAW"
             },
             "VideoDescription": {
               "Width": 1280,
               "ScalingBehavior": "DEFAULT",
               "Height": 720,
               "TimecodeInsertion": "DISABLED",
               "AntiAlias": "ENABLED",
               "Sharpness": 50,
               "CodecSettings": {
                 "Codec": "FRAME_CAPTURE",
                 "FrameCaptureSettings": {
                   "FramerateNumerator": 1,
                   "FramerateDenominator": 5,
                   "MaxCaptures": 500,
                   "Quality": 80
                 }
               },
               "AfdSignaling": "NONE",
               "DropFrameTimecode": "ENABLED",
               "RespondToAfd": "NONE",
               "ColorMetadata": "INSERT"
             }
           }
         ],
         "OutputGroupSettings": {
           "Type": "FILE_GROUP_SETTINGS",
           "FileGroupSettings": {
             "Destination": "s3://EXAMPLE-BUCKET/Thumbnails/",
             "DestinationSettings": {
               "S3Settings": {
                 "AccessControl": {
                   "CannedAcl": "PUBLIC_READ"
                 }
               }
             }
           }
         }
       }
     ],
     "AdAvailOffset": 0,
     "Inputs": [
       {
         "AudioSelectors": {
           "Audio Selector 1": {
             "Offset": 0,
             "DefaultSelection": "DEFAULT",
             "ProgramSelection": 1
           }
         },
         "VideoSelector": {
           "ColorSpace": "FOLLOW"
         },
         "FilterEnable": "AUTO",
         "PsiControl": "USE_PSI",
         "FilterStrength": 0,
         "DeblockFilter": "DISABLED",
         "DenoiseFilter": "DISABLED",
         "TimecodeSource": "EMBEDDED",
         "FileInput": "s3://EXAMPLE-INPUT-BUCKET/input.mp4"
       }
     ]
   }
   ```

1. `batch-transcode` 폴더에서 Lambda 함수를 사용하여 파일을 생성합니다. 다음 Python 예제를 사용하여 `convert.py` 파일 이름을 지정할 수 있습니다.

   S3 Batch Operations는 특정 태스크 데이터를 Lambda 함수로 전송하고 결과 데이터를 다시 요구합니다. Lambda 함수에 대한 요청 및 응답 예제, 응답 및 결과 코드에 대한 정보, S3 Batch Operations의 Lambda 함수 예제는 [AWS Lambda 함수 호출](batch-ops-invoke-lambda.md)을(를) 참조하십시오.

   ```
   import json
   import os
   from urllib.parse import urlparse
   import uuid
   import boto3
   
   """
   When you run an S3 Batch Operations job, your job  
   invokes this Lambda function. Specifically, the Lambda function is 
   invoked on each video object listed in the manifest that you specify 
   for the S3 Batch Operations job in Step 5.  
   
   Input parameter "event": The S3 Batch Operations event as a request
                            for the Lambda function.
   
   Input parameter "context": Context about the event.
   
   Output: A result structure that Amazon S3 uses to interpret the result 
           of the operation. It is a job response returned back to S3 Batch Operations.
   """
   def handler(event, context):
   
       invocation_schema_version = event['invocationSchemaVersion']
       invocation_id = event['invocationId']
       task_id = event['tasks'][0]['taskId']
   
       source_s3_key = event['tasks'][0]['s3Key']
       source_s3_bucket = event['tasks'][0]['s3BucketArn'].split(':::')[-1]
       source_s3 = 's3://' + source_s3_bucket + '/' + source_s3_key
   
       result_list = []
       result_code = 'Succeeded'
       result_string = 'The input video object was converted successfully.'
   
       # The type of output group determines which media players can play 
       # the files transcoded by MediaConvert.
       # For more information, see [Creating outputs with AWS Elemental MediaConvert](https://docs.aws.amazon.com/mediaconvert/latest/ug/creating-streaming-and-file-outputs.html).
       output_group_type_dict = {
           'HLS_GROUP_SETTINGS': 'HlsGroupSettings',
           'FILE_GROUP_SETTINGS': 'FileGroupSettings',
           'CMAF_GROUP_SETTINGS': 'CmafGroupSettings',
           'DASH_ISO_GROUP_SETTINGS': 'DashIsoGroupSettings',
           'MS_SMOOTH_GROUP_SETTINGS': 'MsSmoothGroupSettings'
       }
   
       try:
           job_name = 'Default'
           with open('job.json') as file:
               job_settings = json.load(file)
   
           job_settings['Inputs'][0]['FileInput'] = source_s3
   
           # The path of each output video is constructed based on the values of 
           # the attributes in each object of OutputGroups in the job.json file. 
           destination_s3 = 's3://{0}/{1}/{2}' \
               .format(os.environ['amzn-s3-demo-destination-bucket'],
                       os.path.splitext(os.path.basename(source_s3_key))[0],
                       os.path.splitext(os.path.basename(job_name))[0])
   
           for output_group in job_settings['OutputGroups']:
               output_group_type = output_group['OutputGroupSettings']['Type']
               if output_group_type in output_group_type_dict.keys():
                   output_group_type = output_group_type_dict[output_group_type]
                   output_group['OutputGroupSettings'][output_group_type]['Destination'] = \
                       "{0}{1}".format(destination_s3,
                                       urlparse(output_group['OutputGroupSettings'][output_group_type]['Destination']).path)
               else:
                   raise ValueError("Exception: Unknown Output Group Type {}."
                                    .format(output_group_type))
   
           job_metadata_dict = {
               'assetID': str(uuid.uuid4()),
               'application': os.environ['Application'],
               'input': source_s3,
               'settings': job_name
           }
   
           region = os.environ['AWS_DEFAULT_REGION']
           endpoints = boto3.client('mediaconvert', region_name=region) \
               .describe_endpoints()
           client = boto3.client('mediaconvert', region_name=region, 
                                  endpoint_url=endpoints['Endpoints'][0]['Url'], 
                                  verify=False)
   
           try:
               client.create_job(Role=os.environ['MediaConvertRole'], 
                                 UserMetadata=job_metadata_dict, 
                                 Settings=job_settings)
           # You can customize error handling based on different error codes that 
           # MediaConvert can return.
           # For more information, see [MediaConvert error codes](https://docs.aws.amazon.com/mediaconvert/latest/ug/mediaconvert_error_codes.html). 
           # When the result_code is TemporaryFailure, S3 Batch Operations retries 
           # the task before the job is completed. If this is the final retry, 
           # the error message is included in the final report.
           except Exception as error:
               result_code = 'TemporaryFailure'
               raise
       
       except Exception as error:
           if result_code != 'TemporaryFailure':
               result_code = 'PermanentFailure'
           result_string = str(error)
   
       finally:
           result_list.append({
               'taskId': task_id,
               'resultCode': result_code,
               'resultString': result_string,
           })
   
       return {
           'invocationSchemaVersion': invocation_schema_version,
           'treatMissingKeyAs': 'PermanentFailure',
           'invocationId': invocation_id,
           'results': result_list
       }
   ```

1. `convert.py` 및 `job.json`이(가) 포함된 배포 패키지를 `lambda.zip`라고 하는 `.zip` 파일로 생성하려면, 로컬 터미널에서 이전에 생성한 `batch-transcode` 폴더를 열고 다음 명령을 실행합니다.

   **macOS 사용자**의 경우 다음 명령을 실행합니다.

   ```
   zip -r lambda.zip convert.py job.json                
   ```

   **Windows 사용자**의 경우 다음 명령을 실행합니다.

   ```
   powershell Compress-Archive convert.py lambda.zip
   ```

   ```
   powershell Compress-Archive -update job.json lambda.zip                
   ```

### 실행 역할을 사용하여 Lambda 함수 생성(콘솔)
<a name="batchops-s3-step4-create-function"></a>

1. 

   [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에서 AWS Lambda 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.

   1. [**함수 이름(Function name)**]에 **tutorial-lambda-convert**을 입력합니다.

   1. **런타임**에서 **Python 3.13**을 선택합니다.

1. **기본 실행 역할 변경(Change default execution role)**을 선택하고 **실행 역할(Execution role)**에서 **기존 역할 사용(Use an existing role)**을 선택합니다.

1. **기존 역할**에서, [3단계](#batchops-s3-step3)에서 Lambda 함수용으로 생성한 IAM 역할의 이름을 선택합니다(예: **tutorial-lambda-transcode-role**).

1. 나머지 설정은 기본값으로 유지합니다.

1. **함수 생성**을 선택합니다.

### .zip 파일 아카이브를 사용하여 Lambda 함수를 배포하고 Lambda 함수 구성(콘솔)
<a name="batchops-s3-step4-deploy-function"></a>

1. 생성한 Lambda 함수(예: **tutorial-lambda-convert**)에 대한 페이지의 **코드 소스** 섹션에서 **업로드 원본**을 선택한 후 **.zip 파일**을 선택합니다.

1. **업로드(Upload)**를 선택하여 로컬 `.zip` 파일을 선택합니다.

1. 이전에 생성한 `lambda.zip` 파일을 선택하고 **열기**를 선택합니다.

1. **저장**을 선택합니다.

1. **런타임 설정(Runtime settings)** 섹션에서 **편집(Edit)**을 선택합니다.

1. Lambda 함수 코드에서 호출할 핸들러 메서드를 Lambda 런타임에 알리기 위해 **핸들러** 필드에 **convert.handler**을(를) 입력합니다.

   Python에서 함수를 구성할 때, 핸들러 설정의 값은 파일의 이름과 핸들러 모듈의 이름이며 점(`.`)으로 구분됩니다. 예를 들어 `convert.handler`는 `convert.py` 파일에 정의된 `handler` 메서드를 호출합니다.

1. **저장**을 선택합니다.

1. Lambda 함수 페이지에서 **구성(Configuration)** 탭을 선택합니다. **구성** 탭의 왼쪽 탐색 창에서 **환경 변수**를 선택한 다음 **편집**을 선택합니다.

1. **Add environment variable(환경 변수 추가)**을 선택합니다. 그런 후, 다음의 각 환경 변수에 대해 지정된 **키**와 **값**을 입력합니다.
   + **키**: **DestinationBucket** **값**: **amzn-s3-demo-destination-bucket1** 

     이 값은 [1단계](#batchops-s3-step1)에서 생성한 출력 미디어 파일의 S3 버킷입니다.
   + **키**: **MediaConvertRole** **값**: **arn:aws:iam::*111122223333*:role/tutorial-mediaconvert-role** 

     이 값은 [2단계](#batchops-s3-step2)에서 생성한 MediaConvert용 IAM 역할의 ARN입니다. 이 ARN을 IAM 역할의 실제 ARN으로 바꿔야 합니다.
   + **키**: **Application** **값**: **Batch-Transcoding** 

     이 값은 애플리케이션의 이름입니다.

1. **저장**을 선택합니다.

1. (선택 사항) **구성(Configuration)** 탭에서, 왼쪽 탐색 창의 **일반 구성(General configuration)** 섹션에서 **편집(Edit)**을 선택합니다. **제한 시간(Timeout)** 필드에 **2**분 **0**초를 입력합니다. 그런 다음 **저장**을 선택합니다.

   **제한 시간(Timeout)**은 Lambda가 함수를 중지하기까지 호출 실행을 허용하는 시간입니다. 기본값은 3초입니다. 요금은 구성된 메모리 양과 코드가 실행되는 시간을 기준으로 책정됩니다. 자세한 내용은 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/?icmpid=docs_console_unmapped)을 참조하십시오.

## 5단계: S3 소스 버킷용 Amazon S3 인벤토리 구성
<a name="batchops-s3-step5"></a>

트랜스코딩 Lambda 함수를 설정한 후 비디오 세트를 트랜스코딩하기 위해 S3 Batch Operations 작업을 생성합니다. 먼저 S3 배치 작업에서 지정된 트랜스코딩 작업을 실행할 입력 비디오 객체 목록이 필요합니다. 입력 비디오 객체 목록을 가져오기 위해 S3 소스 버킷에 대한 S3 인벤토리 보고서를 생성할 수 있습니다(예: `amzn-s3-demo-source-bucket`).

**Topics**
+ [

### 입력 비디오의 S3 인벤토리 보고서용 버킷 생성 및 구성
](#batchops-s3-step5-bucket)
+ [

### S3 비디오 소스 버킷용 Amazon S3 인벤토리 구성
](#batchops-s3-step5-inventory)
+ [

### S3 비디오 소스 버킷에 대한 인벤토리 보고서 확인
](#batchops-s3-step5-manifest)

### 입력 비디오의 S3 인벤토리 보고서용 버킷 생성 및 구성
<a name="batchops-s3-step5-bucket"></a>

S3 소스 버킷의 객체를 나열하는 S3 인벤토리 보고서를 저장하려면 S3 인벤토리 대상 버킷을 만들고 S3 소스 버킷에 인벤토리 파일을 기록하도록 버킷에 대한 버킷 정책을 구성해야 합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. **버킷 이름**에 버킷 이름을 입력합니다(예: `amzn-s3-demo-destination-bucket2`).

1. **AWS 리전**은(는) 버킷이 속할 AWS 리전을(를) 선택합니다.

   인벤토리 대상 버킷은 S3 인벤토리를 설정하는 소스 버킷과 동일한 AWS 리전에 있어야 합니다. 인벤토리 대상 버킷은 다른 AWS 계정에 있을 수 있습니다.

1. **이 버킷에 대한 퍼블릭 액세스 차단 설정**에서 기본값 설정을 유지합니다(***모든* 퍼블릭 액세스 차단**이 사용 설정됨).

1. 나머지 설정은 기본값으로 유지합니다.

1. **버킷 생성**을 선택합니다.

1. **버킷(Buckets)** 목록에서 방금 생성한 버킷의 이름을 선택합니다(예: `amzn-s3-demo-destination-bucket2`).

1. 인벤토리 보고서에 대한 데이터를 S3 인벤토리 대상 버킷에 작성할 수 있는 권한을 Amazon S3에 부여하려면 **권한** 탭을 선택합니다.

1. **버킷 정책** 섹션으로 스크롤을 내린 다음 **편집**을 선택합니다. 이**버킷 정책** 페이지가 열립니다.

1. S3 인벤토리에 대한 권한을 부여하려면 **정책** 필드에서 다음 버킷 정책을 붙여 넣습니다.

   세 가지 예제 값을 다음 값으로 바꿉니다.
   + 인벤토리 보고서를 저장하기 위해 생성한 버킷의 이름(예: `amzn-s3-demo-destination-bucket2`)
   + 입력 비디오를 저장하는 소스 버킷의 이름입니다(예: `amzn-s3-demo-source-bucket`).
   + S3 비디오 소스 버킷을 만드는 데 사용한 AWS 계정 ID입니다(예: `111122223333`).

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement":[
       {
         "Sid":"InventoryAndAnalyticsExamplePolicy",
         "Effect":"Allow",
         "Principal": {"Service": "s3.amazonaws.com"},
         "Action":"s3:PutObject",
         "Resource":["arn:aws:s3:::amzn-s3-demo-destination-bucket2/*"],
         "Condition": {
             "ArnLike": {
                 "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket"
              },
            "StringEquals": {
                "aws:SourceAccount": "111122223333",
                "s3:x-amz-acl": "bucket-owner-full-control"
             }
          }
       }
     ]
   }
   ```

------

1. **변경 사항 저장**을 선택합니다.

### S3 비디오 소스 버킷용 Amazon S3 인벤토리 구성
<a name="batchops-s3-step5-inventory"></a>

비디오 객체 및 메타데이터의 플랫 파일 목록을 생성하려면 S3 비디오 소스 버킷에 대한 S3 인벤토리를 구성해야 합니다. 이러한 예약된 인벤토리 보고서에는 버킷의 모든 객체 또는 공유 접두사로 그룹화된 객체가 포함될 수 있습니다. 이 자습서에서, S3 인벤토리 보고서에는 S3 소스 버킷의 모든 비디오 객체가 포함됩니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. S3 소스 버킷에서 입력 비디오에 대한 S3 인벤토리 보고서를 구성하려면 **버킷** 목록에서 S3 소스 버킷의 이름을 선택합니다(예: `amzn-s3-demo-source-bucket`).

1. [**Management**] 탭을 선택한 후

1. 아래의 **인벤토리 구성** 섹션으로 스크롤하고 **인벤토리 구성 생성**을 선택합니다.

1. **인벤토리 구성 이름(Inventory configuration name)**에 이름을 입력합니다(예: **tutorial-inventory-config**).

1. 이 자습서에서는 **인벤토리 범위**의 **객체 버전**에서 **현재 버전만**을 선택하고, 다른 **인벤토리 범위** 설정을 기본값으로 유지합니다.

1. **보고서 세부 정보** 섹션의 **대상 버킷**에서 **이 계정**을 선택합니다.

1. **대상**에서 **S3 찾아보기**를 선택하고, 이전에 생성한 대상 버킷을 선택하여 인벤토리 보고서 저장용으로 선택합니다(예: `amzn-s3-demo-destination-bucket2`). 그런 다음 **경로 선택**을 선택합니다.

   인벤토리 대상 버킷은 S3 인벤토리를 설정하는 소스 버킷과 동일한 AWS 리전에 있어야 합니다. 인벤토리 대상 버킷은 다른 AWS 계정에 있을 수 있습니다.

   **대상(Destination)** 버킷 필드에서, **대상 버킷 권한(Destination bucket permission)**이 인벤토리 대상 버킷 정책에 추가되어 Amazon S3가 해당 인벤토리 대상 버킷에 데이터를 저장할 수 있습니다. 자세한 내용은 [대상 버킷 정책 생성](configure-inventory.md#configure-inventory-destination-bucket-policy) 섹션을 참조하세요.

1. **빈도**는 **일별**을 선택합니다.

1. [**출력 형식(Output format)**]으로 [**CSV**]를 선택합니다.

1. **상태**는 **활성**을 선택합니다.

1. **서버 측 암호화** 섹션에서 이 자습서에 대해 **사용 중지**를 선택합니다.

   자세한 내용은 [S3 콘솔을 사용하여 인벤토리 구성](configure-inventory.md#configure-inventory-console) 및 [암호화에 고객 관리형 키를 사용하도록 Amazon S3에 권한 부여](configure-inventory.md#configure-inventory-kms-key-policy) 단원을 참조하세요.

1. **추가 필드 - *선택 사항*** 섹션에서 **크기**, **최종 수정 날짜** 및 **스토리지 클래스**를 선택합니다.

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

자세한 내용은 [S3 콘솔을 사용하여 인벤토리 구성](configure-inventory.md#configure-inventory-console) 섹션을 참조하세요.

### S3 비디오 소스 버킷에 대한 인벤토리 보고서 확인
<a name="batchops-s3-step5-manifest"></a>

인벤토리 보고서가 게시될 때 매니페스트 파일은 S3 인벤토리 대상 버킷으로 전송됩니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서 비디오 소스 버킷의 이름을 선택합니다(예: `amzn-s3-demo-source-bucket`).

1. **관리**를 선택합니다.

1. S3 인벤토리 보고서가 준비되어 [7단계](#batchops-s3-step7)의 S3 Batch Operations 작업을 생성할 수 있는지 확인하려면, **인벤토리 구성**에서 **매니페스트에서 작업 생성** 버튼이 사용 설정되어 있는지 확인합니다.
**참고**  
첫 번째 인벤토리 보고서를 전달하는 데 최대 48시간이 걸릴 수 있습니다. **매니페스트에서 작업 생성(Create job from manifest)** 버튼이 사용 중지되어 있으면 첫 번째 인벤토리 보고서가 전달되지 않은 것입니다. 첫 번째 인벤토리 보고서가 전달되고 **매니페스트에서 작업 생성** 버튼이 사용 설정될 때까지 기다린 후 [7단계](#batchops-s3-step7)의 S3 Batch Operations 작업을 생성합니다.

1. S3 인벤토리 보고서(`manifest.json`)를 확인하려면 **대상** 열에서 인벤토리 보고서 저장을 위해 이전에 생성한 인벤토리 대상 버킷의 이름을 선택합니다(예: `amzn-s3-demo-destination-bucket2`).

1. **객체** 탭에서 S3 소스 버킷의 이름을 가진 기존 폴더를 선택합니다(예:`amzn-s3-demo-source-bucket`). 그런 다음 인벤토리 구성을 이전에 생성했을 때 **인벤토리 구성 이름**에 입력한 이름을 선택합니다(예:**tutorial-inventory-config**).

   보고서의 생성 날짜가 해당 이름으로 포함된 폴더 목록을 볼 수 있습니다.

1. 특정 날짜의 일별 S3 인벤토리 보고서를 확인하려면 해당 생성 날짜 이름이 있는 폴더를 선택한 후 `manifest.json`을(를) 선택합니다.

1. 특정 날짜의 인벤토리 보고서에 대한 세부 정보를 확인하려면 **manifest.json** 페이지에서 **다운로드(Download)** 또는 **열기(Open)**를 선택합니다.

## 6단계: S3 배치 작업용 IAM 역할 생성
<a name="batchops-s3-step6"></a>

S3 Batch Operations를 사용하여 일괄 트랜스코딩을 수행하려면 먼저 Amazon S3에 S3 Batch Operations를 수행할 수 있는 권한을 부여하록 IAM 역할을 생성해야 합니다.

**Topics**
+ [

### S3 배치 작업용 IAM 정책 생성
](#batchops-s3-step6-policy)
+ [

### S3 Batch Operation IAM 역할 생성 및 권한 정책 연결
](#batchops-s3-step6-role)

### S3 배치 작업용 IAM 정책 생성
<a name="batchops-s3-step6-policy"></a>

입력 매니페스트를 읽고 Lambda 함수를 호출하며 S3 Batch Operations 작업 완료 보고서를 작성할 수 있는 권한을 S3 Batch Operations에 부여하는 IAM 정책을 만들어야 합니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **정책**을 선택합니다.

1. **정책 생성**을 선택합니다.

1. [**JSON**] 탭을 선택합니다.

1. **JSON** 텍스트 필드에 다음 JSON 정책을 붙여 넣습니다.

   JSON 정책에서 네 가지 예제 값을 다음 값으로 바꿉니다.
   + 입력 비디오를 저장하는 소스 버킷의 이름입니다(예: `amzn-s3-demo-source-bucket`).
   + `manifest.json` 파일을 저장하기 위해 [5단계](#batchops-s3-step5)에서 생성한 인벤토리 대상 버킷의 이름(예: `amzn-s3-demo-destination-bucket2`)
   + 출력 미디어 파일을 저장하기 위해 [1단계](#batchops-s3-step1)에서 생성한 버킷의 이름입니다(예: `amzn-s3-demo-destination-bucket1`). 이 자습서에서는 출력 미디어 파일의 대상 버킷에 작업 완료 보고서를 저장합니다.
   + [4단계](#batchops-s3-step4)에서 생성한 Lambda 함수의 역할 ARN Lambda 함수의 역할 ARN을 찾아 복사하려면 다음을 수행합니다.
     + 새 브라우저 탭에서 [https://console.aws.amazon.com/lambda/home#/functions](https://console.aws.amazon.com/lambda/home#/functions)의 Lambda 콘솔에서 **함수** 페이지를 엽니다.
     + **함수** 목록에서, [4단계](#batchops-s3-step4)에서 생성한 Lambda 함수의 이름을 선택합니다(예, **tutorial-lambda-convert**).
     + **ARN 복사(Copy ARN)**를 선택합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "S3Get",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
                   "arn:aws:s3:::amzn-s3-demo-destination-bucket2/*"
               ]
           },
           {
               "Sid": "S3PutJobCompletionReport",
               "Effect": "Allow",
               "Action": "s3:PutObject",
               "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket1/*"
           },
           {
               "Sid": "S3BatchOperationsInvokeLambda",
               "Effect": "Allow",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": [
                   "arn:aws:lambda:us-west-2:111122223333:function:tutorial-lambda-convert"
               ]
           }
       ]
   }
   ```

------

1. **다음: 태그**를 선택합니다.

1. **다음: 검토**를 선택합니다.

1. **이름** 필드에 **tutorial-s3batch-policy**을 입력합니다.

1. **정책 생성**을 선택합니다.

### S3 Batch Operation IAM 역할 생성 및 권한 정책 연결
<a name="batchops-s3-step6-role"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택한 다음, **역할 생성**을 선택합니다.

1. **AWS 서비스** 역할 유형을 선택한 다음, **S3** 서비스를 선택합니다.

1. **사용 사례 선택(Select your use case)**에서 **S3 배치 작업(S3 Batch Operations)**을 선택합니다.

1. **다음**을 선택합니다.

1. **권한 연결**에서 검색 상자에 이전에 생성한 IAM 정책의 이름(예:**tutorial-s3batch-policy**)을 입력하여 정책 목록을 필터링합니다. 정책 이름 옆에 있는 확인란을 선택합니다(예:**tutorial-s3batch-policy**).

1. **다음**을 선택합니다.

1. **역할 이름**에 **tutorial-s3batch-role**을 입력합니다.

1. **역할 생성**을 선택합니다.

   S3 Batch Operations용 IAM 역할을 생성한 후 다음 신뢰 정책이 해당 역할에 자동으로 연결됩니다. 이 신뢰 정책은 S3 Batch Operations 서비스 보안 주체가 IAM 역할을 수임하도록 허용합니다.

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Principal":{
               "Service":"batchoperations.s3.amazonaws.com"
            },
            "Action":"sts:AssumeRole"
         }
      ]
   }
   ```

------

## 7단계: S3 배치 작업 생성 및 실행
<a name="batchops-s3-step7"></a>

S3 소스 버킷의 입력 비디오를 처리하기 위해 S3 Batch Operations 작업을 만들려면 이 특정 작업에 대한 파라미터를 지정해야 합니다.

**참고**  
S3 Batch Operations 작업 생성을 시작하려면 **매니페스트에서 작업 생성** 버튼이 사용 설정되어 있는지 확인합니다. 자세한 내용은 [S3 비디오 소스 버킷에 대한 인벤토리 보고서 확인](#batchops-s3-step5-manifest) 섹션을 참조하세요. **매니페스트에서 작업 생성** 버튼이 사용 중지되어 있으면 첫 번째 인벤토리 보고서가 전달되지 않은 것이며, 버튼이 사용 설정될 때까지 기다려야 합니다. [5단계](#batchops-s3-step5)에서 S3 소스 버킷에 대한 Amazon S3 인벤토리를 구성한 후, 첫 번째 인벤토리 보고서를 전달하는 데 최대 48시간이 걸릴 수 있습니다.

**Topics**
+ [

### S3 배치 작업 생성
](#batchops-s3-step7-create-job)
+ [

### S3 배치 작업을 실행하여 Lambda 함수 호출
](#batchops-s3-step7-run-job)
+ [

### (선택 사항) 완료 보고서 확인
](#batchops-s3-step7-check-report)
+ [

### (선택 사항) Lambda 콘솔에서 각 Lambda 호출 모니터링
](#batchops-s3-step7-monitor-lambda)
+ [

### (선택 사항) MediaConvert 콘솔에서 각 MediaConvert 비디오 트랜스코딩 작업 모니터링
](#batchops-s3-step7-monitor-mediaconvert)

### S3 배치 작업 생성
<a name="batchops-s3-step7-create-job"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **Batch Operations**를 선택합니다.

1. **작업 생성**을 선택합니다.

1. **AWS 리전**은 작업을 생성하려는 리전을 선택합니다.

   이 자습서에서 S3 Batch Operations 작업을 사용하여 Lambda 함수를 호출하려면 매니페스트에서 참조된 객체가 있는 S3 비디오 소스 버킷과 동일한 리전에서 작업을 생성해야 합니다.

1. **매니페스트** 섹션에서 다음을 수행합니다.

   1. **매니페스트 형식(Manifest format)**에서 **S3 인벤토리 보고서(S3 Inventory report)(manifest.json)**를 선택합니다.

   1. **매니페스트 객체**에서 **S3 찾아보기**를 선택하여 인벤토리 보고서 저장을 위해 [5단계](#batchops-s3-step5)에서 생성한 버킷을 찾습니다(예: `amzn-s3-demo-destination-bucket2`). **매니페스트 객체** 페이지에서 특정 날짜에 대한 `manifest.json` 파일을 찾을 때까지 객체 이름을 탐색합니다. 이 파일에는 일괄 트랜스코딩하려는 모든 비디오에 대한 정보가 나열됩니다. 사용할 `manifest.json` 파일을 찾으면, 옆에 있는 옵션 버튼을 선택합니다. 그런 다음 **경로 선택**을 선택합니다.

   1. (선택 사항) 최신 버전이 아닌 버전을 사용하려는 경우, **매니페스트 객체 버전 ID - *선택 사항***에서 매니페스트 객체의 버전 ID를 입력합니다.

1. **다음**을 선택합니다.

1. Lambda 함수를 사용하여 선택된 `manifest.json` 파일에 나열된 모든 객체를 트랜스코딩하려면 **작업 유형**에서 **AWS Lambda 함수 호출**을 선택합니다.

1. **Lambda 함수 호출** 섹션에서 다음을 수행합니다.

   1. **계정의 함수에서 선택(Choose from functions in your account)**을 선택합니다.

   1. **Lambda 함수**에서, [4단계](#batchops-s3-step4)에서 생성한 Lambda 함수를 선택합니다(예: **tutorial-lambda-convert**).

   1. **Lambda 함수 버전**에서, 기본값 **\$1LATEST**를 유지합니다.

1. **다음**을 선택합니다. **추가 옵션 구성** 페이지가 열립니다.

1. **추가 옵션** 섹션에서 기본값 설정을 유지합니다.

   이러한 옵션에 대한 자세한 내용은 [배치 작업 요청 요소](batch-ops-create-job.md#batch-ops-create-job-request-elements) 섹션을 참조하십시오.

1. **보고서 완료**섹션에서 **완료 보고서 대상 경로**는 **S3 찾아보기**를 선택합니다. [1단계](#batchops-s3-step1)에서 출력 미디어 파일에 대해 생성한 버킷을 찾습니다(예: `amzn-s3-demo-destination-bucket1`). 해당 버킷 이름 옆에 있는 옵션 버튼을 선택합니다. 그런 다음 **경로 선택**을 선택합니다.

   나머지 **완료 보고서** 설정은 기본값을 유지합니다. 완료 보고서 설정에 대한 자세한 내용은 [배치 작업 요청 요소](batch-ops-create-job.md#batch-ops-create-job-request-elements) 섹션을 참조하십시오. 완료 보고서는 작업 세부 정보 및 수행된 작업의 레코드를 유지 관리합니다.

1. **권한** 섹션에서, **기존 IAM 역할에서 선택**을 선택합니다. **IAM 역할(IAM role)**에서, [6단계](#batchops-s3-step6)에서 생성한 S3 배치 작업의 IAM 역할을 선택합니다(예: **tutorial-s3batch-role**).

1. **다음**을 선택합니다.

1. **검토** 페이지에서 설정을 검토합니다. 그런 다음 **작업 생성**을 선택합니다.

   S3가 S3 Batch Operations 작업의 매니페스트 읽기를 마치면, 작업의 **상태**를 **실행 확인을 기다리는 중**으로 설정합니다. 작업 상태에 대한 업데이트를 보려면 페이지를 새로 고칩니다. 작업의 상태가 **실행 확인을 기다리는 중**일 때까지 작업을 실행할 수 없습니다.

### S3 배치 작업을 실행하여 Lambda 함수 호출
<a name="batchops-s3-step7-run-job"></a>

배치 작업을 실행하여 비디오 트랜스코딩을 위한 Lambda 함수를 호출합니다. 작업이 실패하면 완료 보고서를 확인하여 원인을 파악할 수 있습니다.

**S3 배치 작업 실행**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **Batch Operations**를 선택합니다.

1. **작업** 목록의 첫 번째 행에서, 이전에 생성한 S3 Batch Operations 작업의 **작업 ID**를 선택합니다.

1. **작업 실행(Run job)**을 선택합니다.

1. 작업 파라미터를 다시 검토하고 **매니페스트에 나열된 총 객체(Total objects listed in manifest)**의 값이 매니페스트의 객체 수와 동일한지 확인합니다. 그런 다음 **작업 실행**을 선택합니다.

   S3 배치 작업 페이지가 열립니다.

1. 작업 실행이 시작된 후 작업 페이지의 **상태(Status)**에서 **상태**, **% 완료**, **총 성공(비율)**, **총 실패(비율)**, **종료 날짜**, **종료 이유**와 같은 S3 배치 작업 진행 상황을 확인합니다.

   S3 Batch Operations 작업이 완료되면 작업 페이지의 데이터를 보고 작업이 예상대로 완료되었는지 확인합니다.

   1,000개 이상의 작업이 시도된 후 S3 Batch Operations 작업의 객체 작업 중 50 퍼센트 이상이 실패하면 작업이 자동으로 실패합니다. 완료 보고서를 확인하여 실패의 원인을 파악하려면 아래의 선택적 절차를 사용하십시오.

### (선택 사항) 완료 보고서 확인
<a name="batchops-s3-step7-check-report"></a>

완료 보고서를 사용하여 실패한 객체와 실패의 원인을 확인할 수 있습니다.

**실패한 객체에 대한 세부 정보를 완료 보고서에서 확인하려면 다음을 수행합니다.**

1. S3 Batch Operations 작업 페이지에서 아래 **완료 보고서** 섹션으로 스크롤하고 **완료 보고서 대상**의 링크를 선택합니다.

   S3 출력 대상 버킷 페이지가 열립니다.

1. **객체** 탭에서, 이전에 생성한 S3 Batch Operations 작업의 작업 ID로 끝나는 이름이 있는 폴더를 선택합니다.

1. **results/**를 선택합니다.

1. `.csv` 파일 옆의 확인란을 선택합니다.

1. 작업 보고서를 보려면 **열기** 또는 **다운로드**를 선택합니다.

### (선택 사항) Lambda 콘솔에서 각 Lambda 호출 모니터링
<a name="batchops-s3-step7-monitor-lambda"></a>

S3 Batch Operations 작업 실행이 시작되면 작업이 각 입력 비디오 객체에 대해 Lambda 함수를 호출합니다. S3는 각 Lambda 호출 로그를 CloudWatch Logs에 기록합니다. Lambda 콘솔의 모니터링 대시보드를 사용하여 Lambda 함수를 모니터링할 수 있습니다.

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

1. 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. **함수** 목록에서, [4단계](#batchops-s3-step4)에서 생성한 Lambda 함수의 이름을 선택합니다(예, **tutorial-lambda-convert**).

1. **모니터링** 탭을 선택합니다.

1. **지표(Metrics)**에서 Lambda 함수의 런타임 지표를 참조하십시오.

1. **로그(Logs)**에서, CloudWatch Logs 인사이트를 통해 각 Lambda 호출에 대한 로그 데이터를 봅니다.
**참고**  
Lambda 함수와 함께 S3 배치 작업을 사용하면 각 객체에서 Lambda 함수가 호출됩니다. S3 배치 작업이 큰 경우 동시에 여러 Lambda 함수를 호출하여 Lambda 동시성이 급증할 수 있습니다.  
각 AWS 계정은(는) 리전당 Lambda 동시성 할당량이 있습니다. 자세한 내용은 *AWS Lambda개발자 안내서*의 [AWS Lambda함수 크기 조정](https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html)을 참조하십시오. S3 배치 작업에 Lambda 함수를 사용하는 모범 사례는 Lambda 함수 자체에 동시성 제한을 설정하는 것입니다. 동시성 제한을 설정하면 작업에서 대부분의 Lambda 동시성을 소비하여 잠재적으로 계정의 다른 함수를 제한하는 상황을 방지할 수 있습니다. 자세한 내용은 *AWS Lambda개발자 안내서*의 [Lambda 예약된 동시성 관리](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) 단원을 참조하십시오.

### (선택 사항) MediaConvert 콘솔에서 각 MediaConvert 비디오 트랜스코딩 작업 모니터링
<a name="batchops-s3-step7-monitor-mediaconvert"></a>

MediaConvert 작업은 미디어 파일을 트랜스코딩하는 작업을 수행합니다. S3 Batch Operations 작업에서 각 비디오에 대해 Lambda 함수를 호출하면 각 Lambda 함수 호출은 각 입력 비디오에 대해 MediaConvert 트랜스코딩 작업을 만듭니다.

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/mediaconvert/](https://console.aws.amazon.com/mediaconvert/)에서 MediaConvert 콘솔을 엽니다.

1. MediaConvert 소개 페이지가 나타나면 **시작하기(Get Started)**를 선택합니다.

1. **작업(Jobs)** 목록에서 각 행을 확인하여 각 입력 비디오의 트랜스코딩 작업을 모니터링합니다.

1. 확인하려는 작업의 행을 식별하고 **작업 ID** 링크를 선택하여 작업 세부 정보 페이지를 엽니다.

1. **작업 요약(Job summary)** 페이지의 **출력(Outputs)**에서, 브라우저에서 지원되는 항목에 따라 HLS, MP4 또는 썸네일 출력에 대한 링크를 선택하여 출력 미디어 파일의 S3 대상 버킷으로 이동합니다.

1. S3 출력 대상 버킷의 해당 폴더(HLS, MP4 또는 썸네일)에서 출력 미디어 파일 객체의 이름을 선택합니다.

   객체 세부 정보 페이지가 열립니다.

1. 객체 세부 정보 페이지의 **객체 개요**에서 **객체 URL**의 링크를 선택하여 트랜스코딩된 출력 미디어 파일을 봅니다.

## 8단계: S3 대상 버킷의 출력 미디어 파일 확인
<a name="batchops-s3-step8"></a>

**S3 대상 버킷의 출력 미디어 파일을 확인하려면 다음을 수행합니다.**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷** 목록에서, [1단계](#batchops-s3-step1)에서 생성한 출력 미디어 파일에 대한 S3 대상 버킷의 이름을 선택합니다(예: `amzn-s3-demo-destination-bucket1`).

1. **객체(Objects)** 탭에서, 각 입력 비디오에는 입력 비디오의 이름이 있는 폴더가 있습니다. 각 폴더에는 입력 비디오의 트랜스코딩된 출력 미디어 파일이 포함되어 있습니다.

   입력 비디오의 출력 미디어 파일을 확인하려면 다음을 수행합니다.

   1. 확인하려는 입력 비디오의 이름이 있는 폴더를 선택합니다.

   1. **Default/** 폴더를 선택합니다.

   1. 트랜스코딩된 형식의 폴더(이 자습서의 HLS, MP4 또는 썸네일)를 선택합니다.

   1. 출력 미디어 파일의 이름을 선택합니다.

   1. 객체 세부 정보 페이지에서 트랜스코딩된 파일을 보려면 **객체 URL**의 링크를 선택합니다.

      HLS 형식의 출력 미디어 파일은 짧은 세그먼트로 분할됩니다. 이 비디오를 재생하려면, 호환 플레이어에 `.m3u8` 파일의 객체 URL을 포함합니다.

## 9단계: 정리
<a name="batchops-s3-step9"></a>

S3 배치 작업, Lambda 및 MediaConvert를 학습 연습으로만 사용하여 비디오를 트랜스코딩한 경우 더 이상 요금이 발생하지 않도록 할당한 AWS 리소스를 삭제합니다.

**Topics**
+ [

### S3 소스 버킷의 S3 인벤토리 구성 삭제
](#batchops-s3-step9-delete-inventory)
+ [

### Lambda 함수를 삭제하려면
](#batchops-s3-step9-delete-lambda)
+ [

### CloudWatch 로그 그룹 삭제
](#batchops-s3-step9-delete-cw)
+ [

### IAM 역할에 대한 인라인 정책과 함께 IAM 역할 삭제
](#batchops-s3-step9-delete-role)
+ [

### 고객 관리형 IAM 정책 삭제
](#batchops-s3-step9-delete-policy)
+ [

### S3 버킷 비우기
](#batchops-s3-step9-empty-bucket)
+ [

### S3 버킷 삭제
](#batchops-s3-step9-delete-bucket)

### S3 소스 버킷의 S3 인벤토리 구성 삭제
<a name="batchops-s3-step9-delete-inventory"></a>

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서 소스 버킷의 이름을 선택합니다(예: `amzn-s3-demo-source-bucket`).

1. [**Management**] 탭을 선택한 후

1. **인벤토리 구성** 섹션에서, [5단계](#batchops-s3-step5)에서 생성한 인벤토리 구성 옆의 옵션 버튼을 선택합니다(예: **tutorial-inventory-config**).

1. **삭제(Delete)**를 선택한 후 **확인(Confirm)**을 선택합니다.

### Lambda 함수를 삭제하려면
<a name="batchops-s3-step9-delete-lambda"></a>

1. 

   [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)에서 AWS Lambda 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **함수(Functions)**를 선택합니다.

1. [4단계](#batchops-s3-step4)에서 생성한 함수 옆의 확인란을 선택합니다(예: **tutorial-lambda-convert**).

1. **작업**을 선택한 후 **삭제**를 선택합니다.

1. **함수 삭제(Delete function)** 대화 상자에서 **삭제(Delete)**를 선택합니다.

### CloudWatch 로그 그룹 삭제
<a name="batchops-s3-step9-delete-cw"></a>

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

1. 왼쪽 탐색 창에서 **로그**를 선택한 다음, **로그 그룹**을 선택합니다.

1. [4단계](#batchops-s3-step4)에서 생성한 Lambda 함수로 끝나는 이름의 로그 그룹 옆에 있는 확인란을 선택합니다(예: **tutorial-lambda-convert**).

1. **작업(Actions)**을 선택한 후 **로그 그룹 삭제(Delete log group(s))**를 선택합니다.

1. **로그 그룹 삭제(Delete log group(s))** 대화 상자에서 **삭제(Delete)**를 선택합니다.

### IAM 역할에 대한 인라인 정책과 함께 IAM 역할 삭제
<a name="batchops-s3-step9-delete-role"></a>

[2단계](#batchops-s3-step2), [3단계](#batchops-s3-step3) 및 [6단계](#batchops-s3-step6)에서 생성한 IAM 역할을 삭제하려면 다음을 수행합니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **역할**을 선택한 후 삭제할 역할 이름 옆에 있는 확인란을 선택합니다.

1. 페이지 상단에서 **삭제(Delete)**를 선택합니다.

1. 확인 대화 상자에서, 안내 메시지에 따라 필요한 응답을 텍스트 입력 필드에 입력한 후 **삭제(Delete)**를 선택합니다.

### 고객 관리형 IAM 정책 삭제
<a name="batchops-s3-step9-delete-policy"></a>

[6단계](#batchops-s3-step6)에서 생성한 고객 관리형 IAM 정책을 삭제하려면 다음을 수행합니다.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **정책**을 선택합니다.

1. [6단계](#batchops-s3-step6)에서 생성한 정책 옆에 있는 옵션 버튼을 선택합니다(예: **tutorial-s3batch-policy**). 검색 상자를 사용하여 정책 목록을 필터링할 수 있습니다.

1. **작업**을 선택한 후 **삭제**를 선택합니다.

1. 텍스트 필드에 해당 이름을 입력하여 이 정책을 삭제할 것인지 확인한 후 **삭제**를 선택합니다.

### S3 버킷 비우기
<a name="batchops-s3-step9-empty-bucket"></a>

[사전 조건](#batchops-s3-prerequisites), [1단계](#batchops-s3-step1) 및 [5단계](#batchops-s3-step5)에서 생성한 S3 버킷을 비우려면 다음을 수행합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷** 목록에서, 비우려는 버킷의 이름 옆에 있는 옵션 버튼을 선택한 후 **비우기**를 선택합니다.

1. **버킷 비우기** 페이지에서 텍스트 필드에 **permanently delete**를 입력하여 해당 버킷 비우기를 확인한 후 **비우기**를 선택합니다.

### S3 버킷 삭제
<a name="batchops-s3-step9-delete-bucket"></a>

[사전 조건](#batchops-s3-prerequisites), [1단계](#batchops-s3-step1) 및 [5단계](#batchops-s3-step5)에서 생성한 S3 버킷을 삭제하려면 다음을 수행합니다.

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷** 목록에서, 삭제할 버킷의 이름 옆에 있는 옵션 버튼을 선택합니다.

1. **삭제**를 선택합니다.

1. **버킷 삭제(Delete bucket)** 페이지의 텍스트 필드에 버킷 이름을 입력하여 버킷의 삭제 여부를 확인한 다음 **버킷 삭제(Delete bucket)**를 선택합니다.

## 다음 단계
<a name="batchops-s3-next-steps"></a>

이 자습서를 완료한 후 다른 관련 사용 사례를 자세히 살펴볼 수 있습니다.
+ Amazon CloudFront를 사용하여 트랜스코딩된 미디어 파일을 전 세계 뷰어에게 스트리밍할 수 있습니다. 자세한 내용은 [자습서: Amazon S3, Amazon CloudFront 및 Amazon Route 53로 온디맨드 스트리밍 비디오 호스팅](tutorial-s3-cloudfront-route53-video-streaming.md) 섹션을 참조하세요.
+ 동영상을 S3 소스 버킷에 업로드하는 순간 트랜스코딩할 수 있습니다. 이렇게 하려면 Lambda 함수를 자동으로 호출하여 S3의 새 객체를 MediaConvert로 트랜스코딩하는 Amazon S3 이벤트 트리거를 구성할 수 있습니다. 자세한 내용은 *AWS Lambda 개발자 가이드*의 [자습서: Amazon S3 트리거를 사용하여 Lambda 함수 호출](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)을 참조하십시오.

# S3 Batch Operations 문제 해결
<a name="troubleshooting-batch-operations"></a>

Amazon S3 Batch Operations를 사용하면 Amazon S3 객체에 대해 대규모 작업을 수행할 수 있습니다. 이 가이드는 발생할 수 있는 일반적인 문제를 해결하는 데 도움이 됩니다.

S3 배치 복제와 관련된 문제를 해결하려면 [복제 문제 해결](replication-troubleshoot.md) 섹션을 참조하세요.

배치 작업 오류가 발생하는 두 가지 기본 유형의 실패가 있습니다.

1. **API 실패** - 요청된 API(예: `CreateJob`)를 실행하지 못했습니다.

1. **작업 실패** - 초기 API 요청이 성공했지만 매니페스트 문제 또는 매니페스트에 지정된 객체에 대한 권한으로 인해 작업이 실패했습니다.

## NoSuchJobException
<a name="nosuchjobexception"></a>

**유형:** API 실패

`NoSuchJobException`은 S3 Batch Operations가 지정된 작업을 찾을 수 없을 때 발생합니다. 이 오류는 단순한 작업 만료 외에도 여러 시나리오에서 발생할 수 있습니다. 일반적인 원인은 다음과 같습니다.

1. **작업 만료** - 작업이 최종 상태(`Complete`, `Cancelled` 또는 `Failed`)에 도달한 후 90일이 지나면 자동으로 삭제됩니다.

1. **잘못된 작업 ID** - `DescribeJob` 또는 `UpdateJobStatus`에 사용된 작업 ID가 `CreateJob`에서 반환한 ID와 일치하지 않습니다.

1. **잘못된 리전** - 생성된 리전과 다른 리전의 작업에 액세스하려고 시도합니다.

1. **잘못된 계정** - 다른 AWS 계정의 작업 ID를 사용합니다.

1. **작업 ID 형식 오류** - 작업 ID에 오타, 추가 문자 또는 잘못된 형식이 있습니다.

1. **타이밍 문제** - 작업이 완전히 등록되기도 전에 생성 직후 작업 상태를 확인합니다.

관련 오류 메시지로는 다음이 있습니다.

1. `No such job`

1. `The specified job does not exist`

### `NoSuchJobException` API 실패를 방지하기 위한 모범 사례
<a name="nosuchjobexception-prevention"></a>

1. **작업 ID 즉시 저장** - 후속 API 직접 호출을 수행하기 전에 `CreateJob` 응답에서 작업 ID를 저장합니다.

1. **재시도 로직 구현** - 생성 직후 작업 상태를 확인할 때 지수 백오프를 추가합니다.

1. **모니터링 설정** - CloudWatch 경보를 생성하여 90일 만료 전에 작업 완료를 추적합니다. 자세한 내용은 Amazon CloudWatch 사용 설명서의 [CloudWatch 경보 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html) 섹션을 참조하세요.

1. **일관된 리전 사용** - 모든 작업이 작업 생성과 동일한 리전을 사용하는지 확인합니다.

1. **입력 검증** - API 직접 호출 전에 작업 ID 형식을 확인합니다.

### 작업이 만료되는 경우
<a name="nosuchjobexception-jobs-expire"></a>

최종 상태의 작업은 90일 후에 자동으로 삭제됩니다. 작업 정보가 손실되지 않도록 하려면 다음을 고려하세요.

1. **만료 전 완료 보고서 다운로드** - 작업 결과 검색 및 저장에 대한 지침은 [ 완료 보고서  작업을 생성할 때 완료 보고서를 요청할 수 있습니다. S3 Batch Operations가 하나 이상의 태스크를 성공적으로 간접 호출하는 한, Amazon S3가 작업이 태스크 실행을 마치거나 실패하거나 취소된 후 완료 보고서를 생성합니다. 모든 작업 또는 실패한 작업만 포함하도록 완료 보고서를 구성할 수 있습니다. 완료 보고서에는 작업 구성, 상태, 그리고 객체 키와 버전, 상태, 오류 코드 및 오류 설명 등 각 태스크의 정보가 포함됩니다. 완료 보고서를 사용하면 추가 설정을 하지 않아도 통합된 형식으로 작업 결과를 손쉽게 볼 수 있습니다. 완료 보고서는 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 통해 암호화됩니다. 완료 보고서의 예는 [예: S3 배치 작업 완료 보고서](batch-ops-examples-reports.md) 섹션을 참조하세요. 완료 보고서를 구성하지 않은 경우에도 여전히 CloudTrail 및 Amazon CloudWatch를 사용하여 작업 및 그 태스크를 모니터링하고 감사할 수 있습니다. 자세한 내용은 다음 항목을 참조하세요. ](batch-ops-job-status.md#batch-ops-completion-report.title) 섹션을 참조하세요.

1. **자체 시스템에 작업 메타데이터 보관** - 데이터베이스 또는 모니터링 시스템에 중요한 작업 정보를 저장합니다.

1. **90일 기한 전에 자동 알림 설정** - Amazon EventBridge를 사용하여 작업이 완료되면 알림을 트리거하는 규칙을 생성합니다. 자세한 내용은 [Amazon S3 이벤트 알림](EventNotifications.md) 섹션을 참조하세요.

### `NoSuchJobException` 문제 해결
<a name="nosuchjobexception-troubleshooting"></a>

1. 다음 명령을 사용하여 작업이 계정 및 리전에 존재하는지 확인합니다.

   ```
   aws s3control list-jobs --account-id 111122223333 --region us-east-1
   ```

1. 다음 명령을 사용하여 모든 작업 상태 중에서 검색합니다. 가능한 작업 상태는 `Active`, `Cancelled`, `Cancelling`, `Complete`, `Completing`, `Failed`, `Failing`, `New`, `Paused`, `Pausing`, `Preparing`, `Ready` 및 `Suspended`입니다.

   ```
   aws s3control list-jobs --account-id 111122223333 --job-statuses your-job-status
   ```

1. 다음 명령을 사용하여 일반적으로 작업을 생성하는 다른 리전에 작업이 존재하는지 확인합니다.

   ```
   aws s3control list-jobs --account-id 111122223333 --region job-region-1 aws s3control list-jobs --account-id 111122223333 --region job-region-2                    
   ```

1. 작업 ID 형식을 검증합니다. 작업 ID는 일반적으로 `12345678-1234-1234-1234-123456789012`처럼 36자로 구성됩니다. 추가 공백, 누락된 문자 또는 대/소문자 구분 문제가 있는지 검사하고 `CreateJob` 명령에서 반환된 전체 작업 ID를 사용하고 있는지 확인합니다.

1. 다음 명령을 사용하여 CloudTrail 로그에서 작업 생성 이벤트를 확인합니다.

   ```
       aws logs filter-log-events --log-group-name CloudTrail/S3BatchOperations \ --filter-pattern "{ $.eventName = CreateJob }" \ --start-time timestamp                    
   ```

### AccessDeniedException
<a name="accessdeniedexception"></a>

**유형:** API 실패

`AccessDeniedException`은 권한 부족, 지원되지 않는 작업 또는 정책 제한으로 인해 S3 Batch Operations 요청이 차단될 때 발생합니다. 이는 Batch Operations에서 가장 일반적인 오류 중 하나입니다. 일반적인 원인은 다음과 같습니다.

1. **IAM 권한 누락** - IAM 자격 증명에 Batch Operations API에 필요한 권한이 없습니다.

1. **S3 권한 부족** - 소스 또는 대상 버킷 및 객체에 액세스할 수 있는 권한이 없습니다.

1. **작업 실행 역할 문제** - 작업 실행 역할에 지정된 작업을 수행할 권한이 없습니다.

1. **지원되지 않는 작업** - 현재 리전 또는 버킷 유형에서 지원되지 않는 작업을 사용하려고 시도합니다.

1. **교차 계정 액세스 문제** - 교차 계정 버킷 또는 객체 액세스에 대한 권한이 없습니다.

1. **리소스 기반 정책 제한** - 작업을 차단하는 버킷 정책 또는 객체 ACL이 있습니다.

1. **서비스 제어 정책(SCP) 제한** - 작업을 방지하는 조직 수준 정책이 있습니다.

관련 오류 메시지:

1. `Access Denied`

1. `User: arn:aws:iam::account:user/username is not authorized to perform: s3:operation`

1. `Cross-account pass role is not allowed`

1. `The bucket policy does not allow the specified operation`

#### AccessDeniedException API 실패를 방지하는 모범 사례
<a name="accessdeniedexception-prevention"></a>

1. **최소 권한 원칙 사용** - 특정 작업에 필요한 최소 권한만 부여합니다.

1. **대규모 작업 전 권한 테스트** - 수천 개의 객체를 처리하기 전에 소규모 테스트 작업을 실행하여 권한을 검증합니다.

1. **IAM 정책 시뮬레이터 사용** - IAM 정책 시뮬레이터를 사용하여 배포하기 전에 정책을 테스트합니다. 자세한 내용은 IAM 사용 설명서의 [IAM 정책 시뮬레이터로 IAM 정책 테스트](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html) 섹션을 참조하세요.

1. **적절한 교차 계정 설정 구현** - 교차 계정 작업 구성을 위해 교차 계정 액세스 구성을 확인합니다. 자세한 내용은 IAM 사용 설명서의 [IAM 튜토리얼: IAM 역할을 사용한 AWS 계정 간 액세스 권한 위임](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html) 섹션을 참조하세요.

1. **권한 변경 모니터링** - Batch Operations에 영향을 미칠 수 있는 IAM 정책 수정에 대한 CloudTrail 알림을 설정합니다.

1. **역할 요구 사항 문서화** - 각 작업 유형에 필요한 권한을 명확하게 문서화합니다.

1. **공통 권한 템플릿 사용** - 권한 예제 및 정책 템플릿을 사용합니다.

   1. [배치 작업에 대한 권한 부여](batch-ops-iam-role-policies.md)

   1. IAM 사용 설명서의 [IAM의 교차 계정 리소스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html).

   1. AWS PrivateLink 가이드의 [엔드포인트 정책을 사용하여 VPC 엔드포인트로 액세스 제어](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html).

#### AccessDeniedException 문제 해결
<a name="accessdeniedexception-troubleshooting"></a>

다음 단계를 체계적으로 수행하여 권한 문제를 식별하고 해결합니다.

1. [S3 배치 작업에서 지원하는 작업](batch-ops-operations.md) 섹션에서 리전별로 지원되는 작업을 확인합니다. 디렉터리 버킷 작업을 리전 및 영역 엔드포인트에서만 사용할 수 있는지 확인합니다. 버킷의 스토리지 클래스에 작업이 지원되는지 확인합니다.

1. 다음 명령을 사용하여 작업을 나열할 수 있는지 확인합니다.

   ```
    aws s3control list-jobs --account-id 111122223333
   ```

1. 다음 명령을 사용하여 요청하는 자격 증명에 대한 IAM 권한을 확인합니다. 작업을 실행하는 계정에는 `s3:CreateJob`, `s3:DescribeJob`, `s3:ListJobs`, `s3:UpdateJobPriority`, `s3:UpdateJobStatus` 및 `iam:PassRole` 권한이 필요합니다.

   ```
   aws sts get-caller-identity 111122223333
   ```

1. 다음 명령을 사용하여 역할이 존재하고 수임 가능한지 확인합니다.

   ```
   aws iam get-role --role-name role-name
   ```

1. 다음 명령을 사용하여 역할의 신뢰 정책을 검토합니다. 작업을 실행하는 역할에는 다음이 있어야 합니다.

   1. `batchoperations.s3.amazonaws.com`이 역할을 수임하도록 허용하는 신뢰 관계.

   1. Batch Operations가 수행 중인 작업(예: 태그 지정 작업을 의미하는 `s3:PutObjectTagging`).

   1. 소스 및 대상 버킷에 대한 액세스 권한.

   1. 매니페스트 파일을 읽을 수 있는 권한.

   1. 완료 보고서를 작성할 수 있는 권한.

   ```
   aws iam get-role --role-name role-name --query 'Role.AssumeRolePolicyDocument'
   ```

1. 매니페스트 및 소스 버킷에 대한 액세스를 테스트하려면 다음 명령을 사용합니다.

   ```
   aws s3 ls s3://amzn-s3-demo-bucket                        
   ```

1. Batch Operations에서 수행 중인 작업을 테스트합니다. 예를 들어 Batch Operations가 태그 지정을 수행하는 경우 소스 버킷의 샘플 객체에 태그를 지정합니다.

1. 버킷 정책을 검토하여 작업을 거부할 수 있는 정책이 있는지 확인합니다.

   1. 레거시 액세스 제어로 작업하는 경우 객체 ACL를 확인합니다.

   1. 작업을 차단하는 서비스 제어 정책(SCP)이 없는지 확인합니다.

   1.  VPC 엔드포인트를 사용하는 경우 VPC 엔드포인트 정책이 Batch Operations를 허용하는지 확인합니다.

1. 다음 명령을 사용하여 CloudTrail로 권한 실패를 식별합니다.

   ```
   aws logs filter-log-events --log-group-name CloudTrail/S3BatchOperations \
       --filter-pattern "{ $.errorCode = AccessDenied }" \
       --start-time timestamp
   ```

#### SlowDownError
<a name="slowdownerror"></a>

**유형:** API 실패

계정에서 S3 Batch Operations API에 대한 요청 속도 제한을 초과한 경우 `SlowDownError` 예외가 발생합니다. 이는 너무 많은 요청으로 인해 서비스에 부담이 가중되는 것을 방지하기 위한 스로틀링 메커니즘입니다. 일반적인 원인은 다음과 같습니다.

1. **높은 API 요청 빈도** - 짧은 시간 내에 너무 많은 API 직접 호출을 수행합니다.

1. **동시 작업** - 여러 애플리케이션 또는 사용자가 동시에 작업을 생성/관리합니다.

1. **속도 제한이 없는 자동 스크립트** - 적절한 백오프 전략을 구현하지 않는 스크립트입니다.

1. **너무 잦은 작업 상태 폴링** - 작업 상태를 필요 이상으로 자주 확인합니다.

1. **버스트 트래픽 패턴** - 피크 처리 시간 동안 API 사용량이 갑자기 급증합니다.

1. **리전 용량 제한** - 리전에 할당된 요청 용량을 초과합니다.

관련 오류 메시지:

1. `SlowDown`

1. `Please reduce your request rate`

1. `Request rate exceeded`

#### SlowDownError API 실패를 방지하는 모범 사례
<a name="slowdownerror-prevention"></a>

1. **클라이언트 측 속도 제한 구현** - 애플리케이션의 API 직접 호출 사이에 지연을 추가합니다.

1. **지터와 함께 지수 백오프 사용** - 썬더링 허드 문제를 방지하기 위해 재시도 지연을 무작위화합니다.

1. **적절한 재시도 로직 설정** - 일시적 오류에 대해 지연 시간을 점차 늘려가며 자동 재시도를 구현합니다.

1. **이벤트 기반 아키텍처 사용** - 폴링을 작업 상태 변경에 대한 EventBridge 알림으로 대체합니다.

1. **시간별 로드 분산** - 여러 기간에 걸쳐 작업 생성 및 상태 확인을 분산합니다.

1. **속도 제한 모니터링 및 알림** - CloudWatch 경보를 설정하여 제한에 근접한 시기를 감지합니다.

대부분의 SDK에는 속도 제한 오류에 대한 재시도 로직이 내장되어 있습니다. 다음과 같이 구성합니다.

1. **AWS CLI** - `cli-read-timeout` 및 `cli-connect-timeout` 파라미터를 사용합니다.

1. **Python용 AWS SDK(Boto3)** - 클라이언트 구성에서 재시도 모드와 최대 시도 횟수를 구성합니다.

1. **Java용 AWS SDK** – `RetryPolicy` 및 `ClientConfiguration` 설정을 사용합니다.

1. **JavaScript용 AWS SDK** – `maxRetries` 및 `retryDelayOptions`를 구성합니다.

재시도 패턴 및 모범 사례에 대한 자세한 내용은 AWS 규범적 지침 가이드의 [백오프 패턴으로 재시도](https://docs.aws.amazon.com/prescriptive-guidance/latest/cloud-design-patterns/retry-backoff.html) 섹션을 참조하세요.

#### SlowDownError 문제 해결
<a name="slowdownerror-troubleshooting"></a>

1. 코드에서 지수 백오프를 즉시 구현합니다.  
**Example bash의 지수 백오프 예제**  

   ```
   for attempt in {1..5}; do
       if aws s3control describe-job --account-id 111122223333 --job-id job-id; then 
           break
       else 
           wait_time=$((2**attempt)) echo "Rate limited, waiting ${wait_time} seconds..." sleep $wait_time
           fi
   done
   ```

1. CloudTrail을 사용하여 요청량이 많은 소스를 식별합니다.

   ```
   aws logs filter-log-events \
       --log-group-name CloudTrail/S3BatchOperations \
       --filter-pattern "{ $.eventName = CreateJob || $.eventName = DescribeJob }" \
       --start-time timestamp \
       --query 'events[*].[eventTime,sourceIPAddress,userIdentity.type,eventName]'
   ```

1. 폴링 빈도를 검토합니다.

   1. 활성 작업에 대해 30초에 한 번 이상 작업 상태를 확인하지 마세요.

   1. 가능하면 폴링 대신 작업 완료 알림을 사용합니다.

   1. 동기화된 요청을 방지하려면 폴링 간격에 지터를 구현합니다.

1. API 사용 패턴을 최적화합니다.

   1. 가능하면 여러 작업을 일괄 처리합니다.

   1. `ListJobs`를 사용하여 한 번의 직접 호출로 여러 작업의 상태를 가져옵니다.

   1. 작업 정보를 캐시하여 중복 API 직접 호출을 줄입니다.

   1. 여러 작업을 동시에 생성하는 대신 시간 경과에 따라 작업 생성을 분산합니다.

1. API 직접 호출에 CloudWatch 지표를 사용하여 요청 패턴을 모니터링합니다.

   ```
      aws logs put-metric-filter \
          --log-group-name CloudTrail/S3BatchOperations \
          --filter-name S3BatchOpsAPICallCount \      
          --filter-pattern "{ $.eventSource = s3.amazonaws.com && $.eventName = CreateJob }" \
          --metric-transformations \        
          metricName=S3BatchOpsAPICalls,metricNamespace=Custom/S3BatchOps,metricValue=1
   ```

## InvalidManifestContent
<a name="invalidmanifestcontent"></a>

**유형:** 작업 실패

매니페스트 파일 형식, 콘텐츠, 구조에 S3 Batch Operations의 작업 처리에 방해가 되는 문제가 있는 경우 `InvalidManifestContent` 예외가 발생합니다. 일반적인 원인은 다음과 같습니다.

1. **형식 위반** - 필수 열 누락, 잘못된 구분 기호 또는 잘못된 CSV 구조.

1. **콘텐츠 인코딩 문제** - 잘못된 문자 인코딩, BOM 마커 또는 UTF-8이 아닌 문자.

1. **객체 키 문제** - 잘못된 문자, 잘못된 URL 인코딩 또는 길이 제한을 초과하는 키.

1. **크기 제한** - 작업이 지원하는 것보다 많은 객체가 포함된 매니페스트. 

1. **버전 ID 형식 오류** - 버전이 지정된 객체의 잘못된 버전 ID.

1. **ETag 형식 문제** - ETag가 필요한 작업에 대해 잘못된 ETag 형식 또는 따옴표 누락.

1. **일관되지 않은 데이터** - 동일한 매니페스트 내에서 혼합된 형식 또는 일관되지 않은 열 수.

관련 오류 메시지:

1. `Required fields are missing in the schema: + missingFields`

1. `Invalid Manifest Content`

1. `The S3 Batch Operations job failed because it contains more keys than the maximum allowed in a single job`

1. `Invalid object key format`

1. `Manifest file is not properly formatted`

1. `Invalid version ID format`

1. `ETag format is invalid`

### InvalidManifestContent 작업 실패를 방지하는 모범 사례
<a name="invalidmanifestcontent-prevention"></a>

1. **업로드 전 검증** - 대규모 데이터세트를 처리하기 전에 작은 작업으로 매니페스트 형식을 테스트합니다.

1. **일관된 인코딩 사용** - 매니페스트 파일에 대해 항상 BOM 없이 UTF-8 인코딩을 사용합니다.

1. **매니페스트 생성 표준 구현** - 매니페스트 생성을 위한 템플릿 및 검증 절차를 생성합니다.

1. **특수 문자를 올바르게 처리** - 특수 문자가 포함된 객체 키를 URL 인코딩합니다.

1. **객체 수 모니터링** - 매니페스트 크기를 추적하고 대규모 작업을 사전에 분할합니다.

1. **객체 존재 확인** - 매니페스트에 객체를 포함하기 전에 객체가 존재하는지 확인합니다.

1. **매니페스트 생성을 위한 AWS 도구 사용** - AWS CLI `s3api list-objects-v2`를 활용하여 적절한 형식의 객체 목록을 생성합니다.

일반적인 매니페스트 문제 및 해결 방법:

1. **필수 열 누락** - 매니페스트에 작업 유형에 필요한 모든 열이 포함되어 있는지 확인합니다. 가장 일반적인 누락된 열은 Bucket과 Key입니다.

1. **잘못된 CSV 형식** - 쉼표 구분 기호를 사용하고 모든 행에서 일관된 열 수를 보장하며 필드 내에 포함된 줄 바꿈을 방지합니다.

1. **객체 키의 특수 문자** - 공백, 유니코드 문자 또는 XML 특수 문자(<, >, &, ", ')가 포함된 객체 키를 URL 인코딩합니다.

1. **대용량 매니페스트 파일** - 작업 한도 이상의 매니페스트를 여러 개의 작은 매니페스트로 분할하고 별도의 작업을 생성합니다.

1. **잘못된 버전 ID** - 버전 ID 형식이 올바른 영숫자 문자열인지 확인합니다. 필요하지 않은 경우 버전 ID 열을 제거합니다.

1. **인코딩 문제** - 매니페스트 파일을 BOM 없이 UTF-8로 저장합니다. 인코딩을 변경할 수 있는 시스템을 통해 매니페스트를 복사하지 마세요.

자세한 매니페스트 형식 사양 및 예제는 다음을 참조하세요.

1. [매니페스트 지정](batch-ops-create-job.md#specify-batchjob-manifest)

1. [S3 배치 작업에서 지원하는 작업](batch-ops-operations.md)

1. [Amazon S3 객체 이름 지정](object-keys.md)

### InvalidManifestContent 문제 해결
<a name="invalidmanifestcontent-troubleshooting"></a>

1. 매니페스트 파일을 다운로드 및 검사합니다. 매니페스트가 다음의 형식 요구 사항을 충족하는지 수동으로 확인합니다.

   1. 쉼표 구분 기호가 있는 CSV 형식일 것.

   1. BOM을 사용하지 않는 UTF-8 인코딩일 것.

   1. 모든 행에서 열 수가 일관적일 것.

   1. 빈 줄이나 후행 공백이 없을 것.

   1. 객체 키에 특수 문자가 포함된 경우 올바르게 URL 인코딩되어야 할 것.

   매니페스트 파일을 다운로드하려면 다음 명령을 사용합니다.

   ```
   aws s3 cp s3://amzn-s3-demo-bucket1/manifest-key ./manifest.csv 
   ```

1. 작업에 필요한 열을 확인합니다.

   1. 모든 작업: `Bucket`, `Key` 

   1. 복사 작업: `VersionId`(선택 사항)

   1. 복원 작업: `VersionId`(선택 사항)

   1. 태그 교체 작업: 추가 열이 필요하지 않습니다.

   1. ACL 교체 작업: 추가 열이 필요하지 않습니다.

   1. 복원 시작: `VersionId`(선택 사항)

1. 객체 수 제한을 확인합니다.

   1. 복사: 최대 10억 개의 객체.

   1. 삭제: 최대 10억 개의 객체.

   1. 복원: 최대 10억 개의 객체.

   1. 태그 지정: 최대 10억 개의 객체.

   1. ACL: 최대 10억 개의 객체.

1. 원본 매니페스트의 몇 가지 객체를 사용하여 테스트 매니페스트를 생성합니다.

1. 다음 명령을 사용하여 매니페스트의 객체 샘플이 존재하는지 확인합니다.

   ```
   aws s3 ls s3://amzn-s3-demo-bucket1/object-key
   ```

1. 작업 실패 세부 정보를 확인하고 작업 설명에서 실패 이유와 특정 오류 세부 정보를 검토합니다.

   ```
   aws s3control describe-job --account-id 111122223333 --job-id job-id                        
   ```