

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

# Amazon SageMaker Unified Studio での信頼できる ID の伝播の使用
<a name="tutorial-tip-smus"></a>

このチュートリアルでは、Trusted Identity Propagation (TIP) を使用して EMR Serverless アプリケーションをセットアップする方法を示します。次に、Amazon SageMaker Unified Studio を介してアイデンティティベースのアクセスコントロールを使用してサンプルテーブルをクエリします。この設定では、EMR Serverless は各ユーザーの Spark クエリを独自の IAM アイデンティティセンター ID で実行し、Lake Formation は AWS Glue データカタログテーブルにユーザーごとのアクセス許可を適用します。

**EMR Studio インタラクティブワークロードで TIP がサポートされていない**  
EMR Studio を介したインタラクティブワークロードは、EMR Serverless による信頼できる ID の伝播をサポートしていません。TIP 対応インタラクティブワークロードのクライアント向けアプリケーションとして、Amazon SageMaker Unified Studio を使用します。

**コスト**  
このチュートリアルでは、EMR Serverless、、Amazon Simple Storage Service AWS Lake Formation AWS IAM アイデンティティセンター、Amazon SageMaker Unified Studio など、料金が発生する可能性のある AWS サービスを使用します。継続的な料金を回避するには、このチュートリアルの最後にあるクリーンアップステップに従います。料金情報については、各サービスの料金ページを参照してください。

## 前提条件と設定
<a name="tutorial-tip-smus-prereqs"></a>

信頼できる ID 伝達を使用してデータをクエリする前に、必要なすべてのリソースをセットアップするには、次の手順を実行します。

### ステップ 1: IAM Identity Center をセットアップする
<a name="tutorial-tip-smus-step1-idc"></a>

