本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
為註冊使用者嵌入 Amazon QuickSight 主控台的完整功能
重要
Amazon QuickSight 有內嵌分析的新API操作: GenerateEmbedUrlForAnonymousUser
和 GenerateEmbedUrlForRegisteredUser
。
您仍然可以使用 GetDashboardEmbedUrl
和 GetSessionEmbedUrl
API操作來內嵌儀表板和 QuickSight 主控台,但它們不包含最新的內嵌功能。如需使用舊API操作內嵌的詳細資訊,請參閱 使用 GetDashboardEmbedURL 和 GetSessionEmbedURL API 操作內嵌分析。
適用於:企業版 |
目標受眾:Amazon QuickSight 開發人員 |
透過 Enterprise Edition,除了提供唯讀儀表板之外,您還可以在自訂品牌撰寫入口網站中提供 Amazon QuickSight 主控台體驗。使用這種方法,可以讓使用者建立資料來源、資料集和分析。在相同的界面中,他們可以建立、發布和檢視儀表板。如果您想限制其中一些許可,也可以這樣做。
QuickSight 透過內嵌主控台存取的使用者需要屬於作者或管理員安全群組。讀取器沒有足夠的存取權來使用 QuickSight 主控台進行撰寫,無論其是內嵌或 的一部分 AWS Management Console。但是,作者和管理員仍然可以存取內嵌式儀表板。如果您想要將許可限制為某些撰寫功能,您可以使用 UpdateUserAPI操作將自訂許可設定檔新增至使用者。使用 RegisterUserAPI操作新增已連接自訂許可設定檔的新使用者。如需詳細資訊,請參閱下列章節:
-
如需透過定義自訂主控台許可來建立自訂角色的資訊,請參閱自訂 QuickSight 主控台的存取。
-
如需使用命名空間隔離多租戶使用者、群組和 QuickSight 資產的相關資訊,請參閱QuickSight 命名空間 。
-
如需將您自己的品牌新增至內嵌 QuickSight主控台的資訊,請參閱在 中使用主題 QuickSight 和QuickSight 主題API操作 。
在以下各節中,您可以找到有關如何為註冊使用者設定內嵌 Amazon QuickSight 儀表板的詳細資訊。
步驟 1:設定許可
在以下章節中,您可以了解如何為後端應用程式或 Web 伺服器設定許可。此任務需要對 的管理存取權IAM。
每個存取 的使用者都會 QuickSight 擔任一個角色,該角色會授予 Amazon 對主控台工作階段的 QuickSight 存取和許可。若要實現此目標,請在AWS您的帳戶中建立IAM角色。將IAM政策與 角色建立關聯,以便為擔任該角色的任何使用者提供許可。新增quicksight:RegisterUser
許可,以確保讀取器可以 QuickSight 唯讀方式存取,且無法存取任何其他資料或建立功能。此IAM角色也需要提供擷取主控台工作階段 的許可URLs。對於這一點,您新增 quicksight:GenerateEmbedUrlForRegisteredUser
。
您可以在IAM政策中建立條件,以限制開發人員可以在GenerateEmbedUrlForAnonymousUser
API操作AllowedDomains
參數中列出的網域。AllowedDomains
參數是選用參數。它可讓您作為開發人員,選擇覆寫在管理 QuickSight功能表中設定的靜態網域。反之,您最多可以列出三個可以存取產生的 的網域或子網域URL。然後URL,這會內嵌在您建立的網站中。只有參數中列出的域可以存取內嵌式儀表板。如果沒有這種情況,您可以在 AllowedDomains
參數中列出網際網路上的任何域。
下列範例政策提供這些許可。
{ "Version": "2012-10-17", "Statement": [ { "Action": "quicksight:RegisterUser", "Resource": "*", "Effect": "Allow" }, { "Effect": "Allow", "Action": [ "quicksight:GenerateEmbedUrlForRegisteredUser" ], "Resource": [ "arn:
partition
:quicksight:region
:accountId
:user/namespace
/userName
" ], "Condition": { "ForAllValues:StringEquals": { "quicksight:AllowedEmbeddingDomains": [ "https://my.static.domain1.com", "https://*.my.static.domain2.com" ] } } } ] }
下列範例政策提供擷取主控台工作階段 的許可URL。如果您要在使用者存取內嵌工作階段之前建立使用者,則可以不帶 quicksight:RegisterUser
使用原則。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "quicksight:GenerateEmbedUrlForRegisteredUser" ], "Resource": [ "arn:
partition
:quicksight:region
:accountId
:user/namespace
/userName
" ], "Condition": { "ForAllValues:StringEquals": { "quicksight:AllowedEmbeddingDomains": [ "https://my.static.domain1.com", "https://*.my.static.domain2.com" ] } } } ] }
最後,您應用程式的IAM身分必須具有與其相關聯的信任政策,才能允許存取您剛建立的角色。這表示當使用者存取您的應用程式時,您的應用程式可以代表使用者擔任角色,並在 中佈建使用者 QuickSight。範例信任政策如下所示。
{ "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" } ] }
如需有關 OpenID Connect 或SAML身分驗證的信任政策的詳細資訊,請參閱 IAM 使用者指南的下列章節:
步驟 2:產生URL已連接驗證碼的
在下一節中,您可以了解如何驗證使用者,並在應用程式伺服器上取得可內嵌URL的主控台工作階段。
當使用者存取您的應用程式時,應用程式會代表使用者擔任該IAM角色。然後,如果使用者尚未存在 QuickSight,它會將使用者新增至 。接著,它傳遞識別符當作唯一的角色工作階段 ID。
執行所述的步驟可確保主控台工作階段的每個檢視器在 中唯一佈建 QuickSight。它還會強制執行個別使用者設定,例如資料列層級的安全性和參數的動態預設值。
下列範例代表使用者執行IAM身分驗證。此代碼在您的應用程式伺服器上運行。
import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.quicksight.AmazonQuickSight; import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder; import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest; import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResult; import com.amazonaws.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration; import com.amazonaws.services.quicksight.model.RegisteredUserQuickSightConsoleEmbeddingConfiguration; /** * Class to call QuickSight AWS SDK to get url for QuickSight console embedding. */ public class GetQuicksightEmbedUrlRegisteredUserQSConsoleEmbedding { private final AmazonQuickSight quickSightClient; public GetQuicksightEmbedUrlRegisteredUserQSConsoleEmbedding() { this.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 getQuicksightEmbedUrl( final String accountId, final String userArn, // Registered user arn to use for embedding. Refer to Get Embed Url section in developer portal to find out how to get user arn for a QuickSight user. final List<String> allowedDomains, // Runtime allowed domain for embedding final String initialPath ) throws Exception { final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = new RegisteredUserEmbeddingExperienceConfiguration() .withQuickSightConsole(new RegisteredUserQuickSightConsoleEmbeddingConfiguration().withInitialPath(initialPath)); final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest = new GenerateEmbedUrlForRegisteredUserRequest(); generateEmbedUrlForRegisteredUserRequest.setAwsAccountId(accountId); generateEmbedUrlForRegisteredUserRequest.setUserArn(userArn); generateEmbedUrlForRegisteredUserRequest.setAllowedDomains(allowedDomains); generateEmbedUrlForRegisteredUserRequest.setExperienceConfiguration(experienceConfiguration); final GenerateEmbedUrlForRegisteredUserResult generateEmbedUrlForRegisteredUserResult = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest); return generateEmbedUrlForRegisteredUserResult.getEmbedUrl(); } }
global.fetch = require('node-fetch'); const AWS = require('aws-sdk'); function generateEmbedUrlForRegisteredUser( accountId, dashboardId, openIdToken, // Cognito-based token userArn, // registered user arn roleArn, // IAM user role to use for embedding sessionName, // Session name for the roleArn assume role allowedDomains, // Runtime allowed domain for embedding getEmbedUrlCallback, // GetEmbedUrl success callback method errorCallback // GetEmbedUrl error callback method ) { const stsClient = new AWS.STS(); let stsParams = { RoleSessionName: sessionName, WebIdentityToken: openIdToken, RoleArn: roleArn } stsClient.assumeRoleWithWebIdentity(stsParams, function(err, data) { if (err) { console.log('Error assuming role'); console.log(err, err.stack); errorCallback(err); } else { const getDashboardParams = { "AwsAccountId": accountId, "ExperienceConfiguration": { "QuickSightConsole": { "InitialPath": '/start' } }, "UserArn": userArn, "AllowedDomains": allowedDomains, "SessionLifetimeInMinutes": 600 }; const quicksightGetDashboard = new AWS.QuickSight({ region: process.env.AWS_REGION, credentials: { accessKeyId: data.Credentials.AccessKeyId, secretAccessKey: data.Credentials.SecretAccessKey, sessionToken: data.Credentials.SessionToken, expiration: data.Credentials.Expiration } }); quicksightGetDashboard.generateEmbedUrlForRegisteredUser(getDashboardParams, function(err, data) { if (err) { console.log(err, err.stack); errorCallback(err); } else { const result = { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": "*", // Use your website domain to secure access to GetEmbedUrl API "Access-Control-Allow-Headers": "Content-Type" }, "body": JSON.stringify(data), "isBase64Encoded": false } getEmbedUrlCallback(result); } }); } }); }
import json import boto3 from botocore.exceptions import ClientError # Create QuickSight and STS clients qs = boto3.client('quicksight', region_name='us-east-1') sts = boto3.client('sts') # Function to generate embedded URL # accountId: AWS account ID # userArn: arn of registered user # allowedDomains: Runtime allowed domain for embedding # roleArn: IAM user role to use for embedding # sessionName: session name for the roleArn assume role def generateEmbeddingURL(accountId, userArn, allowedDomains, roleArn, sessionName): try: assumedRole = sts.assume_role( RoleArn = roleArn, RoleSessionName = sessionName, ) except ClientError as e: return "Error assuming role: " + str(e) else: assumedRoleSession = boto3.Session( aws_access_key_id = assumedRole['Credentials']['AccessKeyId'], aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'], aws_session_token = assumedRole['Credentials']['SessionToken'], ) try: quickSightClient = assumedRoleSession.client('quicksight', region_name='us-east-1') experienceConfiguration = { "QuickSightConsole": { "InitialPath": "/start" } } response = quickSightClient.generate_embed_url_for_registered_user( AwsAccountId = accountId, ExperienceConfiguration = experienceConfiguration, UserArn = userArn, AllowedDomains = allowedDomains, 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: return "Error generating embedding url: " + str(e)
下列範例顯示您可以在應用程式伺服器上使用的 JavaScript (Node.js),以URL為內嵌主控台工作階段產生 。您可以在URL網站或應用程式中使用它來顯示主控台工作階段。
const AWS = require('aws-sdk'); const https = require('https'); var quicksightClient = new AWS.Service({ apiConfig: require('./quicksight-2018-04-01.min.json'), region: 'us-east-1', }); quicksightClient.generateEmbedUrlForRegisteredUser({ 'AwsAccountId': '111122223333', 'ExperienceConfiguration': { 'QuickSightConsole': { 'InitialPath': '/start' } }, 'UserArn': 'REGISTERED_USER_ARN', 'AllowedDomains': allowedDomains, 'SessionLifetimeInMinutes': 100 }, function(err, data) { console.log('Errors: '); console.log(err); console.log('Response: '); console.log(data); });
// 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
/embed/12345/dashboards/67890.., RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' }
下列範例顯示 。NET/您可以在應用程式伺服器上使用的 C# 程式碼,為內嵌主控台工作階段產生 URL 。您可以在URL網站或應用程式中使用此功能來顯示主控台。
using System; using Amazon.QuickSight; using Amazon.QuickSight.Model; namespace GenerateDashboardEmbedUrlForRegisteredUser { class Program { static void Main(string[] args) { var quicksightClient = new AmazonQuickSightClient( AccessKey, SecretAccessKey, SessionToken, Amazon.RegionEndpoint.USEast1); try { RegisteredUserQuickSightConsoleEmbeddingConfiguration registeredUserQuickSightConsoleEmbeddingConfiguration = new RegisteredUserQuickSightConsoleEmbeddingConfiguration { InitialPath = "/start" }; RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration = new RegisteredUserEmbeddingExperienceConfiguration { QuickSightConsole = registeredUserQuickSightConsoleEmbeddingConfiguration }; Console.WriteLine( quicksightClient.GenerateEmbedUrlForRegisteredUserAsync(new GenerateEmbedUrlForRegisteredUserRequest { AwsAccountId = "111122223333", ExperienceConfiguration = registeredUserEmbeddingExperienceConfiguration, UserArn = "REGISTERED_USER_ARN", AllowedDomains = allowedDomains, SessionLifetimeInMinutes = 100 }).Result.EmbedUrl ); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
若要擔任角色,請選擇下列其中一個 AWS Security Token Service (AWS STS) API操作:
-
AssumeRole – 當您使用IAM身分擔任角色時,請使用此操作。
-
AssumeRoleWithWebIdentity – 當您使用 Web 身分提供者來驗證使用者時,請使用此操作。
-
AssumeRoleWithSaml – 當您使用 SAML 來驗證使用者時,請使用此操作。
下列範例顯示用於設定IAM角色的 CLI 命令。角色需要啟用 quicksight:GenerateEmbedUrlForRegisteredUser
的許可。如果您在使用者第一次開啟 時採取 just-in-time新增使用者的方法 QuickSight,該角色也需要為 啟用許可quicksight:RegisterUser
。
aws sts assume-role \ --role-arn "
arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role
" \ --role-session-namejohn.doe@example.com
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_console_session_role/john.doe@example.com
。角色工作階段 ID 由來自 role-arn
和 role-session-name
值的角色名稱所組成。對每個使用者使用唯一的角色工作階段 ID,可確保為每個使用者設定適當的許可。還能避免對使用者存取進行任何調節。限流是一項安全功能,可防止同一使用者 QuickSight 從多個位置存取 。
角色工作階段 ID 也會成為 中的使用者名稱 QuickSight。您可以使用此模式 QuickSight 提前佈建使用者,或在第一次存取主控台工作階段時佈建使用者。
下列範例顯示您可以用來佈建使用者的CLI命令。如需 RegisterUser、 DescribeUser和其他 QuickSight API 操作的詳細資訊,請參閱QuickSight API參考 。
aws quicksight register-user \ --aws-account-id
111122223333
\ --namespacedefault
\ --identity-typeIAM
\ --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role
" \ --user-roleREADER
\ --user-namejhnd
\ --session-name "john.doe@example.com
" \ --emailjohn.doe@example.com
\ --regionus-east-1
\ --custom-permissions-nameTeamA1
如果使用者是透過 Microsoft AD 進行身分驗證,您就不需要使用 RegisterUser
設定他們。相反地,當他們第一次存取 時,就應該自動訂閱 QuickSight。對於 Microsoft AD 使用者,您可以使用 DescribeUser
取得使用者 ARN。
第一次使用者存取 時 QuickSight,您也可以將此使用者新增至適當的群組。下列範例顯示將使用者新增至群組的CLI命令。
aws quicksight create-group-membership \ --aws-account-id=
111122223333
\ --namespace=default
\ --group-name=financeusers
\ --member-name="embedding_quicksight_dashboard_role/john.doe@example.com
"
您現在擁有的應用程式使用者,其也是 的使用者 QuickSight,且具有 QuickSight 主控台工作階段的存取權。
最後,若要取得主控台工作階段URL的簽署,generate-embed-url-for-registered-user
請從應用程式伺服器呼叫 。這會傳回可內嵌的主控台工作階段 URL。下列範例示範如何使用伺服器端呼叫URL為透過 AWS Managed Microsoft AD 或單一登入 (IAM Identity Center) 身分驗證的使用者產生內嵌主控台工作階段的 。
aws quicksight generate-embed-url-for-registered-user \ --aws-account-id
111122223333
\ --entry-pointthe-url-for--the-console-session
\ --session-lifetime-in-minutes600
\ --user-arnarn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_dashboard_role/embeddingsession
--allowed-domains '["domain1
","domain2
"]' \ --experience-configuration QuickSightConsole={InitialPath="/start
"}
如需使用此操作的詳細資訊,請參閱 GenerateEmbedUrlForRegisteredUser。 您可以在自己的程式碼中使用此操作和其他API操作。
步驟 3:內嵌主控台工作階段 URL
在下一節中,您可以了解如何使用 Amazon QuickSight Embedding SDK
-
將主控台工作階段放在HTML頁面上。
-
將參數傳遞至主控台工作階段。
-
以針對您的應用程式而訂做的訊息來處理錯誤狀態。
呼叫 GenerateEmbedUrlForRegisteredUser
API操作以產生您可以內嵌在應用程式中URL的 。這URL有效期為 5 分鐘,產生的工作階段有效期最長為 10 小時。API 操作會提供 URL auth_code
,以啟用單一登入工作階段。
以下是 generate-embed-url-for-registered-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/start...", "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713" }
使用內嵌或將此主控台工作階段新增至 iframe,將此主控台工作階段 QuickSight 內嵌SDK
即將託管內嵌式儀表板的域必須列在允許清單中,此為您的 Amazon QuickSight 訂閱已獲核准的域清單。這項要求將使未獲核准的網域無法託管內嵌儀表板,進而保護您的資料。如需為內嵌主控台新增域的詳細資訊,請參閱 允許在執行期使用 列出網域 QuickSight API。
下列範例示範如何使用產生的 URL。此代碼在您的應用程式伺服器上生成。
<!DOCTYPE html> <html> <head> <title>Console Embedding Example</title> <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script> <script type="text/javascript"> const embedSession = 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 = { onMessage: async (messageEvent, experienceMetadata) => { switch (messageEvent.eventName) { case 'ERROR_OCCURRED': { console.log("Do something when the embedded experience fails loading."); break; } } } }; const embeddedConsoleExperience = await embeddingContext.embedConsole(frameOptions, contentOptions); }; </script> </head> <body onload="embedSession()"> <div id="experience-container"></div> </body> </html>
<!DOCTYPE html> <html> <head> <title>QuickSight Console Embedding</title> <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@1.0.15/dist/quicksight-embedding-js-sdk.min.js"></script> <script type="text/javascript"> var session function onError(payload) { console.log("Do something when the session fails loading"); } function embedSession() { var containerDiv = document.getElementById("embeddingContainer"); var options = { // replace this dummy url with the one generated via embedding API url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode", // replace this dummy url with the one generated via embedding API container: containerDiv, parameters: { country: "United States" }, scrolling: "no", height: "700px", width: "1000px", locale: "en-US", footerPaddingEnabled: true, defaultEmbeddingVisualType: "TABLE", // this option only applies to QuickSight console embedding and is not used for dashboard embedding }; session = QuickSightEmbedding.embedSession(options); session.on("error", onError); } function onCountryChange(obj) { session.setParameters({country: obj.value}); } </script> </head> <body onload="embedSession()"> <span> <label for="country">Country</label> <select id="country" name="country" onchange="onCountryChange(this)"> <option value="United States">United States</option> <option value="Mexico">Mexico</option> <option value="Canada">Canada</option> </select> </span> <div id="embeddingContainer"></div> </body> </html>
若要讓此範例運作,請務必使用 Amazon QuickSight Embedding SDK 來使用 在您的網站上載入內嵌主控台工作階段 JavaScript。為獲得您的版本,請執行以下其中一項操作:
-
從 下載 Amazon QuickSight EmbeddingSDK
GitHub。此儲存庫由一組 QuickSight 開發人員維護。 -
從 下載最新的內嵌SDK版本https://www.npmjs.com/package/amazon-quicksight-embedding-sdk
。 -
如果您使用
npm
做為 JavaScript 相依性,請執行下列命令來下載並安裝它。npm install amazon-quicksight-embedding-sdk