[アップデート] Amazon SageMaker Unified Studio でプロジェクトメンバーごとに権限を分けられるカスタム designation を試してみた

[アップデート] Amazon SageMaker Unified Studio でプロジェクトメンバーごとに権限を分けられるカスタム designation を試してみた

Amazon SageMaker Unified Studio で使えるようになったカスタム designation について、実際に試してみました。同じプロジェクト内でメンバーの権限をきめ細かく制御でき、データエンジニアやアナリストなど役職ごとのアクセス制限が簡単に実現できるようになりました。
2026.11.02

クラウド事業統括本部の石川です。Amazon SageMaker Unified Studio で、プロジェクトメンバーが実行できる操作を権限セットとして定義できるカスタム designation が使えるようになりましたので試してみました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/10/sagemaker-custom-designations/

Amazon SageMaker Unified Studio(以降、SageMaker Unified Studio)では、これまでプロジェクトメンバーに割り当てられる designation は Owner と Contributor の 2 種類だけで、両者の権限はほぼ同じでした。データエンジニア、データスチュワード、アナリストで権限を分けたい場合は、プロジェクトそのものを分ける必要がありました。

このアップデートで、ドメイン管理者が独自の権限セット(カスタム designation)を作成し、プロジェクトメンバーに割り当てられるようになりました。権限は Catalog、Subscriptions、Connections、Notebooks、Data Agent などのカテゴリから選択します。designation はドメイン単位で定義し、ドメイン内のどのプロジェクトでも割り当てられます。各ドメインにはマネージド designation の Owner と Contributor があり、これに加えて最大 10 個のカスタム designation を作成できます。SageMaker Unified Studio を利用できるすべての AWS リージョンで利用できます。

https://docs.aws.amazon.com/sagemaker-unified-studio/latest/adminguide/designations.html

AWS Big Data Blog にも解説記事が公開されています。

https://aws.amazon.com/blogs/big-data/implement-least-privilege-access-with-designations-in-amazon-sagemaker-unified-studio/

カスタム designation とは

designation は、プロジェクト内でメンバーが実行できるアクションを定義した名前付きの権限セットです。権限の実体は Amazon DataZone の API アクションで、Cedar ポリシー言語で記述されます。日本語 UI では「指定」と表示されます。

種類 内容
マネージド designation AWS が管理する Owner と Contributor。編集・削除はできない
カスタム designation ドメイン管理者が作成する権限セット。組織の要件に合わせて権限を選択する

メンバーには直接割り当てで designation を 1 つ設定します。グループ経由で別の designation を継承している場合、そのメンバーの権限は両者の和集合になります。

IAM との関係

ドキュメントでは、designation と IAM の関係が次のように説明されています。

  • IAM は、プリンシパルが DataZone や SageMaker の API を呼び出せるかを AWS API の境界で評価します
  • designation は、割り当てられた権限セットがプロジェクト内でその操作を許可しているかを評価します
  • 両方が許可した場合にだけ操作が成功します。IAM の Deny は designation の内容にかかわらず操作を拒否します
  • designation を使うために既存の IAM ポリシーを変更する必要はありません

また、IAM ベースのドメインでは、プロジェクトメンバーの IAM ロールに SageMakerStudioUserIAMConsolePolicy 管理ポリシー(または同等の権限)が必要です。プロジェクトのメンバー全員がデータとコンピューティングに同じアクセス権を持ち、そのアクセスはプロジェクトの実行ロールで管理されます。

https://docs.aws.amazon.com/sagemaker-unified-studio/latest/adminguide/projects-iam-based-domains.html

制約事項

ドキュメントの Considerations から、今回の検証に関係するものを抜粋します。

  • カスタム designation を使えるのは V2 ドメインのプロジェクトだけです
  • ドメインの admin プロジェクトでは、カスタム designation を作成・割り当てできません
  • Data Agent のアクションは必須で、除外できません。作成画面では自動で追加されます
  • 選択できる権限は、あらかじめ定義されたセットに限られます
  • 新しいクエリエディタはノートブックの上に作られているため、Notebooks の権限はクエリブックにも適用されます
  • DataSource 系の API は IAM だけで認可され、designation の対象外です

