Amazon QuickSight のテンプレートを使用してクロスアカウントアクセスを設定する方法を教えてください。

最終更新日: 2020 年 12 月 16 日

Amazon QuickSight で自分のデータセットとダッシュボードへのクロスアカウントアクセスを作成しようとしています。これを行うにはどうすればよいですか?

簡単な説明

2 つの異なる AWS アカウント間で、Amazon QuickSight データセットとダッシュボードへのクロスアカウントアクセスを作成できます。クロスアカウントアクセスを作成するには、CreateTemplate API オペレーションを使用します。template API オブジェクトを使用すると、既存の Amazon QuickSight 分析またはテンプレートから新しいテンプレートを作成できます。次に、CreateDashboard API を使用してダッシュボードを作成します。

重要: ソースアカウントから適切な読み取りアクセス許可が設定されていることを確認してください。正しいアクセス許可が確立されると、別の AWS アカウントのテンプレートからダッシュボードを作成または共有できます。

Amazon QuickSight で、次のタイプのクロスアカウントアクセスを作成できます。
  • 既存のテンプレート (アカウント A) から別の AWS アカウント (アカウント B) に新しいテンプレートを作成します。
  • 既存のテンプレート (アカウント A) から別の AWS アカウント (アカウント B) にダッシュボードを作成します。
注: この記事では、AWS コマンドラインインターフェイス (AWS CLI) または Boto3 SDK を使用してクロスアカウントアクセスを作成するための手順の概要を示します。AWS CLI コマンドの実行時にエラーが発生した場合は、 AWS CLI の最新バージョンを使用していることを確認してください

解決方法

アカウント A と同じスキーマを使用してアカウント B にデータセットを作成する

以下のように、アカウント A と同じスキーマを使用してデータセットを作成します。

aws quicksight create-data-set --cli-input-json file://<dataset.json>

- または -

次の Boto3 SDK クエリを使用して、アカウント A と同じスキーマを使用してアカウント B にデータセットを作成します。

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 へのクロスアカウントの読み取りアクセス許可を付与します。

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 SDK

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) には、以下のアクションを実行するアクセス許可が必要です。

アカウント A で作成されたテンプレートファイルの quicksight:DescribeTemplate
アカウント B で新しいテンプレートを作成するための quicksight:CreateTemplate

3.    ステップ 2 で定義したアクセス許可を持つ IAM ロールを引き受けます。

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 SDK

/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 SDK

# 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 SDK

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 SDK

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 SDK

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 SDK

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",
{

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?