

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用分布式 Map 状态的 IAM 策略
<a name="iam-policies-eg-dist-map"></a>

当您使用 Step Functions 控制台创建工作流时，Step Functions 可以根据工作流定义中的资源自动生成 IAM 策略。生成的策略包括允许状态机角色调用*分布式地图状态*的 `[StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)` API 操作和访问 AWS 资源（例如 Amazon S3 存储桶和对象以及 Lambda 函数）所需的最低权限。

我们建议在 IAM 策略中仅包括必需的权限。例如，如果您的工作流包含分布式模式下的 `Map` 状态，则将策略范围缩小到包含您的数据的特定 Amazon S3 存储桶和文件夹。

**重要**  
如果您在*分布式 Map 状态* 输入中指定了 Amazon S3 存储桶和对象或前缀，并将[参考路径](amazon-states-language-paths.md#amazon-states-language-reference-paths)指向现有键值对，请务必更新工作流程的 IAM 策略。将策略范围缩小到运行时该路径解析到的存储桶和对象名称。

## 运行分布式 Map 状态的 IAM 策略示例
<a name="iam-policy-run-dist-map"></a>

当您在工作流中包含*分布式 Map 状态* 时，Step Functions 需要适当的权限才能允许状态机角色为*分布式 Map 状态* 调用 `[StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)` API 操作。

以下 IAM 策略示例授予您的状态机角色运行*分布式 Map 状态* 所需的最低权限。

**注意**  
确保将 `stateMachineName` 替换为使用*分布式 Map 状态* 的状态机的名称。例如 `arn:aws:states:region:account-id:stateMachine:mystateMachine`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:StartExecution"
      ],
      "Resource": [
        "arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachineName"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "states:DescribeExecution"
      ],
      "Resource": "arn:aws:states:us-east-1:123456789012:execution:myStateMachineName:*"
    }
  ]
}
```

## redriving分布式 Map 的 IAM 策略示例
<a name="iam-policy-redrive-dist-map"></a>

您可以通过[redriving](redrive-executions.md)[父工作流](state-map-distributed.md#dist-map-orchestrate-parallel-workloads-key-terms)，重新启动未成功的子工作流执行。redriven父工作流会redrives所有未成功的状态，包括分布式 Map。确保您的执行角色具有允许其在父工作流上调用 `[RedriveExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_RedriveExecution.html)` API 操作所需的最低权限。

下面的 IAM 策略示例授予状态机角色redriving*分布式 Map 状态* 所需的最低权限。

**注意**  
确保将 `stateMachineName` 替换为使用*分布式 Map 状态* 的状态机的名称。例如 `arn:aws:states:region:account-id:stateMachine:mystateMachine`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:RedriveExecution"
      ],
      "Resource": "arn:aws:states:us-east-2:123456789012:execution:myStateMachineName/myMapRunLabel:*"
    }
  ]
}
```

## 从 Amazon S3 数据集读取数据的 IAM 策略示例
<a name="iam-policy-eg-item-reader"></a>

以下示例展示了使用 [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 和 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)API 操作授予访问您的 Amazon S3 数据集所需的最低权限的技术。

**Example 使用 Amazon S3 对象作为数据集的条件**  
以下条件授予访问 Amazon S3 存储桶的 `processImages` 文件夹中的对象所需的最低权限。  

```
"Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ],
"Condition": {
   "StringLike": { 
      "s3:prefix": [ "processImages" ]
   }
}
```

**Example 使用 CSV 文件作为数据集**  
以下示例显示了访问名为 `ratings.csv` 的 CSV 文件所需的操作。  

```
"Action": [ "s3:GetObject" ],
"Resource": [
   "arn:aws:s3:::amzn-s3-demo-bucket/csvDataset/ratings.csv"
   ]
```

**Example 使用 Amazon S3 清单作为数据集**  
下面显示了 Amazon S3 清单和数据文件的示例资源。  

```
"Resource": [
   "arn:aws:s3:::myPrefix/amzn-s3-demo-bucket/myConfig-id/YYYY-MM-DDTHH-MMZ/manifest.json",
   "arn:aws:s3:::myPrefix/amzn-s3-demo-bucket/myConfig-id/data/*"
   ]
```

**Example 使用 ListObjects V2 限制使用文件夹前缀**  
使用 [ListObjectsV2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 时，将生成两个策略。其中一个策略用于允许**列出**存储桶的内容 (`ListBucket`)，另一个策略将允许**检索存储桶中的对象** (`GetObject`)。  
下面显示了示例操作、资源和条件：  

```
"Action": [ "s3:ListBucket" ],
"Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ],
"Condition": {
   "StringLike": {
      "s3:prefix": [ "/path/to/your/json/" ]
   }
}
```

```
"Action": [ "s3:GetObject" ],
"Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/path/to/your/json/*" ]
```
请注意，`GetObject` 不会限定范围，您将为对象使用通配符 (`*`)。

## 将数据写入 Amazon S3 存储桶的 IAM 策略示例
<a name="iam-policy-eg-result-writer"></a>

以下 IAM 策略示例授予使用 `[PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)` API 操作将子工作流程执行结果写入 Amazon S3 存储桶*csvJobs*中名为的文件夹所需的最低权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/csvJobs/*"
            ]
        }
    ]
}
```

### AWS KMS key 加密的 Amazon S3 存储桶的 IAM 权限
<a name="multiupload-dmap-result-policy"></a>

*分布式 Map 状态* 使用多部份内容上传将子工作流执行结果写入 Amazon S3 存储桶。如果使用 AWS Key Management Service (AWS KMS) 密钥对存储桶进行加密，则还必须在 IAM 策略中包含对密钥执行 `kms:Decrypt`、`kms:Encrypt` 和 `kms:GenerateDataKey` 操作的权限。这些权限是必需的，因为 Amazon S3 必须在完成分段上传之前解密并读取加密的文件段中的数据。

下面的 IAM 策略示例对用于加密 Amazon S3 存储桶的密钥的 `kms:Decrypt`、`kms:Encrypt` 和 `kms:GenerateDataKey` 操作授予了权限。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:Encrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": [
      "arn:aws:kms:us-east-1:123456789012:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    ]
  }
}
```

有关更多信息，请参阅 *AWS 知识中心 *中的[用 AWS KMS key加密将大型文件上传到 Amazon S3 ](https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/)。

如果您的 IAM 用户或角色与 AWS 账户 相同KMS key，则您必须对密钥策略拥有这些权限。如果您的 IAM 用户或角色属于与 KMS key 不同的账户，您必须在密钥政策和 IAM 用户或角色中具有这些权限。