ゼファーネットのロゴ

Azure AD を使用して IAM Identity Center で生成された SCIM イベントを使用して、Amazon QuickSight でユーザーとグループ メンバーシップを管理します

日付:

アマゾンクイックサイト ID フェデレーションをサポートする、クラウドネイティブでスケーラブルなビジネス インテリジェンス (BI) サービスです。 AWS IDおよびアクセス管理 (IAM) を使用すると、組織はエンタープライズ ID プロバイダー (IdP) で管理されている ID を使用し、シングル サインオン (SSO) を QuickSight に連携させることができます。 オンプレミス アプリ、サードパーティ アプリ、AWS 上のアプリケーションなど、すべてのアプリケーションを使用して一元化されたユーザー ID ストアを構築する組織が増えるにつれて、これらのアプリケーションへのユーザー プロビジョニングを自動化し、それらの属性を一元化された ID ストアと同期させるソリューションが必要になります。ユーザー ID ストア。

ユーザー リポジトリを設計する場合、一部の組織では、ユーザーをグループに編成するか、属性 (部門名など) を使用するか、またはその両方を組み合わせます。 組織が集中認証に Microsoft Azure Active Directory (Azure AD) を使用し、そのユーザー属性を利用してユーザーを整理している場合、すべての QuickSight アカウント間でフェデレーションを有効にし、AWS で生成されたイベントを使用して QuickSight でユーザーとそのグループ メンバーシップを管理できます。プラットホーム。 これにより、システム管理者は Azure AD からユーザーのアクセス許可を集中管理できます。 このソリューションを使用すると、QuickSight でのユーザーとグループのプロビジョニング、更新、およびプロビジョニング解除で、XNUMX か所で管理する必要がなくなります。 これにより、自動同期により、QuickSight のユーザーとグループが Azure AD の情報と一貫性を保つことができます。

この投稿では、QuickSight と Azure AD 間のフェデレーション SSO を構成するために必要な手順について説明します。 AWS IAM Identity Center (AWS Single Sign-On の後継) Azure AD の自動プロビジョニングが有効になっている場合。 また、System for Cross-domain Identity Management (SCIM) イベントを使用した、ユーザーとグループのメンバーシップの自動更新についても説明します。

ソリューションの概要

次の図は、ソリューション アーキテクチャとユーザー フローを示しています。

ソリューション アーキテクチャとユーザー フロー。

この投稿では、IAM Identity Center は、ユーザーの管理と、AWS アカウントおよびクラウド アプリケーションへのアクセスをまとめるための中心的な場所を提供します。 Azure AD はユーザー リポジトリであり、IAM Identity Center で外部 IdP として構成されています。 このソリューションでは、XNUMX つのユーザー属性 (department, jobTitle) 特に Azure AD で。 IAM Identity Center は、SCIM v2.0 プロトコルを使用して、Azure AD から IAM Identity Center へのユーザーおよびグループ情報の自動プロビジョニング (同期) をサポートしています。 このプロトコルでは、Azure AD からの属性が IAM Identity Center に渡され、IAM Identity Center でユーザーのプロファイルに定義された属性が継承されます。 IAM Identity Center は、SAML (Security Assertion Markup Language) 2.0 による ID フェデレーションもサポートしています。 これにより、IAM Identity Center は Azure AD を使用して ID を認証できます。 その後、ユーザーは、QuickSight などの SAML をサポートするアプリケーションに SSO できます。 この投稿の前半では、このエンド ツー エンドの構成方法に焦点を当てています (図のサインイン フローを参照)。

次に、SCIM プロトコルを介して Azure AD と IAM Identity Center の間でユーザー情報の同期が開始されます。 を使用して、QuickSight でのユーザーの作成を自動化できます。 AWSラムダ によってトリガーされる関数 CreateUser でキャプチャされた IAM Identity Center から発生した SCIM イベント アマゾンイベントブリッジ. 同じ Lambda 関数で、指定されたグループ (名前は次の XNUMX つのユーザー属性で構成される) に追加することで、ユーザーのメンバーシップを後で更新できます。 department-jobTitle、それ以外の場合は、メンバーシップを追加する前に、グループがまだ存在しない場合は作成します。

この投稿では、この自動化の部分は省略されています。これは、次のセクションで説明する内容と重複するためです。