1.  AWS アカウントで [IAM Identity Center を有効にします](https://docs.aws.amazon.com/singlesignon/latest/userguide/enable-identity-center.html)。IAM Identity Center インスタンスは、アカウントごとに 1 つのリージョンにのみ存在できます。
**重要**  
IAM アイデンティティセンターがデプロイされているリージョンを書き留めます。後続のすべてのリソース (Lake Formation、EMR Serverless、 AWS Glue) は、同じリージョンに作成する必要があります。たとえば、IAM アイデンティティセンターが us-west-2 にある場合、すべてのリソースも us-west-2 にある必要があります。

1. [ユーザーとグループを ](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)IAM アイデンティティセンターにプロビジョニングするには、手動で行うか、外部 ID プロバイダー (Okta や Microsoft Entra ID など) から同期します。

1. IAM Identity Center インスタンス ARN を書き留めます。以降のステップで必要になります。IAM Identity Center コンソールの設定で検索します****。

   プログラムでインスタンスを検索するには、以下を実行します。

   ```
   aws sso-admin list-instances --region {{your-region}}
   ```

   出力の例:

   ```
   {
       "Instances": [
           {
               "InstanceArn": "arn:aws:sso:::instance/ssoins-1234567890abcdef",
               "IdentityStoreId": "d-1234567890",
               "OwnerAccountId": "123456789012",
               "Status": "ACTIVE"
           }
       ]
   }
   ```

### ステップ 2: IAM アイデンティティセンターで Lake Formation を設定する
<a name="tutorial-tip-smus-step2-lf"></a>

1. Lake Formation コンソール を開く

1. [データレイク管理者](https://docs.aws.amazon.com/lake-formation/latest/dg/admins-setup.html)を設定します。
**重要**  
これらのコマンドの実行に使用する IAM ロールまたはユーザーが、Lake Formation の Data Lake 管理者として追加されていることを確認します。そうしないと、データベースまたはテーブルの作成時に「不十分な Lake Formation アクセス許可 (複数可）」エラーが発生します。ロールを管理者として追加するには:

   ```
   aws lakeformation put-data-lake-settings \
       --data-lake-settings '{
           "DataLakeAdmins": [
               {"DataLakePrincipalIdentifier": "arn:aws:iam::{{account-id}}:role/{{your-role}}"}
           ],
           "CreateDatabaseDefaultPermissions": [],
           "CreateTableDefaultPermissions": [],
           "Parameters": {"CROSS_ACCOUNT_VERSION": "3", "SET_CONTEXT": "TRUE"}
       }'
   ```

1. ステップ 1 でメモしたインスタンス ARN を使用して、Lake Formation の IAM Identity Center 統合を作成します。

   ```
   aws lakeformation create-lake-formation-identity-center-configuration \
       --catalog-id {{account-id}} \
       --instance-arn "arn:aws:sso:::instance/ssoins-{{instance-id}}"
   ```

1. Lake Formation ロケーション登録用の IAM ロールを作成します。信頼された ID の伝播にサービスにリンクされたロールを使用しないでください。詳細については、[「IAM Identity Center を使用した AWS Lake Formation のセットアップ](https://docs.aws.amazon.com/singlesignon/latest/userguide/tip-tutorial-lf.html)」を参照してください。

   **信頼ポリシー:**

   ```
   {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "lakeformation.amazonaws.com"
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:SetContext"
               ]
           }
       ]
   }
   ```
**sts:SetContext は必須です**  
信頼ポリシーには`sts:SetContext`、信頼できる ID の伝播に必要な が含まれている必要があります。デフォルトのウィザードによって作成された IAM ロールは、サービスにリンクされたロールであり、 は含まれません`sts:SetContext`。以前にサービスにリンクされたロールでロケーションを登録した場合は、 を含むカスタムロールで再登録する必要があります`sts:SetContext`。

   **アクセス許可ポリシー** (Amazon S3 データロケーションへのアクセスを許可します）。

   ```
   {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Sid": "LakeFormationDataAccessPermissionsForS3",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:DeleteObject"
               ],
               "Resource": [
                   "arn:aws:s3:::{{your-data-bucket}}/*"
               ]
           },
           {
               "Sid": "LakeFormationDataAccessPermissionsForS3ListBucket",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::{{your-data-bucket}}"
               ]
           }
       ]
   }
   ```

   ロールを作成し、ポリシーをアタッチします。

   ```
   aws iam create-role \
       --role-name LFLocationRegistrationRole \
       --assume-role-policy-document file://lf-trust-policy.json \
       --description "Lake Formation location registration role with sts:SetContext for TIP"
   
   aws iam put-role-policy \
       --role-name LFLocationRegistrationRole \
       --policy-name LFDataAccessPolicy \
       --policy-document file://lf-permissions-policy.json
   ```

1. 作成したロールを使用して、Amazon S3 データロケーションを Lake Formation に登録します。

   ```
   aws lakeformation register-resource \
       --resource-arn "arn:aws:s3:::{{your-data-bucket}}" \
       --role-arn "arn:aws:iam::{{account-id}}:role/LFLocationRegistrationRole"
   ```

1. サンプルデータを指すデータベースとテーブルを AWS Glue データカタログに作成します。

1. データベースとテーブルの両方に対するアクセス許可を IAM Identity Center ユーザーまたはグループに付与します。
**重要**  
テーブルの SELECT と DESCRIBE に加えて、データベースに DESCRIBE を付与する必要があります。データベースレベルのアクセス許可がない場合、アイデンティティベースのアクセスを使用する場合、データベースは SHOW DATABASES の結果に表示されません。

   **コンソールの使用:**

   1. Lake Formation コンソールで、**データレイクのアクセス許可** > **許可**を選択します。

   1. **プリンシパル**で、**IAM アイデンティティセンターのユーザーとグループ**を選択し、ユーザーまたはグループを選択します。

   1. **名前付きデータカタログリソース**で、データベースを選択します。

   1. **データベースのアクセス許可**で、**Describe** を選択します。

   1. **[付与]** を選択します。

   1. ステップ 1 ～ 5 を繰り返します。今回はテーブルを選択し、テーブルの下で **Select** と **Describe** のアクセス許可を付与します。 ****

   **の使用 AWS CLI:**
**重要**  
Lake Formation 許可の IAM アイデンティティセンターユーザーのプリンシパル識別子形式は です`arn:aws:identitystore:::user/<UserId>`。トリプルコロン (:::) を書き留めます。リージョンまたはアカウントが指定されていません。ID ストアから UserId を取得します。

   ```
   # List users to get their UserIds
   aws identitystore list-users --identity-store-id {{identity-store-id}} --region {{your-region}}
   
   # Grant DESCRIBE on the database
   aws lakeformation grant-permissions \
       --principal '{"DataLakePrincipalIdentifier": "arn:aws:identitystore:::user/{{UserId}}"}' \
       --permissions '["DESCRIBE"]' \
       --resource '{"Database": {"DatabaseName": "{{tip_tutorial_db}}", "CatalogId": "{{account-id}}"}}'
   
   # Grant SELECT and DESCRIBE on the table
   aws lakeformation grant-permissions \
       --principal '{"DataLakePrincipalIdentifier": "arn:aws:identitystore:::user/{{UserId}}"}' \
       --permissions '["SELECT","DESCRIBE"]' \
       --resource '{"Table": {"DatabaseName": "{{tip_tutorial_db}}", "Name": "{{employees}}", "CatalogId": "{{account-id}}"}}'
   ```

### ステップ 3: TIP 対応 EMR Serverless アプリケーションを作成する
<a name="tutorial-tip-smus-step3-create-app"></a>

IAM ロールに、アプリケーションを作成するために必要な IAM アイデンティティセンターのアクセス許可があることを確認します。

```
"sso:DescribeInstance",
"sso:CreateApplication", 
"sso:DeleteApplication",
"sso:PutApplicationAuthenticationMethod",
"sso:PutApplicationAssignmentConfiguration",  
"sso:PutApplicationGrant", 
"sso:PutApplicationAccessScope"
```

信頼できる ID の伝播、Apache Livy エンドポイントの有効化、メタストアとして設定された AWS Glue データカタログを使用してアプリケーションを作成します。

```
aws emr-serverless create-application \
    --release-label emr-7.8.0 \
    --type "SPARK" \
    --identity-center-configuration '{"identityCenterInstanceArn": "arn:aws:sso:::instance/ssoins-{{instance-id}}"}' \
    --interactive-configuration '{"livyEndpointEnabled":true}' \
    --runtime-configuration '[{"classification": "spark-defaults", "properties": {"spark.sql.catalogImplementation": "hive", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"}}]'
```

**重要**  
**AWS CLI バージョン要件:** `--identity-center-configuration`、`--interactive-configuration`、および `--runtime-configuration`フラグには AWS CLI v2.15 以降が必要です。「不明なオプション」エラーが発生した場合は、 をアップグレードするか、代わりに Python boto3 (v1.35\+) AWS CLI を使用します。

```
import boto3

session = boto3.Session(profile_name='{{your-profile}}', region_name='{{your-region}}')
client = session.client('emr-serverless')

response = client.create_application(
    name='tip-tutorial-app',
    releaseLabel='emr-7.8.0',
    type='SPARK',
    identityCenterConfiguration={
        'identityCenterInstanceArn': 'arn:aws:sso:::instance/ssoins-{{instance-id}}'
    },
    interactiveConfiguration={
        'livyEndpointEnabled': True
    },
    runtimeConfiguration=[
        {
            'classification': 'spark-defaults',
            'properties': {
                'spark.sql.catalogImplementation': 'hive',
                'spark.hadoop.hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory'
            }
        }
    ]
)
print(response['applicationId'])
```

**Glue Data Catalog メタストア設定**  
`spark.sql.catalogImplementation` および AWS Glue メタストアファクトリクラスの `runtimeConfiguration`設定により、Spark セッションは Glue データカタログ内のすべてのテーブルタイプ (CSV、Parquet、ORC、Iceberg) AWS にアクセスできます。この設定がないと、Iceberg テーブルのみが表示される場合があります。

**TIP には Apache Livy エンドポイントが必要です**  
信頼できる ID の伝播には が必要です`--interactive-configuration '{"livyEndpointEnabled":true}'`。TIP は Apache Livy エンドポイントでのみ有効になります。

必要な IAM Identity Center アクセス許可がない場合は、 `--identity-center-configuration`パラメータなしでアプリケーションを作成し、後で update-application API を使用して TIP を有効にするように IAM Identity Center 管理者に依頼します。

```
aws emr-serverless update-application \
    --application-id {{application-id}} \
    --identity-center-configuration '{"identityCenterInstanceArn": "arn:aws:sso:::instance/ssoins-{{instance-id}}"}'
```

### ステップ 4: ジョブ実行ロールを設定する
<a name="tutorial-tip-smus-step4-job-role"></a>

EMR Serverless `sts:SetContext`がユーザーの ID を使用して認証情報を強化できるようにするには、ジョブ実行ロールの信頼ポリシーに を含める必要があります。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "emr-serverless.amazonaws.com"
            },
            "Action": ["sts:AssumeRole", "sts:SetContext"]
        }
    ]
}
```

ロールを作成します。

```
aws iam create-role \
    --role-name emr-serverless-tip-job-role \
    --assume-role-policy-document file://trust-policy.json \
    --description "EMR Serverless job execution role with TIP support"
```

ジョブがアクセスするダウンストリームサービスのアクセス許可をアタッチします。このロールには、Lake Formation、 AWS Glue、Amazon S3、Amazon CloudWatch Logs のアクセス許可が必要です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LakeFormationAndGlueAccess",
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess",
                "glue:GetTable", "glue:GetTables",
                "glue:GetDatabase", "glue:GetDatabases",
                "glue:GetPartitions"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3DataAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::{{your-data-bucket}}",
                "arn:aws:s3:::{{your-data-bucket}}/*"
            ]
        },
        {
            "Sid": "CloudWatchLogsAccess",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": "arn:aws:logs:{{us-east-1}}:{{111122223333}}:*"
        }
    ]
}
```

**Lake Formation アクセス許可に加えて S3 アクセス許可が必要です**  
データバケットの Amazon S3 アクセス許可 (`s3:GetObject`、`s3:PutObject`、`s3:ListBucket`) は、Lake Formation および AWS Glue アクセス許可に加えて必要です。Spark のスクラッチデータとシャッフルデータには アクセス`s3:PutObject`許可が必要です。Amazon S3 アクセス許可がない場合、Spark ジョブは、基になるデータファイルの読み取り時または一時データの書き込み時に、アクセス拒否エラーで失敗する可能性があります。

**CloudWatch Logs のアクセス許可が必要です**  
Amazon CloudWatch Logs のアクセス許可は、Spark ドライバーとエグゼキュターのログ配信に必要です。これを行わないと、Spark セッションが開始されない可能性があります。

ロールにポリシーをアタッチします。

```
aws iam put-role-policy \
    --role-name emr-serverless-tip-job-role \
    --policy-name tip-lakeformation-access \
    --policy-document file://permissions-policy.json
```

**ジョブ実行ロールに Lake Formation アクセス許可を付与します。**

ジョブ実行ロールには、データベースとテーブルに対する Lake Formation アクセス許可も必要です。これは、IAM Identity Center ユーザーに提供される許可に追加されます。

```
# Grant DESCRIBE on the database to the job role
aws lakeformation grant-permissions \
    --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::{{account-id}}:role/emr-serverless-tip-job-role"}' \
    --permissions '["DESCRIBE"]' \
    --resource '{"Database": {"DatabaseName": "{{tip_tutorial_db}}", "CatalogId": "{{account-id}}"}}'

# Grant SELECT and DESCRIBE on the table to the job role
aws lakeformation grant-permissions \
    --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::{{account-id}}:role/emr-serverless-tip-job-role"}' \
    --permissions '["SELECT","DESCRIBE"]' \
    --resource '{"Table": {"DatabaseName": "{{tip_tutorial_db}}", "Name": "{{employees}}", "CatalogId": "{{account-id}}"}}'
```

その他のダウンストリームサービス設定については、[「EMR Serverless での Lake Formation](lake-formation-section.html) の使用」および[「EMR Serverless での Amazon S3 Access Grants の使用](access-grants.html)」を参照してください。

## Amazon SageMaker Unified Studio を使用して信頼できる ID の伝播でデータをクエリする
<a name="tutorial-tip-smus-query"></a>

セットアップが完了したら、TIP 対応の EMR Serverless アプリケーションを Amazon SageMaker Unified Studio プロジェクトのコンピューティングとして使用して、データをクエリできます。EMR Serverless は、各ユーザーのクエリを独自の IAM アイデンティティセンター ID で実行し、Lake Formation はユーザーごとのアクセス許可を適用します。

### 前提条件
<a name="tutorial-tip-smus-query-prereqs"></a>
+ TIP 対応の EMR Serverless アプリケーション (上記のステップ 3 で完了）。
+ IAM Identity Center 認証で設定された Amazon SageMaker Unified Studio ドメイン。
+ ターゲットデータベースとテーブルの IAM Identity Center ユーザーまたはグループに付与された Lake Formation アクセス許可 (上記のステップ 2 で完了）。

### ステップ 5: TIP を有効にして Amazon SageMaker Unified Studio プロジェクトを作成する
<a name="tutorial-tip-smus-query-setup-project"></a>

1. IAM アイデンティティセンターの認証情報を使用して Amazon SageMaker Unified Studio にサインインします。

1. 新しいプロジェクトを作成するか、既存のプロジェクトを開きます。

1. プロジェクト設定で、プロファイルがブループリントパラメータ`true`で を `enableTrustedIdentityPropagationPermissions` に設定していることを確認します。

### ステップ 6: EMR Serverless アプリケーションをコンピューティングとして追加する
<a name="tutorial-tip-smus-query-add-compute"></a>

Amazon SageMaker Unified Studio プロジェクトのコンピューティング設定では、現在、 コンソールを介した既存の EMR Serverless アプリケーションの追加はサポートされていません。を使用して接続 AWS CLI を作成します。

```
aws datazone create-connection \
  --domain-identifier {{domain-id}} \
  --name "{{my-emr-serverless-connection}}" \
  --environment-identifier {{environment-id}} \
  --props '{
    "sparkEmrProperties": {
      "computeArn": "arn:aws:emr-serverless:{{region}}:{{account-id}}:/applications/{{application-id}}",
      "runtimeRole": "arn:aws:iam::{{account-id}}:role/emr-serverless-tip-job-role"
    }
  }'
```

以下の値を置き換えます:
+ `{{domain-id}}`: Amazon SageMaker Unified Studio ドメイン識別子。
+ `{{environment-id}}`: プロジェクトの環境識別子 (ツール環境を使用）。
+ `{{application-id}}`: ステップ 3 の EMR Serverless アプリケーション ID。
+ `{{emr-serverless-tip-job-role}}`: ステップ 4 のジョブ実行ロール。

**重要**  
`create-connection` API では、呼び出し元が DataZone プロジェクトのメンバーである必要があります。を受け取った場合は`AccessDeniedException`、接続を作成する前に IAM ロールをプロジェクト寄稿者として追加します。

```
import boto3

session = boto3.Session(profile_name='{{your-profile}}', region_name='{{your-region}}')
client = session.client('datazone')

client.create_project_membership(
    domainIdentifier='{{domain-id}}',
    projectIdentifier='{{project-id}}',
    designation='PROJECT_CONTRIBUTOR',
    member={'userIdentifier': 'arn:aws:iam::{{account-id}}:role/{{your-role}}'}
)
```

**EMR Serverless アクセス用にプロジェクトの DataZone ユーザーロールを設定します。**

プロジェクト環境の DataZone ユーザーロールには、EMR Serverless アプリケーションを操作するためのアクセス許可が必要です。次のインラインポリシーをロールに追加します (ロール名はパターン に従います`datazone_usr_role_<project-id>_<environment-id>`)。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "emr-serverless:GetApplication",
                "emr-serverless:StartApplication",
                "emr-serverless:StopApplication",
                "emr-serverless:ListApplications",
                "emr-serverless:AccessLivyEndpoints",
                "emr-serverless:StartJobRun",
                "emr-serverless:GetJobRun",
                "emr-serverless:ListJobRuns",
                "emr-serverless:CancelJobRun",
                "emr-serverless:GetDashboardForJobRun"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::{{111122223333}}:role/emr-serverless-tip-job-role",
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "emr-serverless.amazonaws.com"
                }
            }
        }
    ]
}
```

**DataZone ユーザーロールに Lake Formation アクセス許可を付与します。**

```
# Grant DESCRIBE on the database
aws lakeformation grant-permissions \
    --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::{{account-id}}:role/datazone_usr_role_{{project-id}}_{{environment-id}}"}' \
    --permissions '["DESCRIBE"]' \
    --resource '{"Database": {"DatabaseName": "{{tip_tutorial_db}}", "CatalogId": "{{account-id}}"}}'