権限カテゴリ

作成画面には次のカテゴリと権限が表示されていました。サブスクリプションの内訳はドキュメントで確認しています。

カテゴリ 権限
プロジェクト All actions / Read-only actions / Manage membership / Manage environments / Manage user compute / Access external links
カタログ All actions / Read-only actions / Manage assets / Manage data products / Manage asset publishing / Manage glossaries / Manage asset types / Manage metadata forms / Manage time series data / Manage predictions / Execute metadata generation / Manage governed terms
サブスクリプション All actions / Read-only actions / Manage subscription requests / Manage subscription approvals / Manage asset filters
接続 All actions / Read-only actions / Use connection / Manage connections
ノートブックとクエリブック All actions / Read-only actions
データエージェント All actions

各権限に含まれる API アクションは、ドキュメントの Custom designation permissions に一覧があります。

https://docs.aws.amazon.com/sagemaker-unified-studio/latest/adminguide/designation-permissions.html

やってみた

前提条件

  • SageMaker Unified Studio の IAM ベースの V2 ドメイン(Default_11012026_Domain、ID dzd-68r3uno2uxmrix)
  • 実行者: ドメイン管理者の IAM ロール cm-user
  • 検証環境: ap-northeast-1(東京)、検証日 2026-11-01、AWS CLI 2.39.3
  • IAM ロールの作成・削除と、GUI で操作できなかったユーザープロファイルの無効化は AWS CLI で行い、それ以外はマネジメントコンソールとドメイン管理ポータルで操作しました。結果の確認には AWS CLI の参照系コマンドも使っています

designation を割り当てたメンバーの操作がどう制限されるかを確認するため、テスト用の IAM ロール smus-designation-test-role を作り、検証用プロジェクトのメンバーにしました。テスト用ロールには、カタログとノートブックを参照だけできる designation「Read Only Analyst」を割り当て、コンソールでこのロールに切り替えて SageMaker Unified Studio を操作します。

検証環境のAWS構成図

初期状態の designation を確認する

ドメイン管理ポータルの左メニュー「指定」を開くと、Designations 画面にマネージド designation の「コントリビューター」と「所有者」の 2 つが表示されていました。(メニューだけ「指定」って直訳されると、かえってわからない)

ドメイン管理ポータルで designation を作成する

「Create designation」を押すと、右側に作成画面が開きます。初期状態で「データエージェント (すべて)」と「接続」の 2 権限(Read-only actions と Use connection)が選択済みで、チェックを外せない状態でした。「削除を許可する」は初期状態でオフです。

次の内容で designation を作成しました。

  • Name: Read Only Analyst
  • Description: Read-only access for analysts (dsg-20261101-ef32f99d)
  • 削除を許可する: オン(後片付けで削除するため)
  • アクセス許可: プロジェクト、カタログ、ノートブックとクエリブックの Read-only actions(接続の 2 権限とデータエージェントは選択済みのまま)

アクセス許可の数は、初期状態の 3 から 6 になりました。

「Create」を押すと、Type が Custom の designation として一覧に追加されました。

詳細画面では、選択した 6 つの権限と、指定 ID(dhsymfofpcesyh)を確認できます。

GUI で選んだ権限が Cedar ポリシーとしてどう保存されたかを、AWS CLI で確認しました。

