Amazon QuickSight에서 템플릿을 사용해 교차 계정 액세스를 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 12월 16일

Amazon QuickSight에서 내 데이터 집합 및 대시보드에 대한 교차 계정 액세스를 생성하려고 합니다. 어떻게 해야 하나요?

간략한 설명

서로 다른 두 AWS 계정 간에 Amazon QuickSight 데이터 집합 및 대시보드에 대한 교차 계정 액세스를 생성할 수 있습니다. 교차 계정 액세스를 생성하려면 CreateTemplate API 작업을 사용합니다. 템플릿 API 객체를 사용하면 기존 Amazon QuickSight 분석 또는 템플릿에서 템플릿을 생성할 수 있습니다. 그런 다음 CreateDashboard API를 사용하여 대시보드를 생성합니다.

중요: 소스 계정에서 적절한 READ 권한이 설정되어 있는지 확인하세요. 올바른 권한이 설정되면 다른 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)의 교차 계정 READ 권한을 계정 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"]
  }
]

이 템플릿 파일에 나열된 권한을 통해 대시보드의 공동 소유자로 액세스할 수 있습니다.

다른 사용자에게 READ 전용 액세스 권한을 제공하려면 다음 권한을 지정합니다.

quicksight:DescribeDashboard
quicksight:ListDashboardVersions
quicksight:QueryDashboard

다음 예에서는 "quicksight:*" 와일드카드 표현식을 사용하여 전체 액세스 권한이 부여됩니다.

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

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?