

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 が自動的に使用されます ( を KMS キー ID `<KEY_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 が自動的に使用されます ( を KMS キー ID `<KEY_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 アプリケーションログを読み取れるように、次のポリシーを追加します ( を KMS キー ID `<KEY_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>

作成したロール ARN を使用するように MCP クライアント (Claude Desktop や Amazon Q Developer など) を設定します。

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

 AWS 認証情報の設定方法については、MCP クライアントのドキュメントを参照してください (通常は、このロールを引き受ける AWS プロファイル経由）。

## MCP サーバーリクエストの条件キー
<a name="emr-spark-upgrade-agent-mcp-permissions-change"></a>

SMUS MCP サーバーを介して行われたすべてのリクエストに 2 つの条件キーが自動的に追加されます。
+ `aws:ViaAWSMCPService` – AWS マネージド MCP サーバーを介して行われたリクエスト`true`の場合は、 に設定します。
+ `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)」を参照してください。