% aws datazone get-designation \
  --domain-identifier dzd-68r3uno2uxmrix \
  --identifier dhsymfofpcesyh \
  --output json
{
    "domainId": "dzd-68r3uno2uxmrix",
    "id": "dhsymfofpcesyh",
    "name": "Read Only Analyst",
    "description": "Read-only access for analysts (dsg-20261101-ef32f99d)",
    "designationType": "USER_CREATED",
    "policy": "// namespace: Project\npermit(\n  principal,\n  action in [\n    Project::Action::\"ReadOnlyActions\"\n  ],\n  resource\n);\n\n// namespace: Catalog\npermit(\n  principal,\n  action in [\n    Catalog::Action::\"ReadOnlyActions\"\n  ],\n  resource\n);\n\n// namespace: Connections\npermit(\n  principal,\n  action in [\n    Connections::Action::\"ReadOnlyActions\",\n    Connections::Action::\"UseConnection\"\n  ],\n  resource\n);\n\n// namespace: Notebooks\npermit(\n  principal,\n  action in [\n    Notebooks::Action::\"ReadOnlyActions\"\n  ],\n  resource\n);\n\n// namespace: DataAgent\npermit(\n  principal,\n  action in [\n    DataAgent::Action::\"AllActions\"\n  ],\n  resource\n);",
    "deletionProtection": false,
    "createdBy": "08a7ad58-1f74-4b7f-932f-41eb38dcf4e8",
    "createdAt": "2026-11-01T04:43:19.293088+00:00",
    "lastUpdatedAt": "2026-11-01T04:43:19.293088+00:00"
}

policy の改行を展開すると次のとおりです。カテゴリ(名前空間)ごとに permit 文が分かれ、アクション名は ReadOnlyActions のような GUI の権限単位の名前になっています。designationType は USER_CREATED で、「削除を許可する」をオンにしたので deletionProtection は false です。

// namespace: Project
permit(
  principal,
  action in [
    Project::Action::"ReadOnlyActions"
  ],
  resource
);

// namespace: Catalog
permit(
  principal,
  action in [
    Catalog::Action::"ReadOnlyActions"
  ],
  resource
);

// namespace: Connections
permit(
  principal,
  action in [
    Connections::Action::"ReadOnlyActions",
    Connections::Action::"UseConnection"
  ],
  resource
);

// namespace: Notebooks
permit(
  principal,
  action in [
    Notebooks::Action::"ReadOnlyActions"
  ],
  resource
);

// namespace: DataAgent
permit(
  principal,
  action in [
    DataAgent::Action::"AllActions"
  ],
  resource
);

テスト用の IAM ロールを作成する

テスト用ロールには、前述の SageMakerStudioUserIAMConsolePolicy だけをアタッチしました。このポリシーの内容(検証時点のバージョンは v10)を確認すると、許可されている DataZone のアクションは、ポータルへのログイン(datazone:GetIamPortalLoginUrl)、ドメインとプロジェクトの参照、プロジェクトの作成・削除、環境と接続の参照などです。datazone:Search やノートブックの作成は含まれていません。

このロールにはコンソールで切り替えて使うため、信頼ポリシーには、ドメイン管理者ロールに加えて、コンソールに最初にサインインする IAM ユーザー(今回の環境では別アカウントの IAM ユーザー。aws:userid で絞り、MFA で認証したセッションに限定)を指定しました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:role/cm-user" },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:root" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:userid": "AIDAEXAMPLEUSERID1234"
        },
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}
% aws iam create-role \
  --role-name smus-designation-test-role \
  --assume-role-policy-document file://iam/test-role-trust.json \
  --description 'SMUS custom designation verification (dsg-20261101-ef32f99d)' \
  --max-session-duration 3600 \
  --tags Key=run_id,Value=dsg-20261101-ef32f99d Key=owner,Value=cm-user Key=ttl,Value=2026-11-02 Key=purpose,Value=blog-verification \
  --query 'Role.[RoleName,Arn]' \
  --output text
smus-designation-test-role	arn:aws:iam::123456789012:role/smus-designation-test-role
% aws iam attach-role-policy \
  --role-name smus-designation-test-role \
  --policy-arn arn:aws:iam::aws:policy/SageMakerStudioUserIAMConsolePolicy