この投稿では、 UpdateUser Azure AD でのユーザー プロファイルの更新によってトリガーされる SCIM イベント。 イベントは EventBridge でキャプチャされ、Lambda 関数を呼び出して QuickSight のグループ メンバーシップを更新します (図の更新フローを参照)。 この例では、指定されたユーザーは一度に XNUMX つのグループにのみ所属することになっているため、関数はユーザーの現在のグループ メンバーシップを新しいグループ メンバーシップに置き換えます。

パート I では、IAM Identity Center を介して Azure AD から QuickSight への SSO をセットアップしました (サインイン フロー)。

  1. IAM Identity Center で Azure AD を外部 IdP として構成します。
  2. Azure AD で IAM Identity Center アプリケーションを追加して構成します。
  3. IAM Identity Center の設定を完了します。
  4. Azure AD と IAM Identity Center の両方で SCIM 自動プロビジョニングを設定し、IAM Identity Center で確認します。
  5. IAM Identity Center で QuickSight アプリケーションを追加して設定します。
  6. SAML IdP および SAML 2.0 フェデレーション IAM ロールを構成します。
  7. QuickSight アプリケーションで属性を構成します。
  8. ユーザー、グループ、およびグループ メンバーシップを手動で作成するには、 AWSコマンドラインインターフェイス (AWS CLI) または API。
  9. IAM Identity Center ポータルから QuickSight にログインして、設定を確認します。

パート II では、SCIM イベント (更新フロー) でグループ メンバーシップを変更する自動化を設定します。

  1. EventBridge の SCIM イベントとイベント パターンを理解します。
  2. グループ名の属性マッピングを作成します。
  3. Lambda関数を作成します。
  4. イベントをトリガーする EventBridge ルールを追加します。
  5. Azure AD でユーザー属性の値を変更して、構成を確認します。

前提条件

このチュートリアルでは、次の前提条件を満たしている必要があります。

  • IAM アイデンティティ センター。 手順については、 AWS IAM Identity Center 入門ガイド.
  • QuickSight アカウントのサブスクリプション。
  • IAM IdP、ロール、およびポリシーを作成するために必要な IAM と権限の基本的な理解。
  • Azure AD サブスクリプション。 Azure AD に登録するには、次の属性を持つユーザーが少なくとも XNUMX 人必要です。
    • userPrincipalName – Azure AD ユーザーの必須フィールド。
    • displayName – Azure AD ユーザーの必須フィールド。
    • Mail – IAM Identity Center が QuickSight と連携するための必須フィールド。
    • 職名 – ユーザーをグループに割り当てるために使用
    • 部門 – ユーザーをグループに割り当てるために使用されます。
    • – オプションのフィールド。
    • – オプションのフィールド。

パート I: IAM Identity Center を介して Azure AD から QuickSight への SSO を設定する

このセクションでは、サインイン フローを設定する手順を示します。

IAM Identity Center で外部 IdP を Azure AD として構成する

外部 IdP を構成するには、次の手順を実行します。

  1. IAM Identity Center コンソールで、選択 設定.
  2. 選択する ID ソース タブをクリックし、 ID ソースの変更.
  3. 選択する 外部 ID プロバイダー、を選択します Next.

IdP メタデータが表示されます。 このブラウザ タブを開いたままにします。

Azure AD で IAM Identity Center アプリケーションを追加して構成する

