如何在 Amazon QuickSight 中使用模板设置跨账户访问?
上次更新时间:2022 年 2 月 4 日
我正在尝试在 Amazon QuickSight 中创建对我的数据集和控制面板的跨账户访问。我该如何操作?
简短描述
您可以在两个 AWS 账户之间创建对 QuickSight 数据集和控制面板的跨账户访问。要创建跨账户访问,请使用 CreateTemplate API(创建模板 API)操作。template API(模板 API)对象允许您根据现有 QuickSight 分析或模板来创建模板。然后,使用 CreateDashboard API(创建控制面板 API)创建控制面板。
重要提示:确保从源帐户建立了适当的 READ 权限。建立正确的权限后,您可以在另一个 AWS 账户中创建或共享模板中的控制面板。
您可以在 QuickSight 中创建以下类型的跨账户访问:- 使用现有模板(账户 A)在另一个 AWS 账户(账户 B)中创建新模板。
- 使用现有模板(账户 A)在另一个 AWS 账户(账户 B)中创建控制面板。
注意:本文概述了使用 AWS 命令行界面 (AWS CLI) 或 Boto3 软件开发工具包进行跨账户访问的步骤。如果您在运行 AWS CLI 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
解决方法
使用与账户 A 相同的架构在账户 B 中创建数据集
使用与账户 A 相同的架构创建数据集:
aws quicksight create-data-set --cli-input-json file://<dataset.json>
-或者-
使用以下 Boto3 SDK 查询在账户 B 中使用与账户 A 相同的架构创建数据集:
response = client.create_data_set(
AwsAccountId='<string>',
DataSetId='<string>',
Name='<string>',
'S3Source': {
'DataSourceArn': 'arn:aws:quicksight:<region>:<Account-ID>:datasource/<datasource-name>"',
'InputColumns': [
{
"Name": "Col1",
"Type": "INTEGER"
},
{
"Name": "col2",
"Type": "DECIMAL"
},
{
"Name": "col3",
"Type": "INTEGER"
},
{
"Name": "col4",
"Type": "DECIMAL"
}
]
},
ImportMode='SPICE'|'DIRECT_QUERY',
)
在此示例查询中,我们使用 Amazon Simple Storage Service (Amazon S3) 作为数据源。
要获取数据集 ARN,请使用以下命令:
aws quicksight list-data-sets --aws-account-id <value>
根据账户 A 中的现有分析在账户 A 中创建模板
使用账户 A 的 create-template 命令在分析所在的 AWS 区域中创建模板。
重要提示:您无法跨不同的 AWS 区域创建模板。
使用以下 AWS CLI 命令语法在账户 A 中创建模板:
aws quicksight create-template --aws-account-id <Account_A> --template-id firsttemplate --source-entity file://template.json --profile default
-或者-
使用以下 Boto3 SDK 查询在账户 A 中创建模板:
%config IPCompleter.greedy=True
import boto3
default_namespace = 'default'
account_id = 'Account_A'
client = boto3.client('quicksight')
response = client.create_template( AwsAccountId=account_id, TemplateId='jabsma13', Name='jasbir', SourceEntity={ 'SourceAnalysis': { 'Arn': 'arn:aws:quicksight:us-east-1:12150061445:analysis/198ab579-d3ce-4401-b793-50dd2f81fcd9',
'DataSetReferences': [ { 'DataSetPlaceholder': 'test', 'DataSetArn': 'arn:aws:quicksight:us-east-1:121500614395:dataset/639111f1-36d2-4873-947a-f94dc9a148bb' }, ] } }, Tags=[ { 'Key': 'jsabir', 'Value': 'singh' }, ], VersionDescription='1'
)
下面是模板 JSON 文件 (template.json) 的示例:
{
"SourceAnalysis": {
"Arn": "arn:aws:quicksight:<Region of analysis>:<Account_A>:analysis/<Analysis ID>",
"DataSetReferences": [
{
"DataSetPlaceholder": "<Any name>",
"DataSetArn": "arn:aws:quicksight:<dataset region>:<Account_A>:dataset/<DatasetID>"
}
]
}
}
使用账户 A 中的现有模板在账户 B 中创建模板
要使用账户 A 中的现有模板在账户 B 中创建模板,请执行以下步骤:
1. 在账户 A 中,调用 UpdateTemplatePermissions API 以授予从源模板(账户 A)到账户 B 的跨账户 READ 权限。
AWS CLI
aws quicksight update-template-permissions --aws-account-id <Account_A> --template-id firsttemplate --grant-permissions file://TemplatePermission.json --profile default
采用以下类似方式更新您的模板文件 (TemplatePermission.json):
[{
"Principal": "arn:aws:iam::<Account_B>:root",
"Actions": ["quicksight:UpdateTemplatePermissions", "quicksight:DescribeTemplate"]
}]
Boto3 软件开发工具包
response_updated_perm = client.update_template_permissions(
AwsAccountId='Account_A',
TemplateId='kumo-123',
GrantPermissions=[
{
'Principal': 'arn:aws:iam::<Account_B>:root',
'Actions': [
'quicksight:UpdateTemplatePermissions',
'quicksight:DescribeTemplate'
]
},
]
)
print(response_updated_perm
2. 在账户 B 中为 IAM 用户 (QS-Test) 设置适当的 AWS Identity and Access Management (IAM) 权限:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Resource": "arn:aws:quicksight:us-east-1:<Account_A>:template/kumo-123",
"Action": "quicksight:DescribeTemplate"
},
{
"Effect": "Allow",
"Resource": "*",
"Action": "quicksight:CreateTemplate"
}
]
}
IAM 用户 (QS-Test) 必须拥有执行以下操作的权限:
quicksight:DescribeTemplate(位于账户 A 中创建的模板文件上)quicksight:CreateTemplate(用于在账户 B 中创建新的模板)
3. 让您的 IAM 角色获得第 2 步中定义的权限。
AWS CLI
aws sts assume-role \
--role-arn "arn:aws:iam::<Account_B>:role/<role_name>" \
--role-session-name john.doe@example.com
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"
Boto3 软件开发工具包
/code
sts_client = boto3.client('sts')
assumed_role_object=sts_client.assume_role(
RoleArn="arn:aws:iam::<Account_B>:role/<role_name>",
RoleSessionName="AssumeRoleSession1"
)
credentials=assumed_role_object['Credentials']
QS=boto3.client(
'quicksight',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
)
使用 AssumeRole 返回的临时凭证连接到 QuickSight。
4. 在账户 B 中创建模板。
AWS CLI
aws quicksight create-template --aws-account-id <Account B ID> --template-id firsttemplate --source-entity file://TemplateFromTemplate.json --profile default
账户 B 中的模板文件 (TemplateFromTemplate.json) 如下所示:
{
"SourceTemplate": {
"Arn": "arn:aws:quicksight:us-east-1:<Account A ID>:template/firsttemplate"
}
Boto3 软件开发工具包
# Create template in Account B
client = boto3.client(
'quicksight',
# Hard coded strings as credentials, not recommended.
aws_access_key_id='xxxxxxx',
aws_secret_access_key='xxxxxxxxx'
)
response = client.create_template(
AwsAccountId='Account_B',
TemplateId='XXXXXXX',
Name='XXXXXX',
SourceEntity={
'SourceTemplate': {
'Arn': 'arn:aws:quicksight:us-east-1:<Account_A>:template/kumo-123'
}
}
)
print(response)
5. 使用 list_template API 验证账户 B 中的模板:
AWS CLI
aws quicksight list-templates --aws-account-id <Account B>
Boto3 软件开发工具包
responsetemplates_B = client.list_templates(
AwsAccountId='Account_B')
print(responsetemplates_B['TemplateSummaryList'])
使用我们刚在账户 A 中创建的模板在账户 B 中创建控制面板
1. 使用账户 A 中的模板在账户 B 中创建控制面板。或者,您可以使用账户 B 中新创建的模板来创建控制面板。
AWS CLI
aws quicksight create-dashboard --aws-account-id <Account B ID> --dashboard-id <any ID> --name <any dashboard name> --source-entity file://DashboardFromTemplate.json
下面举例说明您的控制面板 JSON 文件 (DashboardFromTemplate.json) 是什么样:
{
"SourceTemplate": {
"DataSetReferences": [
{
"DataSetPlaceholder": "placeholder", // the place holder you have provided while creating the template in step 1.
"DataSetArn": "arn:aws:quicksight:us-east-1:<Account B ID>:dataset/<Dataset ID>"
}
],
"Arn": "arn:aws:quicksight:us-east-1:<Account B ID>:template/<Template ID>"
}
}
Boto3 软件开发工具包
response_dashboard = client.create_dashboard(
AwsAccountId=Account_B_Id,
DashboardId='Test',
Name='test123',
SourceEntity={
'SourceTemplate': {
'DataSetReferences': [
{
'DataSetPlaceholder': 'test',
'DataSetArn': 'arn:aws:quicksight:us-east-1:<accountId B>:dataset/639111f1-36d2-4873-947a-f94dc9a148bb'
},
],
'Arn': 'arn:aws:quicksight:us-east-1:<Accout_A>:template/<TemplateName>' }
},
Tags=[
{
'Key': 'test',
'Value': 'jsb'
},
]
)
print(response_dashboard)
2. 验证新创建的控制面板:
AWS CLI
aws quicksight list-dashboards \
--aws-account-id <Account B>
Boto3 软件开发工具包
response_dashboards_B= client.list_dashboards(
AwsAccountId='Account_B'
)
print(response_dashboards_A['DashboardSummaryList'])
aws quicksight update-dashboard-permissions --aws-account-id <Account_B> --dashboard-id <dashboard-id> --cli-input-json file://DashboardPermission.json
此命令语法授予 IAM 角色 (QS-TEST) 对 QuickSight 控制面板的完全访问权限。您可以使用 update-dashboard-permissions 命令更新您的新控制面板的权限。
Boto3 软件开发工具包
response = client.update_dashboard_permissions(AwsAccountId='string',DashboardId='string',GrantPermissions=[{'Principal': 'string','Actions': ['string',]},],RevokePermissions=[{'Principal': 'string','Actions': ['string',]},])
下面举例说明您的控制面板 JSON 文件 (DashboardPermission.json) 是什么样:
[
{
"Principal": "arn:aws:quicksight:us-east-1:<Account_A ID >:user/default/<Quicksight user name>", // arn of the QuickSight user you want to assign ownership
"Actions": ["quicksight:DescribeDashboard","quicksight:ListDashboardVersions","quicksight:UpdateDashboardPermissions","quicksight:QueryDashboard","quicksight:UpdateDashboard","quicksight:DeleteDashboard","quicksight:DescribeDashboardPermissions","quicksight:UpdateDashboardPublishedVersion"]
}
]
此模板文件中列出的权限允许您作为控制面板的共同拥有者进行访问。
要向其他用户提供只读访问权限,请指定以下权限:
quicksight:DescribeDashboard
quicksight:ListDashboardVersions quicksight:QueryDashboard
在以下示例中,使用 "quicksight:*" 通配符表达式授予完全访问权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"quicksight:*"
],
"Resource": "*"
}
]
}