為匿名 (未註冊) 使用者嵌入 Amazon Q in QuickSight Generative Q&A 體驗 - Amazon QuickSight

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

為匿名 (未註冊) 使用者嵌入 Amazon Q in QuickSight Generative Q&A 體驗

   目標對象:Amazon QuickSight 開發人員 

在下列各節中,您可以找到如何為匿名 (未註冊) 使用者設定內嵌生成問答體驗的詳細資訊。

步驟 1:設定許可

在下一節中,您可以找到如何設定後端應用程式或 Web 伺服器的許可,以內嵌生成式問答體驗。此任務需要 AWS Identity and Access Management () 的管理存取權IAM。

每個存取生成問答體驗的使用者都會擔任一個角色,為他們提供 Amazon QuickSight 存取和許可。若要實現此目標,請在 中建立 IAM角色 AWS 帳戶。將IAM政策與 角色建立關聯,以便為擔任該角色的任何使用者提供許可。IAM 角色需要提供許可,才能擷取特定使用者集URLs區的內嵌。

透過萬用字元 * 的協助,您可以授予許可,為特定命名空間中的所有URL使用者產生 。或者,您可以授予許可,以URL針對特定命名空間中的使用者子集產生 。對於這一點,您新增 quicksight:GenerateEmbedUrlForAnonymousUser

您可以在IAM政策中建立條件,以限制開發人員可以在 GenerateEmbedUrlForAnonymousUser API 操作的 AllowedDomains 參數中列出的網域。AllowedDomains 參數是選用參數。它授予開發人員覆寫在管理 QuickSight功能表中設定的靜態網域的選項,並改為列出最多三個可存取所產生 的網域或子網域URL。然後URL,這會內嵌在開發人員的網站中。只有參數中列出的域可以存取內嵌 Q 搜尋列。如果沒有這種情況,開發人員可以在 AllowedDomains 參數中列出網際網路上的任何域。

若要限制開發人員可搭配此參數使用的網域,請將 AllowedEmbeddingDomains條件新增至您的IAM政策。如需 AllowedDomains 參數的詳細資訊,請參閱《Amazon QuickSight API 參考GenerateEmbedUrlForAnonymousUser》中的 。

下列範例政策提供這些許可。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "quicksight:GenerateEmbedUrlForAnonymousUser" ], "Resource": [ "arn:{{partition}}:quicksight:{{region}}:{{accountId}}:namespace/{{namespace}}", "arn:{{partition}}:quicksight:{{region}}:{{accountId}}:dashboard/{{dashboardId-1}}", "arn:{{partition}}:quicksight:{{region}}:{{accountId}}:dashboard/{{dashboardId-2}}" ], "Condition": { "ForAllValues:StringEquals": { "quicksight:AllowedEmbeddingDomains": [ "https://my.static.domain1.com", "https://*.my.static.domain2.com" ] } } }

您應用程式的IAM身分必須具有與其相關聯的信任政策,以允許存取您剛建立的角色。這表示當使用者存取您的應用程式時,您的應用程式可以代表使用者擔任該角色,以載入生成式問答體驗。範例信任政策如下所示。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLambdaFunctionsToAssumeThisRole", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Sid": "AllowEC2InstancesToAssumeThisRole", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

如需信任政策的詳細資訊,請參閱IAM《 使用者指南中的暫時安全登入IAM資料。

步驟 2:產生URL已連接驗證碼的

在下一節中,您可以找到如何驗證使用者,並在應用程式伺服器上取得可內嵌的 Q URL 主題。

當使用者存取您的應用程式時,應用程式會代表使用者擔任該IAM角色。然後,如果使用者尚未存在 QuickSight,應用程式會將使用者新增至 。接著,它傳遞識別符當作唯一的角色工作階段 ID。

