【问题标题】:How to Get Embed URLs for AWS Quicksight Dashboards using Java SDK如何使用 Java SDK 获取 AWS Quicksight 仪表板的嵌入 URL
【发布时间】:2020-01-06 22:16:18
【问题描述】:
我认为我了解获取 AWS Quicksight 仪表板的嵌入 URL 所需的所有步骤,并且我已经能够通过 AWS docs 中所述的 AWS CLI 获取有效 URL。
但是,我似乎无法通过 AWS Java SDK(特别是 v2)让它工作。似乎在任何地方都没有一个很好的例子。
有没有人知道使用 Java(或 Groovy)最好使用 Spring Boot(或 Grails 3 或 4)的一个很好的工作示例?
【问题讨论】:
标签:
amazon-web-services
grails
aws-java-sdk
amazon-quicksight
【解决方案1】:
我终于明白了。这是一个有效的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()
}
}