如何使用 Amazon QuickSight 中的模板设置跨账户访问?

上次更新时间:2020 年 12 月 16 日

我正在尝试在 Amazon QuickSight 中创建对我的数据集和控制面板的跨账户访问。我该如何操作?

简短描述

您可以在两个不同的 AWS 账户之间创建对 Amazon QuickSight 数据集和控制面板的跨账户访问。要创建跨账户访问,请使用 CreateTemplate API(创建模板 API)操作。template API(模板 API)对象允许您根据现有 Amazon QuickSight 分析或模板来创建模板。然后,使用 CreateDashboard API(创建控制面板 API)创建控制面板。

重要提示:确保从源帐户建立了适当的 READ 权限。建立正确的权限后,您可以在另一个 AWS 账户中创建或共享模板中的控制面板。

您可以在 Amazon 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 CLI 命令在分析所在的 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 中创建模板

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 返回的临时凭证连接到 Amazon 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'])

3.    向账户 B 中的假定 IAM 角色授予 IAM 权限:

注意:IAM 策略可限于特定操作。确保更新了新控制面板的权限,否则它在 Amazon QuickSight 控制台中不可见。

AWS CLI

aws quicksight update-dashboard-permissions --aws-account-id <Account B> --dashboard-id <ID of newly created dashboard> --grant-permissions file://DashboardPermission.json

此命令语法授予 IAM 角色 (QS-TEST) 对 Amazon 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:*”通配符表达式授予完全访问权限:

}
    ]
        }
"Effect": "Allow"
        "Resource": "*",
        "Action": "quicksight:*",
    "Statement": {
    "Version": "2012-10-17",
{

这篇文章对您有帮助吗?


您是否需要账单或技术支持?