如何使用 Java SDK 获取 AWS Quicksight 仪表板的嵌入 URL

How to Get Embed URLs for AWS Quicksight Dashboards using Java SDK

我想我了解为 AWS Quicksight 仪表板获取嵌入 URL 所需的所有步骤,并且我已经能够通过 AWS CLI 获取有效的 URL,如AWS docs

但是,我似乎无法通过 AWS Java SDK(特别是 v2)让它工作。似乎没有一个很好的例子。

有谁知道使用 Java(或 Groovy)最好使用 Spring Boot(或 Grails 3 或 4)的良好工作示例?

我终于想通了。这是一个有效的 Groovy/Grails sample project,它使用 AWS Java SDK v2.

获取 Quicksight 仪表板 URL

总结

我遵循了 AWS 文档中流程大纲的修改版本,here。文档说让您的服务帐户承担用户的 IAM 角色,然后使用 IdentityType.IAM 作为最终用户请求仪表板。但是,我请求获取 url 作为服务帐户,没有承担用户的角色,并在 API 调用中指定了最终用户的 ARN 和 IdentityType.QUICKSIGHT

代码 (full code)

import software.amazon.awssdk.services.quicksight.QuickSightClient
import software.amazon.awssdk.services.quicksight.model.*

class ApplicationController {
    String roleName = "embed-dashboard"
    String namespace = "default"
    String awsAccountId
    String dashboardId
    QuickSightClient quickSightClient

    def index(String awsAccountId, String email, String dashboardId) {

        //unimportant code removed

        String url = fetchEmbedUrl(email)
        render "<a href='$url' target='_blank'>Dashboard</a>"
    }

    private String fetchEmbedUrl(String email) {
        // look up the user by email address
        // if we don't find the user register them
        User user = fetchUser(email) ?: registerUser(email)

        // get the dashboard URL
        String embedUrl = quickSightClient.getDashboardEmbedUrl(GetDashboardEmbedUrlRequest.builder()
            .awsAccountId(awsAccountId)
            .dashboardId(dashboardId)
            .userArn(user.arn)
            .identityType(IdentityType.QUICKSIGHT)
            .sessionLifetimeInMinutes(600L)
            .build()
        ).embedUrl

        log.info("URL:\n$embedUrl")

        return embedUrl
    }

    private User fetchUser(String email) {
        return quickSightClient.listUsers(ListUsersRequest.builder()
            .awsAccountId(awsAccountId)
            .namespace(namespace)
            .build()
        ).userList().find { it.email() == email }
    }

    private User registerUser(String email) {
        String roleArn = "arn:aws:iam::$awsAccountId:role/$roleName"
        return quickSightClient.registerUser(RegisterUserRequest.builder()
            .awsAccountId(awsAccountId)
            .namespace(namespace)
            .identityType(IdentityType.IAM)
            .iamArn(roleArn)
            .userRole("READER")
            .email(email)
            .sessionName(email)
            .build()
        ).user()
    }

}