import java.util.List; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.regions.Regions; import com.amazonaws.services.quicksight.AmazonQuickSight; import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder; import com.amazonaws.services.quicksight.model.AnonymousUserGenerativeQnAEmbeddingConfiguration; import com.amazonaws.services.quicksight.model.AnonymousUserEmbeddingExperienceConfiguration; import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserRequest; import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserResult; import com.amazonaws.services.quicksight.model.SessionTag; /** * Class to call QuickSight AWS SDK to generate embed url for anonymous user. */ public class GenerateEmbedUrlForAnonymousUserExample { private final AmazonQuickSight quickSightClient; public GenerateEmbedUrlForAnonymousUserExample() { quickSightClient = AmazonQuickSightClientBuilder .standard() .withRegion(Regions.US_EAST_1.getName()) .withCredentials(new AWSCredentialsProvider() { @Override public AWSCredentials getCredentials() { // provide actual IAM access key and secret key here return new BasicAWSCredentials("access-key", "secret-key"); } @Override public void refresh() { } } ) .build(); } public String GenerateEmbedUrlForAnonymousUser( final String accountId, // YOUR AWS ACCOUNT ID final String initialTopicId, // Q TOPIC ID TO WHICH THE CONSTRUCTED URL POINTS AND EXPERIENCE PREPOPULATES INITIALLY final String namespace, // ANONYMOUS EMBEDDING REQUIRES SPECIFYING A VALID NAMESPACE FOR WHICH YOU WANT THE EMBEDDING URL final List<String> authorizedResourceArns, // Q TOPIC ARN LIST TO EMBED final List<String> allowedDomains, // RUNTIME ALLOWED DOMAINS FOR EMBEDDING final List<SessionTag> sessionTags // SESSION TAGS USED FOR ROW-LEVEL SECURITY ) throws Exception { AnonymousUserEmbeddingExperienceConfiguration experienceConfiguration = new AnonymousUserEmbeddingExperienceConfiguration(); AnonymousUserGenerativeQnAEmbeddingConfiguration generativeQnAConfiguration = new AnonymousUserGenerativeQnAEmbeddingConfiguration(); generativeQnAConfiguration.setInitialTopicId(initialTopicId); experienceConfiguration.setGenerativeQnA(generativeQnAConfiguration); GenerateEmbedUrlForAnonymousUserRequest generateEmbedUrlForAnonymousUserRequest = new GenerateEmbedUrlForAnonymousUserRequest() .withAwsAccountId(accountId) .withNamespace(namespace) .withAuthorizedResourceArns(authorizedResourceArns) .withExperienceConfiguration(experienceConfiguration) .withSessionTags(sessionTags) .withSessionLifetimeInMinutes(600L); // OPTIONAL: VALUE CAN BE [15-600]. DEFAULT: 600 .withAllowedDomains(allowedDomains); GenerateEmbedUrlForAnonymousUserResult result = quickSightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserRequest); return result.getEmbedUrl(); } }
注意

APIs 無法直接從瀏覽器呼叫內嵌URL產生。請改參考 Node.JS 範例。

import json import boto3 from botocore.exceptions import ClientError import time # Create QuickSight and STS clients quicksightClient = boto3.client('quicksight',region_name='us-west-2') sts = boto3.client('sts') # Function to generate embedded URL for anonymous user # accountId: YOUR AWS ACCOUNT ID # topicId: Topic ID to embed # quicksightNamespace: VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING # authorizedResourceArns: TOPIC ARN LIST TO EMBED # allowedDomains: RUNTIME ALLOWED DOMAINS FOR EMBEDDING # sessionTags: SESSION TAGS USED FOR ROW-LEVEL SECURITY def generateEmbedUrlForAnonymousUser(accountId, quicksightNamespace, authorizedResourceArns, allowedDomains, sessionTags): try: response = quicksightClient.generate_embed_url_for_anonymous_user( AwsAccountId = accountId, Namespace = quicksightNamespace, AuthorizedResourceArns = authorizedResourceArns, AllowedDomains = allowedDomains, ExperienceConfiguration = { 'GenerativeQnA': { 'InitialTopicId': topicId } }, SessionTags = sessionTags, SessionLifetimeInMinutes = 600 ) return { 'statusCode': 200, 'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"}, 'body': json.dumps(response), 'isBase64Encoded': bool('false') } except ClientError as e: print(e) return "Error generating embeddedURL: " + str(e)

下列範例顯示您可以在應用程式伺服器上使用的 JavaScript (Node.js),以URL為內嵌儀表板產生 。您可以在URL網站或應用程式中使用此項目來顯示儀表板。

const AWS = require('aws-sdk'); const https = require('https'); var quicksightClient = new AWS.Service({ region: 'us-east-1', }); quicksightClient.generateEmbedUrlForAnonymousUser({ 'AwsAccountId': '111122223333', 'Namespace': 'DEFAULT' 'AuthorizedResourceArns': '["topic-arn-topicId1","topic-arn-topicId2"]', 'AllowedDomains': allowedDomains, 'ExperienceConfiguration': { 'GenerativeQnA': { 'InitialTopicId': 'U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f' } }, 'SessionTags': '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]', 'SessionLifetimeInMinutes': 15 }, function(err, data) { console.log('Errors: '); console.log(err); console.log('Response: '); console.log(data); });

下列範例顯示 。NET/您可以在應用程式伺服器上用來產生內嵌 Q 搜尋列URL的 C# 程式碼。您可以在URL網站或應用程式中使用此項目來顯示 Q 搜尋列。

using System; using Amazon.QuickSight; using Amazon.QuickSight.Model; namespace GenerateGenerativeQnAEmbedUrlForAnonymousUser { class Program { static void Main(string[] args) { var quicksightClient = new AmazonQuickSightClient( AccessKey, SecretAccessKey, SessionToken, Amazon.RegionEndpoint.USEast1); try { AnonymousUserGenerativeQnAEmbeddingConfiguration anonymousUserGenerativeQnAEmbeddingConfiguration = new AnonymousUserGenerativeQnAEmbeddingConfiguration { InitialTopicId = "U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f" }; AnonymousUserEmbeddingExperienceConfiguration anonymousUserEmbeddingExperienceConfiguration = new AnonymousUserEmbeddingExperienceConfiguration { GenerativeQnA = anonymousUserGenerativeQnAEmbeddingConfiguration }; Console.WriteLine( quicksightClient.GenerateEmbedUrlForAnonymousUserAsync(new GenerateEmbedUrlForAnonymousUserRequest { AwsAccountId = "111122223333", Namespace = "DEFAULT", AuthorizedResourceArns '["topic-arn-topicId1","topic-arn-topicId2"]', AllowedDomains = allowedDomains, ExperienceConfiguration = anonymousUserEmbeddingExperienceConfiguration, SessionTags = '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]', SessionLifetimeInMinutes = 15, }).Result.EmbedUrl ); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }

若要擔任角色,請選擇下列其中一個 AWS Security Token Service (AWS STS) API操作:

  • AssumeRole – 當您使用IAM身分擔任角色時,請使用此操作。

  • AssumeRoleWithWebIdentity – 當您使用 Web 身分提供者來驗證使用者時,請使用此操作。

  • AssumeRoleWithSaml – 當您使用 驗證使用者時SAML,請使用此操作。

下列範例顯示 CLI命令來設定IAM角色。角色需要啟用 quicksight:GenerateEmbedUrlForAnonymousUser 的許可。

aws sts assume-role \ --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_generative_qna_role" \ --role-session-name anonymous caller

assume-role 操作會傳回三個輸出參數:存取金鑰、私密金鑰和工作階段字符。

注意

若您呼叫 AssumeRole 操作時收到 ExpiredToken 錯誤,原因可能是先前的 SESSION TOKEN 仍在環境變數中。設定以下變數便可清除此錯誤:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

下列範例示範如何在 中設定這三個參數CLI。對於 Microsoft Windows 電腦,請使用 set,不要使用 export

export AWS_ACCESS_KEY_ID = "access_key_from_assume_role" export AWS_SECRET_ACCESS_KEY = "secret_key_from_assume_role" export AWS_SESSION_TOKEN = "session_token_from_assume_role"

對於瀏覽您網站的使用者,執行這些命令可將其角色工作階段 ID 設為 embedding_quicksight_q_search_bar_role/QuickSightEmbeddingAnonymousPolicy。角色工作階段 ID 由來自 role-arnrole-session-name 值的角色名稱所組成。對每個使用者使用唯一的角色工作階段 ID,可確保為每個使用者設定適當的許可。還能避免對使用者存取進行任何調節。調節是一種安全功能,可防止相同的使用者 QuickSight 從多個位置存取 。此外,它使每個會話獨立且不同。如果您正在使用 Web 伺服器陣列 (例如負載平衡),且工作階段重新連線到不同的伺服器,則會開始新的工作階段。

若要取得儀表板URL的簽署,generate-embed-url-for-anynymous-user請從應用程式伺服器呼叫 。這會傳回可內嵌的儀表板 URL。下列範例示範如何使用伺服器端呼叫,為對 Web 入口網站或應用程式進行匿名存取的使用者產生URL內嵌儀表板的 。

aws quicksight generate-embed-url-for-anonymous-user \ --aws-account-id 111122223333 \ --namespace default-or-something-else \ --authorized-resource-arns '["topic-arn-topicId","topic-arn-topicId2"]' \ --allowed-domains '["domain1","domain2"]' \ --experience-configuration 'GenerativeQnA={InitialTopicId="topicId1"}' \ --session-tags '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]' \ --session-lifetime-in-minutes 15

如需使用此操作的詳細資訊,請參閱 GenerateEmbedUrlForAnonymousUser。 您可以在自己的程式碼中使用此操作和其他API操作。

步驟 3:嵌入生成式問答體驗 URL

在下一節中,您可以找到如何在網站或應用程式頁面URL中嵌入生成問答體驗。您可以使用 Amazon QuickSight 內嵌 SDK () 來執行此操作JavaScript。您可以使用SDK執行以下操作:

  • 將生成式問答體驗放在HTML頁面上。

  • 自訂內嵌體驗的配置和外觀,以符合您的應用程式需求。

  • 以針對您的應用程式而訂做的訊息來處理錯誤狀態。

若要產生您可以內嵌在應用程式中URL的 ,請呼叫 GenerateEmbedUrlForAnonymousUserAPI操作。這URL有效時間為 5 分鐘,而產生的工作階段有效時間最長為 10 小時。API 操作會提供 URL auth_code值,以啟用工作階段的單一登入。

以下是 generate-embed-url-for-anonymous-user 的回應範例。

//The URL returned is over 900 characters. For this example, we've shortened the string for //readability and added ellipsis to indicate that it's incomplete.{ "Status": "200", "EmbedUrl": "https://quicksightdomain/embedding/12345/q/search...", "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713" }

使用 內嵌或將此項目新增至 URL iframe,在您的網頁中QuickSight嵌入SDK生成式問答體驗。如果您設定固定高度和寬度數字 (以像素為單位), QuickSight 會使用這些值,而且不會隨著視窗大小調整而變更視覺效果。如果您是設定相對百分比高度和寬度, QuickSight 將提供隨視窗大小變更而改變的回應式配置。

請確定託管生成問答體驗的網域位於允許清單上,即 QuickSight 訂閱的已核准網域清單。此要求透過防止未經核准的網域託管內嵌的生成問答體驗來保護您的資料。如需為內嵌生成性問答體驗新增網域的詳細資訊,請參閱管理域和內嵌

您可以使用 QuickSight 內嵌SDK來自訂內嵌生成問答體驗的配置和外觀,以符合您的應用程式。使用 panelType 屬性來設定在應用程式中轉譯時生成問答體驗的登陸狀態。將 panelType 屬性設定為 'FULL',以轉譯完整的生成問答體驗面板。此面板類似於 QuickSight 使用者在主控台中擁有的體驗。面板的影格高度不會根據使用者互動而變更,且會遵守您在 frameOptions.height 屬性中設定的值。下圖顯示當您將 panelType值設定為 時轉譯的生成問答體驗面板'FULL'

當您將 panelType值設定為 時轉譯的生成問答體驗面板'FULL'。

panelType 屬性設定為 'SEARCH_BAR',以將生成問答體驗轉譯為搜尋列。此搜尋列類似於 Q 搜尋列內嵌至應用程式時呈現的方式。生成問答搜尋列會展開至較大的面板,顯示主題選擇選項、問題建議清單、答案面板或軟木板。

內嵌資產載入時,將會轉譯生成式 Q&A 搜尋列的預設最小高度。建議您將 frameOptions.height 值設定為 ,"38px"以最佳化搜尋列體驗。使用 focusedHeight 屬性來設定主題選取下拉式清單和問題建議清單的最佳大小。使用 expandedHeight 屬性來設定答案面板和軟木板的最佳大小。如果您選擇 'SEARCH_BAR'選項,建議您使用位置來設計父容器的樣式;絕對以避免應用程式中不必要的內容轉移。下圖顯示當您將panelType值設定為 時轉譯的生成問答體驗搜尋列'SEARCH_BAR'

當您將 panelType值設定為 時轉譯的生成問答體驗面板'SEARCH_BAR'。

設定 panelType 屬性之後,請使用 QuickSight 內嵌SDK來自訂生成式問答體驗的下列屬性。

  • 生成問答面板的標題 (僅適用於 panelType: FULL選項)。

  • 搜尋列的預留位置文字。

  • 是否允許選取主題。

  • 主題名稱是否顯示或隱藏。

  • Amazon Q 圖示是否顯示或隱藏 (僅適用於 panelType: FULL選項)。

  • 軟木板是否顯示為隱藏。

  • 使用者是否可以將 Genertaive Q&A 面板最大化為全螢幕。

  • 生成式問答面板的主題。您可以在 中ARN傳遞自訂主題SDK,以變更影格內容的外觀。內嵌的生成 BI 面板不支援 QuickSight 入門主題。若要使用 QuickSight 入門主題,請將它儲存為自訂主題 QuickSight。

當您使用 QuickSight 內嵌 時SDK,頁面上的生成問答體驗會根據狀態動態調整大小。使用 QuickSight 內嵌 SDK,您也可以控制生成式問答體驗中的參數,並接收頁面載入完成、狀態變更和錯誤的回呼。

下列範例示範如何使用產生的 URL。此代碼在您的應用程式伺服器上生成。

<!DOCTYPE html> <html> <head> <title>Generative Q&A Embedding Example</title> <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.7.0/dist/quicksight-embedding-js-sdk.min.js"></script> <script type="text/javascript"> const embedGenerativeQnA = async() => { const {createEmbeddingContext} = QuickSightEmbedding; const embeddingContext = await createEmbeddingContext({ onChange: (changeEvent, metadata) => { console.log('Context received a change', changeEvent, metadata); }, }); const frameOptions = { url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API container: '#experience-container', height: "700px", width: "1000px", onChange: (changeEvent, metadata) => { switch (changeEvent.eventName) { case 'FRAME_MOUNTED': { console.log("Do something when the experience frame is mounted."); break; } case 'FRAME_LOADED': { console.log("Do something when the experience frame is loaded."); break; } } }, }; const contentOptions = { // Optional panel settings. Default behavior is equivalent to {panelType: 'FULL'} panelOptions: { panelType: 'FULL', title: 'custom title', // Optional showQIcon: false, // Optional, Default: true }, // Use SEARCH_BAR panel type for the landing state to be similar to embedQSearchBar // with generative capability enabled topics /* panelOptions: { panelType: 'SEARCH_BAR', focusedHeight: '250px', expandedHeight: '500px', }, */ showTopicName: false, // Optional, Default: true showPinboard: false, // Optional, Default: true allowTopicSelection: false, // Optional, Default: true allowFullscreen: false, // Optional, Default: true searchPlaceholderText: "custom search placeholder", // Optional themeOptions: { // Optional themeArn: 'arn:aws:quicksight:<Region>:<AWS-Account-ID>:theme/<Theme-ID>' } onMessage: async (messageEvent, experienceMetadata) => { switch (messageEvent.eventName) { case 'Q_SEARCH_OPENED': { // called when pinboard is shown / visuals are rendered console.log("Do something when SEARCH_BAR type panel is expanded"); break; } case 'Q_SEARCH_FOCUSED': { // called when question suggestions or topic selection dropdown are shown console.log("Do something when SEARCH_BAR type panel is focused"); break; } case 'Q_SEARCH_CLOSED': { // called when shrinked to initial bar height console.log("Do something when SEARCH_BAR type panel is collapsed"); break; } case 'Q_PANEL_ENTERED_FULLSCREEN': { console.log("Do something when panel enters full screen mode"); break; } case 'Q_PANEL_EXITED_FULLSCREEN': { console.log("Do something when panel exits full screen mode"); break; } case 'CONTENT_LOADED': { console.log("Do something after experience is loaded"); break; } case 'ERROR_OCCURRED': { console.log("Do something when experience fails to load"); break; } } } }; const embeddedGenerativeQnExperience = await embeddingContext.embedGenerativeQnA(frameOptions, contentOptions); }; </script> </head> <body onload="embedGenerativeQnA()"> <div id="experience-container"></div> </body> </html>

若要讓此範例運作,請務必使用 Amazon QuickSight Embedding SDK 在您的網站上載入內嵌的生成問答體驗 JavaScript。為獲得您的版本,請執行以下其中一項操作:

選用的內嵌生成式問答體驗功能

下列選用功能可用於內嵌 的內嵌生成問答體驗SDK。

叫用生成式問答搜尋列動作

  • 設定問題 — 此功能會將問題傳送至生成式問答體驗,並立即查詢問題。

    embeddedGenerativeQnExperience.setQuestion('show me monthly revenue');
  • 關閉答案面板 (適用於生成式問答搜尋列選項) — 此功能會關閉答案面板,並將 iframe 傳回原始搜尋列狀態。

    embeddedGenerativeQnExperience.close();

如需詳細資訊,請參閱QuickSight 內嵌 SDK