% aws iam list-attached-role-policies \
  --role-name smus-designation-test-role \
  --output table
---------------------------------------------------------------------------------
|                           ListAttachedRolePolicies                            |
+-------------------------------------------------------------------------------+
||                              AttachedPolicies                               ||
|+------------+----------------------------------------------------------------+|
||  PolicyArn |  arn:aws:iam::aws:policy/SageMakerStudioUserIAMConsolePolicy   ||
||  PolicyName|  SageMakerStudioUserIAMConsolePolicy                           ||
|+------------+----------------------------------------------------------------+|

ドメイン管理ポータルでプロジェクトを作成する

カスタム designation は admin プロジェクトでは使えないため、ドメイン管理ポータルの「プロジェクト」→「プロジェクトを作成」で検証用のプロジェクトを作成しました。

ステップ 1 でプロジェクト名 designation-lab と説明を入力し、ステップ 2 は既定値のまま進めました。実行ロールは「ユーザー許可を持つ新しいロールを自動作成」、ストレージは「新しいバケットを作成」です。

ステップ 3(メンバーを追加)では、タイプ「IAM」のメンバー検索で smus-designation と入力すると、作成したテスト用ロールが候補に表示されました。追加直後の指定は「コントリビューター」になっていたので、ドロップダウンから「Read Only Analyst」を選びました。ドロップダウンには、Read Only Analyst、コントリビューター、所有者の 3 つが表示されています。

「作成」を押すと、進行状況のダイアログが表示されました。ダイアログを閉じてしばらく待つと、プロジェクトの状態は ACTIVE、環境のデプロイ状態(GetProject の environmentDeploymentDetails.overallDeploymentStatus)は SUCCESSFUL になりました。作成後のプロジェクトの「メンバー」タブは次のとおりです。

指定したテスト用ロール(Read Only Analyst)と管理者ロール(所有者)に加えて、ウィザードが作成した実行ロール AmazonSageMakerUserIAMExecutionRole_edf0eed3 がコントリビューターとして追加されていました。

API でもメンバーを確認しました。

% aws datazone list-project-memberships \
  --domain-identifier dzd-68r3uno2uxmrix \
  --project-identifier b6sdu4ri4gqxzt \
  --output json
{
    "members": [
        {
            "memberDetails": {
                "group": {
                    "groupId": "574fd943-5faa-4c9d-b302-25d4c8a877f1"
                }
            },
            "designation": "PROJECT_OWNER"
        },
        {
            "memberDetails": {
                "group": {
                    "groupId": "184fa1d1-8f07-32ae-bf0a-ac755dea886d"
                }
            },
            "designation": "USER_CREATED_DESIGNATION",
            "userCreatedDesignationId": "dhsymfofpcesyh"
        },
        {
            "memberDetails": {
                "group": {
                    "groupId": "35380cbb-ab07-3510-8f16-0f89560a1f06"
                }
            },
            "designation": "PROJECT_CONTRIBUTOR"
        }
    ]
}

IAM ロールはグループプロファイルとしてメンバーになっています。テスト用ロールのグループプロファイル(184fa1d1-8f07-32ae-bf0a-ac755dea886d)は、GUI でメンバーに追加したときに自動で作られていました。

% aws datazone search-group-profiles \
  --domain-identifier dzd-68r3uno2uxmrix \
  --group-type IAM_ROLE_SESSION_GROUP \
  --output json
{
    "items": [
        {
            "id": "a85eed25-1a92-3202-9bf6-f3fa03a48209",
            "status": "ASSIGNED",
            "rolePrincipalArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMakerAdminIAMExecutionRole",
            "rolePrincipalId": "AROAXQ6Q7KC6RFIAFGWKK"
        },
        {
            "id": "35380cbb-ab07-3510-8f16-0f89560a1f06",
            "status": "ASSIGNED",
            "rolePrincipalArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMakerUserIAMExecutionRole_edf0eed3",
            "rolePrincipalId": "AROAXQ6Q7KC662R46DRTX"
        },
        {
            "id": "574fd943-5faa-4c9d-b302-25d4c8a877f1",
            "status": "ASSIGNED",
            "rolePrincipalArn": "arn:aws:iam::123456789012:role/cm-user",
            "rolePrincipalId": "AROAIQYDPIIE4D75QUZEM"
        },
        {
            "id": "184fa1d1-8f07-32ae-bf0a-ac755dea886d",
            "status": "ASSIGNED",
            "rolePrincipalArn": "arn:aws:iam::123456789012:role/smus-designation-test-role",
            "rolePrincipalId": "AROAXQ6Q7KC6SJTKG3K3K"
        }
    ]
}

