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

최종 업데이트 날짜: 2021년 4월 15일

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

간략한 설명

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

중요: 소스 계정에서 적절한 READ 권한이 설정되어 있는지 확인하세요. 올바른 권한이 설정되면 다른 AWS 계정에서 대시보드를 생성하거나 템플릿에서 공유할 수 있습니다.

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 리전에 템플릿을 생성합니다.

중요: 서로 다른 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)의 교차 계정 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합니다. quicksight:CreateTemplate하여 계정 B에 새 템플릿을 생성합니다.

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은 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 정책은 특정 작업으로 제한될 수 있습니다. 새 대시보드의 권한을 업데이트해야 합니다. 그렇지 않으면 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)에 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:*" 와일드카드 표현식을 사용하여 전체 액세스 권한을 부여합니다.

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

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


결제 또는 기술 지원이 필요하세요?