# Grant SELECT and DESCRIBE on the table
aws lakeformation grant-permissions \
    --principal '{"DataLakePrincipalIdentifier": "arn:aws:iam::{{account-id}}:role/datazone_usr_role_{{project-id}}_{{environment-id}}"}' \
    --permissions '["SELECT","DESCRIBE"]' \
    --resource '{"Table": {"DatabaseName": "{{tip_tutorial_db}}", "Name": "{{employees}}", "CatalogId": "{{account-id}}"}}'
```

**EMR Serverless 接続のコンソール制限**  
Amazon SageMaker Unified Studio は現在、コンソールのコンピューティング設定による既存の Amazon EMR on EC2 クラスターの追加をサポートしています。EMR Serverless アプリケーションの場合は、上記の AWS CLI 方法を使用します。

### ステップ 7: サンプルテーブルをクエリする
<a name="tutorial-tip-smus-query-run"></a>

1. Amazon SageMaker Unified Studio プロジェクトで JupyterLab IDE スペースを開きます。

1. ノートブック実行のコンピューティングとして EMR Serverless 接続を選択します。

1. 新しいノートブックセルで、次の PySpark クエリを実行します。

   ```
   %%pyspark my-emr-serverless-connection
   spark.sql("SHOW DATABASES").show()
   
   %%pyspark my-emr-serverless-connection
   spark.sql("SELECT * FROM tip_tutorial_db.employees LIMIT 10").show()
   ```

1. クエリがデータを返すことを確認します。これにより、IAM アイデンティティセンターのアイデンティティが Lake Formation に伝達され、アイデンティティに基づいてアクセスが付与されたことが確認されます。

**アプリケーションのコールドスタート**  
接続の作成後に初めてセルを実行すると、EMR Serverless はアプリケーションを起動します (コールドスタート）。これには 2～3 分かかる場合があります。後続のセルは、セッションがアクティブである間、数秒以内に実行されます。

**アクセス拒否エラーのトラブルシューティング**  
アクセス拒否エラーが表示された場合は、以下を確認します。  
IAM Identity Center ユーザーまたはグループには、データベースで DESCRIBE、Lake Formation のテーブルで SELECT/DESCRIBE が付与されています。
ジョブ実行ロールには、 `lakeformation:GetDataAccess`および AWS Glue Data Catalog アクセス許可があります。
DataZone ユーザーロールには、データベースとテーブルに対する Lake Formation アクセス許可があります。
Lake Formation Amazon S3 の場所は、 `sts:SetContext` (サービスにリンクされたロールではなく) を含むカスタムロールに登録されます。

## トラブルシューティング
<a name="tutorial-tip-smus-troubleshooting"></a>


| エラー | 原因 | Fix | 
| --- | --- | --- | 
| AccessDeniedException: emr-serverless:GetApplication | DataZone ユーザーロールに EMR Serverless アクセス許可がありません。 | EMR Serverless インラインポリシーを DataZone ユーザーロールに追加します (ステップ 6 を参照）。 | 
| アプリケーションが STARTED ステータスになるまでの待機中にタイムアウトしました | EMR Serverless アプリケーションのコールドスタートがデフォルトのタイムアウトを超えています。 | セルを再実行します。アプリはバックグラウンドで開始し続け、次の試行で準備が整います。 | 
| セッションが見つかりません。アイドルタイムアウトのためクリーンアップされました。 | ジョブ実行ロールに対するアクセス許可が不十分であるため、Spark セッションの開始に失敗しました。 | ジョブ実行ロールに Amazon S3、Amazon CloudWatch Logs、 AWS Glue、Lake Formation のアクセス許可があることを確認します (ステップ 4 を参照）。 | 
| Lake Formation のアクセス許可が不十分 (複数可): データベースで必須の説明 | ID またはロールにデータベースレベルの Lake Formation アクセス許可がありません。 | データベースの DESCRIBE を IAM Identity Center ユーザー、ジョブ実行ロール、DataZone ユーザーロールに付与します。 | 
| TABLE\_OR\_VIEW\_NOT\_FOUND | Spark セッションは AWS Glue データカタログを使用するように設定されていません。 | EMR Serverless アプリケーションに spark.sql.catalogImplementation=hiveと AWS Glue メタストアファクトリクラスが含まれていることを確認します runtimeConfiguration (ステップ 3 を参照）。 | 
| AccessDeniedException: CreateConnection | 発信者は DataZone プロジェクトのメンバーではありません。 | を呼び出す前に、プロジェクト寄稿者としてロールを追加します create-connection (ステップ 6 を参照）。 | 

## リソースをクリーンアップする
<a name="tutorial-tip-smus-cleanup"></a>

このチュートリアルで作成したリソースは、継続的な料金の発生を回避するために削除してください。

1. EMR Serverless アプリケーションを削除します。

1. Amazon SageMaker Unified Studio 接続を削除し、Amazon SageMaker Unified Studio プロジェクト (このチュートリアルでのみ作成した場合はドメイン) を削除します。

1. 付与した Lake Formation アクセス許可を取り消し、Amazon S3 データロケーションの登録を解除します。

1. ステップ 2 とステップ 4 で作成した IAM ロールを削除します。

1. テスト Amazon S3 バケットとサンプルデータをすべて削除します。

## 次の手順
<a name="tutorial-tip-smus-next-steps"></a>
+ CloudTrail で ID の伝播を確認するには、EMR Serverless サービス`sts:SetContext`から で`AssumeRole`イベントを探します。
+ 異なるユーザーのアクセスを制限するには、追加の IAM Identity Center ユーザーを作成し、同じテーブルに対して異なる Lake Formation アクセス許可 (列レベルや行レベルのフィルタリングなど) を付与します。
+ 本稼働デプロイでは、ワイルドカードを使用するのではなく、ジョブ実行ロールの Amazon S3 および AWS Glue アクセス許可を特定のリソースにスコープします。
+ Amazon SageMaker Unified Studio で EMR Serverless を使用する方法の詳細については、[Amazon SageMaker Unified Studio の EMR Serverless](https://docs.aws.amazon.com/next-generation-sagemaker/latest/userguide/emr-serverless.html)」を参照してください。