

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# IAM 角色設定
<a name="emr-spark-upgrade-agent-iam-role"></a>

## 先決條件
<a name="emr-spark-upgrade-agent-iam-prerequisites"></a>

開始前，請確保您具備以下條件：
+ 具有 IAM 管理存取權 AWS 的帳戶
+ AWS 已安裝並設定 CLI。如需詳細資訊，請參閱[安裝 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ 用於暫存升級成品的 Amazon S3 儲存貯體

設定下列變數以用於後續命令 (`my-staging-bucket`以您的儲存貯體名稱取代）：

```
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGION=$(aws configure get region)
STAGING_BUCKET=my-staging-bucket
```

## 步驟 1：建立 IAM 角色
<a name="emr-spark-upgrade-agent-iam-step1"></a>

SMUS MCP 伺服器使用您的 IAM 角色來授權 AWS 服務層級的操作。不需要單獨的 MCP 特定許可。

**建立 IAM 角色 (AWS CLI)**

1. 建立信任政策文件：

   ```
   cat > mcp-trust-policy.json << EOF
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Sid": "AllowAccountToAssumeRole",
         "Effect": "Allow",
         "Principal": { "AWS": "arn:aws:iam::${ACCOUNT_ID}:root" },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   EOF
   ```

1. 建立角色：

   ```
   aws iam create-role \
     --role-name SparkUpgradeMCPRole \
     --assume-role-policy-document file://mcp-trust-policy.json
   ```

## 步驟 2：連接部署模式的許可
<a name="emr-spark-upgrade-agent-iam-step2"></a>

連接符合您 EMR 部署平台的許可政策。

### 選項 A：EC2 上的 EMR
<a name="emr-spark-upgrade-agent-iam-emr-ec2"></a>

1. 建立政策文件 (`<STAGING_BUCKET>`以您的 Amazon S3 儲存貯體名稱取代）：

   ```
   cat > emr-ec2-upgrade-policy.json << EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "elasticmapreduce:DescribeCluster",
           "elasticmapreduce:DescribeStep",
           "elasticmapreduce:ListSteps",
           "elasticmapreduce:ListClusters",
           "elasticmapreduce:DescribeJobFlows",
           "elasticmapreduce:AddJobFlowSteps",
           "elasticmapreduce:CreatePersistentAppUI",
           "elasticmapreduce:DescribePersistentAppUI",
           "elasticmapreduce:GetPersistentAppUIPresignedURL"
         ],
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": ["s3:GetBucket*", "s3:GetObject*", "s3:List*", "s3:Put*"],
         "Resource": [
           "arn:aws:s3:::${STAGING_BUCKET}",
           "arn:aws:s3:::${STAGING_BUCKET}/*"
         ]
       }
     ]
   }
   EOF
   ```

1. 連接政策：

   ```
   aws iam put-role-policy \
     --role-name SparkUpgradeMCPRole \
     --policy-name EMREC2UpgradeAccess \
     --policy-document file://emr-ec2-upgrade-policy.json
   ```

或者，為您的預備儲存貯體連接 [AmazonElasticMapReduceFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonElasticMapReduceFullAccess.html) 受管政策加上 Amazon S3 政策。

#### KMS 許可 - 預備儲存貯體
<a name="emr-spark-upgrade-agent-iam-kms-staging"></a>

如果預備儲存貯體使用 CMK 加密，請新增下列政策。上傳資料時，服務會自動使用在儲存貯體上設定的 CMK (`<KEY_ID>`以 KMS 金鑰 ID 取代）：

```
aws iam put-role-policy \
  --role-name SparkUpgradeMCPRole \
  --policy-name KMSStagingBucketEncrypt \
  --policy-document "{
    \"Version\": \"2012-10-17\",
    \"Statement\": [{
      \"Effect\": \"Allow\",
      \"Action\": [\"kms:GenerateDataKey\", \"kms:Encrypt\"],
      \"Resource\": \"arn:aws:kms:${REGION}:${ACCOUNT_ID}:key/<KEY_ID>\"
    }]
  }"
```

### 選項 B：EMR Serverless
<a name="emr-spark-upgrade-agent-iam-emr-serverless"></a>

1. 建立政策文件 (`<STAGING_BUCKET>`以您的 Amazon S3 儲存貯體名稱取代）：

   ```
   cat > emr-serverless-upgrade-policy.json << EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "emr-serverless:StartJobRun",
           "emr-serverless:GetJobRun",
           "emr-serverless:GetApplication",
           "emr-serverless:ListApplications",
           "emr-serverless:GetDashboardForJobRun"
         ],
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": "iam:PassRole",
         "Resource": "*",
         "Condition": {
           "StringLike": {
             "iam:PassedToService": "emr-serverless.amazonaws.com"
           }
         }
       },
       {
         "Effect": "Allow",
         "Action": ["logs:GetLogEvents", "logs:DescribeLogStreams"],
         "Resource": "arn:aws:logs:*:*:log-group:*"
       },
       {
         "Effect": "Allow",
         "Action": ["s3:GetBucket*", "s3:GetObject*", "s3:List*", "s3:Put*"],
         "Resource": [
           "arn:aws:s3:::${STAGING_BUCKET}",
           "arn:aws:s3:::${STAGING_BUCKET}/*"
         ]
       }
     ]
   }
   EOF
   ```

1. 連接政策：

   ```
   aws iam put-role-policy \
     --role-name SparkUpgradeMCPRole \
     --policy-name EMRServerlessUpgradeAccess \
     --policy-document file://emr-serverless-upgrade-policy.json
   ```

#### KMS 許可 - 預備儲存貯體
<a name="emr-spark-upgrade-agent-iam-kms-staging-serverless"></a>

如果預備儲存貯體使用 CMK 加密，請新增下列政策。上傳資料時，服務會自動使用在儲存貯體上設定的 CMK (`<KEY_ID>`以 KMS 金鑰 ID 取代）：

```
aws iam put-role-policy \
  --role-name SparkUpgradeMCPRole \
  --policy-name KMSStagingBucketEncrypt \
  --policy-document "{
    \"Version\": \"2012-10-17\",
    \"Statement\": [{
      \"Effect\": \"Allow\",
      \"Action\": [\"kms:GenerateDataKey\", \"kms:Encrypt\"],
      \"Resource\": \"arn:aws:kms:${REGION}:${ACCOUNT_ID}:key/<KEY_ID>\"
    }]
  }"
```

#### KMS 許可 - CloudWatch Logs
<a name="emr-spark-upgrade-agent-iam-kms-cloudwatch"></a>

如果 CloudWatch Logs 使用 CMK 加密，請新增下列政策，讓服務可以讀取 EMR Serverless 應用程式日誌 (`<KEY_ID>`以 KMS 金鑰 ID 取代）：

```
aws iam put-role-policy \
  --role-name SparkUpgradeMCPRole \
  --policy-name KMSCloudWatchLogsDecrypt \
  --policy-document "{
    \"Version\": \"2012-10-17\",
    \"Statement\": [{
      \"Effect\": \"Allow\",
      \"Action\": [\"kms:Decrypt\", \"kms:DescribeKey\"],
      \"Resource\": \"arn:aws:kms:${REGION}:${ACCOUNT_ID}:key/<KEY_ID>\"
    }]
  }"
```

## 步驟 3：設定您的 MCP 用戶端
<a name="emr-spark-upgrade-agent-iam-step3"></a>

將 MCP 用戶端 （例如，Claude Desktop 或 Amazon Q Developer) 設定為使用您建立的角色 ARN：

```
echo "arn:aws:iam::${ACCOUNT_ID}:role/SparkUpgradeMCPRole"
```

請參閱 MCP 用戶端的文件，了解如何設定 AWS 登入資料 （通常是透過擔任此角色的 AWS 設定檔）。

## MCP 伺服器請求的條件索引鍵
<a name="emr-spark-upgrade-agent-mcp-permissions-change"></a>

兩個條件索引鍵會自動新增至透過 SMUS MCP 伺服器提出的所有請求：
+ `aws:ViaAWSMCPService` – `true` 針對透過 AWS 受管 MCP 伺服器提出的任何請求，將 設定為 。
+ `aws:CalledViaAWSMCP` – 設定為 MCP 伺服器服務主體 （例如 `sagemaker-unified-studio-mcp.amazonaws.com`)。

當請求來自 AWS 受管 MCP 伺服器時，您可以使用這些條件金鑰來控制對 資源的存取。

**範例：只有在透過 SMUS MCP 伺服器存取時，才允許 EMR 操作：**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowEMRReadViaSMUSMCP",
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:DescribeCluster",
        "elasticmapreduce:ListClusters",
        "elasticmapreduce:ListSteps",
        "emr-serverless:GetJobRun",
        "emr-serverless:GetApplication"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:CalledViaAWSMCP": "sagemaker-unified-studio-mcp.amazonaws.com"
        }
      }
    }
  ]
}
```

**範例：透過任何 AWS 受管 MCP 伺服器拒絕所有操作：**

```
{
  "Effect": "Deny",
  "Action": "*",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "aws:ViaAWSMCPService": "true"
    }
  }
}
```

**範例：透過特定 AWS 受管 MCP 伺服器拒絕特定操作：**

```
{
  "Effect": "Deny",
  "Action": ["glue:GetJobRun", "glue:StartJobRun"],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:CalledViaAWSMCP": "sagemaker-unified-studio-mcp.amazonaws.com"
    }
  }
}
```

如需條件索引鍵的詳細資訊，請參閱《*IAM 使用者指南*》中的[AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。