IAM Identity Center アプリケーションをセットアップするには、次の手順を実行します。

  1. 新しいブラウザー タブを開きます。
  2. Azure 管理者の資格情報を使用して Azure AD ポータルにログインします。
  3. Azureサービス、選択する Azure Active Directory.
  4. ナビゲーションペインの[ 管理 、選択する エンタープライズアプリケーション、を選択します 新しいアプリ.
  5. Azure AD ギャラリーを閲覧する セクション、検索 IAM アイデンティティ センター、を選択します AWS IAM Identity Center (AWS Single Sign-On の後継).
  6. アプリケーションの名前を入力します (この投稿では、 IIC-QuickSight)と選択 創造する.
  7. 管理 セクションでは、選択 シングル・サインオン、を選択します SAML.
  8. ユーザーとグループを割り当てる セクションでは、選択 ユーザーとグループを割り当てる.
  9. 選択する ユーザー/グループを追加 少なくとも XNUMX 人のユーザーを追加します。
  10. 選択 ユーザー その役割として。
  11. シングルサインオンを設定する セクションでは、選択 始める.
  12. 基本的なSAML構成 セクションでは、選択 編集をクリックし、次のパラメーターと値を入力します。
  13. 識別する – の値 IAM Identity Center 発行者 URL フィールド。
  14. 返信URL – の値 IAM ID センター アサーション コンシューマ サービス (ACS) URL フィールド。
  15. サインオンURL – 空白のままにします。
  16. リレー状態 – 空白のままにします。
  17. ログアウトURL – 空白のままにします。
  18. 選択する Save.

構成は次のスクリーンショットのようになります。

の監視

  1. SAML 証明書 セクションで、 フェデレーションメタデータXML ファイルと 証明書(生) ファイルにソフトウェアを指定する必要があります。
    フェデレーション メタデータ XML ファイルと証明書 (未加工) ファイル

この時点で、Azure AD SSO の構成がすべて完了しました。 後でこのページに戻って自動プロビジョニングを構成するため、このブラウザー タブは開いたままにしておいてください。

IAM Identity Center の完全な設定

次の手順で IAM Identity Center の設定を完了します。

  1. 前のステップで開いたままにしておいた IAM Identity Center コンソールのブラウザー タブに戻ります。
  2. IdP SAML メタデータID プロバイダーのメタデータ セクションでは、選択 ファイルを選ぶ.
  3. 以前にダウンロードしたメタデータ ファイルを選択します (IIC-QuickSight.xml).
  4. IdP 証明書ID プロバイダーのメタデータ セクションでは、選択 ファイルを選ぶ.
  5. 以前にダウンロードした証明書ファイルを選択します (IIC-QuickSight.cer).
  6. 選択する Next.
  7. ACCEPT と入力し、選択します。 ID プロバイダー ソースの変更.

Azure AD と IAM Identity Center の両方で SCIM 自動プロビジョニングを設定する

プロビジョニング方法は引き続き マニュアル (非 SCIM)。 このステップでは、自動プロビジョニングを有効にして、IAM Identity Center がユーザーを認識できるようにします。これにより、QuickSight への ID フェデレーションが可能になります。

  1. 自動プロビジョニング セクションでは、選択 有効にします.
    [有効にする]を選択します
  2. 選択する アクセストークン トークンを表示します。
    アクセストークン
  3. 手順 1 で開いたままにしたブラウザー タブ (Azure AD) に戻ります。
  4. 管理 セクションでは、選択 エンタープライズアプリケーション.
  5. 選択する IIC-QuickSight、を選択します プロビジョニング.
  6. 選択する オートマチック in プロビジョニングモード 次の値を入力します。
  7. テナント URL – の値 SCIM エンドポイント フィールド。
  8. シークレットトークン – の値 アクセストークン フィールド。
  9. 選択する 試験用接続.
  10. テスト接続が正常に完了したら、設定します プロビジョニング ステータス 〜へ On.
    プロビジョニングステータスをオンに設定
  11. 選択する Save.
  12. 選択する プロビジョニングを開始します SCIM プロトコルを使用して自動プロビジョニングを開始します。

プロビジョニングが完了すると、XNUMX 人以上のユーザーが Azure AD から IAM Identity Center に伝達されます。 次のスクリーンショットは、IAM Identity Center でプロビジョニングされたユーザーを示しています。

IAM Identity Center でプロビジョニングされたユーザー

この SCIM プロビジョニングでは、IAM Identity Center から発生したイベントによってトリガーされる Lambda 関数を使用して、QuickSight のユーザーを作成する必要があることに注意してください。 この投稿では、AWS CLI を使用してユーザーとグループのメンバーシップを作成します (ステップ 8)。

IAM Identity Center で QuickSight アプリケーションを追加して設定する

このステップでは、IAM Identity Center で QuickSight アプリケーションを作成します。 また、アプリケーションが機能するように IAM SAML プロバイダー、ロール、およびポリシーを構成します。 次の手順を完了します。

  1. IAM Identity Center コンソールで、 アプリケーション ページ、選択 アプリケーションを追加.
  2. 統合済みアプリケーションアプリケーションを選択してください、 入る quicksight.
  3. 選択 アマゾンクイックサイト、を選択します Next.
  4. の名前を入力してください 表示名、 といった Amazon QuickSight.
  5. 選択する ダウンロードIAM Identity Center SAML メタデータ ファイル そしてそれをあなたのコンピュータに保存してください。
  6. 他のすべてのフィールドはそのままにして、構成を保存します。
  7. 作成したばかりのアプリケーションを開き、 ユーザーの割り当て.

以前に SCIM を介してプロビジョニングされたユーザーが一覧表示されます。

  1. アプリケーションに割り当てるすべてのユーザーを選択します。

SAML IdP と SAML 2.0 フェデレーション IAM ロールを構成する

IAM Identity Center および IAM ロール用に IAM SAML IdP を設定するには、次の手順を実行します。

  1. IAMコンソールのナビゲーションペインで、[ IDプロバイダー、を選択します プロバイダーを追加.
  2. 選択する SAML as プロバイダータイプ、入力して Azure-IIC-QS as プロバイダー名.
  3. メタデータドキュメント、選択する ファイルを選ぶ 先ほどダウンロードしたメタデータ ファイルをアップロードします。
  4. 選択する プロバイダーを追加 構成を保存します。
  5. ナビゲーションペインで、 役割、を選択します 役割を作成する.
  6. 信頼できるエンティティタイプ選択 SAML2.0フェデレーション.
  7. SAML 2.0 プロバイダーの選択をクリックし、作成した SAML プロバイダーを選択してから、 プログラムによるアクセスとAWSマネジメントコンソールへのアクセスを許可する.
  8. 選択する Next.
  9. ソフトウェア設定ページで、下図のように 許可を追加する ページ、選択 Next.

この投稿では、AWS CLI コマンドを使用して QuickSight ユーザーを作成するため、アクセス許可ポリシーは作成しません。 ただし、QuickSight のセルフプロビジョニング機能が必要な場合は、 CreateReader, CreateUser, CreateAdmin アクション (QuickSight ユーザーの役割に応じて) が必要です。

  1. ソフトウェア設定ページで、下図のように 名前を付け、確認し、作成する ページ、下 役割の詳細、 入る qs-reader-azure 役割のため。
  2. 選択する 役割を作成する.
  3. ロールの ARN に注意してください。

ARN を使用して、IAM Identity Center アプリケーションで属性を設定します。

QuickSight アプリケーションで属性を構成する

IAM SAML IdP および IAM ロールを IAM Identity Center の QuickSight アプリケーションに関連付けるには、次の手順を実行します。

  1. IAM Identity Center コンソールのナビゲーションペインで、 アプリケーション.
  2. 現在地に最も近い Amazon QuickSight アプリケーション、および メニュー、選択 属性マッピングの編集.
  3. 選択する 新しい属性マッピングを追加.
  4. 次の表のマッピングを構成します。
アプリケーションのユーザー属性 この文字列値または IAM Identity Center のユーザー属性にマップします
件名 ${user:email}
https://aws.amazon.com/SAML/Attributes/RoleSessionName ${user:email}
https://aws.amazon.com/SAML/Attributes/Role arn:aws:iam::<ACCOUNTID>:role/qs-reader-azure,arn:aws:iam::<ACCOUNTID>:saml-provider/Azure-IIC-QS
https://aws.amazon.com/SAML/Attributes/PrincipalTag:Email ${user:email}

次の値に注意してください。

  • 交換する AWS アカウント ID を使用します。
  • PrincipalTag:Email QuickSight管理ページで有効にする必要があるセルフプロビジョニングユーザー向けのメール同期機能用です。 この投稿では、AWS CLI コマンドでユーザーを登録するため、この機能を有効にしないでください。
  1. 選択する 変更を保存します.

AWS CLI を使用してユーザー、グループ、およびグループ メンバーシップを作成する

前述のように、QuickSight のユーザーとグループは、このソリューションで手動で作成されています。 次の AWS CLI コマンドを使用して作成します。

最初のステップは、先ほど作成した IAM ロールと Azure AD に登録されているメール アドレスを指定して、QuickSight でユーザーを作成することです。 XNUMX 番目の手順では、最初の手順で作成したユーザーの Azure AD からの組み合わせ属性値としてグループ名を使用してグループを作成します。 XNUMX 番目のステップは、前に作成したグループにユーザーを追加することです。 member-name で構成される QuickSight で作成されたユーザー名を示します。 <IAM Role name>/<session name>。 次のコードを参照してください。

aws quicksight register-user --aws-account-id <ACCOUNTID> --namespace default --identity-type IAM --email <email registered in Azure AD> --user-role READER --iam-arn arn:aws:iam::<ACCOUNTID>:role/qs-reader-azure --session-name <email registered in Azure AD> aws quicksight create-group --aws-account-id <ACCOUNTID> --namespace default --group-name Marketing-Specialist aws quicksight create-group-membership --aws-account-id <ACCOUNTID> --namespace default --member-name qs-reader-azure/<email registered in Azure AD> –-group-name Marketing-Specialist

この時点で、Azure AD、IAM Identity Center、IAM、および QuickSight のエンド ツー エンドの構成が完了しました。

IAM Identity Center ポータルから QuickSight にログインして設定を確認します

これで、IdP が開始する SSO フローを使用して QuickSight にログインする準備が整いました。

  1. ブラウザで新しいプライベート ウィンドウを開きます。
  2. IAM Identity Center ポータルにログインします (https://d-xxxxxxxxxx.awsapps.com/start).

Azure AD ログイン プロンプトにリダイレクトされます。

  1. Azure AD 資格情報を入力します。

IAM Identity Center ポータルにリダイレクトされます。

  1. IAM Identity Center ポータルで、 アマゾンクイックサイト.

IAM Identity Center ポータル、Amazon QuickSight を選択

QuickSight ホームに自動的にリダイレクトされます。
QuickSight ホームに自動的にリダイレクトされます

パート II: SCIM イベントでのグループ メンバーシップの変更を自動化する

このセクションでは、更新フローを構成します。

EventBridge の SCIM イベントとイベント パターンを理解する

Azure AD 管理者が特定のユーザー プロファイルの属性に変更を加えると、変更は SCIM プロトコルを介して IAM Identity Center のユーザー プロファイルと同期され、アクティビティはファイルに記録されます。 AWS クラウドトレイル と呼ばれるイベント UpdateUser by sso-directory.amazonaws.com (IAM Identity Center) をイベント ソースとして使用します。 同様に、 CreateUser Azure AD でユーザーが作成されたときにイベントが記録され、 DisableUser イベントは、ユーザーが無効になったときのものです。

上の次のスクリーンショット  イベント履歴 ページは XNUMX つを示しています CreateUser イベント: XNUMX つは IAM Identity Center によって記録され、もう XNUMX つは QuickSight によって記録されます。 この投稿では、IAM Identity Center のものを使用します。

CloudTrail コンソール

EventBridge がフローを適切に処理できるようにするには、各イベントで、イベント パターンが一致するイベントのフィールドを指定する必要があります。 以下のイベントパターンは一例です UpdateUser SCIM 同期時に IAM Identity Center で生成されるイベント:

{ "source": ["aws.sso-directory"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["sso-directory.amazonaws.com"], "eventName": ["UpdateUser"] }
}

この投稿では、QuickSight でトリガーされるグループ メンバーシップの自動更新について説明します。 UpdateUser SCIMイベント。

グループ名の属性マッピングを作成する

Lambda 関数が QuickSight でグループ メンバーシップを管理するには、XNUMX つのユーザー属性 (department & jobTitle)。 プロセスを簡単にするために、Azure AD で XNUMX つの属性を組み合わせています (department, jobTitle) IAM Identity Center の XNUMX つの属性 (title)、Azure AD の属性マッピング機能を使用します。 その後、IAM Identity Center は title このユーザーの指定されたグループ名としての属性。

  1. Azure AD コンソールにログインし、次の場所に移動します。 業務アプリケーション, IIC-QuickSight, プロビジョニング.
  2. 選択する 属性マッピングの編集.
  3. マッピング、選択する Azure Active Directory ユーザーのプロビジョニング.
    Azure AD コンソール、マッピングの下
  4. 選択する jobTitle リストから Azure Active Directory の属性.
  5. 次の設定を変更します。
    1. マッピング タイプExpression
    2. 表現Join("-", [department], [jobTitle])
    3. 対象属性 title
      設定を更新
  6. 選択する Save.
  7. プロビジョニング ページを離れることができます。

属性は IAM Identity Center で自動的に更新されます。 更新されたユーザー プロファイルは、次のスクリーンショットのようになります (左側が Azure AD、右側が IAM Identity Center)。

更新されたユーザー プロファイル
お仕事関連情報

Lambda関数を作成する

次に、SCIM イベントで QuickSight グループのメンバーシップを更新する Lambda 関数を作成します。 関数のコア部分は、ユーザーの title トリガーされたイベント情報に基づいて IAM Identity Center の属性値を確認し、ユーザーが QuickSight に存在することを確認します。 グループ名がまだ存在しない場合は、QuickSight でグループを作成し、ユーザーをグループに追加します。 次の手順を完了します。

  1. Lambdaコンソールで、 関数を作成する.
  2. 名前 、 入る UpdateQuickSightUserUponSCIMEvent.
  3. ランタイム、選択する Pythonの3.9.
  4. タイム·アウト、15 秒に設定します。
  5. 権限、次のアクセス許可を含む IAM ロールを作成してアタッチします (信頼されたエンティティ (プリンシパル) は、 lambda.amazonaws.com):
    { "Version": "2012-10-17", "Statement": [ { "Sid": "MinimalPrivForScimQsBlog", "Effect": "Allow", "Action": [ "identitystore:DescribeUser", "quicksight:RegisterUser", "quicksight:DescribeUser", "quicksight:CreateGroup", "quicksight:DeleteGroup", "quicksight:DescribeGroup", "quicksight:ListUserGroups", "quicksight:CreateGroupMembership", "quicksight:DeleteGroupMembership", "quicksight:DescribeGroupMembership", "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" } ]
    }

  6. Boto3 SDK を使用して Python コードを記述します。 アイデンティティストア & クイックサイト. 以下は、サンプルの Python コード全体です。
import sys
import boto3
import json
import logging
from time import strftime
from datetime import datetime # Set logging
logger = logging.getLogger()
logger.setLevel(logging.INFO) def lambda_handler(event, context): ''' Modify QuickSight group membership upon SCIM event from IAM Identity Center originated from Azure AD. It works in this way: Azure AD -> SCIM -> Identity Center -> CloudTrail -> EventBridge -> Lambda -> QuickSight Note that this is a straightforward sample to show how to update QuickSight group membership upon certain SCIM event. For example, it assumes that 1:1 user-to-group assigmnent, only one (combined) SAML attribute, etc. For production, take customer requirements into account and develop your own code. ''' # Setting variables (hard-coded. get dynamically for production code) qs_namespace_name = 'default' qs_iam_role = 'qs-reader-azure' # Obtain account ID and region account_id = boto3.client('sts').get_caller_identity()['Account'] region = boto3.session.Session().region_name # Setup clients qs = boto3.client('quicksight') iic = boto3.client('identitystore') # Check boto3 version logger.debug(f"## Your boto3 version: {boto3.__version__}") # Get user info from event data event_json = json.dumps(event) logger.debug(f"## Event: {event_json}") iic_store_id = event['detail']['requestParameters']['identityStoreId'] iic_user_id = event['detail']['requestParameters']['userId'] # For UpdateUser event, userId is provided through requestParameters logger.info("## Getting user info from Identity Store.") try: res_iic_describe_user = iic.describe_user( IdentityStoreId = iic_store_id, UserId = iic_user_id ) except Exception as e: logger.error("## Operation failed due to unknown error. Exiting.") logger.error(e) sys.exit() else: logger.info(f"## User info retrieval succeeded.") azure_user_attribute_title = res_iic_describe_user['Title'] azure_user_attribute_userprincipalname = res_iic_describe_user['UserName'] qs_user_name = qs_iam_role + "/" + azure_user_attribute_userprincipalname logger.info(f"#### Identity Center user name: {azure_user_attribute_userprincipalname}") logger.info(f"#### QuickSight group name desired: {azure_user_attribute_title}") logger.debug(f"#### res_iic_describe_user: {json.dumps(res_iic_describe_user)}, which is {type(res_iic_describe_user)}") # Exit if user is not present since this function is supposed to be called by UpdateUser event try: # Get QuickSight user name res_qs_describe_user = qs.describe_user( UserName = qs_user_name, AwsAccountId = account_id, Namespace = qs_namespace_name ) except qs.exceptions.ResourceNotFoundException as e: logger.error(f"## User {qs_user_name} is not found in QuickSight.") logger.error(f"## Make sure the QuickSight user has been created in advance. Exiting.") logger.error(e) sys.exit() except Exception as e: logger.error("## Operation failed due to unknown error. Exiting.") logger.error(e) sys.exit() else: logger.info(f"## User {qs_user_name} is found in QuickSight.") # Remove current membership unless it's the desired one qs_new_group = azure_user_attribute_title # Set "Title" SAML attribute as the desired QuickSight group name in_desired_group = False # Set this flag True when the user is already a member of the desired group logger.info(f"## Starting group membership removal.") try: res_qs_list_user_groups = qs.list_user_groups( UserName = qs_user_name, AwsAccountId = account_id, Namespace = qs_namespace_name ) except Exception as e: logger.error("## Operation failed due to unknown error. Exiting.") logger.error(e) sys.exit() else: # Skip if the array is empty (user is not member of any groups) if not res_qs_list_user_groups['GroupList']: logger.info(f"## User {qs_user_name} is not a member of any QuickSight group. Skipping removal.") else: for grp in res_qs_list_user_groups['GroupList']: qs_current_group = grp['GroupName'] # Retain membership if the new and existing group names match if qs_current_group == qs_new_group: logger.info(f"## The user {qs_user_name} already belong to the desired group. Skipping removal.") in_desired_group = True else: # Remove all unnecessary memberships logger.info(f"## Removing user {qs_user_name} from existing group {qs_current_group}.") try: res_qs_delete_group_membership = qs.delete_group_membership( MemberName = qs_user_name, GroupName = qs_current_group, AwsAccountId = account_id, Namespace = qs_namespace_name ) except Exception as e: logger.error(f"## Operation failed due to unknown error. Exiting.") logger.error(e) sys.exit() else: logger.info(f"## The user {qs_user_name} has removed from {qs_current_group}.") # Create group membership based on IIC attribute "Title" logger.info(f"## Starting group membership assignment.") if in_desired_group is True: logger.info(f"## The user already belongs to the desired one. Skipping assignment.") else: try: logger.info(f"## Checking if the desired group exists.") res_qs_describe_group = qs.describe_group( GroupName = qs_new_group, AwsAccountId = account_id, Namespace = qs_namespace_name ) except qs.exceptions.ResourceNotFoundException as e: # Create a QuickSight group if not present logger.info(f"## Group {qs_new_group} is not present. Creating.") today = datetime.now() res_qs_create_group = qs.create_group( GroupName = qs_new_group, Description = 'Automatically created at ' + today.strftime('%Y.%m.%d %H:%M:%S'), AwsAccountId = account_id, Namespace = qs_namespace_name ) except Exception as e: logger.error(f"## Operation failed due to unknown error. Exiting.") logger.error(e) sys.exit() else: logger.info(f"## Group {qs_new_group} is found in QuickSight.") # Add the user to the desired group logger.info("## Modifying group membership based on its latest attributes.") logger.info(f"#### QuickSight user name: {qs_user_name}") logger.info(f"#### QuickSight group name: {qs_new_group}") try: res_qs_create_group_membership = qs.create_group_membership( MemberName = qs_user_name, GroupName = qs_new_group, AwsAccountId = account_id, Namespace = qs_namespace_name ) except Exception as e: logger.error("## Operation failed due to unknown error. Exiting.") logger.error(e) else: logger.info("## Group membership modification succeeded.") qs_group_member_name = res_qs_create_group_membership['GroupMember']['MemberName'] qs_group_member_arn = res_qs_create_group_membership['GroupMember']['Arn'] logger.debug("## QuickSight group info:") logger.debug(f"#### qs_user_name: {qs_user_name}") logger.debug(f"#### qs_group_name: {qs_new_group}") logger.debug(f"#### qs_group_member_name: {qs_group_member_name}") logger.debug(f"#### qs_group_member_arn: {qs_group_member_arn}") logger.debug("## IIC info:") logger.debug(f"#### IIC user name: {azure_user_attribute_userprincipalname}") logger.debug(f"#### IIC user id: {iic_user_id}") logger.debug(f"#### Title: {azure_user_attribute_title}") logger.info(f"## User {qs_user_name} has been successfully added to the group {qs_new_group} in {qs_namespace_name} namespace.") # return response return { "namespaceName": qs_namespace_name, "userName": qs_user_name, "groupName": qs_new_group }

この Lambda 関数には Boto3 1.24.64 以降が必要であることに注意してください。 Boto3 が Lambdaランタイム これよりも古い場合、Lambda レイヤーを使用して最新バージョンの Boto3 を使用します。 詳細については、を参照してください。 Python (Boto 3) Lambda 関数からの「不明なサービス」、「パラメーターの検証に失敗しました」、および「オブジェクトに属性がありません」というエラーを解決するにはどうすればよいですか?.

イベントをトリガーする EventBridge ルールを追加する

以前に作成した Lambda 関数を呼び出す EventBridge ルールを作成するには、次の手順を実行します。

  1. EventBridge コンソールで、新しいルールを作成します。
  2. 名前 、 入る updateQuickSightUponSCIMEvent.
  3. イベントパターン、次のコードを入力します。
    { "source": ["aws.sso-directory"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["sso-directory.amazonaws.com"], "eventName": ["UpdateUser"] }
    }

  4. 目標で、作成した Lambda 関数を選択します (UpdateQuickSightUserUponSCIMEvent).
  5. ルールを有効にします。

Azure AD でユーザー属性値を変更して構成を確認する

Azure AD でユーザーの属性を変更し、新しいグループが作成され、ユーザーが新しいグループに追加されていることを確認してみましょう。

  1. Azure AD コンソールに戻ります。
  2. 管理 、クリック ユーザー.
  3. 以前に IAM Identity Center ポータルから QuickSight にログインするために使用したユーザーの XNUMX つを選択します。
  4. 選択する プロパティを編集するの値を編集します。 職名 & 部門.
    プロパティの編集
  5. 構成を保存します。
  6. 管理 、選択する エンタープライズアプリケーション、アプリケーション名、および プロビジョニング.
  7. 選択する プロビジョニングを停止する その後 プロビジョニングを開始します 順番通りに。

Azure AD では、SCIM プロビジョニング間隔は 40分固定. すぐに結果を得るために、プロビジョニングを手動で停止して開始します。

プロビジョニング ステータス

  1. QuickSight コンソールに移動します。
  2. ドロップダウンのユーザー名メニューで、 QuickSightを管理する.
  3. 選択する グループを管理する.

これで、新しいグループが作成され、ユーザーがこのグループに割り当てられたことがわかります。

新しいグループが作成され、ユーザーがこのグループに割り当てられます

クリーンアップ

ソリューションが完成したら、環境をクリーンアップして、コストへの影響を最小限に抑えます。 次のリソースを削除することをお勧めします。

  • ラムダ関数
  • ラムダ層
  • Lambda 関数の IAM ロール
  • Lambda 関数の CloudWatch ログ グループ
  • EventBridgeルール
  • QuickSight アカウント
    • Note : AWS アカウントごとに XNUMX つの QuickSight アカウントしか存在できません。 したがって、QuickSight アカウントは、組織内の他のユーザーによって既に使用されている可能性があります。 このブログをフォローするように明示的に設定し、他のユーザーによって使用されていないことが確実な場合にのみ、QuickSight アカウントを削除してください。
  • IAM アイデンティティ センター インスタンス
  • Azure AD の IAM ID プロバイダーの構成
  • Azure AD インスタンス

まとめ

この投稿では、QuickSight ユーザーの一元管理のために IAM Identity Center SCIM プロビジョニングと Azure AD からの SAML 2.0 フェデレーションを構成するための段階的な手順を説明しました。 また、IAM Identity Center で生成された SCIM イベントを使用し、EventBridge と Lambda で自動化を設定することにより、Azure AD のユーザー属性に基づいて QuickSight でグループ メンバーシップの自動更新を行うデモも行いました。

QuickSight でユーザーとグループをプロビジョニングするためのこのイベント駆動型のアプローチにより、システム管理者は、組織に応じてさまざまなユーザー管理方法が期待される場合に完全な柔軟性を得ることができます。 また、ユーザーが QuickSight にアクセスするたびに、QuickSight と Azure AD の間でユーザーとグループの一貫性が確保されます。

ご質問やフィードバックをお待ちしております。


著者について

中谷 毅 東京のプロフェッショナルサービスチームのプリンシパルビッグデータコンサルタントです。 IT 業界で 25 年の経験があり、データ インフラストラクチャの設計を専門としています。 オフの日には、ロック ドラマーやモーターサイクリストになることができます。

若菜ビルキン-坂下 はAmazonQuickSightのスペシャリストソリューションアーキテクトです。 彼女は顧客と緊密に協力して、視覚化を通じてデータを理解できるように支援しています。 以前、ワカナはS&Pグローバルに勤務し、顧客がビジネスに関連するデータ、洞察、調査にアクセスできるように支援していました。

スポット画像

最新のインテリジェンス

スポット画像