

# 使用标签控制访问和标记任务
<a name="batch-ops-job-tags"></a>

您可以通过添加*标签*来标记和控制对 S3 分批操作任务的访问。标签可用于确定谁负责分批操作任务。任务标签的存在可授予或限制用户取消任务、激活处于确认状态的任务或更改任务优先级的能力。可以创建附加了标签的任务，并且可以在创建任务后向任务添加标签。每个标签都是一个键值对，可以在创建任务或稍后更新时包含该键值对。

**警告**  
确保任务标签中不包含任何机密信息或个人数据。

考虑以下标记示例：假设您希望您的财务部门创建一个分批操作任务。您可以编写允许用户调用 `CreateJob` 的 AWS Identity and Access Management (IAM) 策略，前提是创建任务时使用分配了 `Finance` 值的 `Department` 标签。此外，您可以将该策略附加到作为财务部门成员的所有用户。

继续使用此示例，您可以编写一个策略，允许用户更新具有所需标签的任何任务的优先级，或者取消具有这些标签的任何任务。有关更多信息，请参阅 [使用任务标签控制批量操作的权限](batch-ops-job-tags-examples.md)。

您可以在创建新的 S3 分批操作任务时向其添加标签，也可以将向现有任务添加标签。

注意以下标签限制：
+ 只要任务具有唯一的标签键，就可以将最多 50 个标签与该任务关联。
+ 标签键的长度最大可以为 128 个 Unicode 字符，标签值的长度最大可以为 256 个 Unicode 字符。
+ 键和值区分大小写。

有关标签限制的更多信息，请参阅《*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) – 返回与批量操作任务关联的标签集。
+ [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) – 删除与批量操作任务关联的标签集。

# 使用用于标记的任务标签创建分批操作任务
<a name="batch-ops-tags-create"></a>

可以通过添加*标签* 来标注 Amazon S3 批量操作任务和控制对任务的访问。标签可用于确定谁负责分批操作任务。您可以创建附加了标签的任务，并且可以在创建任务后向任务添加标签。有关更多信息，请参阅 [使用标签控制访问和标记任务](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 开发工具包
<a name="batch-ops-examples-java-job-with-tags-create"></a>

要使用适用于 Java 的 AWS SDK 创建带有标签的 S3 批量操作任务，可以使用 S3Control 客户端来配置任务参数，包括清单位置、任务操作、报告设置以及用于组织和跟踪目的的标签。

有关如何使用适用于 Java 的 AWS SDK 创建带有标签的 S3 批量操作任务的示例，请参阅《Amazon S3 API Reference》**中的 [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 批量操作任务中删除标签。

## 使用 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>

要使用适用于 Java 的 AWS SDK 删除 S3 批量操作任务的标签，可以使用 S3Control 客户端以及任务 ID 来移除与批量操作任务关联的所有标签。

有关如何使用适用于 Java 的 AWS SDK 删除任务标签的示例，请参阅《Amazon S3 API Reference》**中的 [Delete tags from a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_DeleteJobTagging_section.html)。

# 向现有批量操作任务添加任务标签
<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 批量操作任务添加任务标签。有关更多信息，请参阅以下示例。

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

以下是使用 AWS CLI 通过 `s3control put-job-tagging` 向 S3 批量操作任务添加任务标签的示例。要使用这些示例，请将 *`user input placeholders`* 替换为您自己的信息。

**注意**  
如果您发送带有空标签集的此请求，批量操作将删除对象上的现有标签集。但是，如果您使用此方法，则需为套餐 1 请求 (`PUT`) 付费。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing)。  
相反，要删除批量操作任务的现有标签，建议使用 `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>

要使用适用于 Java 的 AWS SDK 在 S3 批量操作任务上放置标签，可以使用 S3Control 客户端来添加或更新带有键值对的标签，以用于整理和跟踪目的。

有关如何使用适用于 Java 的 AWS SDK 放置任务标签的示例，请参阅《Amazon S3 API Reference》**中的 [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 批量操作任务的标签，可以使用 `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>

要使用适用于 Java 的 AWS SDK 获取 S3 批量操作任务的标签，可以使用 S3Control 客户端以及任务 ID 来检索与批量操作任务关联的所有标签，并将其作为列表返回。

有关如何使用适用于 Java 的 AWS SDK 获取任务标签的示例，请参阅《Amazon S3 API Reference》**中的 [Get tags from a batch job](https://docs.aws.amazon.com/AmazonS3/latest/API/s3-control_example_s3-control_GetJobTagging_section.html)。

# 使用任务标签控制批量操作的权限
<a name="batch-ops-job-tags-examples"></a>

为了协助您管理 Amazon S3 批量操作任务，可以添加*任务标签*。借助任务标签，您可以控制对 S3 分批操作任务的访问，并强制在创建任何任务时应用标签。

您最多可以为每个分批操作任务应用 50 个任务标签。通过使用标签，可以设置精细的策略，来限制可以编辑任务的用户集。任务标签可授予或限制用户取消任务、激活处于确认状态的任务或更改任务优先级的能力。此外，您可以强制将标签应用于所有新任务，并为标签指定允许的键值对。可以使用 [AWS Identity and Access Management（IAM）策略语言](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_iam-tags.html)来表达所有这些条件。有关更多信息，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for 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 或生产。

在此示例中，您在 IAM 策略中使用 S3 批量操作任务标签，来向用户授予创建和编辑只能在其部门内运行的任务的权限。您可以根据与任务相关的开发阶段分配任务，例如 QA 或生产。

下面的示例使用以下部门，每个部门使用批量操作的方式均不同：
+ 财务
+ 合规性
+ 商业智能
+ 工程

**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 是一种 IAM 授权策略，它通过向用户和 AWS 资源附加标签来定义权限。

为用户和任务分配以下部门标签之一：

**键 : 值**
+ `department : Finance`
+ `department : Compliance`
+ `department : BusinessIntelligence`
+ `department : Engineering`
**注意**  
任务标签键和值区分大小写。

使用 ABAC 访问控制策略，您可以授予“财务”部门中的用户在其部门内创建和管理 S3 批量操作任务的权限，方法是将标签 `department=Finance` 与其用户关联。

此外，您可以将托管策略附加到 IAM 用户，此策略允许公司中的任何用户在其各自部门内创建或修改 S3 分批操作任务。

此示例中的策略包括三个策略语句：
+ 策略中的第一个语句允许用户创建分批操作任务，前提是任务创建请求包含与其各自部门匹配的任务标签。这使用 `"${aws:PrincipalTag/department}"` 语法表示，该语法在策略评估时被用户的部门标签所取代。当在请求 `("aws:RequestTag/department")` 中为部门标签提供的值与用户的部门匹配时，该条件将得到满足。
+ 策略中的第二个语句允许用户更改任务的优先级或更新任务的状态，前提是用户正在更新的任务与用户的部门匹配。
+ 第三个语句允许用户随时通过 `PutJobTagging` 请求更新分批操作任务的标签，只要 (1) 其部门标签被保留，并且 (2) 他们正在更新的任务位于其部门内。

------
#### [ 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 或 生产 中创建高优先级任务的能力。为了满足这一需求，您可以创建一个根据上一节中的低优先级策略改写的托管策略。

该策略执行以下操作：
+ 允许用户使用标签 `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"        
                    ]      
                }    
            }  
        }  
    ]
}
```

------