コンソールでテスト用ロールに切り替える

マネジメントコンソールの「ロールの切り替え」で、テスト用ロールに表示名 designation-test で切り替えました。コンソール右上の表示名が designation-test になり、コンソールホームのコストのウィジェットは「アクセス拒否」と表示されます。

テスト用ロールで SageMaker Unified Studio を操作する

テスト用ロールのまま、コンソールの Amazon SageMaker の「ドメイン」画面から IAM ベースのドメインの「開く」を押すと、designation-lab プロジェクトの概要画面が開きました。左下の「ドメイン管理」のリンクは表示されていません。

カタログを検索する(許可される操作)

「検出」で sample と入力して検索しました。Catalog の Read-only actions を付けているので、検索結果に Glue テーブルのアセット(churn、elb_parquet、superstore_people など)とモデルが表示されました。

ノートブックを作成する(拒否される操作)

「ノートブック」を開くと、一覧には「ノートブックなし」と表示されました。Notebooks の Read-only actions を付けているので、一覧の表示はできています。「ノートブックを作成」のボタンも押せる状態で表示されていました。

「ノートブックを作成」を押すと、画面右下に次のエラーが表示され、ノートブックは作成されませんでした。このエラーは数秒で消えます。

User is not permitted to perform operation: CreateNotebook DesignationPolicy does not allow access.

DesignationPolicy does not allow access. とあるので、designation による拒否です。Read Only Analyst に Notebooks の All actions が含まれていないためです。

また、テスト用ロールのセッションのままドメイン管理ポータルのプロジェクト詳細の URL(/admin/projects/b6sdu4ri4gqxzt)を開くと、「管理者管理へのアクセス権がありません。」と表示され、プロジェクトの選択画面に移動しました。

CloudTrail で API の呼び出し元を確認する

テスト用ロールの IAM ポリシーには datazone:Search が含まれていないのに、検索は成功しています。そこで、ポータルからの API 呼び出しが CloudTrail にどう記録されているかを確認しました(ap-northeast-1、2026-11-01T04:50Z〜05:00Z の LookupEvents)。

[
  {"event": "CreateNotebook", "time": "2026-11-01T04:55:09Z", "eventSource": "datazone.amazonaws.com", "errorCode": "AccessDenied", "userIdentity.type": "AssumedRole", "userIdentity.arn": "arn:aws:sts::123456789012:assumed-role/AmazonSageMakerUserIAMExecutionRole_edf0eed3/18b5607a-a007-4d16-bd61-86337d23eb75@bfd3xm0vnbk2zd"},
  {"event": "Search", "time": "2026-11-01T04:55:00Z", "eventSource": "datazone.amazonaws.com", "errorCode": null, "userIdentity.type": "AssumedRole", "userIdentity.arn": "arn:aws:sts::123456789012:assumed-role/AmazonSageMakerUserIAMExecutionRole_edf0eed3/18b5607a-a007-4d16-bd61-86337d23eb75@bfd3xm0vnbk2zd"},
  {"event": "ListNotebooks", "time": "2026-11-01T04:54:59Z", "eventSource": "datazone.amazonaws.com", "errorCode": null, "userIdentity.type": "AssumedRole", "userIdentity.arn": "arn:aws:sts::123456789012:assumed-role/AmazonSageMakerUserIAMExecutionRole_edf0eed3/18b5607a-a007-4d16-bd61-86337d23eb75@bfd3xm0vnbk2zd"}
]

