

# 使用任务标签控制批量操作的权限
<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"        
                    ]      
                }    
            }  
        }  
    ]
}
```

------