3 つの呼び出しはいずれも、テスト用ロールではなく、プロジェクトの実行ロール AmazonSageMakerUserIAMExecutionRole_edf0eed3 のセッションで実行されていました。セッション名の 18b5607a-a007-4d16-bd61-86337d23eb75 は、テスト用ロールでポータルにログインしたときに作られたユーザープロファイルの ID で、bfd3xm0vnbk2zd はプロジェクトの ToolingLite 環境の ID です。

考察

IAM ベースのドメインでは、ポータルの操作は実行ロールで API が呼ばれる

CloudTrail の記録では、テスト用ロールがポータルで行った操作は、プロジェクトの実行ロールのセッションで DataZone の API を呼び出していました。テスト用ロールに付けたのはポータルへのログイン用の SageMakerStudioUserIAMConsolePolicy だけで、datazone:Search は許可していませんが、検索は成功しています。

このことから、IAM ベースのドメインでポータルを使う場合、ポータルからの API 呼び出しで IAM が評価するのはメンバーの IAM ロールではなくプロジェクトの実行ロールで、メンバーごとの違いは designation で付けることになると考えられます。これは、IAM ベースのドメインではメンバー全員のアクセスがプロジェクトの実行ロールで管理される、という前述のドキュメントの説明とも合っています。同じプロジェクトのメンバーの間で操作を分けたい場合は、メンバーの IAM ポリシーではなく designation で制御します。

権限のない操作のボタンも表示される

Read Only Analyst を割り当てたテスト用ロールでも、「ノートブックを作成」のボタンは押せる状態で表示されていました。押したときに DesignationPolicy does not allow access. のエラーが数秒表示されるだけなので、メンバーには、どの designation が割り当てられていて何ができないのかを事前に伝えておく必要があります。

また、ドキュメントによると Notebooks の権限はクエリブックにも適用されます。今回は確認していませんが、Notebooks を Read-only actions にすると、新しいクエリエディタでの操作も制限される可能性があります。

プロジェクトを削除しても残るリソースがある

プロジェクト作成ウィザードで実行ロールと S3 バケットを自動作成した場合、プロジェクトを削除しても実行ロールと S3 バケットは残りました。グループプロファイルとユーザープロファイルも削除 API がないため、無効化した状態で残ります。検証用のプロジェクトを作るときは、これらを後片付けの対象に含めておく必要があります。

今後期待したいこと

  • 権限のない操作のボタンを、designation に合わせて無効化または非表示にする
  • designation の削除ダイアログで、案内の文言と実際に入力する文字列をそろえる
  • プロジェクトの削除時に、ウィザードで自動作成した実行ロールと S3 バケットもあわせて削除できるようにする

最後に

カスタム designation を使うと、同じプロジェクトの中でメンバーごとに実行できる操作を分けられます。今回は、カタログとノートブックを参照だけできる designation をドメイン管理ポータルで作成し、プロジェクト作成ウィザードでテスト用ロールに割り当てました。テスト用ロールでは、カタログの検索とノートブック一覧の表示はでき、ノートブックの作成は DesignationPolicy does not allow access. で拒否されました。

今回確認した操作では、ポータルからの API 呼び出しはプロジェクトの実行ロールで行われていました。IAM ベースのドメインでは、メンバーごとの権限の違いは designation で付けることになります。データエンジニア、データスチュワード、アナリストが同じプロジェクトを使っている場合は、Contributor を一律に割り当てている状態から、役割ごとのカスタム designation に切り替えることを検討してみてください。

合わせて読みたい

https://aws.amazon.com/blogs/big-data/implement-least-privilege-access-with-designations-in-amazon-sagemaker-unified-studio/

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事