

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Quick Sight를 사용하여 개발
<a name="quicksight_dev"></a>

Amazon Quick Sight용 API 작업과 원하는 프로그래밍 언어에서 Amazon Quick Sight에 액세스할 수 있는 용 AWS 소프트웨어 개발 키트(SDKs)를 제공합니다. 현재 사용자 및 그룹을 관리할 수 있습니다. Enterprise Edition에서는 웹 페이지 또는 앱에 대시보드를 포함할 수도 있습니다.

, AWS Management Console명령줄 도구 및 기타 서비스의 호출을 포함하여 계정의 Amazon Quick Sight API에 대한 호출을 모니터링하려면를 사용합니다 AWS CloudTrail. 자세한 내용은 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하십시오.

## 필수 지식
<a name="quicksight_dev-required_knowledge"></a>

API를 통해 Amazon Quick Sight에 액세스하려면 다음 사항을 숙지해야 합니다.
+ JSON
+ 웹 서비스
+ HTTP 요청
+ JavaScript, Java, Python, C\$1 등 하나 이상의 프로그래밍 언어

 AWS SDKs 및 툴킷이 제공해야 하는 사항을 둘러보려면 AWS [시작하기 리소스 센터를](https://aws.amazon.com/getting-started/tools-sdks/) 방문하는 것이 좋습니다.

터미널과 선호하는 텍스트 편집기를 사용할 수 있지만 통합 개발 환경(IDE)에서 더 시각적인 UI 경험의 이점을 누릴 수 있습니다. *AWS 시작하기 리소스 센터*의 [IDE 및 IDE 도구 키트](https://aws.amazon.com/getting-started/tools-sdks/#IDE_and_IDE_Toolkits) 섹션에서 IDE 목록을 제공합니다. 이 사이트에서는 원하는 IDE에 대해 다운로드할 수 있는 AWS 툴킷을 제공합니다. 일부 IDE에서는 프로그래밍 언어를 더 자세히 배울 수 있는 자습서도 제공합니다.

## Amazon Quick Sight에 사용 가능한 API 작업
<a name="quicksight_dev-using_libraries"></a>

AWS 는 HTTPS를 통해 요청을 제출하는 대신 언어별 API 작업을 사용하여 애플리케이션을 빌드하려는 소프트웨어 개발자를 위해 라이브러리, 샘플 코드, 자습서 및 기타 리소스를 제공합니다. 이러한 라이브러리는 요청에 암호화 서명, 요청 재시도, 오류 응답 처리 등과 같은 작업을 자동으로 관리하는 기본 기능을 제공합니다. 이러한 라이브러리를 사용하면 쉽게 시작할 수 있습니다.

 AWS SDKs 다운로드에 대한 자세한 내용은 [AWS SDKs 및 도구를 참조하세요](https://aws.amazon.com/tools/). 다음 링크는 사용 가능한 언어별 API 설명서의 샘플입니다.

**AWS Command Line Interface**
+ [AWS CLI QuickSight 명령 참조](https://docs.aws.amazon.com/cli/latest/reference/quicksight/index.html)
+ [AWS CLI 사용 설명서](https://docs.aws.amazon.com/cli/latest/userguide/)
+ [AWS CLI 명령 참조](https://docs.aws.amazon.com/cli/latest/reference/)

**AWS SDK for .NET**
+ [Amazon.Quicksight](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html?page=QuickSight/NQuickSight.html)
+ [Amazon.Quicksight.Model](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html?page=QuickSight/NQuickSightModel.html)

**AWS SDK for C\$1\$1**
+ [Aws::QuickSight::QuickSightClient Class Reference](https://sdk.amazonaws.com/cpp/api/LATEST/class_aws_1_1_quick_sight_1_1_quick_sight_client.html)

**AWS SDK for Go**
+ [QuickSight](https://docs.aws.amazon.com/sdk-for-go/api/service/quicksight/)

**AWS SDK for Java**
+ [com.amazonaws.services.quicksight](https://docs.aws.amazon.com/sdk-for-java/latest/reference/index.html?com/amazonaws/services/quicksight/package-summary.html)
+ [com.amazonaws.services.quicksight.model](https://docs.aws.amazon.com/sdk-for-java/latest/reference/index.html?com/amazonaws/services/quicksight/model/package-summary.html)

**AWS SDK for JavaScript**
+ [AWS.QuickSight](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/QuickSight.html)

**AWS SDK for PHP**
+ [QuickSightClient](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.QuickSight.QuickSightClient.html)

**AWS SDK for Python (Boto3)**
+ [Amazon Quick Sight](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/quicksight.html)

**AWS SDK for Ruby**
+ [Aws::QuickSight](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/QuickSight.html)

# 용어 및 개념
<a name="quicksight_dev-terminology"></a>

이 섹션에서는 Amazon Quick Sight의 개발 용어 목록을 제공합니다.

**익명 Amazon Quick Sight 사용자:** - 사실상 네임스페이스에 속하며 임베딩에만 사용할 수 있는 임시 Amazon Quick Sight 사용자 자격 증명입니다. 태그 기반 규칙을 사용하여 이러한 사용자를 위한 행 수준 보안을 구현할 수 있습니다.

**함수 호출자 자격 증명:** - API 요청을 수행하는 AWS Identity and Access Management 사용자의 자격 증명입니다. 호출자의 자격 증명은 요청에 연결된 서명을 사용하여 Amazon Quick Sight에서 결정합니다. 제공된 SDK 클라이언트를 사용하면 수동 작업 없이도 서명을 생성하거나 서명을 요청에 연결할 수 있습니다. 하지만 원하는 경우 수동 작업도 가능합니다.

**호출자 자격 증명:** - 호출자 자격 증명 외에도 Amazon Quick Sight. AWS approves 호출자를 호출할 때 IAM `AssumeRole` API를 통해 호출자의 자격 증명을 수임할 수 있습니다. 이는 동일한 Amazon Quick Sight 구독에 속하는 여러 계정을 명시적으로 추가할 필요가 없도록 하기 위한 것입니다.

**네임스페이스:** - 사용자 풀을 분리하여 클라이언트, 자회사, 팀 등을 구성할 수 있는 논리적 컨테이너입니다. 자세한 내용은 [격리된 네임스페이스를 사용한 멀티테넌시 지원을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/namespaces.html).

**QuickSight ARN:** - Amazon 리소스 이름(ARN) Amazon Quick Sight 리소스는 이름 또는 ARN을 사용하여 식별됩니다. 예를 들어 이들은 그룹 이름이 `MyGroup1`이고 사용자 이름이 `User1`이며 ID가 `1a1ac2b2-3fc3-4b44-5e5d-c6db6778df89`인 대시보드인 ARN입니다.

```
arn:aws:quicksight:us-east-1:111122223333:group/default/MyGroup1
	arn:aws:quicksight:us-east-1:111122223333:user/default/User1
	arn:aws:quicksight:us-west-2:111122223333:dashboard/1a1ac2b2-3fc3-4b44-5e5d-c6db6778df89
```

다음 예에서는 이름이 `MyTemplate`인 템플릿과 이름이 `MyDashboard`인 대시보드의 ARN을 보여줍니다.

1. 템플릿용 샘플 ARN

   ```
   arn:aws:quicksight:us-east-1:111122223333:template/MyTemplate
   ```

1. 템플릿의 특정 버전을 참조하는 템플릿용 샘플 ARN

   ```
   arn:aws:quicksight:us-east-1:111122223333:template/MyTemplate/version/10
   ```

1. 템플릿 별칭용 샘플 ARN

   ```
   arn:aws:quicksight:us-east-1:111122223333:template/MyTemplate/alias/STAGING
   ```

1. 대시보드용 샘플 ARN

   ```
   arn:aws:quicksight:us-east-1:111122223333:dashboard/MyDashboard
   ```

1. 대시보드의 특정 버전을 참조하는 대시보드용 샘플 ARN

   ```
   arn:aws:quicksight:us-east-1:111122223333:dashboard/MyDashboard/version/10
   ```

상황에 따라 항목의 이름, ID 또는 ARN을 제공해야 할 수도 있습니다. 이름이 있는 경우 일부 Amazon Quick Sight API 작업을 사용하여 ARN을 검색할 수 있습니다.

**Amazon Quick Sight 대시보드:** - 분석 또는 템플릿에서 생성된 Amazon Quick Sight 보고서를 식별하는 엔터티입니다. Amazon Quick Sight 대시보드는 공유할 수 있습니다. 올바른 권한이 있으면 해당 보고서에서 예약된 이메일 보고서를 생성할 수 있습니다. `CreateDashboard` 및 `DescribeDashboard` API 작업은 대시보드 엔터티에서 작동합니다.

**Amazon Quick Sight 템플릿:** - 분석 또는 대시보드를 생성하는 데 필요한 메타데이터를 캡슐화하는 개체입니다. 분석과 관련된 데이터 세트를 자리 표시자로 대체하여 추상화합니다. 템플릿을 사용하여 대시보드를 생성할 수 있습니다. 소스 분석 및 템플릿을 생성에 사용한 동일한 스키마를 따르는 데이터 세트로 데이터 세트 자리 표시자를 바꾸면 됩니다.

**Amazon Quick Sight 사용자:** - API 직접 호출이 수행하는 Amazon Quick Sight 사용자 자격 증명입니다. 이 사용자는 발신자 자격 증명과 동일하지 않지만 Amazon Quick Sight 내의 사용자에게 매핑되는 사용자일 수 있습니다.

# Amazon Quick Sight API를 사용하여 애플리케이션 개발
<a name="quicksight-sdks"></a>

 AWS SDKs를 사용하여 사용 중인 프로그래밍 언어 또는 플랫폼에 맞는 API에 액세스하여 배포의 대부분의 측면을 관리할 수 있습니다. 자세한 내용은 [AWS SDK](https://aws.amazon.com/tools/#SDKs)를 참조하십시오.

API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/index.html?id=docs_gateway)를 참조하세요.

Amazon Quick Sight API 작업을 호출하려면 먼저 IAM 자격 증명에 연결된 정책의 `quicksight:operation-name` 권한이 필요합니다. 예를 들어 `list-users`을(를) 직접 호출하려면 `quicksight:ListUsers` 권한이 필요합니다. 모든 작업에 같은 패턴이 적용됩니다.

필요한 권한이 무엇인지 확실하지 않은 경우, 직접 호출해 볼 수 있습니다. 그러면 클라이언트가 누락된 권한이 무엇인지 알려줍니다. 명시적인 리소스를 지정하는 대신 권한 정책의 리소스 필드에 별표(`*`)를 사용할 수 있습니다. 하지만 각 권한을 최대한 제한할 것을 권장합니다. Amazon Quick Sight Amazon 리소스 이름(ARN) 식별자를 사용하여 정책의 리소스를 지정하거나 제외하여 사용자 액세스를 제한할 수 있습니다.

자세한 내용은 다음을 참조하세요.
+ [Amazon Quick Sight에 대한 IAM 정책 예제](https://docs.aws.amazon.com/quicksight/latest/user/iam-policy-examples.html)
+ [작업, 리소스 및 조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonquicksight.html)
+ [IAM JSON 정책 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)

사용자 또는 그룹의 ARN을 검색하려면 해당 리소스에서 `Describe` 작업을 사용합니다. 또한 상황에 따라 IAM에 조건을 추가하여 API에 대한 액세스를 추가로 제한할 수도 있습니다. 예를 들어 `User1`에 `Group1`를 추가할 때 기본 리소스는 `Group1`이므로 특정 그룹에 대한 액세스를 허용하거나 거부할 수 있지만 IAM Amazon Quick Sight 키를 사용하여 특정 사용자가 해당 그룹에 추가되는 `quicksight:UserName` 것을 허용하거나 방지하여 조건을 추가할 수도 있습니다.

다음은 정책의 예입니다. 즉, 이 정책이 연결된 함수 호출자는 그룹에 추가하려는 사용자 이름이 `user1`이 아니면 어떤 그룹에서든 `CreateGroupMembership` 작업을 호출할 수 있습니다.

```
{
    "Effect": "Allow",
    "Action": "quicksight:CreateGroupMembership",
    "Resource": "arn:aws:quicksight:us-east-1:aws-account-id:group/default/*",
    "Condition": {
        "StringNotEquals": {
            "quicksight:UserName": "user1"
        }
    }
}
```

------
#### [ AWS CLI ]

다음 절차에서는 AWS CLI를 통해 Amazon Quick Sight API 작업과 상호 작용하는 방법을 설명합니다. 다음 명령은 Bash에서 테스트가 되었지만, 다른 명령줄 환경에서도 같거나 비슷할 것입니다.

1. 환경에 AWS SDK를 설치합니다. 설치 방법에 대한 지침은 [AWS 명령줄 인터페이스](https://aws.amazon.com/cli/)에서 확인하세요.

1. 다음 명령 및 후속 지침을 사용하여 AWS CLI 자격 증명 및 리전을 설정합니다. 적정 권한을 가진 IAM 자격 증명 및 역할에 대한 자격 증명을 사용합니다.

   ```
   aws configure
   ```

1. 다음 명령을 실행하여 Amazon Quick Sight SDK 도움말을 확인합니다.

   ```
   aws quicksight help
   ```

1. API 사용 방법에 대한 자세한 지침을 얻으려면 다음과 같이 도움말 다음에 나오는 이름을 입력합니다.

   ```
   aws quicksight list-users help
   ```

1. 이제 Amazon Quick Sight API 작업을 호출할 수 있습니다. 이 예제에서는 계정의 Amazon Quick Sight 사용자 목록을 반환합니다.

   ```
   aws quicksight list-users --aws-account-id aws-account-id --namespace default --region us-east-1
   ```

------
#### [ Java SDK ]

다음 절차에 따라 Amazon Quick Sight와 상호 작용하는 Java 앱을 설정합니다.

1. 시작하려면 IDE에서 Java 프로젝트를 만듭니다.

1. Amazon Quick Sight SDK를 새 프로젝트로 가져옵니다. 예: `AWSQuickSightJavaClient-1.11.x.jar`

1. IDE가 Amazon Quick Sight SDK를 인덱싱하면 다음과 같이 가져오기 줄을 추가할 수 있습니다.

   ```
   import com.amazonaws.services.quicksight.AmazonQuickSight;
   ```

   IDE가 이를 유효하다고 인식하지 않은 경우에는 SDK를 가져왔는지 확인합니다.

1. 다른 AWS SDKs 마찬가지로 Amazon Quick Sight SDK는 많은 기능을 수행하기 위해 외부 종속성이 필요합니다. 외부 종속 프로그램은 다운로드를 하여 같은 프로젝트에 가져와야 합니다. 다음과 같은 종속 프로그램이 필요합니다.
   + `aws-java-sdk-1.11.402.jar` (AWS Java SDK 및 자격 증명 설정) - [AWS SDK for Java 설정을 참조하세요. ](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-install.html) 
   + `commons-logging-1.2.jar` - [ https://commons.apache.org/proper/commons-logging/download\$1logging.cgi](https://commons.apache.org/proper/commons-logging/download_logging.cgi)를 참조하세요.
   + `jackson-annotations-2.9.6.jar`, `jackson-core-2.9.6.jar` 및 `jackson-databind-2.9.6.jar` - [ http://repo1.maven.org/maven2/com/fasterxml/jackson/core/ ](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/)를 참조하세요.
   + `httpclient-4.5.6.jar`, `httpcore-4.4.10.jar` - [ https://hc.apache.org/downloads.cgi ](https://hc.apache.org/downloads.cgi)를 참조하세요.
   + `joda-time-2.1.jar` - [ https://mvnrepository.com/artifact/joda-time/joda-time/2.1 ](https://mvnrepository.com/artifact/joda-time/joda-time/2.1)을 참조하세요.

1. 이제 Amazon Quick Sight 클라이언트를 생성할 준비가 되었습니다. 클라이언트가 통신할 수 있는 기본 퍼블릭 엔드포인트를 사용하거나 엔드포인트를 명시적으로 참조할 수 있습니다. 자격 AWS 증명을 제공하는 방법에는 여러 가지가 있습니다. 다음 예제와 같이 직접적이고 간단한 접근 방법이 제공되고 있습니다. 다음 클라이언트 메서드는 다음과 같이 모든 API를 호출하는 데 사용됩니다.

   ```
   private static AmazonQuickSight getClient() {
   	final AWSCredentialsProvider credsProvider = new AWSCredentialsProvider() {
   	@Override
   	public AWSCredentials getCredentials() {
   	// provide actual IAM access key and secret key here
   	return new BasicAWSCredentials("access-key", "secret-key");
   	}
   	
   	@Override
   	public void refresh() {}
   	};
   	
   	return AmazonQuickSightClientBuilder
   	.standard()
   	.withRegion(Regions.US_EAST_1.getName())
   	.withCredentials(credsProvider)
   	.build();
   	}
   ```

1. 이제 위의 클라이언트를 사용하여 Amazon Quick Sight 계정의 모든 사용자를 나열할 수 있습니다.
**참고**  
Amazon Quick Sight를 구독하는 데 사용한 AWS 계정 ID를 제공해야 합니다. 이는 호출자 자격 증명의 AWS 계정 ID와 일치해야 합니다. 현재는 교차 계정 호출이 지원되지 않습니다. 뿐만 아니라 필수 파라미터 `namespace`를 항상 *기본*으로 설정해야 합니다.

   ```
   getClient().listUsers(new ListUsersRequest()
           .withAwsAccountId("relevant_AWS_account_ID")
           .withNamespace("default"))
           .getUserList().forEach(user -> {
               System.out.println(user.getArn());
           });
   ```

1. 가능한 모든 API 작업 목록과 해당 작업에서 사용하는 요청 객체를 보려면 IDE에서 클라이언트 객체를 **CTRL 클릭하여** Amazon Quick Sight 인터페이스를 볼 수 있습니다. 또는 Amazon Quick Sight JavaClient JAR 파일의 `com.amazonaws.services.quicksight` 패키지 내에서 찾을 수 있습니다.

------
#### [ JavaScript (Node.js) SDK ]

다음 절차에 따라 Node.js를 사용하여 Amazon Quick Sight와 상호 작용합니다.

1. 다음 명령을 사용하여 노드 환경을 설정합니다.
   + `npm install aws-sdk`
   + `npm install aws4 `
   + `npm install request`
   + `npm install url`

1.  AWS SDK를 사용하여 Node.js를 구성하고 자격 증명을 설정하는 방법에 대한 자세한 내용은 SDK [AWS SDK for JavaScript v2 개발자 안내서](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/welcome.html)-->를 참조하세요.

1. 다음 코드 예제를 사용하여 설정을 테스트합니다. HTTPS는 필수입니다. 이 샘플은 URL 요청 파라미터와 함께 Amazon Quick Sight 작업의 전체 목록과 계정의 Amazon Quick Sight 사용자 목록을 표시합니다.

   ```
   const AWS = require('aws-sdk');
   const https = require('https');
   
   var quicksight = new AWS.Service({
       apiConfig: require('./quicksight-2018-04-01.min.json'),
       region: 'us-east-1',
   });
   
   console.log(quicksight.config.apiConfig.operations);
   
   quicksight.listUsers({
       // Enter your actual AWS account ID
       'AwsAccountId': 'relevant_AWS_account_ID', 
       'Namespace': 'default',
   }, function(err, data) {
       console.log('---');
       console.log('Errors: ');
       console.log(err);
       console.log('---');
       console.log('Response: ');
       console.log(data);
   });
   ```

------
#### [ Python3 SDK ]

다음 절차에 따라 Amazon Quick Sight와 상호 작용할 사용자 지정 빌드 `botocore` 패키지를 생성합니다.

1. 환경의 AWS 디렉터리에 자격 증명 파일을 생성합니다. Linux/Mac 기반 환경에서는 이 파일을 \$1/.aws/credentials라고 부르며, 그 형식은 다음과 같습니다.

   ```
   [default]
   aws_access_key_id = Your_IAM_access_key
   aws_secret_access_key = Your_IAM_secret_key
   ```

1. `botocore-1.12.10` 폴더를 압축 해제합니다. `botocore-1.12.10`에 디렉터리를 변경하고 Python 3 인터프리터 환경에 들어갑니다.

1. 응답은 딕셔너리 객체 형태로 반환됩니다. 이들 각각은 요청 ID와 응답 상태가 포함된 `ResponseMetadata` 항목을 가지고 있습니다. 다른 항목들은 실행하는 작업 유형에 따라 결정됩니다.

1. 다음 예제는 먼저 그룹을 생성, 삭제 및 나열하는 샘플 앱입니다. 그런 다음, Quicksight 계정에 사용자를 나열합니다.

   ```
   import botocore.session
   default_namespace = 'default'
   account_id = 'relevant_AWS_Account'
   
   session = botocore.session.get_session()
   client = session.create_client("quicksight", region_name='us-east-1')
   
   print('Creating three groups: ')
   client.create_group(AwsAccountId = account_id, Namespace=default_namespace, GroupName='MyGroup1')
   client.create_group(AwsAccountId = account_id, Namespace=default_namespace, GroupName='MyGroup2')
   client.create_group(AwsAccountId = account_id, Namespace=default_namespace, GroupName='MyGroup3')
   
   print('Retrieving the groups and listing them: ')
   response = client.list_groups(AwsAccountId = account_id, Namespace=default_namespace)
   for group in response['GroupList']:
       print(group)
   
   print('Deleting our groups: ')
   client.delete_group(AwsAccountId = account_id, Namespace=default_namespace, GroupName='MyGroup1')
   client.delete_group(AwsAccountId = account_id, Namespace=default_namespace, GroupName='MyGroup2')
   client.delete_group(AwsAccountId = account_id, Namespace=default_namespace, GroupName='MyGroup3')
   
   response = client.list_users(AwsAccountId = account_id, Namespace=default_namespace)
   for user in response['UserList']:
       print(user)
   ```

------
#### [ .NET/C\$1 SDK ]

다음 절차에 따라 C\$1을 사용하여 Amazon Quick Sight와 상호 작용합니다.NET. 이 예제는 Mac용 Microsoft Visual에서 구성한 것이기 때문에 IDE 및 플랫폼에 따라 지침이 약간 다를 수 있습니다. 하지만 서로 비슷할 것입니다.



1. `nuget.zip` 파일을 `nuget`라는 폴더에 풉니다.

1. Visual Studio에 **콘솔 앱** 프로젝트를 새로 생성합니다.

1. 솔루션 아래에서 앱 **종속성**을 찾아서, 컨텍스트 메뉴를 열고(마우스 오른쪽 버튼 클릭) **패키지 추가**를 선택합니다.

1. 소스 목록에서 **소스 구성**을 선택합니다.

1. **추가**를 선택하고 `QuickSightSDK`라고 소스 이름을 명명합니다. `nuget` 폴더를 검색하고 **소스 추가**를 선택합니다.

1. **확인**을 선택합니다. 그런 다음를 `QuickSightSDK` 선택한 상태에서 세 개의 Amazon Quick Sight 패키지를 모두 선택합니다.
   + `AWSSDK.QuickSight`
   + `AWSSDK.Extensions.NETCore.Setup`
   + `AWSSDK.Extensions.CognitoAuthentication`

1. **패키지 추가**를 클릭합니다.

1. 다음 샘플 앱을 콘솔 앱 편집기에 복사하여 붙여 넣습니다.

   ```
   using System;
   using Amazon.QuickSight.Model;
   using Amazon.QuickSight;
   
   namespace DotNetQuickSightSDKTest
   {
       class Program
       {
           private static readonly string AccessKey = "insert_your_access_key";
           private static readonly string SecretAccessKey = "insert_your_secret_key";
           private static readonly string AccountID = "AWS_account_ID";
           private static readonly string Namespace = "default";  // leave this as default
   
           static void Main(string[] args)
           {
               var client = new AmazonQuickSightClient(
                   AccessKey,
                   SecretAccessKey, 
                   Amazon.RegionEndpoint.USEast1);
   
               var listUsersRequest = new ListUsersRequest
               {
                   AwsAccountId = AccountID,
                   Namespace = Namespace
               };
   
               client.ListUsersAsync(listUsersRequest).Result.UserList.ForEach(
                   user => Console.WriteLine(user.Arn)
               );
   
               var listGroupsRequest = new ListGroupsRequest
               {
                   AwsAccountId = AccountID,
                   Namespace = Namespace
               };
   
               client.ListGroupsAsync(listGroupsRequest).Result.GroupList.ForEach(
                   group => Console.WriteLine(group.Arn)
               );
           }
       }
   }
   ```

------

# Amazon Quick Sight 이벤트 통합
<a name="events-integration"></a>

Amazon EventBridge를 사용하면 새 대시보드 생성 또는 업데이트와 같은 Amazon Quick Sight의 이벤트에 자동으로 응답할 수 있습니다. 이러한 이벤트는 거의 실시간으로 EventBridge로 전송됩니다. 개발자는 원하는 이벤트를 표시하는 간단한 규칙을 작성하고 규칙과 일치하는 이벤트 발생 시 실행할 작업을 지정할 수 있습니다. 이벤트를 사용하면 연속 백업 및 배포와 같은 사용 사례를 완료할 수 있습니다.

**Topics**
+ [지원되는 이벤트](#events-supported)
+ [예제 이벤트 페이로드](#sample-events-payload)
+ [Amazon Quick Sight 이벤트를 Amazon CloudWatch로 전송하는 규칙 생성](events-send-cloudwatch.md)
+ [Amazon Quick Sight 이벤트를 로 전송하는 규칙 생성 AWS Lambda](events-send-lambda.md)

## 지원되는 이벤트
<a name="events-supported"></a>

Amazon Quick Sight는 현재 다음 이벤트를 지원합니다.


| 애셋 유형 | 작업 | 이벤트 세부 정보 유형 | 이벤트 세부 정보 | 
| --- | --- | --- | --- | 
| 대시보드 | 생성 | Amazon Quick Sight 대시보드 생성 성공 | <pre>{<br />    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83",<br />    "versionNumber": 1<br />}</pre> | 
| 대시보드 | 생성 | Amazon Quick Sight 대시보드 생성 실패 | <pre>{<br />    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83",<br />    "versionNumber": 1,<br />    "errors": [<br />      {<br />        "Type": "PARAMETER_NOT_FOUND",<br />        "Message": "Missing property abc"<br />      },<br />      {<br />        "Type": "DATA_SET_NOT_FOUND",<br />        "Message": "Cannot find dataset with id abc"<br />      }<br />    ]<br />}</pre> | 
| 대시보드 | 생성 | Amazon Quick Sight 대시보드 허용 업데이트 | <pre>{"dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83" }</pre> | 
| 대시보드 | 업데이트 | Amazon Quick Sight 대시보드 업데이트 성공 | <pre>{<br />    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83",<br />    "versionNumber": 1<br />}</pre> | 
| 대시보드 | 업데이트 | Amazon Quick Sight 대시보드 업데이트 실패 | <pre>{<br />    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83",<br />    "versionNumber": 1,<br />    "errors": [<br />      {<br />        "Type": "PARAMETER_NOT_FOUND",<br />        "Message": "Missing property abc"<br />      },<br />      {<br />        "Type": "DATA_SET_NOT_FOUND",<br />        "Message": "Cannot find dataset with id abc"<br />      }<br />    ]<br />}</pre> | 
| 대시보드 | 업데이트 | Amazon Quick Sight 대시보드 허용 업데이트 | <pre>{"dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83"}</pre> | 
| 대시보드 | 게시 | Amazon Quick Sight 대시보드 게시 버전 업데이트 | <pre>{<br />    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83",<br />    "versionNumber": 2<br />}</pre> | 
| 대시보드 | Delete | Amazon Quick Sight 대시보드 삭제됨 | <pre>{<br />    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83"<br />}</pre> | 
| 분석 | 생성 | Amazon Quick Sight 분석 생성 성공 | <pre>{<br />    "analysisId": "e5f37119-e24c-4874-901a-af9032b729b5"<br />}</pre> | 
| 분석 | 생성 | Amazon Quick Sight 분석 생성 실패 | <pre>{<br />    "analysisId": "e5f37119-e24c-4874-901a-af9032b729b5",<br />    "errors": [<br />      {<br />        "Type": "PARAMETER_NOT_FOUND",<br />        "Message": "Missing property abc"<br />      },<br />      {<br />        "Type": "DATA_SET_NOT_FOUND",<br />        "Message": "Cannot find dataset with id abc"<br />      }<br />    ]<br />}</pre> | 
| 분석 | 생성 | Amazon Quick Sight 분석 허용 사항 업데이트 | <pre>{"analysisId": "e5f37119-e24c-4874-901a-af9032b729b5" }</pre> | 
| 분석 | Delete | Amazon Quick Sight 분석 삭제됨 | <pre>{<br />    "analysisId": "e5f37119-e24c-4874-901a-af9032b729b5"<br />}</pre> | 
| 분석 | 업데이트 | Amazon Quick Sight 분석 업데이트 성공 | <pre>{<br />    "analysisId": "e5f37119-e24c-4874-901a-af9032b729b5"<br />}</pre> | 
| 분석 | 업데이트 | Amazon Quick Sight 분석 업데이트 실패 | <pre>{<br />    "analysisId": "e5f37119-e24c-4874-901a-af9032b729b5",    <br />    "errors": [        <br />        {            <br />            "Type": "PARAMETER_NOT_FOUND",            <br />            "Message": "Missing property abc"        <br />        },        <br />        {             <br />            "Type": "DATA_SET_NOT_FOUND",            <br />            "Message": "Cannot find dataset with id abc"        <br />        }    <br />    ]<br />}</pre> | 
| 분석 | 업데이트 | Amazon Quick Sight 분석 허용 사항 업데이트 | <pre>{"analysisId": "e5f37119-e24c-4874-901a-af9032b729b5" }</pre> | 
| VPC 연결 | 생성 | Amazon Quick Sight VPC 연결 생성 성공 | <pre>{<br />    "vpcConnectionId": "53d34238-57e7-488d-b99a-a0037d275a4e",<br />    "availabilityStatus": "CREATION_SUCCESSFUL"<br />}</pre> | 
| VPC 연결 | 생성 | Amazon Quick Sight VPC 연결 생성 실패 | <pre>{<br />    "vpcConnectionId": "53d34238-57e7-488d-b99a-a0037d275a4e",<br />    "availabilityStatus": "CREATION_FAILED"<br />}</pre> | 
| VPC 연결 | 업데이트 | Amazon Quick Sight VPC 연결 업데이트 성공 | <pre>{<br />    "vpcConnectionId": "53d34238-57e7-488d-b99a-a0037d275a4e",<br />    "availabilityStatus": "UPDATE_SUCCESSFUL"<br />}</pre> | 
| VPC 연결 | 업데이트 | Amazon Quick Sight VPC 연결 업데이트 실패 | <pre>{<br />    "vpcConnectionId": "53d34238-57e7-488d-b99a-a0037d275a4e",<br />    "availabilityStatus": "UPDATE_FAILED"<br />}</pre> | 
| VPC 연결 | Delete | Amazon Quick Sight VPC 연결 삭제 성공 | <pre>{<br />    "vpcConnectionId": "53d34238-57e7-488d-b99a-a0037d275a4e",<br />    "availabilityStatus": "DELETED"<br />}</pre> | 
| VPC 연결 | Delete | Amazon Quick Sight VPC 연결 삭제 실패 | <pre>{<br />    "vpcConnectionId": "53d34238-57e7-488d-b99a-a0037d275a4e",<br />    "availabilityStatus": "DELETION_FAILED"<br />}</pre> | 
| 폴더 | 생성 | Amazon Quick Sight 폴더 생성됨 | <pre>{<br />    "folderId": "77e307e8-b41b-472a-90e8-fe3f471537be",<br />    "parentFolderArn": "arn:aws:quicksight:us-east-1:123456789012:folder/098765432134"<br />}</pre> | 
| 폴더 | 생성 | Amazon Quick Sight 폴더 권한이 업데이트됨 | <pre>{"folderId": "77e307e8-b41b-472a-90e8-fe3f471537be" }</pre> | 
| 폴더 | 업데이트 | Amazon Quick Sight 폴더 업데이트 | <pre>{<br />    "folderId": "77e307e8-b41b-472a-90e8-fe3f471537be"<br />}</pre> | 
| 폴더 | 업데이트 | Amazon Quick Sight 폴더 권한이 업데이트됨 | <pre>{"folderId": "77e307e8-b41b-472a-90e8-fe3f471537be" }</pre> | 
| 폴더 | Delete | Amazon Quick Sight 폴더 삭제됨 | <pre>{<br />    "folderId": "77e307e8-b41b-472a-90e8-fe3f471537be"<br />}</pre> | 
| 폴더 | 멤버십 업데이트 | Amazon Quick Sight 폴더 멤버십 업데이트 | <pre>{<br />    "folderId": "77e307e8-b41b-472a-90e8-fe3f471537be",<br />    "membersAdded": ["arn:aws:quicksight:us-east-1:123456789012:analysis/e5f37119-e24c-4874-901a-af9032b729b5"],<br />    "membersRemoved": []<br />}</pre> | 
| 데이터세트 | 생성 | Amazon Quick Sight 데이터 세트 생성됨 | <pre>{<br />    "datasetId": "a6553a81-f97e-4ffa-a860-baea63196efa"<br />}</pre> | 
| 데이터세트 | 생성 | Amazon Quick Sight 데이터 세트 권한 업데이트됨 | <pre>{"datasetId": "a6553a81-f97e-4ffa-a860-baea63196efa" }</pre> | 
| 데이터세트 | 업데이트 | Amazon Quick Sight 데이터 세트 업데이트됨 | <pre>{<br />    "datasetId": "a6553a81-f97e-4ffa-a860-baea63196efa"<br />}</pre> | 
| 데이터세트 | 업데이트 | Amazon Quick Sight 데이터 세트 권한 업데이트됨 | <pre>{"datasetId": "a6553a81-f97e-4ffa-a860-baea63196efa" }</pre> | 
| 데이터세트 | Delete | Amazon Quick Sight 데이터 세트 삭제됨 | <pre>{<br />    "datasetId": "a6553a81-f97e-4ffa-a860-baea63196efa"<br />}</pre> | 
| DataSource | 생성 | Amazon Quick Sight DataSource 생성 성공 | <pre>{<br />    "datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824"<br />}</pre> | 
| DataSource | 생성 | Amazon Quick Sight DataSource 생성 실패 | <pre>{<br />    "datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824",<br />    "error": {<br />        "message": "AMAZON_ELASTICSEARCH engine version 7.4 is lower than minimum supported version 7.7",<br />        "type": "ENGINE_VERSION_NOT_SUPPORTED"<br />    }<br />}</pre> | 
| DataSource | 생성 | Amazon Quick Sight DataSource 권한 업데이트 | <pre>{"datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824" }</pre> | 
| DataSource | 업데이트 | Amazon Quick Sight DataSource 업데이트 성공 | <pre>{<br />    "datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824"<br />}</pre> | 
| DataSource | 업데이트 | Amazon Quick Sight DataSource 업데이트 실패 | <pre>{<br />    "datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824",<br />    "error": {<br />        "message": "AMAZON_ELASTICSEARCH engine version 7.4 is lower than minimum supported version 7.7",<br />        "type": "ENGINE_VERSION_NOT_SUPPORTED"<br />    }<br />}</pre> | 
| DataSource | 업데이트 | Amazon Quick Sight DataSource 권한 업데이트 | <pre>{"datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824" }</pre> | 
| DataSource | Delete | Amazon Quick Sight DataSource 삭제됨 | <pre>{<br />    "datasourceId": "230caa6e-dc87-406b-91fb-037f29c32824"<br />}</pre> | 
| 테마 | 생성 | Amazon Quick Sight 테마 생성 성공 | <pre>{<br />    ""themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83", <br />    "versionNumber": 1"<br />}</pre> | 
| 테마 | 생성 | Amazon Quick Sight 테마 생성 실패 | <pre>{ <br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83", <br />    "versionNumber": 1<br />}</pre> | 
| 테마 | 생성 | Amazon Quick Sight 테마 권한 업데이트됨 | <pre>{"themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83" }</pre> | 
| 테마 | 업데이트 | Amazon Quick Sight 테마 업데이트 성공 | <pre>{<br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83",    <br />    "versionNumber": 2<br />}</pre> | 
| 테마 | 업데이트 | Amazon Quick Sight 테마 업데이트 실패 | <pre>{<br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83",    <br />    "versionNumber": 2<br />}</pre> | 
| 테마 | 업데이트 | Amazon Quick Sight 테마 권한 업데이트됨 | <pre>{"themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83" }</pre> | 
| 테마 | Delete | Amazon Quick Sight 테마 삭제 | <pre>{<br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83"<br />}</pre> | 
| 테마 | 별칭 생성 | Amazon Quick Sight 테마 별칭 생성됨 | <pre>{<br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83",    <br />    "aliasName": "MyThemeAlias"    <br />    "versionNumber": 2<br />}</pre> | 
| 테마 | 별칭 업데이트 | Amazon Quick Sight 별칭 업데이트 | <pre>{<br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83",    <br />    "aliasName": "MyThemeAlias"    <br />    "versionNumber": 4<br />}</pre> | 
| 테마 | 별칭 삭제 | Amazon Quick Sight 테마 별칭 삭제됨 | <pre>{<br />    "themeId": "6fdbc328-ebbd-457f-aa02-9780173afc83",    <br />    "aliasName": "MyThemeAlias"    <br />    "versionNumber": 2<br />}</pre> | 

## 예제 이벤트 페이로드
<a name="sample-events-payload"></a>

모든 이벤트는 표준 EventBridge [객체 구조](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html)를 따릅니다. 세부 정보 필드는 이벤트에 대한 정보가 포함된 JSON 객체입니다.

```
{
  "version": "0",
  "id": "3acb26c8-397c-4c89-a80a-ce672a864c55",
  "detail-type": "QuickSight Dashboard Creation Successful",
  "source": "aws.quicksight",
  "account": "123456789012",
  "time": "2023-10-30T22:06:31Z",
  "region": "us-east-1",
  "resources": ["arn:aws:quicksight:us-east-1:123456789012:dashboard/6fdbc328-ebbd-457f-aa02-9780173afc83"],
  "detail": {
    "dashboardId": "6fdbc328-ebbd-457f-aa02-9780173afc83",
    "versionNumber": 1
  }
}
```

# Amazon Quick Sight 이벤트를 Amazon CloudWatch로 전송하는 규칙 생성
<a name="events-send-cloudwatch"></a>

간단한 규칙을 작성하여 관심 있는 Amazon Quick Sight 이벤트와 이벤트가 규칙과 일치할 때 수행할 자동화된 작업을 표시할 수 있습니다. 예를 들어 Amazon Quick Sight 자산이 폴더에 배치될 때마다 Amazon CloudWatch로 이벤트를 보내도록 Amazon Quick Sight를 구성할 수 있습니다. 자세한 정보는 [Amazon EventBridge 사용자 가이드](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)를 참조하세요.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) CloudWatch 콘솔을 엽니다.

1. 탐색 창의 **이벤트** 아래에서 **규칙**을 선택합니다.

1. **규칙 생성**을 선택합니다.

1. 규칙에 대해 이름과 설명을 입력하세요. 규칙 이름은 이 리전 내에서 고유해야 합니다. 예를 들면 `QuickSightAssetChangeRuleCloudWatch`를 입력합니다.

1. **기본** 이벤트 버스를 선택합니다.

1. **이벤트 패턴이 있는 규칙**을 선택한 후**다음**을 선택합니다.

1. **이벤트 소스**에서 **AWS 이벤트 또는 EventBridge 파트너 이벤트**를 선택합니다.

1. **생성 방법** 섹션에서 **사용자 지정 패턴(JSON 편집기)**을 선택합니다.

1. **이벤트 패턴** 텍스트 상자에 다음 코드 조각을 입력하고 **다음**를 선택합니다.

   ```
   {
     "source": ["aws.quicksight"]
   }
   ```

   또는 Amazon Quick Sight에서 이벤트 유형의 하위 집합만 구독하는 규칙을 생성할 수 있습니다. 예를 들어, 다음 규칙은 id가 `77e307e8-b41b-472a-90e8-fe3f471537be`인 폴더에 자산을 추가하거나 제거할 때만 트리거됩니다.

   ```
   {
     "source": ["aws.quicksight"],
     "detail-type": ["QuickSight Folder Membership Updated"],
     "detail": {
       "folderId": "77e307e8-b41b-472a-90e8-fe3f471537be"
     }
   }
   ```

1. **대상**에서 **AWS 서비스** > **CloudWatch 로그 그룹**을 선택합니다.

1. 기존 로그 그룹에서 선택하거나 새 로그 그룹을 입력하여 새 로그 그룹을 생성합니다.

1. 선택적으로 이 규칙에 다른 대상을 추가할 수 있습니다.

1. **태그 구성**에서는 **다음**을 선택합니다.

1. **규칙 생성**을 선택합니다.

자세한 정보는 Amazon EventBridge 사용자 가이드의 [이벤트에 응답하는 Amazon EventBridge 규칙 생성](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)을 참조하세요.

# Amazon Quick Sight 이벤트를 로 전송하는 규칙 생성 AWS Lambda
<a name="events-send-lambda"></a>

이 자습서에서는 Amazon Quick Sight 계정의 자산 이벤트를 로깅하는 AWS Lambda 함수를 생성합니다. 그런 다음 자산이 변경될 때마다 함수를 실행하는 규칙을 생성합니다. 이 자습서에서는 Amazon Quick Sight에 이미 가입했다고 가정합니다.

**1단계: Lambda 함수 생성**

Lambda 함수를 생성하여 상태 변경 이벤트를 기록합니다. 규칙을 생성할 때 이 함수를 지정합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. Lambda를 처음 사용하는 경우 시작 페이지가 표시됩니다. **지금 시작**을 선택합니다. 그렇지 않은 경우에는 **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. 함수 생성 페이지에서 Lambda 함수의 이름과 설명을 입력합니다. 예를 들어 함수 이름을 `QuickSightAssetChangeFn`로 지정합니다.

1. **런타임**에서 **Node.js 18.x**를 선택합니다.

1. **아키텍처**에서는 **x86\$164**를 선택합니다.

1. **실행 역할**에서 **기본 Lambda 권한이 있는 새 역할 생성** 또는 **기존 역할 사용**을 선택하고 원하는 역할을 선택합니다.

1. **함수 생성**을 선택합니다.

1. **QuickSightAssetChange** 페이지에서 **index.js**를 선택합니다.

1. **index.js** 창에서 기존 코드를 삭제합니다.

1. 다음 코드 조각을 입력합니다.

   ```
   console.log('Loading function');
   exports.handler = async (event, context) => {
     console.log('Received QuickSight event:', JSON.stringify(event));
   };
   ```

1. **배포**를 선택합니다.

**2단계: 규칙 생성**

Amazon Quick Sight 자산을 create/update/delete할 때마다 Lambda 함수를 실행하는 규칙을 생성합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/) Amazon EventBridge 콘솔을 엽니다.

1. 탐색 창에서 **규칙**을 선택합니다.

1. **규칙 생성**을 선택합니다.

1. 규칙에 대해 이름과 설명을 입력하십시오. 예를 들면 `QuickSightAssetChangeRule`을 입력합니다.

1. **기본** 이벤트 버스를 선택합니다.

1. **이벤트 패턴이 있는 규칙**을 선택한 후**다음**을 선택합니다.

1. **이벤트 소스**에서 **AWS 이벤트 또는 EventBridge 파트너 이벤트**를 선택합니다.

1. **생성 방법** 섹션에서 **사용자 지정 패턴(JSON 편집기)**을 선택합니다.

1. **이벤트 패턴** 텍스트 상자에 다음 코드 조각을 입력하고 **다음**를 선택합니다.

   ```
   {
     "source": ["aws.quicksight"]
   }
   ```

   또는 Amazon Quick Sight에서 이벤트 유형의 하위 집합만 구독하는 규칙을 생성할 수 있습니다. 예를 들어, 다음 규칙은 id가 `77e307e8-b41b-472a-90e8-fe3f471537be`인 폴더에 자산을 추가하거나 제거할 때만 트리거됩니다.

   ```
   {
     "source": ["aws.quicksight"],
     "detail-type": ["QuickSight Folder Membership Updated"],
     "detail": {
       "folderId": "77e307e8-b41b-472a-90e8-fe3f471537be"
     }
   }
   ```

1. **대상 유형**에서 **AWS 서비스** 및 **Lambda 함수**를 선택합니다.

1. **함수**에서는 생성한 Lambda 함수를 선택합니다. 그리고 **다음**을 선택합니다.

1. **태그 구성**에서는 **다음**을 선택합니다.

1. 규칙의 단계를 검토하십시오. 그런 다음 **규칙 생성**을 선택합니다.

**3단계: 규칙 테스트**

규칙을 테스트하려면 분석을 생성합니다. 몇 분 기다린 후에 Lambda 함수가 호출되었는지 확인합니다.

1. [https://quicksight.aws.amazon.com/](https://quicksight.aws.amazon.com/) Amazon Quick Sight 콘솔을 엽니다.

1. 새 분석을 생성합니다.

1. 탐색 창에서 [**규칙(Rules)**]을 선택하고 생성한 규칙의 이름을 선택합니다.

1. **규칙 세부 정보**에서 **모니터링**을 선택합니다.

1. 그러면 Amazon CloudWatch 콘솔로 리디렉션됩니다. 리디렉션되지 않은 경우 **CloudWatch에서 지표 보기**를 클릭합니다.

1. [**모든 지표(All metrics)**]에서 생성한 규칙의 이름을 선택합니다. 그래프에 규칙이 호출된 것으로 표시되어야 합니다.

1. 탐색 창에서 **로그 그룹**을 선택합니다.

1. Lambda 함수에 대한 로그 그룹 이름을 선택합니다. 예를 들어 `/aws/lambda/function-name`입니다.

1. 로그 스트림 이름을 선택하여 시작한 인스턴스에서 함수를 통해 제공된 데이터를 확인합니다. 다음과 유사한 수신된 이벤트가 표시되어야 합니다.

   ```
   {
     "version": "0",
     "id": "3acb26c8-397c-4c89-a80a-ce672a864c55",
     "detail-type": "QuickSight Analysis Creation Successful",
     "source": "aws.quicksight",
     "account": "123456789012",
     "time": "2023-10-30T22:06:31Z",
     "region": "us-east-1",
     "resources": ["arn:aws:quicksight:us-east-1:123456789012:analysis/e5f37119-e24c-4874-901a-af9032b729b5"],
     "detail": {
       "analysisId": "e5f37119-e24c-4874-901a-af9032b729b5"
     }
   }
   ```

JSON 형식의 Amazon Quick Sight 이벤트 예제는 [Amazon Quick Sight 이벤트 개요를 참조하세요](https://docs.aws.amazon.com/quicksight/latest/developerguide/events.html).

# Amazon Quick Sight에 대한 임베디드 분석
<a name="embedded-analytics"></a>

**중요**  
Amazon Quick Sight에는 및 임베딩 분석을 위한 새로운 API 작업이 `GenerateEmbedUrlForAnonymousUser` 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` API 작업을 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. API 작업 사용에 대한 자세한 내용은 [GetDashboardEmbedURL 및 GetSessionEmbedURL API 작업을 사용한 분석 기능 임베딩](embedded-analytics-deprecated.md) 단원을 참조하세요.


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

Amazon Quick Sight 임베디드 분석을 사용하면 데이터 기반 경험을 소프트웨어 애플리케이션에 원활하게 통합할 수 있습니다. 브랜드에 맞게 임베디드 구성 요소의 스타일을 지정할 수 있습니다. 이 기능은 최종 사용자가 애플리케이션을 떠나지 않고도 데이터를 분석하고 상호 작용할 수 있는 Amazon Quick Sight의 기능을 제공합니다. 인지적 복잡성을 줄여 사용자 경험을 개선하면 사용자는 더 깊이 이해하고 효과적으로 작업할 수 있는 더 나은 기회를 얻을 수 있습니다.

Amazon Quick Sight는 다음 요소에 대한 임베딩을 지원합니다.
+ Amazon Quick Sight 콘솔(등록된 사용자를 위한 전체 작성 환경)
+ Amazon Quick Sight 대시보드 및 시각적 객체(등록 사용자, 익명 사용자, 퍼블릭 최종 사용자용)
+ Amazon Quick Sight Q 검색 창(등록 사용자 및 익명 사용자용)

임베디드 Amazon Quick Sight 콘솔을 사용하면 전체 Amazon Quick Sight 환경을 포함할 수 있습니다. 이렇게 하면 AWS Management Console 또는 독립 실행형 웹 사이트의 컨텍스트가 아닌 애플리케이션의 일부로 Amazon Quick Sight 작성 도구를 사용할 수 있습니다. 임베디드 Amazon Quick Sight 콘솔 사용자는에 Amazon Quick Sight 작성자 또는 관리자로 등록해야 합니다 AWS 계정. 또한 Amazon Quick Sight 지원 인증 방법을 AWS 계정사용하여 동일한에 인증해야 합니다.

임베디드 Amazon Quick Sight 대시보드 또는 시각적 객체를 사용하면 독자는 게시된 대시보드 또는 시각적 객체에서와 동일한 기능과 상호 작용을 얻을 수 있습니다. 임베디드 대시보드 또는 시각적 객체를 사용하기 위해, 독자(뷰어) 는 다음 중 하나를 포함할 수 있습니다.
+ Amazon Quick Sight에서 지원하는 AWS 계정 모든 방법으로에서 인증된 Amazon Quick Sight 사용자.
+ 웹 사이트 또는 애플리케이션의 인증되지 않은 방문자 - 이 옵션을 사용하려면 용량 요금이 책정된 세션 팩이 필요합니다. 구독 유형에 대한 자세한 내용은 [Amazon Quick Sight 구독 및 역할 이해를 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/user-types.html#subscription-role-mapping).
+ 프로그래밍 방식으로 액세스하여 모니터나 대형 화면에서 디스플레이를 보는 여러 최종 사용자

앱도에 상주 AWS하는 경우 앱은 Amazon Quick Sight 구독 AWS 계정 과 동일한에 상주할 필요가 없습니다. 그러나 앱은 API 호출에 사용하는 AWS Identity and Access Management (IAM) 역할을 수임할 수 있어야 합니다.

콘텐츠를 임베딩하려면 먼저 임베딩을 사용하려는 AWS 계정 에서 Amazon Quick Sight Enterprise 에디션을 사용해야 합니다.

Amazon Quick Sight 임베딩은 지원되는 모든에서 사용할 수 있습니다 AWS 리전.

**Topics**
+ [애플리케이션에 Amazon Quick Sight 분석 임베딩](embedding-overview.md)
+ [사용자 지정 Amazon Quick Sight 자산을 애플리케이션에 임베딩](customize-and-personalize-embedded-analytics.md)
+ [원클릭 임베드 코드를 사용하여 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩](1-click-embedding.md)
+ [Amazon Quick Sight APIs를 사용한 임베딩](embedded-analytics-api.md)

# 애플리케이션에 Amazon Quick Sight 분석 임베딩
<a name="embedding-overview"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 

분석을 임베드하려면 Amazon Quick Sight 임베딩 API를 실행하여 임베드 코드를 생성할 수 있습니다. 또는 대시보드의 경우 Amazon Quick Sight에서 대시보드를 공유할 때 임베드 코드를 복사할 수 있습니다. 각 옵션에 대해 아래에 설명되어 있습니다.

## 등록된 사용자의 원클릭 임베딩
<a name="embedding-overview-1-click"></a>

계정의 등록된 사용자와 대시보드를 공유하는 경우 대시보드의 임베드 코드를 복사하여 내부 애플리케이션의 HTML에 붙여 넣을 수 있습니다.

원클릭 엔터프라이즈 임베딩을 사용하는 것은 사용자가 인증해야 하는 내부 애플리케이션에 Amazon Quick Sight 대시보드를 임베드하려는 경우에 가장 적합합니다. 임베드 코드를 복사하면 변경되지 않는 정적 임베드 코드가 생성됩니다.

자세한 내용은 [원클릭 임베드 코드를 사용하여 등록된 사용자를 위한 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩](embedded-analytics-1-click.md) 단원을 참조하십시오.

## Amazon Quick Sight APIs를 사용한 임베딩
<a name="embedding-overview-api"></a>

Amazon Quick Sight API를 사용한 임베딩은 사용자가 인증해야 하는 내부 애플리케이션 또는 누구나 액세스할 수 있는 외부 애플리케이션에 Amazon Quick Sight 환경을 포함하려는 경우에 가장 적합합니다. 임베딩 API 작업을 사용하여 임베드 코드를 생성하면 일회성 코드가 생성됩니다.

자세한 내용은 [Amazon Quick Sight APIs를 사용한 임베딩](embedded-analytics-api.md) 단원을 참조하십시오.

# 사용자 지정 Amazon Quick Sight 자산을 애플리케이션에 임베딩
<a name="customize-and-personalize-embedded-analytics"></a>

Amazon Quick Sight 임베디드 분석을 사용하여 비즈니스 요구 사항에 맞게 조정된 사용자 지정 Amazon Quick Sight 자산을 애플리케이션에 포함할 수 있습니다. 임베디드 대시보드 및 시각적 객체의 경우 Amazon Quick Sight 작성자는 독자가 대시보드 또는 시각적 객체를 탐색할 때 액세스할 수 있는 필터 및 드릴다운을 추가할 수 있습니다. Amazon Quick Sight 개발자는 Amazon Quick Sight SDKs를 사용하여 SaaS 애플리케이션과 Amazon Quick Sight 임베디드 자산 간에 더 엄격한 통합을 구축하여 런타임 시 대시보드의 시각적 객체에 데이터 포인트 콜백 작업을 추가할 수도 있습니다.

Amazon Quick Sight SDKs에 대한 자세한 내용은 [GitHub](https://github.com/awslabs/amazon-quicksight-embedding-sdk) 또는 [NPM](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)`amazon-quicksight-embedding-sdk`의 섹션을 참조하세요.

아래에서 Amazon Quick Sight SDKs를 사용하여 Amazon Quick Sight 임베디드 분석을 사용자 지정하는 방법에 대한 설명을 찾을 수 있습니다.

**Topics**
+ [Amazon Quick Sight에서 런타임 시 임베디드 콜백 작업 추가](embedding-custom-actions-callback.md)
+ [Amazon Quick Sight 임베디드 대시보드 및 시각적 객체의 런타임 데이터 필터링](embedding-runtime-filtering.md)
+ [Amazon Quick Sight 임베디드 대시보드 및 시각적 객체의 모양과 느낌 사용자 지정](embedding-runtime-theming.md)
+ [Amazon Quick Sight 임베딩 SDK를 사용하여 임베디드 대시보드 보기에 대한 공유 가능한 링크 활성화](embedded-view-sharing.md)

# Amazon Quick Sight에서 런타임 시 임베디드 콜백 작업 추가
<a name="embedding-custom-actions-callback"></a>

임베디드 데이터 포인트 콜백 작업을 사용하여 서비스형 소프트웨어(SaaS) 애플리케이션과 Amazon Quick Sight 임베디드 대시보드 및 시각적 객체 간에 더 긴밀한 통합을 구축합니다. 개발자는 Amazon Quick Sight 임베딩 SDK를 사용하여 다시 호출할 데이터 포인트를 등록할 수 있습니다. 시각적 객체에 대한 콜백 작업을 등록하면, 독자는 시각적 객체에서 데이터 포인트를 선택하여 선택한 데이터 포인트와 관련된 데이터를 제공하는 콜백을 수신할 수 있습니다. 이 정보를 사용하여 주요 레코드에 플래그를 지정하고, 데이터 포인트와 관련된 원시 데이터를 컴파일하고, 레코드를 캡처하고, 백엔드 프로세스용 데이터를 컴파일할 수 있습니다.

사용자 지정 시각적 콘텐츠, 텍스트 상자 또는 인사이트에는 임베디드 콜백이 지원되지 않습니다.

콜백에 데이터 포인트를 등록하기 전에 Embedding SDK를 버전 2.3.0으로 업데이트하세요. Amazon Quick Sight 임베딩 SDK 사용에 대한 자세한 내용은 GitHub의 [amazon-quicksight-embedding-sdk](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

Amazon Quick Sight SDK를 통해 런타임 시 데이터 포인트 콜백을 하나 이상의 시각적 객체에 등록할 수 있습니다. 또한 [VisualCustomAction](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_VisualCustomAction.html) API 구조에서 지원하는 모든 상호 작용에 데이터 포인트 콜백을 등록할 수 있습니다. 이렇게 하면 사용자가 시각적 객체에서 데이터 포인트를 선택하거나 데이터 포인트 컨텍스트 메뉴에서 데이터 포인트를 선택할 때 데이터 포인트 콜백이 시작될 수 있습니다. 다음 예제는 독자가 시각적 객체에서 데이터 포인트를 선택할 때 시작하는 데이터 포인트 콜백을 등록합니다.

```
/const MY_GET_EMBED_URL_ENDPOINT =
  "https://my.api.endpoint.domain/MyGetEmbedUrlApi"; // Sample URL

// The dashboard id to embed
const MY_DASHBOARD_ID = "my-dashboard"; // Sample ID

// The container element in your page that will have the embedded dashboard
const MY_DASHBOARD_CONTAINER = "#experience-container"; // Sample ID

// SOME HELPERS

const ActionTrigger = {
  DATA_POINT_CLICK: "DATA_POINT_CLICK",
  DATA_POINT_MENU: "DATA_POINT_MENU",
};

const ActionStatus = {
  ENABLED: "ENABLED",
  DISABLED: "DISABLED",
};

// This function makes a request to your endpoint to obtain an embed url for a given dashboard id
// The example implementation below assumes the endpoint takes dashboardId as request data
// and returns an object with EmbedUrl property
const myGetEmbedUrl = async (dashboardId) => {
  const apiOptions = {
    dashboardId,
  };
  const apiUrl = new URL(MY_GET_EMBED_URL_ENDPOINT);
  apiUrl.search = new URLSearchParams(apiOptions).toString();
  const apiResponse = await fetch(apiUrl.toString());
  const apiResponseData = await apiResponse.json();
  return apiResponseData.EmbedUrl;
};

// This function constructs a custom action object
const myConstructCustomActionModel = (
  customActionId,
  actionName,
  actionTrigger,
  actionStatus
) => {
  return {
    Name: actionName,
    CustomActionId: customActionId,
    Status: actionStatus,
    Trigger: actionTrigger,
    ActionOperations: [
      {
        CallbackOperation: {
          EmbeddingMessage: {},
        },
      },
    ],
  };
};

// This function adds a custom action on the first visual of first sheet of the embedded dashboard
const myAddVisualActionOnFirstVisualOfFirstSheet = async (
  embeddedDashboard
) => {
  // 1. List the sheets on the dashboard
  const { SheetId } = (await embeddedDashboard.getSheets())[0];
  // If you'd like to add action on the current sheet instead, you can use getSelectedSheetId method
  // const SheetId = await embeddedDashboard.getSelectedSheetId();

  // 2. List the visuals on the specified sheet
  const { VisualId } = (await embeddedDashboard.getSheetVisuals(SheetId))[0];

  // 3. Add the custom action to the visual
  try {
    const customActionId = "custom_action_id"; // Sample ID
    const actionName = "Flag record"; // Sample name
    const actionTrigger = ActionTrigger.DATA_POINT_CLICK; // or ActionTrigger.DATA_POINT_MENU
    const actionStatus = ActionStatus.ENABLED;
    const myCustomAction = myConstructCustomActionModel(
      customActionId,
      actionName,
      actionTrigger,
      actionStatus
    );
    const response = await embeddedDashboard.addVisualActions(
      SheetId,
      VisualId,
      [myCustomAction]
    );
    if (!response.success) {
      console.log("Adding visual action failed", response.errorCode);
    }
  } catch (error) {
    console.log("Adding visual action failed", error);
  }
};

const parseDatapoint = (visualId, datapoint) => {
  datapoint.Columns.forEach((Column, index) => {
    // FIELD | METRIC
    const columnType = Object.keys(Column)[0];

    // STRING | DATE | INTEGER | DECIMAL
    const valueType = Object.keys(Column[columnType])[0];
    const { Column: columnMetadata } = Column[columnType][valueType];

    const value = datapoint.RawValues[index][valueType];
    const formattedValue = datapoint.FormattedValues[index];

    console.log(
      `Column: ${columnMetadata.ColumnName} has a raw value of ${value}
           and formatted value of ${formattedValue.Value} for visual: ${visualId}`
    );
  });
};

// This function is used to start a custom workflow after the end user selects a datapoint
const myCustomDatapointCallbackWorkflow = (callbackData) => {
  const { VisualId, Datapoints } = callbackData;

  parseDatapoint(VisualId, Datapoints);
};

// EMBEDDING THE DASHBOARD

const main = async () => {
  // 1. Get embed url
  let url;
  try {
    url = await myGetEmbedUrl(MY_DASHBOARD_ID);
  } catch (error) {
    console.log("Obtaining an embed url failed");
  }

  if (!url) {
    return;
  }

  // 2. Create embedding context
  const embeddingContext = await createEmbeddingContext();

  // 3. Embed the dashboard
  const embeddedDashboard = await embeddingContext.embedDashboard(
    {
      url,
      container: MY_DASHBOARD_CONTAINER,
      width: "1200px",
      height: "300px",
      resizeHeightOnSizeChangedEvent: true,
    },
    {
      onMessage: async (messageEvent) => {
        const { eventName, message } = messageEvent;
        switch (eventName) {
          case "CONTENT_LOADED": {
            await myAddVisualActionOnFirstVisualOfFirstSheet(embeddedDashboard);
            break;
          }
          case "CALLBACK_OPERATION_INVOKED": {
            myCustomDatapointCallbackWorkflow(message);
            break;
          }
        }
      },
    }
  );
};

main().catch(console.error);
```

사용자가 컨텍스트 메뉴를 열 때 데이터포인트 콜백을 시작하도록 위 예제를 구성할 수도 있습니다. 위 예제에서 이 작업을 수행하려면 `actionTrigger`의 값을 `ActionTrigger.DATA_POINT_MENU`(으)로 설정합니다.

데이터포인트 콜백이 등록되면, 지정된 시각적 객체나 시각적 객체의 대부분의 데이터포인트에 적용됩니다. 콜백은 시각적 객체의 합계 또는 소계에는 적용되지 않습니다. 리더가 데이터 포인트와 상호 작용하면 Amazon Quick Sight 임베딩 SDK로 `CALLBACK_OPERATION_INVOKED` 메시지가 전송됩니다. 이 메시지는 `onMessage` 핸들러에 의해 캡처됩니다. 메시지에는 선택한 데이터 포인트와 관련된 전체 데이터 행의 원시 및 표시 값이 포함됩니다. 또한 데이터 포인트가 포함된 시각적 객체의 모든 열에 대한 열 메타데이터도 포함됩니다. 다음은 `CALLBACK_OPERATION_INVOKED` 메시지의 예입니다.

```
{
   CustomActionId: "custom_action_id",
   DashboardId: "dashboard_id",
   SheetId: "sheet_id",
   VisualId: "visual_id",
   DataPoints: [
        {
            RawValues: [
                    {
                        String: "Texas" // 1st raw value in row
                    },
                    {
                        Integer: 1000 // 2nd raw value in row
                    }
            ],
            FormattedValues: [
                    {Value: "Texas"}, // 1st formatted value in row
                    {Value: "1,000"} // 2nd formatted value in row
            ],
            Columns: [
                    { // 1st column metadata
                        Dimension: {
                            String: {
                                Column: {
                                    ColumnName: "State",
                                    DatsetIdentifier: "..."
                                }
                            }
                        }
                    },
                    { // 2nd column metadata
                        Measure: {
                            Integer: {
                                Column: {
                                    ColumnName: "Cancelled",
                                    DatsetIdentifier: "..."
                                },
                                AggregationFunction: {
                                    SimpleNumericalAggregation: "SUM"
                                }
                            }
                        }
                    }
            ]
        }
   ]
}
```

# Amazon Quick Sight 임베디드 대시보드 및 시각적 객체의 런타임 데이터 필터링
<a name="embedding-runtime-filtering"></a>

Amazon Quick Sight 임베딩 SDK의 필터 메서드를 사용하여 런타임 시 서비스형 소프트웨어(SaaS) 애플리케이션 내에서 Amazon Quick Sight 필터의 성능을 활용할 수 있습니다. 런타임 필터를 사용하면 비즈니스 소유자가 애플리케이션을 임베디드 Amazon Quick Sight 대시보드 및 시각적 객체와 통합할 수 있습니다. 이를 수행하려면 애플리케이션에서 사용자 지정 필터 제어를 생성하고 애플리케이션의 데이터를 기반으로 필터 사전 설정을 적용합니다. 그런 다음 개발자는 런타임 시 최종 사용자를 위한 필터 구성을 개인화할 수 있습니다.

개발자는 Amazon Quick Sight 임베딩 SDK를 사용하여 임베디드 대시보드 또는 시각적 객체에서 Amazon Quick Sight 필터를 생성, 쿼리, 업데이트 및 제거할 수 있습니다. [FilterGroup](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FilterGroup.html) 데이터 모델을 사용하여 애플리케이션에서 Amazon Quick Sight 필터 객체를 생성하고 필터 방법을 사용하여 임베디드 대시보드 및 시각적 객체에 적용합니다. Amazon Quick Sight 임베딩 SDK 사용에 대한 자세한 내용은 GitHub의 [amazon-quicksight-embedding-sdk](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

**사전 조건**

시작하기 전에 Amazon Quick Sight 임베딩 SDK 버전 2.5.0 이상을 사용하고 있는지 확인하세요.

## 용어 및 개념
<a name="runtime-filtering-terminology"></a>

다음 용어는 임베디드 런타임 필터링을 사용할 때 유용할 수 있습니다.
+ *필터 그룹* - 개별 필터의 그룹입니다. `FilterGroup` 내에 있는 필터는 서로 OR 처리됩니다. [FilterGroup](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_FilterGroup.html) 내의 필터는 동일한 시트 또는 시각적 객체에 적용됩니다.
+ *필터* - 단일 필터입니다. 필터는 범주, 숫자 또는 날짜/시간 필터 유형일 수 있습니다. 필터에 대한 자세한 정보는 [필터](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_Filter.html)를 참조하세요.

## 설정
<a name="runtime-filtering-setup"></a>

시작하기 전에 다음 자산 및 정보가 준비되어 있는지 확인합니다.
+ 범위를 `FilterGroup`으로 지정할 시트의 시트 ID입니다. 이는 임베딩 SDK의 `getSheets` 메서드를 사용하여 얻을 수 있습니다.
+ 필터링하려는 데이터세트의 데이터세트 및 열 식별자입니다. 이는 [DescribeDashboardDefinition](https://docs.aws.amazon.com/APIReference/API_DescribeDashboardDefinition.html) API 작업을 통해 얻을 수 있습니다.

  사용하는 열 유형에 따라 임베디드 자산에 추가할 수 있는 필터 유형에 제한이 있을 수 있습니다. 필터 제한에 대한 자세한 정보는 [필터](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_Filter.html)를 참조하세요.
+ 해당하는 경우 범위를 `FilterGroup`으로 지정할 시각적 객체의 시각적 ID입니다. 이는 임베딩 SDK의 `getSheetVisuals` 메서드를 사용하여 얻을 수 있습니다.

  `getSheetVisuals` 메서드 외에도 추가하는 `FilterGroup`의 범위는 현재 선택한 시트로만 지정할 수 있습니다.

이 기능을 사용하려면 Amazon Quick Sight 임베딩 SDK를 통해 애플리케이션에 대시보드 또는 시각적 객체가 이미 포함되어 있어야 합니다. Amazon Quick Sight 임베딩 SDK 사용에 대한 자세한 내용은 GitHub의 [amazon-quicksight-embedding-sdk](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

## SDK 메서드 인터페이스
<a name="runtime-filtering-sdk-interface"></a>

**대시보드 임베딩 getter 메서드**

다음 테이블에서는 개발자가 사용할 수 있는 다양한 대시보드 임베딩 getter 메서드를 설명합니다.


| 방법 | 설명 | 
| --- | --- | 
|  `getFilterGroupsForSheet(sheetId: string) `  |  파라미터에 제공된 시트에 현재 범위가 지정된 모든 FilterGroups를 반환합니다.  | 
|  `getFilterGroupsForVisual(sheetId: string, visualId: string)`  |  파라미터에 제공된 시각적 객체로 범위가 지정된 모든 `FilterGroups`를 반환합니다.  | 

파라미터에 제공된 시트가 임베디드 대시보드에서 현재 선택한 시트가 아닌 경우 위 메서드는 오류를 반환합니다.

**시각적 객체 임베딩 getter 메서드**

다음 테이블에서는 개발자가 사용할 수 있는 다양한 시각적 객체 임베딩 getter 메서드를 설명합니다.


| 방법 | 설명 | 
| --- | --- | 
|  `getFilterGroups()`  |  현재 범위가 임베디드 시각적 객체로 지정된 모든 `FilterGroups`를 반환합니다.  | 

**Setter 메서드**

다음 테이블에서는 개발자가 대시보드 또는 시각적 객체 임베딩에 사용할 수 있는 다양한 setter 메서드를 설명합니다.


| 방법 | 설명 | 
| --- | --- | 
|  `addFilterGroups(filterGroups: FilterGroup[])`  |  제공된 **FilterGroups**를 임베디드 대시보드 또는 시각적 객체에 추가하고 적용합니다. 추가 성공 여부를 나타내는 `ResponseMessage`가 반환됩니다.  | 
|  `updateFilterGroups(filterGroups: FilterGroup[])`  |  파라미터에 제공된 `FilterGroup`과 동일한 `FilterGroupId`가 포함된 임베디드 환경에서 `FilterGroups`를 업데이트합니다. 업데이트 성공 여부를 나타내는 `ResponseMessage`가 반환됩니다.  | 
|  `removeFilterGroups(filterGroupsOrIds: FilterGroup[] \| string[])`  |  대시보드에서 제공된 FilterGroups를 제거하고 제거 시도가 성공 여부를 나타내는 `ResponseMessage`를 반환합니다.  | 

제공되는 `FilterGroup`은 현재 선택된 임베디드 시트 또는 시각적 객체로 범위가 지정되어야 합니다.

# Amazon Quick Sight 임베디드 대시보드 및 시각적 객체의 모양과 느낌 사용자 지정
<a name="embedding-runtime-theming"></a>

Amazon Quick Sight 임베딩 SDK(버전 2.5.0 이상)를 사용하여 런타임 시 임베디드 Amazon Quick Sight 대시보드 및 시각적 객체의 테마를 변경할 수 있습니다. 런타임 테마를 사용하면 서비스형 소프트웨어(SaaS) 애플리케이션을 Amazon Quick Sight 임베디드 자산과 더 쉽게 통합할 수 있습니다. 런타임 테마를 사용하면 임베디드 콘텐츠의 테마를 Amazon Quick Sight 자산이 임베디드되는 상위 애플리케이션의 테마와 동기화할 수 있습니다. 런타임 테마 지정을 사용하여 독자에 대한 사용자 지정 옵션을 추가할 수도 있습니다. 테마 지정 변경 사항은 초기화 시 또는 임베디드 대시보드 또는 시각적 객체의 수명 기간 동안 임베디드 자산에 적용할 수 있습니다.

테마에 대한 자세한 정보는 [Amazon Quick Sight에서 테마 사용](themes-in-quicksight.md) 섹션을 참조하세요. Amazon Quick Sight 임베딩 SDK 사용에 대한 자세한 내용은 GitHub의 [amazon-quicksight-embedding-sdk](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

**사전 조건**

시작하기 전에 다음 사전 조건을 충족하는지 확인합니다.
+ Amazon Quick Sight 임베딩 SDK 버전 2.5.0 이상을 사용하고 있습니다.
+ 작업하려는 테마에 액세스할 수 있는 권한입니다. Amazon Quick Sight의 테마에 권한을 부여하려면 `UpdateThemePermissions` API를 호출하거나 Amazon Quick Sight 콘솔의 분석 편집기에서 테마 옆에 있는 **공유** 아이콘을 사용합니다.

## 용어 및 개념
<a name="runtime-theming-terminology"></a>

다음 용어는 임베디드 런타임 지정을 작업할 때 유용할 수 있습니다.
+ *테마* - 콘텐츠 표시 방식을 변경하는 여러 분석 및 대시보드에 적용할 수 있는 설정 모음입니다.
+ *ThemeConfiguration* – 이 구성 객체에는 테마의 모든 표시 속성이 포함됩니다.
+ *테마 재정의* - 콘텐츠 표시 방법의 일부 또는 모든 측면을 재정의하기 위해 활성 테마에 적용되는 `ThemeConfiguration` 객체입니다.
+ *테마 ARN * - Amazon Quick Sight 테마를 식별하는 Amazon 리소스 이름(ARN)입니다. 다음은 사용자 지정 테마 ARN의 예제입니다.

  `arn:aws:quicksight:region:account-id:theme/theme-id`

  Amazon Quick Sight에서 제공하는 스타터 테마에는 테마 ARN에 리전이 없습니다. 다음은 시작 테마 ARN의 예제입니다.

  `arn:aws:quicksight::aws:theme/CLASSIC`

## 설정
<a name="runtime-theming-setup"></a>

런타임 테마 지정 작업을 시작할 수 있도록 다음 정보가 준비되어 있는지 확인합니다.
+ 사용하려는 테마의 테마 ARN입니다. 기존 테마를 선택하거나 새로 만들 수 있습니다. Amazon Quick Sight 계정의 모든 테마 및 테마 ARNs 목록을 가져오려면 [ListThemes](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_ListThemes.html) API 작업을 호출합니다. 사전 설정된 Amazon Quick Sight 테마에 대한 자세한 내용은 섹션을 참조하세요[Amazon Quick APIs를 사용한 Amazon Quick 분석의 기본 테마 설정](customizing-quicksight-default-theme.md).
+ 등록된 사용자 임베딩을 사용하는 경우 사용자가 사용하려는 테마에 액세스할 수 있는지 확인합니다.

  익명 사용자 임베딩을 사용하는 경우 테마 ARN 목록을 `GenerateEmbedUrlForAnonymousUser` API의 `AuthorizedResourceArns` 파라미터에 전달합니다. 익명 사용자에게는 `AuthorizedResourceArns` 파라미터에 나열된 모든 테마에 대한 액세스 권한이 부여됩니다.

## SDK 메서드 인터페이스
<a name="runtime-theming-sdk-interface"></a>

**Setter 메서드**

다음 테이블에서는 개발자가 테마 지정에 사용할 수 있는 다양한 setter 메서드를 설명합니다.


| 방법 | 설명 | 
| --- | --- | 
|  `setTheme(themeArn: string)`  |  대시보드 또는 시각적 객체의 활성 테마를 다른 테마로 바꿉니다. 적용된 경우 테마 재정의가 제거됩니다. 테마에 액세스할 수 없거나 테마가 없는 경우 오류가 반환됩니다.  | 
|  `setThemeOverride(themeOverride: ThemeConfiguration)`  |  현재 활성 테마를 재정의하도록 동적 `ThemeConfiguration`을 설정합니다. 이는 이전에 설정한 테마 재정의를 대체합니다. 새 `ThemeConfiguration`에 제공되지 않은 모든 값은 현재 활성 테마의 값으로 기본 설정됩니다. 제공한 `ThemeConfiguration`이 유효하지 않은 경우 오류가 반환됩니다.  | 

## 테마로 임베디드 콘텐츠 초기화
<a name="runtime-theming-sdk-initialize"></a>

기본값이 아닌 테마로 임베디드 대시보드 또는 시각적 객체를 초기화하려면 `DashboardContentOptions` 또는 `VisualContentOptions` 파라미터에 `themeOptions` 객체를 정의하고 `themeOptions` 내에 `themeArn` 속성을 원하는 테마 ARN으로 설정합니다.

다음 예제에서는 `MIDNIGHT` 테마로 임베디드 대시보드를 초기화합니다.

```
import { createEmbeddingContext } from 'amazon-quicksight-embedding-sdk';

const embeddingContext = await createEmbeddingContext();

const {
    embedDashboard,
} = embeddingContext;

const frameOptions = {
    url: '<YOUR_EMBED_URL>',
    container: '#experience-container',
};
const contentOptions = {
    themeOptions: {
        themeArn: "arn:aws:quicksight::aws:theme/MIDNIGHT"
    }
};

// Embedding a dashboard experience
const embeddedDashboardExperience = await embedDashboard(frameOptions, contentOptions);
```

## 테마 재정의로 임베디드 콘텐츠 초기화
<a name="runtime-theming-runtime-initialize-override"></a>

개발자는 테마 재정의를 사용하여 런타임 시 임베디드 대시보드 또는 시각적 객체의 테마를 정의할 수 있습니다. 이렇게 하면 Amazon Quick Sight 내에서 테마를 사전 구성할 필요 없이 대시보드 또는 시각적 객체가 타사 애플리케이션에서 테마를 상속할 수 있습니다. 테마 재정의로 임베디드 대시보드 또는 시각적 객체를 초기화하려면 `DashboardContentOptions` 또는 `VisualContentOptions` 파라미터에서 `themeOptions` 내에 `themeOverride` 속성을 설정합니다. 다음 예제에서는 대시보드 테마의 글꼴을 기본 글꼴에서 `Amazon Ember`로 재정의합니다.

```
import { createEmbeddingContext } from 'amazon-quicksight-embedding-sdk';

const embeddingContext = await createEmbeddingContext();

const {
    embedDashboard,
} = embeddingContext;

const frameOptions = {
    url: '<YOUR_EMBED_URL>',
    container: '#experience-container',
};
const contentOptions = {
    themeOptions: {
        "themeOverride":{"Typography":{"FontFamilies":[{"FontFamily":"Comic Neue"}]}}
    }
};

// Embedding a dashboard experience
const embeddedDashboardExperience = await embedDashboard(frameOptions, contentOptions);
```

## 사전 로드된 테마로 임베디드 콘텐츠 초기화
<a name="runtime-theming-runtime-initialize-preloaded"></a>

개발자는 초기화 시 사전 로드되도록 대시보드 테마 세트를 구성할 수 있습니다. 이는 어두운 모드와 밝은 모드와 같은 다양한 뷰 간에 빠르게 전환할 때 가장 유용합니다. 임베디드 대시보드 또는 시각적 객체는 최대 5개의 사전 로드된 테마로 초기화할 수 있습니다. 사전 로드된 테마를 사용하려면 `DashboardContentOptions` 또는 `VisualContentOptions`에서 `preloadThemes` 속성을 최대 5개의 `themeArns` 배열로 설정합니다. 다음 예제에서는 `Midnight` 및 `Rainier` 시작 테마를 대시보드에 사전 로드합니다.

```
import { createEmbeddingContext } from 'amazon-quicksight-embedding-sdk';

const embeddingContext = await createEmbeddingContext();

const {
    embedDashboard,
} = embeddingContext;

const frameOptions = {
    url: '<YOUR_EMBED_URL>',
    container: '#experience-container',
};
const contentOptions = {
    themeOptions: {
        "preloadThemes": ["arn:aws:quicksight::aws:theme/RAINIER", "arn:aws:quicksight::aws:theme/MIDNIGHT"]
    }
};

// Embedding a dashboard experience
const embeddedDashboardExperience = await embedDashboard(frameOptions, contentOptions);
```

# Amazon Quick Sight 임베딩 SDK를 사용하여 임베디드 대시보드 보기에 대한 공유 가능한 링크 활성화
<a name="embedded-view-sharing"></a>

Amazon Quick Sight 개발자는 Amazon Quick Sight 임베딩 SDK(버전 2.8.0 이상)를 사용하여 임베디드 대시보드 독자가 임베디드 대시보드 보기에 대한 공유 가능한 링크를 수신하고 배포할 수 있습니다. 개발자는 대시보드 또는 콘솔 임베딩을 사용하여 Amazon Quick Sight 임베딩 SDK를 사용하여 캡슐화된 Amazon Quick Sight의 참조를 사용하여 애플리케이션 페이지에 대한 공유 가능한 링크를 생성할 수 있습니다. 그러면 Amazon Quick Sight 독자가 공유 가능한 링크를 동료에게 보낼 수 있습니다. 피어가 공유 링크에 액세스하면 임베디드 Amazon Quick Sight 대시보드가 포함된 애플리케이션의 페이지로 이동합니다. 또한 개발자는 익명 임베딩을 사용할 때 Amazon Quick Sight의 익명 독자를 위한 북마크로 사용할 수 있는 공유 가능한 대시보드 보기 링크를 생성하고 저장할 수 있습니다.

**사전 조건**

시작하기 전에 Amazon Quick Sight 임베딩 SDK 버전 2.8.0 이상을 사용하고 있는지 확인합니다.

**Topics**
+ [Amazon Quick Sight 임베디드 분석을 위한 `SharedView` 기능 구성 활성화](embedded-view-sharing-set-up.md)
+ [Amazon Quick Sight `createSharedView` API를 사용하여 공유 뷰 생성](embedded-view-sharing-sdk-create.md)
+ [공유 Amazon Quick Sight 보기 사용](embedded-view-sharing-sdk-consume.md)

# Amazon Quick Sight 임베디드 분석을 위한 `SharedView` 기능 구성 활성화
<a name="embedded-view-sharing-set-up"></a>

Amazon Quick Sight API를 사용하여 임베디드 인스턴스를 생성할 때 아래 예제`true`와 같이 `FeatureConfigurations`페이로드`SharedView`의 값을 로 설정합니다.는 임베디드 대시보드에 액세스하는 등록된 사용자의 `StatePersistence` 구성을 `SharedView` 재정의합니다. 대시보드 사용자가 `StatePersistence`에 비활성화되고 `SharedView`에 활성화된 경우 해당 상태는 유지됩니다.

```
const generateNewEmbedUrl = async () => {
    const generateUrlPayload = {
        experienceConfiguration: {
            QuickSightConsole: {
            FeatureConfigurations: {
                "SharedView": { 
                    "Enabled": true
                 },
            },
        },
    }
    const result: GenerateEmbedUrlResult = await generateEmbedUrlForRegisteredUser(generateUrlPayload);
    return result.url;
};
```

# Amazon Quick Sight `createSharedView` API를 사용하여 공유 뷰 생성
<a name="embedded-view-sharing-sdk-create"></a>

임베딩 SDK를 버전 2.8.0 이상으로 업데이트한 후 `createSharedView` API를 사용하여 새 공유 뷰를 생성합니다. 작업이 반환하는 `sharedViewId` 및 `dashboardId`를 기록합니다. 아래 예제에서는 새 공유 뷰를 생성합니다.

```
const response = await embeddingFrame.createSharedView();
const sharedViewId = response.message.sharedViewId;
const dashboardId = response.message.dashboardId;
```

`createSharedView`는 사용자가 대시보드를 볼 때만 호출할 수 있습니다. 콘솔별 공유 뷰를 생성하려면 `createSharedView` 작업을 활성화하기 전에 사용자가 대시보드 페이지에 있는지 확인합니다. 아래 예제에 표시된 대로 `PAGE_NAVIGATION` 이벤트로 이 작업을 수행할 수 있습니다.

```
const contentOptions = {
    onMessage: async (messageEvent, metadata) => {
    switch (messageEvent.eventName) {
            case 'CONTENT_LOADED': {
                console.log("Do something when the embedded experience is fully loaded.");
                break;
            }
            case 'ERROR_OCCURRED': {
                console.log("Do something when the embedded experience fails loading.");
                break;
            }
            case 'PAGE_NAVIGATION': {
                setPageType(messageEvent.message.pageType); 
                if (messageEvent.message.pageType === 'DASHBOARD') {
                    setShareEnabled(true);
                    } else {
                    setShareEnabled(false);
                }
                break;
            }
        }
    }
};
```

# 공유 Amazon Quick Sight 보기 사용
<a name="embedded-view-sharing-sdk-consume"></a>

새 공유 뷰를 생성한 후 임베딩 SDK를 사용하여 공유 뷰를 다른 사용자에게 사용 가능하게 합니다. 아래 예제에서는 Amazon Quick Sight의 임베디드 대시보드에 대한 소모성 공유 보기를 설정합니다.

------
#### [ With an appended URL ]

임베드 URL에 `sharedViewId`를 추가하고 ` /views/{viewId}`에서 이 URL을 사용자에게 노출합니다. 사용자는 이 URL을 사용하여 공유 뷰로 이동할 수 있습니다.

```
const response = await dashboardFrame.createSharedView();
const newEmbedUrl = await generateNewEmbedUrl();
const formattedUrl = new URL(newEmbedUrl);
formattedUrl.pathname = formattedUrl.pathname.concat('/views/' + response.message.sharedViewId);
const baseUrl = formattedUrl.href;
alert("Click to view this QuickSight shared view", baseUrl);
```

------
#### [ With the contentOptions SDK ]

`viewId`를 `contentOptions`에 전달하여 지정된 `viewId`에 대한 환경을 엽니다.

```
const contentOptions = {
    toolbarOptions: {
        ...
    },
    viewId: sharedViewId,
};

const embeddedDashboard = await embeddingContext.embedDashboard(
    {container: containerRef.current},
    contentOptions
);
```

------
#### [ With the InitialPath property ]

```
const shareView = async() => {
    const returnValue = await consoleFrame.createSharedView();
    const {dashboardId, sharedViewId} = returnValue.message;
    const newEmbedUrl = await generateNewEmbedUrl(`/dashboards/${dashboardId}/views/${sharedViewId}`);
    setShareUrl(newEmbedUrl);
};

const generateNewEmbedUrl = async (initialPath) => {
    const generateUrlPayload = {
        experienceConfiguration: {
            QuickSightConsole: {
            InitialPath: initialPath,
            FeatureConfigurations: {
                "SharedView": { 
                    "Enabled": true
                 },
            },
        },
    }
    const result: GenerateEmbedUrlResult = await generateEmbedUrlForRegisteredUser(generateUrlPayload);
    return result.url;
};
```

------

# 원클릭 임베드 코드를 사용하여 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩
<a name="1-click-embedding"></a>

임베드 코드를 사용하여 시각적 객체 또는 대시보드를 애플리케이션에 포함할 수 있습니다. 대시보드를 공유하거나 Amazon Quick Sight의 **시각적 객체 임베드** 메뉴에서이 코드를 얻을 수 있습니다.

등록된 사용자를 위해 내부 애플리케이션에 시각적 객체 또는 대시보드를 포함할 수 있습니다. 또는 Amazon Quick Sight 콘솔에서 퍼블릭 공유를 켤 수 있습니다. 이렇게 하면 인터넷상의 모든 사용자가 퍼블릭 애플리케이션, Wiki 또는 포털에 포함된 공유 영상 또는 대시보드에 액세스할 수 있습니다.

다음에는 원클릭 시각적 객체 또는 대시보드 임베드 코드를 사용하여 시각적 객체와 대시보드를 임베드하는 방법에 대한 설명이 나와 있습니다.

**Topics**
+ [원클릭 임베드 코드를 사용하여 등록된 사용자를 위한 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩](embedded-analytics-1-click.md)
+ [원클릭 임베드 코드를 사용하여 익명 사용자를 위한 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩](embedded-analytics-1-click-public.md)

# 원클릭 임베드 코드를 사용하여 등록된 사용자를 위한 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩
<a name="embedded-analytics-1-click"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 

Amazon Quick Sight 계정의 등록된 사용자를 위해 내부 애플리케이션에 시각적 객체 또는 대시보드를 포함할 수 있습니다. 대시보드를 공유할 때 얻는 임베드 코드를 사용하거나 Amazon Quick Sight의 **임베드 시각적** 객체 메뉴에서 임베드 코드를 사용하면 됩니다. 임베드 코드를 생성하기 위해 Amazon Quick Sight 임베딩 API를 실행할 필요가 없습니다. Amazon Quick Sight에서 임베드 코드를 복사하여 내부 애플리케이션의 HTML 코드에 붙여 넣을 수 있습니다.

내장하려는 대시보드에 액세스할 수 있거나 내장하려는 시각적 객체가 있는 사용자 및 그룹(또는 Amazon Quick Sight 계정의 모든 사용자)이 내부 애플리케이션에 액세스할 수 있는 경우 자격 증명으로 Amazon Quick Sight 계정에 로그인하라는 메시지가 표시됩니다. 인증을 받은 사용자는 내부 페이지에서 시각적 요소나 대시보드에 액세스할 수 있습니다. SSO(Single Sign-On)를 사용하도록 설정한 경우 사용자에게 다시 로그인하라는 메시지가 표시되지 않습니다.

다음에는 원클릭 시각적 객체 또는 대시보드 임베드 코드를 사용하여 시각적 객체와 대시보드를 임베드하는 방법에 대한 설명이 나와 있습니다.

## 시작하기 전에
<a name="embedded-analytics-1-click-prerequisites"></a>

시작하기 전에 다음을 확인하세요.
+ 인터넷 브라우저 설정에는 팝업과 iframe 간의 통신을 허용하는 다음 중 하나가 포함되어 있습니다.
  + Mozilla Broadcast Channel API가 기본적으로 지원됩니다. 자세한 내용은 Mozilla 설명서의 [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)를 참조하세요.
  + IndexedDB 지원
  + LocalStorage 지원
+ 인터넷 브라우저의 "모든 쿠키 차단" 설정이 꺼져 있습니다.

## 1단계: 대시보드 액세스 권한 부여
<a name="embedded-analystics-1-click-share"></a>

사용자가 임베디드 대시보드에 액세스할 수 있도록 하려면 해당 대시보드를 볼 수 있는 액세스 권한을 부여하세요. 개별 사용자 및 그룹에 대시보드 액세스 권한을 부여하거나, 계정의 모든 사용자에게 액세스 권한을 부여할 수 있습니다. 시각적 권한은 대시보드 수준에서 결정됩니다. 임베디드 시각적 개체에 대한 액세스 권한을 부여하려면 해당 시각적 개체가 속한 대시보드에 대한 액세스 권한을 부여하세요. 자세한 내용은 [대시보드 액세스 권한 부여](share-a-dashboard.md) 단원을 참조하십시오.

## 2단계: 시각적 객체나 대시보드를 삽입하려는 도메인을 허용 목록에 추가
<a name="embedded-analytics-1-click-allow-list"></a>

내부 애플리케이션에 시각적 객체와 대시보드를 포함하려면 임베딩하려는 도메인이 Amazon Quick Sight 계정에 허용 목록에 있는지 확인합니다. 자세한 내용은 [정적 도메인 리스팅 허용](manage-domains.md#embedding-static) 단원을 참조하십시오.

## 3단계: 임베디드 코드 가져오기
<a name="embedded-analytics-1-click-code"></a>

다음 절차에 따라 시각적 객체 코드 또는 대시보드 임베디드 코드를 가져오십시오.

**대시보드 임베드 코드 가져오기**

1. Amazon Quick Sight에서 게시된 대시보드를 열고 오른쪽 상단에서 **공유**를 선택합니다. 그런 다음 **대시보드 공유**를 선택합니다.

1. 열린 **대시보드 공유** 페이지에서 왼쪽 상단의 **임베드 코드 복사**를 선택합니다.

   임베드 코드는 클립보드에 복사되며 다음과 유사합니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

   ```
   <iframe
           width="960"
           height="720"
           src="https://quicksightdomain/sn/embed/share/accounts/accountid/dashboards/dashboardid?directory_alias=account_directory_alias">
       </iframe>
   ```

**시각적 객체 임베드 코드 가져오기**

1. Amazon Quick Sight에서 게시된 대시보드를 열고 임베드하려는 시각적 객체를 선택합니다. 그런 다음 시각적 객체의 오른쪽 상단에서 시각적 객체 메뉴를 열어서 **시각적 객체 임베드**를 선택합니다.

1. 열리는 **시각적 객체 임베드** 창에서 **코드 복사**를 선택합니다.

   임베드 코드는 클립보드에 복사되며 다음과 유사합니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

   ```
   <iframe
           width="600"
           height="400"
           src="https://quicksightdomain/sn/embed/share/accounts/111122223333/dashboards/DASHBOARDID/sheets/SHEETID>/visuals/VISUALID">
       </iframe>
   ```

## 4단계: 코드를 내부 애플리케이션의 HTML 페이지에 붙여넣기
<a name="embedded-analytics-1-click-html"></a>

다음 절차를 사용하여 임베드 코드를 내부 애플리케이션의 HTML 페이지에 붙여 넣습니다.

**내부 응용 프로그램의 HTML 페이지에 코드 붙여 넣기**
+ 대시보드를 임베드하려는 페이지의 HTML 코드를 열고 임베드 코드를 붙여 넣습니다.

  다음 예는 임베디드 대시보드에서 어떤 모양을 갖추게 되는지 보여줍니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

  ```
  <!DOCTYPE html>
      <html>
      <body>
  
      <h2>Example.com - Employee Portal</h2>
      <h3>Current shipment stats</h3>
          <iframe
          width="960"
          height="720"
          src="https://quicksightdomain/sn/embed/share/accounts/accountid/dashboards/dashboardid?directory_alias=account_directory_alias">
      </iframe>
  
      </body>
      </html>
  ```

  다음 예는 임베디드 시각적 객체에서 어떤 모양을 갖추게 되는지 보여줍니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

  ```
  <!DOCTYPE html>
      <html>
      <body>
  
      <h2>Example.com - Employee Portal</h2>
      <h3>Current shipment stats</h3>
          <iframe
          width="600"
          height="400"
          src="https://quicksightdomain/sn/embed/share/accounts/111122223333/dashboards/DASHBOARDID/sheets/SHEETID>/visuals/VISUALID?directory_alias=account_directory_alias">
      </iframe>
  
      </body>
      </html>
  ```

예를 들어 내부 Google Sites 도구 페이지에 시각적 객체 또는 대시보드를 임베드하고 싶다고 가정해 보겠습니다. Google Sites에서 페이지를 열고 임베드 위젯에 임베드 코드를 붙여 넣을 수 있습니다.

시각적 객체나 대시보드를 내부 Microsoft SharePoint 사이트에 포함하려는 경우, 새 페이지를 만든 다음 임베드 웹 파트에 임베드 코드를 붙여넣을 수 있습니다.

# 원클릭 임베드 코드를 사용하여 익명 사용자를 위한 Amazon Quick Sight 시각적 객체 및 대시보드 임베딩
<a name="embedded-analytics-1-click-public"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 

Amazon Quick Sight에서 시각적 객체 또는 대시보드를 공유할 때 얻는 임베드 코드를 사용하여 퍼블릭 사이트에 시각적 객체 또는 대시보드를 임베드할 수 있습니다. Amazon Quick Sight 콘솔을 사용하여 퍼블릭 공유를 활성화하고 인터넷상의 모든 사용자에게 공유 시각적 객체 또는 대시보드에 대한 액세스 권한을 자동으로 부여할 수도 있습니다.

다음에서 시각적 객체 또는 대시보드에 대한 퍼블릭 공유를 켜고 인터넷상의 모든 사용자가 볼 수 있도록 시각적 또는 대시보드를 포함하는 방법을 확인할 수 있습니다. 두 경우 모두 원클릭 임베드 코드를 사용하면 됩니다.

## 시작하기 전에
<a name="embedded-analytics-1-click-prerequisites"></a>

시작하기 전에 다음을 확인하세요.
+ 인터넷 브라우저 설정에는 팝업과 iframe 간의 통신을 허용하는 다음 중 하나가 포함되어 있습니다.
  + Mozilla Broadcast Channel API가 기본적으로 지원됩니다. 자세한 내용은 Mozilla 설명서의 [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API)를 참조하세요.
  + IndexedDB 지원
  + LocalStorage 지원
+ 인터넷 브라우저의 "모든 쿠키 차단" 설정이 꺼져 있습니다.

## 1단계: 대시보드에 대한 퍼블릭 액세스 켜기
<a name="embedded-analytics-1-click-step-1"></a>

인터넷상의 모든 사용자가 임베디드 시각적 객체나 대시보드에 액세스할 수 있게 하려면 먼저 대시보드의 퍼블릭 액세스를 켜세요. 시각적 권한은 대시보드 수준에서 결정됩니다. 임베디드 시각적 개체에 대한 액세스 권한을 부여하려면 해당 시각적 개체가 속한 대시보드에 대한 액세스 권한을 부여하세요. 자세한 내용은 [인터넷상의 모든 사용자에게 Amazon Quick Sight 대시보드에 대한 액세스 권한 부여](share-a-dashboard-grant-access-anyone.md) 단원을 참조하십시오.

## 2단계: 시각적 객체나 대시보드를 삽입하려는 도메인을 허용 목록에 추가
<a name="embedded-analytics-1-click-step-2"></a>

퍼블릭 애플리케이션, Wiki 또는 포털에 시각적 객체와 대시보드를 포함하려면 이를 포함하려는 도메인이 Amazon Quick Sight 계정의 허용 목록에 있는지 확인합니다.

## 3단계: 임베디드 코드 가져오기
<a name="embedded-analytics-1-click-step-3"></a>

다음 절차에 따라 시각적 객체 코드 또는 대시보드 임베디드 코드를 가져오십시오.

**대시보드 임베드 코드 가져오기**

1. Amazon Quick Sight에서 게시된 대시보드를 열고 오른쪽 상단에서 **공유**를 선택합니다. 그런 다음 **대시보드 공유**를 선택합니다.

1. 열린 **대시보드 공유** 페이지에서 왼쪽 상단의 **임베드 코드 복사**를 선택합니다.

   임베드 코드는 클립보드에 복사되며 다음과 유사합니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

   ```
   <iframe
           width="960"
           height="720"
           src="https://quicksightdomain/sn/
               embed/share/accounts/accountid/dashboards/dashboardid">
       </iframe>
   ```

**시각적 객체 임베드 코드 가져오기**

1. Amazon Quick Sight에서 게시된 대시보드를 열고 임베드하려는 시각적 객체를 선택합니다. 그런 다음 시각적 객체의 오른쪽 상단에 있는 시각적 메뉴를 열고 **시각적 객체 임베드을 선택합니다.**

1. 열리는 **시각적 객체 임베드** 창에서 **코드 복사**를 선택합니다.

   임베드 코드는 클립보드에 복사되며 다음과 유사합니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

   ```
   <iframe
           width="600"
           height="400"
           src="https://quicksightdomain/sn/embed/share/accounts/111122223333/dashboards/DASHBOARDID/sheets/SHEETID>/visuals/VISUALID">
       </iframe>
   ```

## 4단계: 임베드 코드를 HTML 페이지, Wiki 페이지 또는 포털에 붙여넣기
<a name="embedded-analytics-1-click-step-4"></a>

다음 절차에 따라 임베드 코드를 HTML 페이지, Wiki 페이지 또는 포털에 붙여넣을 수 있습니다.

**임베드 코드 붙여넣기**
+ 시각적 객체나 대시보드를 임베드하려는 위치의 HTML 코드를 열고 임베드 코드를 붙여넣습니다.

  다음 예는 임베디드 대시보드에서 어떤 모양을 갖추게 되는지 보여줍니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

  ```
  <!DOCTYPE html>
      <html>
      <body>
  
      <h2>Example.com - Employee Portal</h2>
      <h3>Current shipment stats</h3>
          <iframe
          width="960"
          height="720"
          src="https://quicksightdomain/sn/
              embed/share/accounts/accountid/dashboards/dashboardid">
      </iframe>
  
      </body>
      </html>
  ```

  다음 예는 임베디드 시각적 객체에서 어떤 모양을 갖추게 되는지 보여줍니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

  ```
  <!DOCTYPE html>
      <html>
      <body>
  
      <h2>Example.com - Employee Portal</h2>
      <h3>Current shipment stats</h3>
          <iframe
          width="600"
          height="400"
          src="https://quicksightdomain/sn/embed/share/accounts/111122223333/dashboards/DASHBOARDID/sheets/SHEETID>/visuals/VISUALID">
      </iframe>
  
      </body>
      </html>
  ```

공개 애플리케이션을 Google Sites에 구축한 경우 Google Sites에서 페이지를 연 다음 임베드 위젯을 사용하여 임베드 코드를 붙여넣습니다.

Google 사이트에 임베드할 때 Amazon Quick Sight의 다음 도메인이 허용 목록에 있는지 확인합니다.
+ `https://googleusercontent.com` (하위 도메인 켜기)
+ `https://www.gstatic.com`
+ `https://sites.google.com`

시각적 객체 또는 대시보드를 애플리케이션에 포함한 후에는, 애플리케이션에 액세스할 수 있는 모든 사용자가 임베디드 시각적 객체 또는 대시보드에 액세스할 수 있습니다. 모든 사람과 공유되는 대시보드를 업데이트하려면 [공개적으로 공유된 대시보드 업데이트](share-a-dashboard-grant-access-anyone-update.md)을 참조하세요. 퍼블릭 공유를 끄려면 [퍼블릭 공유 설정 끄기](share-a-dashboard-grant-access-anyone-no-share.md)을(를) 참조하세요.

퍼블릭 공유를 끄면 공용 애플리케이션에 포함했거나 링크를 통해 공유한 대시보드 또는 대시보드에 인터넷을 사용하는 누구도 액세스할 수 없습니다. 다음에 누군가가 인터넷에서 이러한 대시보드를 보려고 하면 해당 대시보드를 볼 수 있는 액세스 권한이 없다는 메시지를 받게 됩니다.

# Amazon Quick Sight APIs를 사용한 임베딩
<a name="embedded-analytics-api"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

Amazon Quick Sight APIs를 사용하여 분석을 임베딩하는 실제 프로세스에는 몇 가지 단계만 포함됩니다.

시작하기 전에 다음 도구가 있는지 확인하세요.
+  AWS SDK를 사용하여 API 호출을 수행할 애플리케이션에서 사용하는 호출자 자격 증명에 필요한 IAM 권한을 설정합니다. 예를 들어, `quicksight:GenerateEmbedUrlForAnonymousUser` 또는 `quicksight:GenerateEmbedUrlForRegisteredUser` 작업을 허용할 권한을 부여합니다.
+ 등록된 사용자를 위해 임베드하려면 Amazon Quick Sight 자산을 사용자와 미리 공유합니다. 신규 인증 사용자의 경우 자산에 대한 액세스 권한을 부여하는 방법을 숙지하세요. 이렇게 하는 한 가지 방법은 Amazon Quick Sight 폴더에 모든 자산을 추가하는 것입니다. Amazon Quick Sight API를 사용하려면 `DescribeDashboardPermissions` 및 `UpdateDashboardPermissions` API 작업을 사용합니다. 자세한 내용은 Amazon Quick API 참조의 [DescribeDashboardPermissions](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeDashboardPermissions.html) 또는 [UpdateDashboardPermissions](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_UpdateDashboardPermissions.html)를 참조하세요. ** 네임스페이스 또는 그룹의 모든 사용자와 대시보드를 공유하려는 경우, 대시보드를 `namespace` 또는 `group`와(과) 공유할 수 있습니다.
+ 대시보드를 임베딩하는 경우, 포함하려는 대시보드의 ID가 있어야 합니다. 대시보드 ID는 대시보드 URL의 코드입니다. 대시보드 URL에서도 가져올 수 있습니다.
+ Amazon Quick Sight 관리자는 Amazon Quick Sight 분석을 포함할 도메인을 명시적으로 활성화해야 합니다. 프로필 메뉴에서 **Amazon Quick Sight, 도메인 및 임베딩 관리를** 사용하거나 `GenerateEmbedUrlForAnonymousUser` 또는 `GenerateEmbedUrlForRegisteredUser` API 호출의 `AllowedDomains` 파라미터를 사용하여이 작업을 수행할 수 있습니다. **** 

  이 옵션은 Amazon Quick Sight 관리자에게만 표시됩니다. 하위 도메인을 도메인의 일부로 추가할 수도 있습니다. 자세한 내용은 [Amazon Quick API를 사용하여 런타임 시 도메인 나열 허용](manage-domains.md#embedding-run-time) 단원을 참조하십시오.

  정적 허용 목록의 모든 도메인(예: 개발, 스테이징, 프로덕션)이 명시적으로 허용되고 HTTPS를 사용해야 합니다. 최대 100개의 도메인을 허용 목록에 추가할 수 있습니다. Amazon Quick Sight API 작업을 사용하여 런타임에 도메인을 추가할 수 있습니다.

모든 사전 요구 사항이 완료되면 Amazon Quick Sight 임베딩에는 다음 단계가 포함되며, 이에 대해서는 나중에 자세히 설명합니다.

1. 인증을 위해서는 애플리케이션 서버를 사용하여 사용자를 인증하세요. 서버에서 인증한 후 필요한 AWS SDK를 사용하여 임베디드 대시보드 URL을 생성합니다.

1. 웹 포털 또는 애플리케이션에 생성된 URL을 사용하여 Amazon Quick Sight를 포함합니다. 이 프로세스를 간소화하기 위해 [NPMJS](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk) 및 [GitHub](https://github.com/awslabs/amazon-quicksight-embedding-sdk)에서 사용할 수 있는 Amazon Quick Sight 임베딩 SDK를 사용할 수 있습니다. 이 사용자 지정 JavaScript SDK는 Amazon Quick Sight를 애플리케이션 페이지에 효율적으로 통합하고, 기본값을 설정하고, 제어를 연결하고, 콜백을 가져오고, 오류를 처리할 수 있도록 설계되었습니다.

 AWS CloudTrail 감사 로그를 사용하여 임베디드 대시보드 수, 임베디드 경험 사용자 및 액세스 속도에 대한 정보를 가져올 수 있습니다.

**Topics**
+ [Amazon Quick Sight API를 사용하여 Amazon Quick Sight 대시보드 임베딩](embedding-dashboards.md)
+ [Amazon Quick Sight APIs를 사용하여 Amazon Quick Sight 시각적 객체 임베딩](embedding-visuals.md)
+ [등록된 사용자를 위한 Amazon Quick Sight 콘솔의 전체 기능 임베딩](embedded-analytics-full-console-for-authenticated-users.md)
+ [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩](embedding-gen-bi.md)
+ [Amazon Quick Sight Q 검색 창 임베딩(클래식)](embedding-quicksight-q.md)
+ [GetDashboardEmbedURL 및 GetSessionEmbedURL API 작업을 사용한 분석 기능 임베딩](embedded-analytics-deprecated.md)

# Amazon Quick Sight API를 사용하여 Amazon Quick Sight 대시보드 임베딩
<a name="embedding-dashboards"></a>

다음 주제를 사용하여 Amazon Quick Sight API를 사용한 대시보드 임베딩에 대해 알아봅니다.

**Topics**
+ [등록된 사용자를 위한 Amazon Quick Sight 대시보드 임베딩](embedded-analytics-dashboards-for-authenticated-users.md)
+ [익명(미등록) 사용자를 위한 Amazon Quick Sight 대시보드 임베딩](embedded-analytics-dashboards-for-everyone.md)
+ [임베디드 대시보드에서 실행 요약 활성화](embedded-analytics-genbi-executive-summaries-dashboard.md)

# 등록된 사용자를 위한 Amazon Quick Sight 대시보드 임베딩
<a name="embedded-analytics-dashboards-for-authenticated-users"></a>

**중요**  
Amazon Quick Sight에는 및 임베딩 분석을 위한 새로운 API 작업이 `GenerateEmbedUrlForAnonymousUser` 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` API 작업을 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. 이전 API 작업을 사용한 임베딩에 대한 자세한 내용은 [GetDashboardEmbedURL 및 GetSessionEmbedURL API 작업을 사용한 분석 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-deprecated.html) 참조하세요.


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 Amazon Quick Sight의 등록된 사용자를 위해 임베디드 Amazon Quick Sight 대시보드를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-dashboards-for-authenticated-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-dashboards-for-authenticated-users-step-2)
+ [3단계: 대시보드 URL 임베드](#embedded-dashboards-for-authenticated-users-step-3)

## 1단계: 권한 설정
<a name="embedded-dashboards-for-authenticated-users-step-1"></a>

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

대시보드에 액세스하는 각 사용자는 Amazon Quick Sight에 대시보드에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면에서 IAM 역할을 생성합니다 AWS 계정. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 특정 사용자 풀의 임베딩 URL을 검색할 수 있는 권한을 제공해야 합니다. 와일드카드 문자 \$1를 사용하여, 특정 네임스페이스의 모든 사용자 또는 특정 네임스페이스의 일부 사용자에 대해 URL을 생성할 권한을 부여할 수 있습니다. 이를 위해 `quicksight:GenerateEmbedUrlForRegisteredUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForRegisteredUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자는 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의할 수 있는 옵션을 제공합니다. 대신 생성된 URL에 액세스할 수 있는 도메인 또는 하위 도메인을 최대 3개까지 나열할 수 있습니다. 그러면 만든 웹 사이트에 이 URL이 포함됩니다. 파라미터에 나열된 도메인만 포함된 시각적 객체에 액세스할 수 있습니다. 이 조건이 없으면, 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForRegisteredUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

다음 샘플 정책은 이러한 권한을 제공합니다.

또한 Amazon Quick Sight 독자가 될 사용자를 처음 생성하는 경우 정책에 `quicksight:RegisterUser` 권한을 추가해야 합니다.

다음 샘플 정책은 Amazon Quick Sight 리더인 최초 사용자를 위해 임베딩 URL을 검색할 수 있는 권한을 제공합니다.

마지막으로, 방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

OpenID Connect 또는 SAML 인증의 신뢰 정책에 대한 자세한 내용은 IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 자격 증명 또는 OpenID Connect 연동을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 연동을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-dashboards-for-authenticated-users-step-2"></a>

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 대시보드 URL을 가져오는 방법을 알아볼 수 있습니다. IAM 또는 Amazon Quick Sight 자격 증명 유형에 대한 대시보드를 포함하려는 경우 대시보드를 사용자와 공유합니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

이 단계를 수행하면 대시보드의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

### Java
<a name="embedded-dashboards-for-authenticated-users-java"></a>

```
import com.amazonaws.auth.AWSCredentials;
    import com.amazonaws.auth.BasicAWSCredentials;
    import com.amazonaws.auth.AWSCredentialsProvider;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.quicksight.AmazonQuickSight;
    import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
    import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest;
    import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResult;
    import com.amazonaws.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration;
    import com.amazonaws.services.quicksight.model.RegisteredUserDashboardEmbeddingConfiguration;

    /**
    * Class to call QuickSight AWS SDK to get url for dashboard embedding.
    */
    public class GetQuicksightEmbedUrlRegisteredUserDashboardEmbedding {

        private final AmazonQuickSight quickSightClient;

        public GetQuicksightEmbedUrlRegisteredUserDashboardEmbedding() {
            this.quickSightClient = AmazonQuickSightClientBuilder
                    .standard()
                    .withRegion(Regions.US_EAST_1.getName())
                    .withCredentials(new AWSCredentialsProvider() {
                        @Override
                        public AWSCredentials getCredentials() {
                            // provide actual IAM access key and secret key here
                            return new BasicAWSCredentials("access-key", "secret-key");
                        }

                        @Override
                        public void refresh() {}
                        }
                    )
                    .build();
        }

        public String getQuicksightEmbedUrl(
                final String accountId, // AWS Account ID
                final String dashboardId, // Dashboard ID to embed
                final List<String> allowedDomains, // Runtime allowed domain for embedding
                final String userArn // Registered user arn to use for embedding. Refer to Get Embed Url section in developer portal to find out how to get user arn for a QuickSight user.
        ) throws Exception {
            final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = new RegisteredUserEmbeddingExperienceConfiguration()
                    .withDashboard(new RegisteredUserDashboardEmbeddingConfiguration().withInitialDashboardId(dashboardId));
            final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest = new GenerateEmbedUrlForRegisteredUserRequest();
            generateEmbedUrlForRegisteredUserRequest.setAwsAccountId(accountId);
            generateEmbedUrlForRegisteredUserRequest.setUserArn(userArn);
            generateEmbedUrlForRegisteredUserRequest.setAllowedDomains(allowedDomains);
            generateEmbedUrlForRegisteredUserRequest.setExperienceConfiguration(experienceConfiguration);

            final GenerateEmbedUrlForRegisteredUserResult generateEmbedUrlForRegisteredUserResult = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest);

            return generateEmbedUrlForRegisteredUserResult.getEmbedUrl();
        }
    }
```

### JavaScript
<a name="embedded-dashboards-for-authenticated-users-js"></a>

```
global.fetch = require('node-fetch');
    const AWS = require('aws-sdk');

    function generateEmbedUrlForRegisteredUser(
        accountId,
        dashboardId,
        openIdToken, // Cognito-based token
        userArn, // registered user arn
        roleArn, // IAM user role to use for embedding
        sessionName, // Session name for the roleArn assume role
        allowedDomains, // Runtime allowed domain for embedding
        getEmbedUrlCallback, // GetEmbedUrl success callback method
        errorCallback // GetEmbedUrl error callback method
        ) {
        const stsClient = new AWS.STS();
        let stsParams = {
            RoleSessionName: sessionName,
            WebIdentityToken: openIdToken,
            RoleArn: roleArn
        }

        stsClient.assumeRoleWithWebIdentity(stsParams, function(err, data) {
            if (err) {
                console.log('Error assuming role');
                console.log(err, err.stack);
                errorCallback(err);
            } else {
                const getDashboardParams = {
                    "AwsAccountId": accountId,
                    "ExperienceConfiguration": {
                        "Dashboard": {
                            "InitialDashboardId": dashboardId
                        }
                    },
                    "UserArn": userArn,
                    "AllowedDomains": allowedDomains,
                    "SessionLifetimeInMinutes": 600
                };

                const quicksightClient = new AWS.QuickSight({
                    region: process.env.AWS_REGION,
                    credentials: {
                        accessKeyId: data.Credentials.AccessKeyId,
                        secretAccessKey: data.Credentials.SecretAccessKey,
                        sessionToken: data.Credentials.SessionToken,
                        expiration: data.Credentials.Expiration
                    }
                });

                quicksightClient.generateEmbedUrlForRegisteredUser(getDashboardParams, function(err, data) {
                    if (err) {
                        console.log(err, err.stack);
                        errorCallback(err);
                    } else {
                        const result = {
                            "statusCode": 200,
                            "headers": {
                                "Access-Control-Allow-Origin": "*", // Use your website domain to secure access to GetEmbedUrl API
                                "Access-Control-Allow-Headers": "Content-Type"
                            },
                            "body": JSON.stringify(data),
                            "isBase64Encoded": false
                        }
                        getEmbedUrlCallback(result);
                    }
                });
            }
        });
    }
```

### Python3
<a name="embedded-dashboards-for-authenticated-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError

sts = boto3.client('sts')

# Function to generate embedded URL  
# accountId: AWS account ID
# dashboardId: Dashboard ID to embed
# userArn: arn of registered user
# allowedDomains: Runtime allowed domain for embedding
# roleArn: IAM user role to use for embedding
# sessionName: session name for the roleArn assume role
def getEmbeddingURL(accountId, dashboardId, userArn, allowedDomains, roleArn, sessionName):
    try:
        assumedRole = sts.assume_role(
            RoleArn = roleArn,
            RoleSessionName = sessionName,
        )
    except ClientError as e:
        return "Error assuming role: " + str(e)
    else: 
        assumedRoleSession = boto3.Session(
            aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
            aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
            aws_session_token = assumedRole['Credentials']['SessionToken'],
        )
        try:
            quicksightClient = assumedRoleSession.client('quicksight', region_name='us-west-2')
            response = quicksightClient.generate_embed_url_for_registered_user(
                AwsAccountId=accountId,
                ExperienceConfiguration = {
                    "Dashboard": {
                        "InitialDashboardId": dashboardId
                    }
                },
                UserArn = userArn,
                AllowedDomains = allowedDomains,
                SessionLifetimeInMinutes = 600
            )
            
            return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
                'body': json.dumps(response),
                'isBase64Encoded':  bool('false')
            }
        except ClientError as e:
            return "Error generating embedding url: " + str(e)
```

### Node.js
<a name="embedded-dashboards-for-authenticated-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
    const https = require('https');

    var quicksightClient = new AWS.Service({
        apiConfig: require('./quicksight-2018-04-01.min.json'),
        region: 'us-east-1',
    });

    quicksightClient.generateEmbedUrlForRegisteredUser({
        'AwsAccountId': '111122223333',
        'ExperienceConfiguration': { 
            'Dashboard': {
                'InitialDashboardId': '1c1fe111-e2d2-3b30-44ef-a0e111111cde'
            }
        },
        'UserArn': 'REGISTERED_USER_ARN',
        'AllowedDomains': allowedDomains,
        'SessionLifetimeInMinutes': 100
    }, function(err, data) {
        console.log('Errors: ');
        console.log(err);
        console.log('Response: ');
        console.log(data);
    });
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
    //readability and added ellipsis to indicate that it's incomplete.
        { 
            Status: 200,
            EmbedUrl: 'https://quicksightdomain/embed/12345/dashboards/67890...'
            RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' 
        }
```

### .NET/C\$1
<a name="embedded-dashboards-for-authenticated-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
using System;
    using Amazon.QuickSight;
    using Amazon.QuickSight.Model;

    namespace GenerateDashboardEmbedUrlForRegisteredUser
    {
        class Program
        {
            static void Main(string[] args)
            {
                var quicksightClient = new AmazonQuickSightClient(
                    AccessKey,
                    SecretAccessKey,
                    SessionToken,
                    Amazon.RegionEndpoint.USEast1);
                try
                {
                    RegisteredUserDashboardEmbeddingConfiguration registeredUserDashboardEmbeddingConfiguration
                        = new RegisteredUserDashboardEmbeddingConfiguration
                        {
                            InitialDashboardId = "dashboardId"
                        };
                    RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration
                        = new RegisteredUserEmbeddingExperienceConfiguration
                        {
                            Dashboard = registeredUserDashboardEmbeddingConfiguration
                        };
                        
                    Console.WriteLine(
                        quicksightClient.GenerateEmbedUrlForRegisteredUserAsync(new GenerateEmbedUrlForRegisteredUserRequest
                        {
                            AwsAccountId = "111122223333",
                            ExperienceConfiguration = registeredUserEmbeddingExperienceConfiguration,
                            UserArn = "REGISTERED_USER_ARN",
                            AllowedDomains = allowedDomains,
                            SessionLifetimeInMinutes = 100
                        }).Result.EmbedUrl
                    );
                } catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
```

### AWS CLI
<a name="embedded-dashboards-for-authenticated-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForRegisteredUser`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 대시보드를 처음 열 때 사용자를 추가하는 적시 접근 방식을 취하려면, 역할에 `quicksight:RegisterUser`에 대한 사용 권한도 활성화해야 합니다.

```
aws sts assume-role \
        --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
        --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_dashboard_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 대시보드에 처음 액세스할 때 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
        --aws-account-id 111122223333 \
        --namespace default \
        --identity-type IAM \
        --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
        --user-role READER \
        --user-name jhnd \
        --session-name "john.doe@example.com" \
        --email john.doe@example.com \
        --region us-east-1 \
        --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는, 설정을 위해 `RegisterUser`을(를) 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 ARN을 얻는 데 `DescribeUser`를 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때 대시보드가 공유되는 그룹에이 사용자를 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
    --aws-account-id=111122223333 \
    --namespace=default \
    --group-name=financeusers \
    --member-name="embedding_quicksight_dashboard_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 대시보드에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 대시보드에 대해 서명된 URL을 가져오려면 앱 서버에서 `generate-embed-url-for-registered-user`을 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 Single Sign-On(IAM Identity Center)을 통해 인증된 사용자에 대한 서버 측 호출을 사용하여 임베디드 대시보드의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-registered-user \
        --aws-account-id 111122223333 \
        --session-lifetime-in-minutes 600 \
        --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_visual_role/embeddingsession \
        --allowed-domains '["domain1","domain2"]' \
        --experience-configuration Dashboard={InitialDashboardId=1a1ac2b2-3fc3-4b44-5e5d-c6db6778df89}
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: 대시보드 URL 임베드
<a name="embedded-dashboards-for-authenticated-users-step-3"></a>

다음 섹션에서는 [Amazon Quick Sight Embedding SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 3단계에서 대시보드 URL을 포함하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ HTML 페이지에 대시보드 배치
+ 대시보드에 파라미터 전달
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GenerateEmbedUrlForRegisteredUser` API 작업을 직접 호출하여 앱에 포함할 수 있는 URL을 생성하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `generate-embed-url-for-registered-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    {
        "Status": "200",
        "EmbedUrl": "https://quicksightdomain/embed/12345/dashboards/67890..",
        "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
    }
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 대시보드를 임베](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)딩합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 대시보드 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

임베디드 대시보드를 호스팅할 도메인은 Quick 구독이 승인된 도메인 목록인 허용 목록에 있어야 합니다. 이 요건은 임베디드 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 대시보드의 도메인 추가에 대한 자세한 내용은 [Amazon Quick Sight API를 사용하여 런타임에 도메인 나열 허용을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-run-time.html) 참조하세요.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

### SDK 2.0
<a name="embedded-dashboards-for-authenticated-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Dashboard Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedDashboard = async() => {
                const {
                    createEmbeddingContext,
                } = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: '<YOUR_EMBED_URL>',
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    parameters: [
                        {
                            Name: 'country',
                            Values: [
                                'United States'
                            ],
                        },
                        {
                            Name: 'states',
                            Values: [
                                'California',
                                'Washington'
                            ]
                        }
                    ],
                    locale: "en-US",
                    sheetOptions: {
                        initialSheetId: '<YOUR_SHEETID>',
                        singleSheet: false,                        
                        emitSizeChangedEventOnSheetChange: false,
                    },
                    toolbarOptions: {
                        export: false,
                        undoRedo: false,
                        reset: false
                    },
                    attributionOptions: {
                        overlayContent: false,
                    },
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'CONTENT_LOADED': {
                                console.log("All visuals are loaded. The title of the document:", messageEvent.message.title);
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Error occurred while rendering the experience. Error code:", messageEvent.message.errorCode);
                                break;
                            }
                            case 'PARAMETERS_CHANGED': {
                                console.log("Parameters changed. Changed parameters:", messageEvent.message.changedParameters);
                                break;
                            }
                            case 'SELECTED_SHEET_CHANGED': {
                                console.log("Selected sheet changed. Selected sheet:", messageEvent.message.selectedSheet);
                                break;
                            }
                            case 'SIZE_CHANGED': {
                                console.log("Size changed. New dimensions:", messageEvent.message);
                                break;
                            }
                            case 'MODAL_OPENED': {
                                window.scrollTo({
                                    top: 0 // iframe top position
                                });
                                break;
                            }
                        }
                    },
                };
                const embeddedDashboardExperience = await embeddingContext.embedDashboard(frameOptions, contentOptions);

                const selectCountryElement = document.getElementById('country');
                selectCountryElement.addEventListener('change', (event) => {
                    embeddedDashboardExperience.setParameters([
                        {
                            Name: 'country',
                            Values: event.target.value
                        }
                    ]);
                });
            };
        </script>
    </head>

    <body onload="embedDashboard()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="experience-container"></div>
    </body>

</html>
```

### SDK 1.0
<a name="embedded-dashboards-for-authenticated-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Basic Embed</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@1.0.15/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            var dashboard
            function onDashboardLoad(payload) {
                console.log("Do something when the dashboard is fully loaded.");
            }

            function onError(payload) {
                console.log("Do something when the dashboard fails loading");
            }

            function embedDashboard() {
                var containerDiv = document.getElementById("embeddingContainer");
                var options = {
                    // replace this dummy url with the one generated via embedding API
                    url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode",
                    container: containerDiv,
                    parameters: {
                        country: "United States"
                    },
                    scrolling: "no",
                    height: "700px",
                    width: "1000px",
                    locale: "en-US",
                    footerPaddingEnabled: true
                };
                dashboard = QuickSightEmbedding.embedDashboard(options);
                dashboard.on("error", onError);
                dashboard.on("load", onDashboardLoad);
            }

            function onCountryChange(obj) {
                dashboard.setParameters({country: obj.value});
            }
        </script>
    </head>

    <body onload="embedDashboard()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country" onchange="onCountryChange(this)">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="embeddingContainer"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 대시보드를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# 익명(미등록) 사용자를 위한 Amazon Quick Sight 대시보드 임베딩
<a name="embedded-analytics-dashboards-for-everyone"></a>

**중요**  
Amazon Quick Sight에는 및 임베딩 분석을 위한 새로운 API 작업이 `GenerateEmbedUrlForAnonymousUser` 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` API 작업을 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. 이전 API 작업을 사용한 임베딩에 대한 자세한 내용은 [GetDashboardEmbedURL 및 GetSessionEmbedURL API 작업을 사용한 분석 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-deprecated.html) 참조하세요.


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 익명(미등록) 사용자를 위해 임베디드 Amazon Quick Sight 대시보드를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-analytics-dashboards-with-anonymous-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-analytics-dashboards-with-anonymous-users-step-2)
+ [3단계: 대시보드 URL 임베드](#embedded-analytics-dashboards-with-anonymous-users-step-3)

## 1단계: 권한 설정
<a name="embedded-analytics-dashboards-with-anonymous-users-step-1"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

대시보드에 액세스하는 각 사용자는 Amazon Quick Sight에 대시보드에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면에서 IAM 역할을 생성합니다 AWS 계정. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForAnonymousUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자는 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의할 수 있는 옵션을 제공합니다. 대신 생성된 URL에 액세스할 수 있는 도메인 또는 하위 도메인을 최대 세 개까지 나열할 수 있습니다. 그러면 만든 웹 사이트에 이 URL이 포함됩니다. 파라미터에 나열된 도메인만 임베디드 대시보드에 액세스할 수 있습니다. 이 조건이 없으면, 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForAnonymousUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

다음 샘플 정책은 `GenerateEmbedUrlForAnonymousUser`을(를) 사용할 수 있는 권한을 제공합니다. 이 접근 방식이 제대로 작동하려면 AWS 계정에 대해 필요에 맞는 세션 팩 또는 세션 용량 요금도 필요합니다. 그렇지 않으면 사용자가 대시보드에 액세스하려고 하면 `UnsupportedPricingPlanException` 오류가 반환됩니다.

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면, 애플리케이션이 사용자를 대신하여 역할을 맡아서 대시보드를 열 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
    {
        "Sid": "AllowLambdaFunctionsToAssumeThisRole",
        "Effect": "Allow",
        "Principal": {
            "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
    },
    {
        "Sid": "AllowEC2InstancesToAssumeThisRole",
        "Effect": "Allow",
        "Principal": {
            "Service": "ec2.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
    }
]
}
```

------

자세한 내용은 IAM 사용 설명서의 [IAM의 임시 보안 인증](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 단원을 참조하세요.

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-analytics-dashboards-with-anonymous-users-step-2"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 단원에서는 익명의 방문자를 대신해 인증하고 애플리케이션 서버에서 임베딩 가능한 대시보드 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 식별자를 고유한 역할 세션 ID로 전달합니다. 이 코드는 앱 서버에서 실행됩니다.

### Java
<a name="embedded-analytics-dashboards-with-anonymous-users-java"></a>

```
import java.util.List;
    import com.amazonaws.auth.AWSCredentials;
    import com.amazonaws.auth.AWSCredentialsProvider;
    import com.amazonaws.auth.BasicAWSCredentials;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.quicksight.AmazonQuickSight;
    import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
    import com.amazonaws.services.quicksight.model.RegisteredUserDashboardEmbeddingConfiguration;
    import com.amazonaws.services.quicksight.model.AnonymousUserEmbeddingExperienceConfiguration;
    import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserRequest;
    import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserResult;
    import com.amazonaws.services.quicksight.model.SessionTag;


    /**
    * Class to call QuickSight AWS SDK to generate embed url for anonymous user.
    */
    public class GenerateEmbedUrlForAnonymousUserExample {

        private final AmazonQuickSight quickSightClient;

        public GenerateEmbedUrlForAnonymousUserExample() {
            quickSightClient = AmazonQuickSightClientBuilder
                .standard()
                .withRegion(Regions.US_EAST_1.getName())
                .withCredentials(new AWSCredentialsProvider() {
                        @Override
                        public AWSCredentials getCredentials() {
                            // provide actual IAM access key and secret key here
                            return new BasicAWSCredentials("access-key", "secret-key");
                        }

                        @Override
                        public void refresh() {
                        }
                    }
                )
                .build();
        }

        public String GenerateEmbedUrlForAnonymousUser(
            final String accountId, // YOUR AWS ACCOUNT ID
            final String initialDashboardId, // DASHBOARD ID TO WHICH THE CONSTRUCTED URL POINTS.
            final String namespace, // ANONYMOUS EMBEDDING REQUIRES SPECIFYING A VALID NAMESPACE FOR WHICH YOU WANT THE EMBEDDING URL
            final List<String> authorizedResourceArns, // DASHBOARD ARN LIST TO EMBED
            final List<String> allowedDomains, // RUNTIME ALLOWED DOMAINS FOR EMBEDDING
            final List<SessionTag> sessionTags // SESSION TAGS USED FOR ROW-LEVEL SECURITY
        ) throws Exception {
            AnonymousUserEmbeddingExperienceConfiguration experienceConfiguration = new AnonymousUserEmbeddingExperienceConfiguration();
            AnonymousUserDashboardEmbeddingConfiguration dashboardConfiguration = new AnonymousUserDashboardEmbeddingConfiguration();
            dashboardConfiguration.setInitialDashboardId(initialDashboardId);
            experienceConfiguration.setDashboard(dashboardConfiguration);

            GenerateEmbedUrlForAnonymousUserRequest generateEmbedUrlForAnonymousUserRequest = new GenerateEmbedUrlForAnonymousUserRequest()
                .withAwsAccountId(accountId)
                .withNamespace(namespace)
                .withAuthorizedResourceArns(authorizedResourceArns)
                .withExperienceConfiguration(experienceConfiguration)
                .withSessionTags(sessionTags)
                .withSessionLifetimeInMinutes(600L); // OPTIONAL: VALUE CAN BE [15-600]. DEFAULT: 600
                .withAllowedDomains(allowedDomains);

            GenerateEmbedUrlForAnonymousUserResult dashboardEmbedUrl = quickSightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserRequest);

            return dashboardEmbedUrl.getEmbedUrl();
        }

    }
```

### JavaScript
<a name="embedded-analytics-dashboards-with-anonymous-users-js"></a>

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function generateEmbedUrlForAnonymousUser(
accountId, // YOUR AWS ACCOUNT ID
initialDashboardId, // DASHBOARD ID TO WHICH THE CONSTRUCTED URL POINTS
quicksightNamespace, // VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
authorizedResourceArns, // DASHBOARD ARN LIST TO EMBED
allowedDomains, // RUNTIME ALLOWED DOMAINS FOR EMBEDDING
sessionTags, // SESSION TAGS USED FOR ROW-LEVEL SECURITY
generateEmbedUrlForAnonymousUserCallback, // GENERATEEMBEDURLFORANONYMOUSUSER SUCCESS CALLBACK METHOD
errorCallback // GENERATEEMBEDURLFORANONYMOUSUSER ERROR CALLBACK METHOD
) {
const experienceConfiguration = {
    "DashboardVisual": {
        "InitialDashboardVisualId": {
            "DashboardId": "dashboard_id",
            "SheetId": "sheet_id",
            "VisualId": "visual_id"
        }
    }
};

const generateEmbedUrlForAnonymousUserParams = {
    "AwsAccountId": accountId,
    "Namespace": quicksightNamespace,
    "AuthorizedResourceArns": authorizedResourceArns,
    "AllowedDomains": allowedDomains,
    "ExperienceConfiguration": experienceConfiguration,
    "SessionTags": sessionTags,
    "SessionLifetimeInMinutes": 600
};

const quicksightClient = new AWS.QuickSight({
    region: process.env.AWS_REGION,
    credentials: {
        accessKeyId: AccessKeyId,
        secretAccessKey: SecretAccessKey,
        sessionToken: SessionToken,
        expiration: Expiration
    }
});

quicksightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserParams, function(err, data) {
    if (err) {
        console.log(err, err.stack);
        errorCallback(err);
    } else {
        const result = {
            "statusCode": 200,
            "headers": {
                "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO THIS API
                "Access-Control-Allow-Headers": "Content-Type"
            },
            "body": JSON.stringify(data),
            "isBase64Encoded": false
        }
        generateEmbedUrlForAnonymousUserCallback(result);
    }
});
}
```

### Python3
<a name="embedded-analytics-dashboards-with-anonymous-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError
import time

# Create QuickSight and STS clients
quicksightClient = boto3.client('quicksight',region_name='us-west-2')
sts = boto3.client('sts')

# Function to generate embedded URL for anonymous user
# accountId: YOUR AWS ACCOUNT ID
# quicksightNamespace: VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
# authorizedResourceArns: DASHBOARD ARN LIST TO EMBED
# allowedDomains: RUNTIME ALLOWED DOMAINS FOR EMBEDDING
# dashboardId: DASHBOARD ID TO WHICH THE CONSTRUCTED URL POINTS
# sessionTags: SESSION TAGS USED FOR ROW-LEVEL SECURITY
def generateEmbedUrlForAnonymousUser(accountId, quicksightNamespace, authorizedResourceArns, allowedDomains, dashboardId, sessionTags):
try:
    response = quicksightClient.generate_embed_url_for_anonymous_user(
        AwsAccountId = accountId,
        Namespace = quicksightNamespace,
        AuthorizedResourceArns = authorizedResourceArns,
        AllowedDomains = allowedDomains,
            ExperienceConfiguration = {
                "Dashboard": {
                    "InitialDashboardId": dashboardId
                }
            },
        SessionTags = sessionTags,
        SessionLifetimeInMinutes = 600
    )
        
    return {
        'statusCode': 200,
        'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
        'body': json.dumps(response),
        'isBase64Encoded':  bool('false')
    }
except ClientError as e:
    print(e)
    return "Error generating embeddedURL: " + str(e)
```

### Node.js
<a name="embedded-analytics-dashboards-with-anonymous-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
    const https = require('https');

    var quicksightClient = new AWS.Service({
        apiConfig: require('./quicksight-2018-04-01.min.json'),
        region: 'us-east-1',
    });

    quicksightClient.generateEmbedUrlForAnonymousUser({
        'AwsAccountId': '111122223333',
        'Namespace' : 'default',
        'AuthorizedResourceArns': authorizedResourceArns,
        'AllowedDomains': allowedDomains,
        'ExperienceConfiguration': experienceConfiguration,
        'SessionTags': sessionTags,
        'SessionLifetimeInMinutes': 600

    }, function(err, data) {
        console.log('Errors: ');
        console.log(err);
        console.log('Response: ');
        console.log(data);
    });
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
    //readability and added ellipsis to indicate that it's incomplete.
        { 
            Status: 200,
            EmbedUrl: 'https://quicksightdomain/embed/12345/dashboards/67890..',
            RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' 
        }
```

### .NET/C\$1
<a name="embedded-analytics-dashboards-with-anonymous-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
using System;
    using Amazon.QuickSight;
    using Amazon.QuickSight.Model;

    var quicksightClient = new AmazonQuickSightClient(
        AccessKey,
        SecretAccessKey,
        sessionToken,
        Amazon.RegionEndpoint.USEast1);
        
    try
    {
        Console.WriteLine(
            quicksightClient.GenerateEmbedUrlForAnonymousUserAsync(new GenerateEmbedUrlForAnonymousUserRequest
            {
                AwsAccountId = "111122223333",
                Namespace = default,
                AuthorizedResourceArns = authorizedResourceArns,
                AllowedDomains = allowedDomains,
                ExperienceConfiguration = experienceConfiguration,
                SessionTags = sessionTags,
                SessionLifetimeInMinutes = 600,
            }).Result.EmbedUrl
        );
    } catch (Exception ex) {
        Console.WriteLine(ex.Message);
    }
```

### AWS CLI
<a name="embedded-analytics-dashboards-with-anonymous-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - Security Assertion Markup(SAML)을 사용하여 사용자를 인증하는 경우 이 작업을 사용하십시오.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForAnonymousUser`에 대한 권한이 활성화되어 있어야 합니다.

```
aws sts assume-role \
    --role-arn "arn:aws:iam::11112222333:role/QuickSightEmbeddingAnonymousPolicy" \
    --role-session-name anonymous caller
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_dashboard_role/QuickSightEmbeddingAnonymousPolicy`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 방문 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 각 세션을 분리하고 구분할 수 있습니다. 로드 밸런싱 등을 위해 여러 웹 서버를 사용하는 경우, 세션이 다른 서버에 다시 연결되면 새 세션이 시작됩니다.

대시보드에 대해 서명된 URL을 가져오려면, 앱 서버에서 `generate-embed-url-for-anynymous-user`을(를) 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제는 웹 포털 또는 앱을 익명으로 방문하는 사용자에 대해 서버 측 직접 호출을 사용하여 임베디드 대시보드의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 111122223333 \
--namespace default-or-something-else \
--session-lifetime-in-minutes 15 \
--authorized-resource-arns '["dashboard-arn-1","dashboard-arn-2"]' \
--allowed-domains '["domain1","domain2"]' \
--session-tags '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]' \
--experience-configuration 'DashboardVisual={InitialDashboardVisualId={DashboardId=dashboard_id,SheetId=sheet_id,VisualId=visual_id}}'
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: 대시보드 URL 임베드
<a name="embedded-analytics-dashboards-with-anonymous-users-step-3"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 [Amazon Quick Sight Embedding SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 2단계에서 대시보드 URL을 포함하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ HTML 페이지에 대시보드 배치
+ 대시보드에 파라미터 전달
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GenerateEmbedUrlForAnynymousUser` API 작업을 직접 호출하여 앱에 포함할 수 있는 URL을 생성하세요. 이 URL은 5분 동안 유효하며 결과 세션은 10시간 동안 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `generate-embed-url-for-anynymous-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
        {
            "Status": "200",
            "EmbedUrl": "https://quicksightdomain/embed/12345/dashboards/67890..",
            "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
        }
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 대시보드를 임베](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)딩합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 대시보드 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

임베디드 대시보드를 호스팅할 도메인은 Quick 구독이 승인된 도메인 목록인 허용 목록에 있어야 합니다. 이 요건은 임베디드 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 대시보드의 도메인 추가에 대한 자세한 내용은 [Amazon Quick Sight API를 사용하여 런타임에 도메인 나열 허용을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-run-time.html) 참조하세요.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 실행됩니다.

### SDK 2.0
<a name="embedded-analytics-dashboards-with-anonymous-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

<head>
    <title>Dashboard Embedding Example</title>
    <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
    <script type="text/javascript">
        const embedDashboard = async() => {
            const {
                createEmbeddingContext,
            } = QuickSightEmbedding;

            const embeddingContext = await createEmbeddingContext({
                onChange: (changeEvent, metadata) => {
                    console.log('Context received a change', changeEvent, metadata);
                },
            });

            const frameOptions = {
                url: '<YOUR_EMBED_URL>',
                container: '#experience-container',
                height: "700px",
                width: "1000px",
                onChange: (changeEvent, metadata) => {
                    switch (changeEvent.eventName) {
                        case 'FRAME_MOUNTED': {
                            console.log("Do something when the experience frame is mounted.");
                            break;
                        }
                        case 'FRAME_LOADED': {
                            console.log("Do something when the experience frame is loaded.");
                            break;
                        }
                    }
                },
            };

            const contentOptions = {
                parameters: [
                    {
                        Name: 'country',
                        Values: [
                            'United States'
                        ],
                    },
                    {
                        Name: 'states',
                        Values: [
                            'California',
                            'Washington'
                        ]
                    }
                ],
                locale: "en-US",
                sheetOptions: {
                    initialSheetId: '<YOUR_SHEETID>',
                    singleSheet: false,                        
                    emitSizeChangedEventOnSheetChange: false,
                },
                toolbarOptions: {
                    export: false,
                    undoRedo: false,
                    reset: false
                },
                attributionOptions: {
                    overlayContent: false,
                },
                onMessage: async (messageEvent, experienceMetadata) => {
                    switch (messageEvent.eventName) {
                        case 'CONTENT_LOADED': {
                            console.log("All visuals are loaded. The title of the document:", messageEvent.message.title);
                            break;
                        }
                        case 'ERROR_OCCURRED': {
                            console.log("Error occurred while rendering the experience. Error code:", messageEvent.message.errorCode);
                            break;
                        }
                        case 'PARAMETERS_CHANGED': {
                            console.log("Parameters changed. Changed parameters:", messageEvent.message.changedParameters);
                            break;
                        }
                        case 'SELECTED_SHEET_CHANGED': {
                            console.log("Selected sheet changed. Selected sheet:", messageEvent.message.selectedSheet);
                            break;
                        }
                        case 'SIZE_CHANGED': {
                            console.log("Size changed. New dimensions:", messageEvent.message);
                            break;
                        }
                        case 'MODAL_OPENED': {
                            window.scrollTo({
                                top: 0 // iframe top position
                            });
                            break;
                        }
                    }
                },
            };
            const embeddedDashboardExperience = await embeddingContext.embedDashboard(frameOptions, contentOptions);

            const selectCountryElement = document.getElementById('country');
            selectCountryElement.addEventListener('change', (event) => {
                embeddedDashboardExperience.setParameters([
                    {
                        Name: 'country',
                        Values: event.target.value
                    }
                ]);
            });
        };
    </script>
</head>

<body onload="embedDashboard()">
    <span>
        <label for="country">Country</label>
        <select id="country" name="country">
            <option value="United States">United States</option>
            <option value="Mexico">Mexico</option>
            <option value="Canada">Canada</option>
        </select>
    </span>
    <div id="experience-container"></div>
</body>

</html>
```

### SDK 1.0
<a name="embedded-analytics-dashboards-with-anonymous-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

<head>
    <title>Basic Embed</title>
    <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@1.0.15/dist/quicksight-embedding-js-sdk.min.js"></script>
    <script type="text/javascript">
        var dashboard
        function onDashboardLoad(payload) {
            console.log("Do something when the dashboard is fully loaded.");
        }

        function onError(payload) {
            console.log("Do something when the dashboard fails loading");
        }

        function embedDashboard() {
            var containerDiv = document.getElementById("embeddingContainer");
            var options = {
                // replace this dummy url with the one generated via embedding API
                url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode",
                container: containerDiv,
                parameters: {
                    country: "United States"
                },
                scrolling: "no",
                height: "700px",
                width: "1000px",
                locale: "en-US",
                footerPaddingEnabled: true
            };
            dashboard = QuickSightEmbedding.embedDashboard(options);
            dashboard.on("error", onError);
            dashboard.on("load", onDashboardLoad);
        }

        function onCountryChange(obj) {
            dashboard.setParameters({country: obj.value});
        }
    </script>
</head>

<body onload="embedDashboard()">
    <span>
        <label for="country">Country</label>
        <select id="country" name="country" onchange="onCountryChange(this)">
            <option value="United States">United States</option>
            <option value="Mexico">Mexico</option>
            <option value="Canada">Canada</option>
        </select>
    </span>
    <div id="embeddingContainer"></div>
</body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 대시보드를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk) 최신 Amazon Quick Sight 임베딩 SDK 버전을 다운로드합니다.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# 임베디드 대시보드에서 실행 요약 활성화
<a name="embedded-analytics-genbi-executive-summaries-dashboard"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

임베디드 대시보드에서 실행 요약을 활성화할 수 있습니다. 활성화되면 등록된 사용자는 Amazon Quick Sight가 대시보드에 대해 생성한 모든 인사이트의 요약을 제공하는 실행 요약을 생성할 수 있습니다. 실행 요약을 통해 리더는 대시보드에 대한 주요 인사이트와 정보를 한눈에 쉽게 확인할 수 있습니다. 사용자가 대시보드의 실행 요약을 생성하는 방법에 대한 자세한 내용은 [Amazon Quick Sight 대시보드의 실행 요약 생성을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/use-executive-summaries.html).

**참고**  
실행 요약은 등록된 사용자의 경우 임베디드 대시보드에서만 사용할 수 있으며 익명 또는 미등록 사용자의 경우 임베디드 대시보드에서 활성화할 수 없습니다.

**등록된 사용자의 경우 임베디드 대시보드에서 실행 요약을 활성화하는 방법**
+ [등록된 사용자의 Amazon Quick Sight 대시보드 임베딩](https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-dashboards-for-authenticated-users.html) 단계에 따라 다음과 같은 변경 사항이 있는 대시보드를 임베딩합니다.

  1. 2단계에서 URL을 생성하는 경우 다음 예제와 같이 [GenerateEmbedUrlForRegisteredUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 또는 [GenerateEmbedUrlForRegisteredUserWithIdentity](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUserWithIdentity.html)의 `ExecutiveSummary` 파라미터에서 `Enabled: true`를 설정하세요.

     ```
     ExperienceConfiguration: {
             Dashboard: {
                 InitialDashboardId: dashboard_id,
                 FeatureConfigurations: {
                     AmazonQInQuickSight: {
                         ExecutiveSummary: {
                             Enabled: true
                         }
                     }
                 }
             }
         }
     }
     ```

  1. 3단계에서 Amazon Quick Sight 임베딩 SDK를 사용하여 대시보드 URL을 임베딩할 때 다음 예제`contentOptions`와 같이 `executiveSummary: true`에서를 설정합니다.

     ```
     const contentOptions = {
         toolbarOptions: {
             executiveSummary: true
         }
     };
     ```

# Amazon Quick Sight APIs를 사용하여 Amazon Quick Sight 시각적 객체 임베딩
<a name="embedding-visuals"></a>

Amazon Quick Sight API를 사용하여 게시된 대시보드의 일부인 개별 시각적 객체를 애플리케이션에 포함할 수 있습니다.

**Topics**
+ [등록된 사용자를 위한 Amazon Quick Sight 시각적 객체 임베딩](embedded-analytics-visuals-for-authenticated-users.md)
+ [익명(미등록) 사용자를 위한 Amazon Quick Sight 시각적 객체 임베딩](embedded-analytics-visuals-for-everyone.md)

# 등록된 사용자를 위한 Amazon Quick Sight 시각적 객체 임베딩
<a name="embedded-analytics-visuals-for-authenticated-users"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 Amazon Quick Sight의 등록된 사용자를 위해 임베디드 Amazon Quick Sight 시각적 객체를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-visuals-for-authenticated-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-visuals-for-authenticated-users-step-2)
+ [3단계: 시각적 객체 URL 임베드](#embedded-visuals-for-authenticated-users-step-3)

## 1단계: 권한 설정
<a name="embedded-visuals-for-authenticated-users-step-1"></a>

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

시각적 객체에 액세스하는 각 사용자는 Amazon Quick Sight에 시각적 객체에 대한 액세스 및 권한을 부여하는 역할을 맡습니다. 이렇게 하려면에서 IAM 역할을 생성합니다 AWS 계정. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 특정 사용자 풀의 임베딩 URL을 검색할 수 있는 권한을 제공해야 합니다. 와일드카드 문자 \$1를 사용하여, 특정 네임스페이스의 모든 사용자 또는 특정 네임스페이스의 일부 사용자에 대해 URL을 생성할 권한을 부여할 수 있습니다. 이를 위해 `quicksight:GenerateEmbedUrlForRegisteredUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForAnonymousUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자는 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의할 수 있는 옵션을 제공합니다. 대신 생성된 URL에 액세스할 수 있는 도메인 또는 하위 도메인을 최대 세 개까지 나열할 수 있습니다. 그러면 만든 웹 사이트에 이 URL이 포함됩니다. 파라미터에 나열된 도메인만 임베디드 대시보드에 액세스할 수 있습니다. 이 조건이 없으면, 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForRegisteredUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

다음 샘플 정책은 이러한 권한을 제공합니다.

또한 Amazon Quick Sight 독자가 될 사용자를 처음 생성하는 경우 정책에 `quicksight:RegisterUser` 권한을 추가해야 합니다.

다음 샘플 정책은 Amazon Quick Sight 리더인 최초 사용자를 위해 임베딩 URL을 검색할 수 있는 권한을 제공합니다.

마지막으로, 방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

OpenID Connect 또는 SAML 인증의 신뢰 정책에 대한 자세한 내용은 IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 자격 증명 또는 OpenID Connect 연동을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 연동을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-visuals-for-authenticated-users-step-2"></a>

다음 섹션에서는 Amazon Quick Sight 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 시각적 URL을 가져오는 방법을 알아볼 수 있습니다. IAM 또는 Amazon Quick Sight 자격 증명 유형에 대한 시각적 객체를 포함하려는 경우 시각적 객체를 Amazon Quick Sight 사용자와 공유합니다.

Amazon Quick Sight 사용자가 앱에 액세스하면 앱은 Amazon Quick Sight 사용자를 대신하여 IAM 역할을 수임합니다. 그런 다음 Amazon Quick Sight 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

설명된 단계를 수행하면 시각적 객체의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다.

다음 예제에서는 Amazon Quick Sight 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

### Java
<a name="embedded-visuals-for-authenticated-users-java"></a>

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.DashboardVisualId;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResult;
import com.amazonaws.services.quicksight.model.RegisteredUserDashboardVisualEmbeddingConfiguration;
import com.amazonaws.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration;

import java.util.List;

/**
 * Class to call QuickSight AWS SDK to get url for Visual embedding.
 */
public class GenerateEmbedUrlForRegisteredUserTest {

    private final AmazonQuickSight quickSightClient;

    public GenerateEmbedUrlForRegisteredUserTest() {
        this.quickSightClient = AmazonQuickSightClientBuilder
            .standard()
            .withRegion(Regions.US_EAST_1.getName())
            .withCredentials(new AWSCredentialsProvider() {
                    @Override
                    public AWSCredentials getCredentials() {
                        // provide actual IAM access key and secret key here
                        return new BasicAWSCredentials("access-key", "secret-key");
                    }

                    @Override
                    public void refresh() {                        
                    }
                }
            )
            .build();
    }

    public String getEmbedUrl(
            final String accountId, // AWS Account ID
            final String dashboardId, // Dashboard ID of the dashboard to embed
            final String sheetId, // Sheet ID of the sheet to embed
            final String visualId, // Visual ID of the visual to embed
            final List<String> allowedDomains, // Runtime allowed domains for embedding
            final String userArn // Registered user arn of the user that you want to provide embedded visual. Refer to Get Embed Url section in developer portal to find out how to get user arn for a QuickSight user.
    ) throws Exception {
        final DashboardVisualId dashboardVisual = new DashboardVisualId()
            .withDashboardId(dashboardId)
            .withSheetId(sheetId)
            .withVisualId(visualId);
        final RegisteredUserDashboardVisualEmbeddingConfiguration registeredUserDashboardVisualEmbeddingConfiguration
            = new RegisteredUserDashboardVisualEmbeddingConfiguration()
                .withInitialDashboardVisualId(dashboardVisual);
        final RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration
            = new RegisteredUserEmbeddingExperienceConfiguration()
                .withDashboardVisual(registeredUserDashboardVisualEmbeddingConfiguration);
        final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest
            = new GenerateEmbedUrlForRegisteredUserRequest()
                .withAwsAccountId(accountId)
                .withUserArn(userArn)
                .withExperienceConfiguration(registeredUserEmbeddingExperienceConfiguration)
                .withAllowedDomains(allowedDomains);

        final GenerateEmbedUrlForRegisteredUserResult generateEmbedUrlForRegisteredUserResult = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest);

        return generateEmbedUrlForRegisteredUserResult.getEmbedUrl();
    }
}
```

### JavaScript
<a name="embedded-visuals-for-authenticated-users-js"></a>

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function generateEmbedUrlForRegisteredUser(
    accountId, // Your AWS account ID
    dashboardId, // Dashboard ID to which the constructed URL points
    sheetId, // Sheet ID to which the constructed URL points
    visualId, // Visual ID to which the constructed URL points
    openIdToken, // Cognito-based token
    userArn, // registered user arn
    roleArn, // IAM user role to use for embedding
    sessionName, // Session name for the roleArn assume role
    allowedDomains, // Runtime allowed domain for embedding
    getEmbedUrlCallback, // GetEmbedUrl success callback method
    errorCallback // GetEmbedUrl error callback method
    ) {
    const stsClient = new AWS.STS();
    let stsParams = {
        RoleSessionName: sessionName,
        WebIdentityToken: openIdToken,
        RoleArn: roleArn
    }

    stsClient.assumeRoleWithWebIdentity(stsParams, function(err, data) {
        if (err) {
            console.log('Error assuming role');
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const getDashboardParams = {
                "AwsAccountId": accountId,
                "ExperienceConfiguration": {
                    "DashboardVisual": {
                        "InitialDashboardVisualId": {
                            "DashboardId": dashboardId,
                            "SheetId": sheetId,
                            "VisualId": visualId
                        }
                    }
                },
                "UserArn": userArn,
                "AllowedDomains": allowedDomains,
                "SessionLifetimeInMinutes": 600
            };

            const quicksightGetDashboard = new AWS.QuickSight({
                region: process.env.AWS_REGION,
                credentials: {
                    accessKeyId: data.Credentials.AccessKeyId,
                    secretAccessKey: data.Credentials.SecretAccessKey,
                    sessionToken: data.Credentials.SessionToken,
                    expiration: data.Credentials.Expiration
                }
            });

            quicksightGetDashboard.generateEmbedUrlForRegisteredUser(getDashboardParams, function(err, data) {
                if (err) {
                    console.log(err, err.stack);
                    errorCallback(err);
                } else {
                    const result = {
                        "statusCode": 200,
                        "headers": {
                            "Access-Control-Allow-Origin": "*", // Use your website domain to secure access to GetEmbedUrl API
                            "Access-Control-Allow-Headers": "Content-Type"
                        },
                        "body": JSON.stringify(data),
                        "isBase64Encoded": false
                    }
                    getEmbedUrlCallback(result);
                }
            });
        }
    });
}
```

### Python3
<a name="embedded-visuals-for-authenticated-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError

sts = boto3.client('sts')

# Function to generate embedded URL  
# accountId: AWS account ID
# dashboardId: Dashboard ID to embed
# sheetId: SHEET ID to embed from the dashboard 
# visualId: Id for the Visual you want to embedded from the dashboard sheet. 
# userArn: arn of registered user
# allowedDomains: Runtime allowed domain for embedding
# roleArn: IAM user role to use for embedding
# sessionName: session name for the roleArn assume role
def getEmbeddingURL(accountId, dashboardId, sheetId, visualId, userArn, allowedDomains, roleArn, sessionName):
    try:
        assumedRole = sts.assume_role(
            RoleArn = roleArn,
            RoleSessionName = sessionName,
        )
    except ClientError as e:
        return "Error assuming role: " + str(e)
    else: 
        assumedRoleSession = boto3.Session(
            aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
            aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
            aws_session_token = assumedRole['Credentials']['SessionToken'],
        )
        try:
            quicksightClient = assumedRoleSession.client('quicksight', region_name='us-west-2')
            response = quicksightClient.generate_embed_url_for_registered_user(
                AwsAccountId=accountId,
                ExperienceConfiguration = {
                    'DashboardVisual': {
                        'InitialDashboardVisualId': {
                            'DashboardId': dashboardId,
                            'SheetId': sheetId,
                            'VisualId': visualId
                        }
                    },
                },
                UserArn = userArn,
                AllowedDomains = allowedDomains,
                SessionLifetimeInMinutes = 600
            )
            
            return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
                'body': json.dumps(response),
                'isBase64Encoded':  bool('false')
            }
        except ClientError as e:
            return "Error generating embedding url: " + str(e)
```

### Node.js
<a name="embedded-visuals-for-authenticated-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    apiConfig: require('./quicksight-2018-04-01.min.json'),
    region: 'us-east-1',
});

quicksightClient.generateEmbedUrlForRegisteredUser({
    'AwsAccountId': '111122223333',
    'ExperienceConfiguration': { 
        'DashboardVisual': {
            'InitialDashboardVisualId': {
                'DashboardId': 'dashboard_id',
                'SheetId': 'sheet_id',
                'VisualId': 'visual_id'
            }
        }
    },
    'UserArn': 'REGISTERED_USER_ARN',
    'AllowedDomains': allowedDomains,
    'SessionLifetimeInMinutes': 100
}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    {
        "Status": "200",
        "EmbedUrl": "https://quicksightdomain/embed/12345/dashboards/67890/sheets/12345/visuals/67890...",
        "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
    }
```

### .NET/C\$1
<a name="embedded-visuals-for-authenticated-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateDashboardEmbedUrlForRegisteredUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                DashboardVisualId dashboardVisual = new DashboardVisualId
                {
                    DashboardId = "dashboard_id",
                    SheetId = "sheet_id",
                    VisualId = "visual_id"
                };

                RegisteredUserDashboardVisualEmbeddingConfiguration registeredUserDashboardVisualEmbeddingConfiguration
                    = new RegisteredUserDashboardVisualEmbeddingConfiguration
                    {
                        InitialDashboardVisualId = dashboardVisual                        
                    };               
                    
                RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration
                    = new RegisteredUserEmbeddingExperienceConfiguration
                    {
                        DashboardVisual = registeredUserDashboardVisualEmbeddingConfiguration
                    };
                    
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForRegisteredUserAsync(new GenerateEmbedUrlForRegisteredUserRequest
                    {
                        AwsAccountId = "111122223333",
                        ExperienceConfiguration = registeredUserEmbeddingExperienceConfiguration,
                        UserArn = "REGISTERED_USER_ARN",
                        AllowedDomains = allowedDomains,
                        SessionLifetimeInMinutes = 100
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

### AWS CLI
<a name="embedded-visuals-for-authenticated-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForRegisteredUser`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 대시보드를 처음 열 때 사용자를 추가하는 적시 접근 방식을 취하려면, 역할에 `quicksight:RegisterUser`에 대한 사용 권한도 활성화해야 합니다.

```
aws sts assume-role \
    --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_visual_role" \
    --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_visual_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 대시보드에 처음 액세스할 때 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
    --aws-account-id 111122223333 \
    --namespace default \
    --identity-type IAM \
    --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_visual_role" \
    --user-role READER \
    --user-name jhnd \
    --session-name "john.doe@example.com" \
    --email john.doe@example.com \
    --region us-east-1 \
    --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는 설정을 위해 `RegisterUser`를 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 ARN을 얻는 데 `DescribeUser`를 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때 시각적 객체가 공유되는 그룹에이 사용자를 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
    --aws-account-id=111122223333 \
    --namespace=default \
    --group-name=financeusers \
    --member-name="embedding_quicksight_visual_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 시각적 객체에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 시각적 객체에 대해 서명된 URL을 가져오려면, 앱 서버에서 `generate-embed-url-for-registered-user`을(를) 직접 호출합니다. 그러면 임베드 가능한 시각적 객체 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 Single Sign-On(IAM Identity Center)을 통해 인증된 사용자에 대한 서버 측 직접 호출을 사용하여 임베디드 시각적 객체의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-registered-user \
    --aws-account-id 111122223333 \
    --session-lifetime-in-minutes 600 \
    --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_visual_role/embeddingsession \
    --allowed-domains '["domain1","domain2"]' \
    --experience-configuration 'DashboardVisual={InitialDashboardVisualId={DashboardId=dashboard_id,SheetId=sheet_id,VisualId=visual_id}}'
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: 시각적 객체 URL 임베드
<a name="embedded-visuals-for-authenticated-users-step-3"></a>

다음 섹션에서는 [Amazon Quick Sight Embedding SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 3단계에서 시각적 URL을 포함하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ 시각적 객체를 HTML 페이지에 배치하세요.
+ 시각적 객체에 파라미터를 전달합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GenerateEmbedUrlForRegisteredUser` API 작업을 직접 호출하여 앱에 포함할 수 있는 URL을 생성하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `generate-embed-url-for-registered-user`의 응답 예입니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    {
        "Status": "200",
        "EmbedUrl": "https://quicksightdomain/embed/12345/dashboards/67890/sheets/12345/visuals/67890...",
        "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
    }
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 시각적 객체를 임베](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)딩합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 시각적 객체 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

임베디드 시각적 객체 및 대시보드를 호스팅할 도메인은 Quick 구독에 대해 승인된 도메인 *목록인 허용* 목록에 있어야 합니다. 이 요건은 임베디드 시각적 객체와 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 시각적 객체 및 대시보드의 도메인 추가에 대한 자세한 내용은 [Amazon Quick Sight API를 사용하여 런타임에 도메인 나열 허용을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-run-time.html) 참조하세요.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

### SDK 2.0
<a name="embedded-visuals-for-authenticated-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Visual Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedVisual = async() => {    
                const {
                    createEmbeddingContext,
                } = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    parameters: [
                        {
                            Name: 'country',
                            Values: ['United States'],
                        },
                        {
                            Name: 'states',
                            Values: [
                                'California',
                                'Washington'
                            ]
                        }
                    ],
                    locale: "en-US",
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'CONTENT_LOADED': {
                                console.log("All visuals are loaded. The title of the document:", messageEvent.message.title);
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Error occurred while rendering the experience. Error code:", messageEvent.message.errorCode);
                                break;
                            }
                            case 'PARAMETERS_CHANGED': {
                                console.log("Parameters changed. Changed parameters:", messageEvent.message.changedParameters);
                                break;
                            }
                            case 'SIZE_CHANGED': {
                                console.log("Size changed. New dimensions:", messageEvent.message);
                                break;
                            }
                        }
                    },
                };
                const embeddedVisualExperience = await embeddingContext.embedVisual(frameOptions, contentOptions);

                const selectCountryElement = document.getElementById('country');
                selectCountryElement.addEventListener('change', (event) => {
                    embeddedVisualExperience.setParameters([
                        {
                            Name: 'country',
                            Values: event.target.value
                        }
                    ]);
                });
            };
        </script>
    </head>

    <body onload="embedVisual()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="experience-container"></div>
    </body>

</html>
```

### SDK 1.0
<a name="embedded-visuals-for-authenticated-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Visual Embedding Example</title>
        <!-- You can download the latest QuickSight embedding SDK version from https://www.npmjs.com/package/amazon-quicksight-embedding-sdk -->
        <!-- Or you can do "npm install amazon-quicksight-embedding-sdk", if you use npm for javascript dependencies -->
        <script src="./quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            let embeddedVisualExperience;
            function onVisualLoad(payload) {
                console.log("Do something when the visual is fully loaded.");
            }

            function onError(payload) {
                console.log("Do something when the visual fails loading");
            }

            function embedVisual() {
                const containerDiv = document.getElementById("embeddingContainer");
                const options = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: containerDiv,
                    parameters: {
                        country: "United States"
                    },
                    height: "700px",
                    width: "1000px",
                    locale: "en-US"
                };
                embeddedVisualExperience = QuickSightEmbedding.embedVisual(options);
                embeddedVisualExperience.on("error", onError);
                embeddedVisualExperience.on("load", onVisualLoad);
            }

            function onCountryChange(obj) {
                embeddedVisualExperience.setParameters({country: obj.value});
            }
        </script>
    </head>

    <body onload="embedVisual()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country" onchange="onCountryChange(this)">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="embeddingContainer"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 시각적 객체를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# 익명(미등록) 사용자를 위한 Amazon Quick Sight 시각적 객체 임베딩
<a name="embedded-analytics-visuals-for-everyone"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 익명(미등록) 사용자를 위해 임베디드 Amazon Quick Sight 시각적 객체를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-analytics-visuals-with-anonymous-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-analytics-visuals-with-anonymous-users-step-2)
+ [3단계: 시각적 객체 URL 임베드](#embedded-analytics-visuals-with-anonymous-users-step-3)

## 1단계: 권한 설정
<a name="embedded-analytics-visuals-with-anonymous-users-step-1"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

시각적 객체에 액세스하는 각 사용자는 Amazon Quick Sight에 시각적 객체에 대한 액세스 및 권한을 부여하는 역할을 맡습니다. 이렇게 하려면에서 IAM 역할을 생성합니다 AWS 계정. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForAnonymousUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자는 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의할 수 있는 옵션을 제공합니다. 대신 생성된 URL에 액세스할 수 있는 도메인 또는 하위 도메인을 최대 세 개까지 나열할 수 있습니다. 그러면 만든 웹 사이트에 이 URL이 포함됩니다. 파라미터에 나열된 도메인만 임베디드 대시보드에 액세스할 수 있습니다. 이 조건이 없으면, 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForAnonymousUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면, 애플리케이션이 사용자를 대신하여 역할을 맡아서 시각적 객체를 열 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

자세한 내용은 IAM 사용 설명서의 [IAM의 임시 보안 인증](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 단원을 참조하세요.

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-analytics-visuals-with-anonymous-users-step-2"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 시각적 객체 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 식별자를 고유한 역할 세션 ID로 전달합니다. 이 코드는 앱 서버에서 실행됩니다.

### Java
<a name="embedded-analytics-visuals-with-anonymous-users-java"></a>

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.AnonymousUserDashboardVisualEmbeddingConfiguration;
import com.amazonaws.services.quicksight.model.AnonymousUserEmbeddingExperienceConfiguration;
import com.amazonaws.services.quicksight.model.DashboardVisualId;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserRequest;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserResult;
import com.amazonaws.services.quicksight.model.SessionTag;

import java.util.List;

/**
 * Class to call QuickSight AWS SDK to get url for Visual embedding.
 */
public class GenerateEmbedUrlForAnonymousUserTest {
    private final AmazonQuickSight quickSightClient;

    public GenerateEmbedUrlForAnonymousUserTest() {
        this.quickSightClient = AmazonQuickSightClientBuilder
            .standard()
            .withRegion(Regions.US_EAST_1.getName())
            .withCredentials(new AWSCredentialsProvider() {
                    @Override
                    public AWSCredentials getCredentials() {
                        // provide actual IAM access key and secret key here
                        return new BasicAWSCredentials("access-key", "secret-key");
                    }

                    @Override
                    public void refresh() {                           
                    }
                }
            )
            .build();
    }

    public String getEmbedUrl(
            final String accountId, // AWS Account ID
            final String namespace, // Anonymous embedding required specifying a valid namespace for which you want the enbedding URL
            final List<String> authorizedResourceArns, // Dashboard arn list of dashboard visuals to embed
            final String dashboardId, // Dashboard ID of the dashboard to embed
            final String sheetId, // Sheet ID of the sheet to embed
            final String visualId, // Visual ID of the visual to embed
            final List<String> allowedDomains, // Runtime allowed domains for embedding
            final List<SessionTag> sessionTags // Session tags used for row-level security
    ) throws Exception {
        final DashboardVisualId dashboardVisual = new DashboardVisualId()
            .withDashboardId(dashboardId)
            .withSheetId(sheetId)
            .withVisualId(visualId);
        final AnonymousUserDashboardVisualEmbeddingConfiguration anonymousUserDashboardVisualEmbeddingConfiguration
            = new AnonymousUserDashboardVisualEmbeddingConfiguration()
                .withInitialDashboardVisualId(dashboardVisual);
        final AnonymousUserEmbeddingExperienceConfiguration anonymousUserEmbeddingExperienceConfiguration
            = new AnonymousUserEmbeddingExperienceConfiguration()
                .withDashboardVisual(anonymousUserDashboardVisualEmbeddingConfiguration);
        final GenerateEmbedUrlForAnonymousUserRequest generateEmbedUrlForAnonymousUserRequest
            = new GenerateEmbedUrlForAnonymousUserRequest()
                .withAwsAccountId(accountId)
                .withNamespace(namespace)
                // authorizedResourceArns should contain ARN of dashboard used below in ExperienceConfiguration
                .withAuthorizedResourceArns(authorizedResourceArns)
                .withExperienceConfiguration(anonymousUserEmbeddingExperienceConfiguration)
                .withAllowedDomains(allowedDomains)
                .withSessionTags(sessionTags)
                .withSessionLifetimeInMinutes(600L);

        final GenerateEmbedUrlForAnonymousUserResult generateEmbedUrlForAnonymousUserResult
            = quickSightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserRequest);

        return generateEmbedUrlForAnonymousUserResult.getEmbedUrl();
    }
}
```

### JavaScript
<a name="embedded-analytics-visuals-with-anonymous-users-js"></a>

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function generateEmbedUrlForAnonymousUser(
    accountId, // Your AWS account ID
    dashboardId, // Dashboard ID to which the constructed url points
    sheetId, // Sheet ID to which the constructed url points
    visualId, // Visual ID to which the constructed url points
    quicksightNamespace, // valid namespace where you want to do embedding
    authorizedResourceArns, // dashboard arn list of dashboard visuals to embed
    allowedDomains, // runtime allowed domains for embedding
    sessionTags, // session tags used for row-level security
    generateEmbedUrlForAnonymousUserCallback, // success callback method
    errorCallback // error callback method
    ) {
    const experienceConfiguration = {
        "DashboardVisual": {
            "InitialDashboardVisualId": {
                "DashboardId": dashboardId,
                "SheetId": sheetId,
                "VisualId": visualId
            }
        }
    };
    
    const generateEmbedUrlForAnonymousUserParams = {
        "AwsAccountId": accountId,
        "Namespace": quicksightNamespace,
        // authorizedResourceArns should contain ARN of dashboard used below in ExperienceConfiguration
        "AuthorizedResourceArns": authorizedResourceArns,
        "AllowedDomains": allowedDomains,
        "ExperienceConfiguration": experienceConfiguration,
        "SessionTags": sessionTags,
        "SessionLifetimeInMinutes": 600
    };

    const quicksightClient = new AWS.QuickSight({
        region: process.env.AWS_REGION,
        credentials: {
            accessKeyId: AccessKeyId,
            secretAccessKey: SecretAccessKey,
            sessionToken: SessionToken,
            expiration: Expiration
        }
    });

    quicksightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const result = {
                "statusCode": 200,
                "headers": {
                    "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO THIS API
                    "Access-Control-Allow-Headers": "Content-Type"
                },
                "body": JSON.stringify(data),
                "isBase64Encoded": false
            }
            generateEmbedUrlForAnonymousUserCallback(result);
        }
    });
}
```

### Python3
<a name="embedded-analytics-visuals-with-anonymous-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError
import time

# Create QuickSight and STS clients
quicksightClient = boto3.client('quicksight',region_name='us-west-2')
sts = boto3.client('sts')

# Function to generate embedded URL for anonymous user
# accountId: YOUR AWS ACCOUNT ID
# quicksightNamespace: VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
# authorizedResourceArns: DASHBOARD ARN LIST TO EMBED
# allowedDomains: RUNTIME ALLOWED DOMAINS FOR EMBEDDING
# experienceConfiguration: DASHBOARD ID, SHEET ID and VISUAL ID TO WHICH THE CONSTRUCTED URL POINTS
# Example experienceConfig -> 'DashboardVisual': {
#     'InitialDashboardVisualId': {
#         'DashboardId': 'dashboardId',
#         'SheetId': 'sheetId',
#         'VisualId': 'visualId'
#     }
# },
# sessionTags: SESSION TAGS USED FOR ROW-LEVEL SECURITY
def generateEmbedUrlForAnonymousUser(accountId, quicksightNamespace, authorizedResourceArns, allowedDomains, experienceConfiguration, sessionTags):
    try:
        response = quicksightClient.generate_embed_url_for_anonymous_user(
            AwsAccountId = accountId,
            Namespace = quicksightNamespace,
            AuthorizedResourceArns = authorizedResourceArns,
            AllowedDomains = allowedDomains,
            ExperienceConfiguration = experienceConfiguration,
            SessionTags = sessionTags,
            SessionLifetimeInMinutes = 600
        )
            
        return {
            'statusCode': 200,
            'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
            'body': json.dumps(response),
            'isBase64Encoded':  bool('false')
        }
    except ClientError as e:
        print(e)
        return "Error generating embeddedURL: " + str(e)
```

### Node.js
<a name="embedded-analytics-visuals-with-anonymous-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    apiConfig: require('./quicksight-2018-04-01.min.json'),
    region: 'us-east-1',
});

quicksightClient.generateEmbedUrlForAnonymousUser({
    'AwsAccountId': '111122223333',
    'Namespace' : 'default',
    // authorizedResourceArns should contain ARN of dashboard used below in ExperienceConfiguration
    'AuthorizedResourceArns': authorizedResourceArns,
    'ExperienceConfiguration': { 
        'DashboardVisual': {
            'InitialDashboardVisualId': {
                'DashboardId': 'dashboard_id',
                'SheetId': 'sheet_id',
                'VisualId': 'visual_id'
            }
        }
    },
    'AllowedDomains': allowedDomains,    
    'SessionTags': sessionTags,
    'SessionLifetimeInMinutes': 600

}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    {
        "Status": "200",
        "EmbedUrl": "https://quicksightdomain/embed/12345/dashboards/67890/sheets/12345/visuals/67890...",
        "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
    }
```

### .NET/C\$1
<a name="embedded-analytics-visuals-with-anonymous-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateDashboardEmbedUrlForAnonymousUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                DashboardVisualId dashboardVisual = new DashboardVisualId
                {
                    DashboardId = "dashboard_id",
                    SheetId = "sheet_id",
                    VisualId = "visual_id"
                };

                AnonymousUserDashboardVisualEmbeddingConfiguration anonymousUserDashboardVisualEmbeddingConfiguration
                    = new AnonymousUserDashboardVisualEmbeddingConfiguration
                    {
                        InitialDashboardVisualId = dashboardVisual                        
                    };               
                    
                AnonymousUserEmbeddingExperienceConfiguration anonymousUserEmbeddingExperienceConfiguration
                    = new AnonymousUserEmbeddingExperienceConfiguration
                    {
                        DashboardVisual = anonymousUserDashboardVisualEmbeddingConfiguration
                    }; 
                    
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForAnonymousUserAsync(new GenerateEmbedUrlForAnonymousUserRequest
                    {
                        AwsAccountId = "111222333444",
                        Namespace = default,
                        // authorizedResourceArns should contain ARN of dashboard used below in ExperienceConfiguration
                        AuthorizedResourceArns = { "dashboard_id" },
                        ExperienceConfiguration = anonymousUserEmbeddingExperienceConfiguration,
                        SessionTags = sessionTags,
                        SessionLifetimeInMinutes = 600,
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

### AWS CLI
<a name="embedded-analytics-visuals-with-anonymous-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - Security Assertion Markup(SAML)을 사용하여 사용자를 인증하는 경우 이 작업을 사용하십시오.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForAnonymousUser`에 대한 권한이 활성화되어 있어야 합니다.

```
aws sts assume-role \
    --role-arn "arn:aws:iam::11112222333:role/QuickSightEmbeddingAnonymousPolicy" \
    --role-session-name anonymous caller
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_visual_role/QuickSightEmbeddingAnonymousPolicy`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 방문 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 각 세션을 분리하고 구분할 수 있습니다. 로드 밸런싱 등을 위해 여러 웹 서버를 사용하는 경우, 세션이 다른 서버에 다시 연결되면 새 세션이 시작됩니다.

마지막으로 시각적 객체에 대해 서명된 URL을 가져오려면, 앱 서버에서 `generate-embed-url-for-anynymous-user`을(를) 직접 호출합니다. 그러면 임베드 가능한 시각적 객체 URL이 반환됩니다. 다음 예제는 웹 포털 또는 앱을 익명으로 방문하는 사용자에 대해 서버 측 직접 호출을 사용하여 임베디드 시각적 객체의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-anonymous-user \
    --aws-account-id 111122223333 \
    --namespace default-or-something-else \
    --session-lifetime-in-minutes 15 \
    --authorized-resource-arns '["dashboard-arn-1","dashboard-arn-2"]' \
    --allowed-domains '["domain1","domain2"]' \
    --session-tags '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]' \
    --experience-configuration 'DashboardVisual={InitialDashboardVisualId={DashboardId=dashboard_id,SheetId=sheet_id,VisualId=visual_id}}'
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: 시각적 객체 URL 임베드
<a name="embedded-analytics-visuals-with-anonymous-users-step-3"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 [Amazon Quick Sight Embedding SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 2단계에서 시각적 URL을 포함하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ 시각적 객체를 HTML 페이지에 배치하세요.
+ 시각적 객체에 파라미터를 전달합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GenerateEmbedUrlForAnonymousUser` API 작업을 직접 호출하여 앱에 포함할 수 있는 URL을 생성하세요. 이 URL은 5분 동안 유효하며 결과 세션은 10시간 동안 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 권한 부여(auth) 코드를 제공합니다.

다음은 `generate-embed-url-for-anonymous-user`의 응답 예입니다. 이 예제`quicksightdomain`의는 Amazon Quick Sight 계정에 액세스하는 데 사용하는 URL입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    {
        "Status": "200",
        "EmbedUrl": "https://quicksightdomain/embed/12345/dashboards/67890/sheets/12345/visuals/67890...",
        "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
    }
```

Amazon Quick Sight 임베[딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 시각적 객체를 임베](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)딩합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 시각적 객체 내에서 파라미터를 제어하고 시각적 객체 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

임베디드 시각적 객체를 호스팅할 도메인은 Quick 구독이 승인된 도메인 목록인 허용 목록에 있어야 합니다. 이 요건은 임베디드 시각적 객체와 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 시각적 객체 및 대시보드의 도메인 추가에 대한 자세한 내용은 [Amazon Quick Sight API를 사용하여 런타임에 도메인 나열 허용을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-run-time.html) 참조하세요.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 실행됩니다.

### SDK 2.0
<a name="embedded-analytics-visuals-with-anonymous-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Visual Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedVisual = async() => {    
                const {
                    createEmbeddingContext,
                } = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    parameters: [
                        {
                            Name: 'country',
                            Values: ['United States'],
                        },
                        {
                            Name: 'states',
                            Values: [
                                'California',
                                'Washington'
                            ]
                        }
                    ],
                    locale: "en-US",
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'CONTENT_LOADED': {
                                console.log("All visuals are loaded. The title of the document:", messageEvent.message.title);
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Error occurred while rendering the experience. Error code:", messageEvent.message.errorCode);
                                break;
                            }
                            case 'PARAMETERS_CHANGED': {
                                console.log("Parameters changed. Changed parameters:", messageEvent.message.changedParameters);
                                break;
                            }
                            case 'SIZE_CHANGED': {
                                console.log("Size changed. New dimensions:", messageEvent.message);
                                break;
                            }
                        }
                    },
                };
                const embeddedVisualExperience = await embeddingContext.embedVisual(frameOptions, contentOptions);

                const selectCountryElement = document.getElementById('country');
                selectCountryElement.addEventListener('change', (event) => {
                    embeddedVisualExperience.setParameters([
                        {
                            Name: 'country',
                            Values: event.target.value
                        }
                    ]);
                });
            };
        </script>
    </head>

    <body onload="embedVisual()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="experience-container"></div>
    </body>

</html>
```

### SDK 1.0
<a name="embedded-analytics-visuals-with-anonymous-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Visual Embedding Example</title>
        <!-- You can download the latest QuickSight embedding SDK version from https://www.npmjs.com/package/amazon-quicksight-embedding-sdk -->
        <!-- Or you can do "npm install amazon-quicksight-embedding-sdk", if you use npm for javascript dependencies -->
        <script src="./quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            let embeddedVisualExperience;
            function onVisualLoad(payload) {
                console.log("Do something when the visual is fully loaded.");
            }

            function onError(payload) {
                console.log("Do something when the visual fails loading");
            }

            function embedVisual() {
                const containerDiv = document.getElementById("embeddingContainer");
                const options = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: containerDiv,
                    parameters: {
                        country: "United States"
                    },
                    height: "700px",
                    width: "1000px",
                    locale: "en-US"
                };
                embeddedVisualExperience = QuickSightEmbedding.embedVisual(options);
                embeddedVisualExperience.on("error", onError);
                embeddedVisualExperience.on("load", onVisualLoad);
            }

            function onCountryChange(obj) {
                embeddedVisualExperience.setParameters({country: obj.value});
            }
        </script>
    </head>

    <body onload="embedVisual()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country" onchange="onCountryChange(this)">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="embeddingContainer"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 시각적 객체를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 QuickSight 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# 등록된 사용자를 위한 Amazon Quick Sight 콘솔의 전체 기능 임베딩
<a name="embedded-analytics-full-console-for-authenticated-users"></a>

**중요**  
Amazon Quick Sight에는 및 임베딩 분석을 위한 새로운 API 작업이 `GenerateEmbedUrlForAnonymousUser` 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` API 작업을 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. 이전 API 작업을 사용한 임베딩에 대한 자세한 내용은 [GetDashboardEmbedURL 및 GetSessionEmbedURL API 작업을 사용한 분석 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-deprecated.html) 참조하세요.


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

Enterprise Edition을 사용하면 읽기 전용 대시보드를 제공하는 것 외에도 사용자 지정 브랜드 작성 포털에서 Amazon Quick Sight 콘솔 환경을 제공할 수도 있습니다. 이 접근 방식을 사용하면 사용자가 데이터 소스, 데이터 세트 및 분석을 생성할 수 있습니다. 동일한 인터페이스에서 대시보드를 만들고 게시하고 볼 수 있습니다. 이러한 권한 중 일부를 제한하려는 경우에도 그렇게 할 수 있습니다.

임베디드 콘솔을 통해 Amazon Quick Sight에 액세스하는 사용자는 작성자 또는 관리자 보안 집단에 속해야 합니다. 독자는 Amazon Quick Sight 콘솔이 내장되어 있는지 또는의 일부인지에 관계없이 작성에 사용할 수 있는 충분한 액세스 권한이 없습니다 AWS Management Console. 하지만 작성자와 관리자는 여전히 임베디드 대시보드에 액세스할 수 있습니다. 일부 작성 기능에 대한 권한을 제한하려는 경우, [UpdateUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_UpdateUser.html) API 작업을 통해 사용자에게 사용자 지정 권한 프로필을 추가할 수 있습니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html) API 작업을 사용하여 사용자 지정 권한 프로필이 첨부된 새 사용자를 추가할 수 있습니다. 자세한 내용은 다음 단원을 참조하세요.
+ 사용자 지정 콘솔 권한을 정의하여 사용자 지정 역할을 생성하는 방법에 대한 자세한 내용은 [Amazon Quick Sight 콘솔에 대한 액세스 사용자 지정을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/customizing-permissions-to-the-quicksight-console.html).
+ 네임스페이스를 사용하여 멀티테넌시 사용자, 그룹 및 Amazon Quick Sight 자산을 격리하는 방법에 대한 자세한 내용은 [Amazon Quick Sight 네임스페이스를 참조하세요](https://docs.aws.amazon.com/quicksight/latest/APIReference/controlling-access.html#namespaces.html).
+ 임베디드 Amazon Quick Sight 콘솔에 자체 브랜딩을 추가하는 방법에 대한 자세한 내용은 [Amazon Quick Sight에서 테마 사용](https://docs.aws.amazon.com/quicksight/latest/user/themes-in-quicksight.html) 및 [QuickSight 테마 API 작업을](https://docs.aws.amazon.com/quicksight/latest/APIReference/qs-assets.html#themes) 참조하세요.

다음 섹션에서는 등록된 사용자를 위해 임베디드 Amazon Quick Sight 대시보드를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-analytics-full-console-for-authenticated-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-analytics-full-console-for-authenticated-users-step-2)
+ [3단계: 콘솔 세션 URL 임베드](#embedded-analytics-full-console-for-authenticated-users-step-3)
+ [등록된 사용자의 경우 임베디드 콘솔에서 생성형 BI 기능 활성화](embedding-consoles-genbi.md)

## 1단계: 권한 설정
<a name="embedded-analytics-full-console-for-authenticated-users-step-1"></a>

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

Amazon Quick Sight에 액세스하는 각 사용자는 Amazon Quick Sight에 콘솔 세션에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면 AWS 계정에서 IAM 역할을 생성합니다. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. 독자가 읽기 전용 방식으로 Amazon Quick Sight에 액세스할 수 있고 다른 데이터 또는 생성 기능에 액세스할 수 없도록 `quicksight:RegisterUser` 권한을 추가합니다. 또한 IAM 역할은 콘솔 세션 URL을 검색할 수 있는 권한을 제공해야 합니다. 이를 위해 `quicksight:GenerateEmbedUrlForRegisteredUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForAnonymousUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자는 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의할 수 있는 옵션을 제공합니다. 대신 생성된 URL에 액세스할 수 있는 도메인 또는 하위 도메인을 최대 세 개까지 나열할 수 있습니다. 그러면 만든 웹 사이트에 이 URL이 포함됩니다. 파라미터에 나열된 도메인만 임베디드 대시보드에 액세스할 수 있습니다. 이 조건이 없으면, 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

다음 샘플 정책은 이러한 권한을 제공합니다.

다음 샘플 정책은 콘솔 세션 URL을 검색할 수 있는 권한을 제공합니다. 임베디드 세션에 액세스하기 전에 사용자를 생성 중이면 `quicksight:RegisterUser` 없이도 정책을 사용할 수 있습니다.

마지막으로, 방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스할 때 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

OpenID Connect 또는 SAML 인증의 신뢰 정책에 대한 자세한 내용은 IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 자격 증명 또는 OpenID Connect 연동을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 연동을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-analytics-full-console-for-authenticated-users-step-2"></a>

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 콘솔 세션 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

설명된 단계를 수행하면 콘솔 세션의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

### Java
<a name="embedded-analytics-full-console-for-authenticated-users-java"></a>

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResult;
import com.amazonaws.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration;
import com.amazonaws.services.quicksight.model.RegisteredUserQuickSightConsoleEmbeddingConfiguration;

/**
 * Class to call QuickSight AWS SDK to get url for QuickSight console embedding.
 */
public class GetQuicksightEmbedUrlRegisteredUserQSConsoleEmbedding {

    private final AmazonQuickSight quickSightClient;

    public GetQuicksightEmbedUrlRegisteredUserQSConsoleEmbedding() {
        this.quickSightClient = AmazonQuickSightClientBuilder
                .standard()
                .withRegion(Regions.US_EAST_1.getName())
                .withCredentials(new AWSCredentialsProvider() {
                        @Override
                        public AWSCredentials getCredentials() {
                            // provide actual IAM access key and secret key here
                            return new BasicAWSCredentials("access-key", "secret-key");
                        }

                         @Override
                        public void refresh() {                           
                        }
                    }
                )
                .build();
    }

    public String getQuicksightEmbedUrl(
            final String accountId,
            final String userArn, // Registered user arn to use for embedding. Refer to Get Embed Url section in developer portal to find out how to get user arn for a QuickSight user.
            final List<String> allowedDomains, // Runtime allowed domain for embedding
            final String initialPath
    ) throws Exception {
        final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = new RegisteredUserEmbeddingExperienceConfiguration()
                .withQuickSightConsole(new RegisteredUserQuickSightConsoleEmbeddingConfiguration().withInitialPath(initialPath));
        final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest = new GenerateEmbedUrlForRegisteredUserRequest();
        generateEmbedUrlForRegisteredUserRequest.setAwsAccountId(accountId);
        generateEmbedUrlForRegisteredUserRequest.setUserArn(userArn);
        generateEmbedUrlForRegisteredUserRequest.setAllowedDomains(allowedDomains);
        generateEmbedUrlForRegisteredUserRequest.setExperienceConfiguration(experienceConfiguration);

        final GenerateEmbedUrlForRegisteredUserResult generateEmbedUrlForRegisteredUserResult = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest);

        return generateEmbedUrlForRegisteredUserResult.getEmbedUrl();
    }
}
```

### JavaScript
<a name="embedded-analytics-full-console-for-authenticated-users-js"></a>

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function generateEmbedUrlForRegisteredUser(
    accountId,
    dashboardId,
    openIdToken, // Cognito-based token
    userArn, // registered user arn
    roleArn, // IAM user role to use for embedding
    sessionName, // Session name for the roleArn assume role
    allowedDomains, // Runtime allowed domain for embedding
    getEmbedUrlCallback, // GetEmbedUrl success callback method
    errorCallback // GetEmbedUrl error callback method
    ) {
    const stsClient = new AWS.STS();
    let stsParams = {
        RoleSessionName: sessionName,
        WebIdentityToken: openIdToken,
        RoleArn: roleArn
    }

    stsClient.assumeRoleWithWebIdentity(stsParams, function(err, data) {
        if (err) {
            console.log('Error assuming role');
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const getDashboardParams = {
                "AwsAccountId": accountId,
                "ExperienceConfiguration": {
                    "QuickSightConsole": {
                        "InitialPath": '/start'
                    }
                },
                "UserArn": userArn,
                "AllowedDomains": allowedDomains,
                "SessionLifetimeInMinutes": 600
            };

            const quicksightGetDashboard = new AWS.QuickSight({
                region: process.env.AWS_REGION,
                credentials: {
                    accessKeyId: data.Credentials.AccessKeyId,
                    secretAccessKey: data.Credentials.SecretAccessKey,
                    sessionToken: data.Credentials.SessionToken,
                    expiration: data.Credentials.Expiration
                }
            });

            quicksightGetDashboard.generateEmbedUrlForRegisteredUser(getDashboardParams, function(err, data) {
                if (err) {
                    console.log(err, err.stack);
                    errorCallback(err);
                } else {
                    const result = {
                        "statusCode": 200,
                        "headers": {
                            "Access-Control-Allow-Origin": "*", // Use your website domain to secure access to GetEmbedUrl API
                            "Access-Control-Allow-Headers": "Content-Type"
                        },
                        "body": JSON.stringify(data),
                        "isBase64Encoded": false
                    }
                    getEmbedUrlCallback(result);
                }
            });
        }
    });
}
```

### Python3
<a name="embedded-analytics-full-console-for-authenticated-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError

# Create QuickSight and STS clients
qs = boto3.client('quicksight', region_name='us-east-1')
sts = boto3.client('sts')

# Function to generate embedded URL  
# accountId: AWS account ID
# userArn: arn of registered user
# allowedDomains: Runtime allowed domain for embedding
# roleArn: IAM user role to use for embedding
# sessionName: session name for the roleArn assume role
def generateEmbeddingURL(accountId, userArn, allowedDomains, roleArn, sessionName):
    try:
        assumedRole = sts.assume_role(
            RoleArn = roleArn,
            RoleSessionName = sessionName,
        )
    except ClientError as e:
        return "Error assuming role: " + str(e)
    else: 
        assumedRoleSession = boto3.Session(
            aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
            aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
            aws_session_token = assumedRole['Credentials']['SessionToken'],
        )
        try:
            quickSightClient = assumedRoleSession.client('quicksight', region_name='us-east-1')
            
            experienceConfiguration = {
                "QuickSightConsole": {
                    "InitialPath": "/start"
                }
            }
            response = quickSightClient.generate_embed_url_for_registered_user(
                 AwsAccountId = accountId,
                 ExperienceConfiguration = experienceConfiguration,
                 UserArn = userArn,
                 AllowedDomains = allowedDomains,
                 SessionLifetimeInMinutes = 600
            )
            
            return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
                'body': json.dumps(response),
                'isBase64Encoded':  bool('false')
            }
        except ClientError as e:
            return "Error generating embedding url: " + str(e)
```

### Node.js
<a name="embedded-analytics-full-console-for-authenticated-users-node"></a>

다음 예제는 앱 서버에서 임베디드 콘솔 세션에 대한 URL를 가져오는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 콘솔 세션을 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    apiConfig: require('./quicksight-2018-04-01.min.json'),
    region: 'us-east-1',
});

quicksightClient.generateEmbedUrlForRegisteredUser({
    'AwsAccountId': '111122223333',
    'ExperienceConfiguration': {
        'QuickSightConsole': {
            'InitialPath': '/start'
        }
    },
    'UserArn': 'REGISTERED_USER_ARN',
    'AllowedDomains': allowedDomains,
    'SessionLifetimeInMinutes': 100
}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

**Example**  

```
// The URL returned is over 900 characters. For this example, we've shortened the string for
// readability and added ellipsis to indicate that it's incomplete.
    {
        Status: 200,
        EmbedUrl: 'https://quicksightdomain/embed/12345/dashboards/67890..,
        RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713'
    }
```

### .NET(C\$1)
<a name="embedded-analytics-full-console-for-authenticated-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 콘솔 세션에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 콘솔을 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateDashboardEmbedUrlForRegisteredUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                RegisteredUserQuickSightConsoleEmbeddingConfiguration registeredUserQuickSightConsoleEmbeddingConfiguration
                    = new RegisteredUserQuickSightConsoleEmbeddingConfiguration
                    {
                        InitialPath = "/start"
                    };
                RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration
                    = new RegisteredUserEmbeddingExperienceConfiguration
                    {
                        QuickSightConsole = registeredUserQuickSightConsoleEmbeddingConfiguration
                    };
                
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForRegisteredUserAsync(new GenerateEmbedUrlForRegisteredUserRequest
                    {
                        AwsAccountId = "111122223333",
                        ExperienceConfiguration = registeredUserEmbeddingExperienceConfiguration,
                        UserArn = "REGISTERED_USER_ARN",
                        AllowedDomains = allowedDomains,
                        SessionLifetimeInMinutes = 100
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

### AWS CLI
<a name="embedded-analytics-full-console-for-authenticated-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForRegisteredUser`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 Amazon Quick Sight를 처음 열 때 사용자를 추가하기 위해 just-in-time 접근 방식을 취하는 경우 역할에는에 대한 권한도 활성화되어 있어야 합니다`quicksight:RegisterUser`.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
     --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_console_session_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. 조절은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 콘솔 세션에 처음 액세스할 때 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
     --aws-account-id 111122223333 \
     --namespace default \
     --identity-type IAM \
     --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
     --user-role READER \
     --user-name jhnd \
     --session-name "john.doe@example.com" \
     --email john.doe@example.com \
     --region us-east-1 \
     --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는 설정을 위해 `RegisterUser`를 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 ARN을 얻는 데 `DescribeUser`를 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때이 사용자를 적절한 그룹에 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
     --aws-account-id=111122223333 \
     --namespace=default \
     --group-name=financeusers \
     --member-name="embedding_quicksight_dashboard_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 Amazon Quick Sight 콘솔 세션에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 콘솔 세션에 대해 서명된 URL을 가져오려면, 앱 서버에서 `generate-embed-url-for-registered-user`을(를) 호출합니다. 그러면 임베드 가능한 콘솔 세션 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 Single Sign-On(IAM Identity Center)을 통해 인증된 사용자에 대한 서버 측 호출을 사용하여 임베디드 콘솔 세션의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-registered-user \
    --aws-account-id 111122223333 \
    --entry-point the-url-for--the-console-session \
    --session-lifetime-in-minutes 600 \
    --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_dashboard_role/embeddingsession
	--allowed-domains '["domain1","domain2"]' \
    --experience-configuration QuickSightConsole={InitialPath="/start"}
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: 콘솔 세션 URL 임베드
<a name="embedded-analytics-full-console-for-authenticated-users-step-3"></a>

다음 섹션에서는 [Amazon Quick Sight Embedding SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 3단계에서 콘솔 세션 URL을 포함하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ 콘솔 세션을 HTML 페이지에 배치합니다.
+ 콘솔 세션에 파라미터를 전달합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GenerateEmbedUrlForRegisteredUser` API 작업을 직접 호출하여 앱에 포함할 수 있는 URL을 생성하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `generate-embed-url-for-registered-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
{
     "Status": "200",
     "EmbedUrl": "https://quicksightdomain/embedding/12345/start...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

Amazon Quick Sight 임베[딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 콘솔 세션을 임베딩](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 콘솔 세션 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

임베디드 대시보드를 호스팅할 도메인은 Quick 구독에 대해 승인된 도메인 *목록인 허용* 목록에 있어야 합니다. 이 요건은 임베디드 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 콘솔의 도메인 추가에 대한 자세한 내용은 [Amazon Quick Sight API를 사용하여 런타임에 도메인 나열 허용을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-run-time.html).

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

### SDK 2.0
<a name="embedded-analytics-full-console-for-authenticated-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Console Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedSession = async() => {    
                const {
                    createEmbeddingContext,
                } = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'ERROR_OCCURRED': {
                                console.log("Do something when the embedded experience fails loading.");
                                break;
                            }
                        }
                    }
                };
                const embeddedConsoleExperience = await embeddingContext.embedConsole(frameOptions, contentOptions);
            };
        </script>
    </head>

    <body onload="embedSession()">
        <div id="experience-container"></div>
    </body>

</html>
```

### SDK 1.0
<a name="embedded-analytics-full-console-for-authenticated-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>QuickSight Console Embedding</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@1.0.15/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            var session

            function onError(payload) {
                console.log("Do something when the session fails loading");
            }

            function embedSession() {
                var containerDiv = document.getElementById("embeddingContainer");
                var options = {
                    // replace this dummy url with the one generated via embedding API
                    url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode", // replace this dummy url with the one generated via embedding API
                    container: containerDiv,
                    parameters: {
                        country: "United States"
                    },
                    scrolling: "no",
                    height: "700px",
                    width: "1000px",
                    locale: "en-US",
                    footerPaddingEnabled: true,
                    defaultEmbeddingVisualType: "TABLE", // this option only applies to QuickSight console embedding and is not used for dashboard embedding
                };
                session = QuickSightEmbedding.embedSession(options);
                session.on("error", onError);
            }

            function onCountryChange(obj) {
                session.setParameters({country: obj.value});
            }
        </script>
    </head>

    <body onload="embedSession()">
        <span>
            <label for="country">Country</label>
            <select id="country" name="country" onchange="onCountryChange(this)">
                <option value="United States">United States</option>
                <option value="Mexico">Mexico</option>
                <option value="Canada">Canada</option>
            </select>
        </span>
        <div id="embeddingContainer"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 콘솔 세션을 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# 등록된 사용자의 경우 임베디드 콘솔에서 생성형 BI 기능 활성화
<a name="embedding-consoles-genbi"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

임베디드 콘솔에서 다음과 같은 생성형 BI 기능을 활성화할 수 있습니다.
+ 실행 요약: 활성화된 경우 등록된 Author Pro 및 Reader Pro 사용자는 Amazon Quick Sight가 주요 인사이트를 쉽게 검색할 수 있도록 대시보드에 생성한 모든 인사이트의 요약을 제공하는 실행 요약을 생성할 수 있습니다.
+ 작성: 이 옵션을 활성화하는 경우 Author Pro 사용자는 생성형 BI를 사용하여 계산된 필드를 빌드하고 시각적 객체를 빌드 및 세분화할 수 있습니다.
+ Q&A: 이 옵션을 활성화하는 경우 Author Pro 및 Reader Pro 사용자는 AI 기반 Q&A를 사용하여 데이터와 관련된 질문을 제안하고 답변할 수 있습니다.
+ 데이터 스토리: 이 옵션을 활성화하는 경우 Author Pro 및 Reader Pro 사용자는 세부 정보를 제공하여 데이터 스토리의 첫 번째 초안을 빠르게 생성할 수 있습니다.

**등록된 사용자의 경우 임베디드 콘솔에서 생성형 BI 기능을 활성화하는 방법**
+ [등록된 사용자가 다음과 같은 변경 사항을 적용하여 콘솔을 포함할 수 있도록 Amazon Quick Sight 콘솔의 전체 기능 임베딩](https://docs.aws.amazon.com/quicksight/latest/user/embedded-analytics-full-console-for-authenticated-users.html)의 단계를 따릅니다.

  1. 2단계에서 URL을 생성하는 경우 활성화하려는 각 기능에 대해 다음 예제와 같이 [GenerateEmbedUrlForRegisteredUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 또는 [GenerateEmbedUrlForRegisteredUserWithIdentity](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUserWithIdentity.html)의 `FeatureConfigurations` 파라미터에서 `Enabled: true`를 설정하세요. 구성이 제공되지 않으면 기능은 기본적으로 비활성화됩니다.

     ```
     ExperienceConfiguration: {
             QuickSightConsole: {
                 InitialPath: "initial_path",
                 AmazonQInQuickSight: {
                     FeatureConfigurations: { 
                         COMMENT: Enable executive summaries
                         ExecutiveSummary: {
                             Enabled: true
                         },
                         COMMENT: Enable Generative BI authoring
                         GenerativeAuthoring: {
                             Enabled: true
                         },
                         COMMENT: Enable Q&A
                         DataQnA: {
                             Enabled: true
                         },
                         COMMENT: Enable data stories
                         DataStories: {
                             Enabled: true
                         }       
                     }
                 }
             }
         }
     }
     ```

  1. 3단계에서 Amazon Quick Sight 임베딩 SDK를 사용하여 콘솔 URL을 임베딩할 때 다음 예제의 값을 원하는 대로 설정합니다. 구성이 제공되지 않으면 기능은 기본적으로 비활성화됩니다.
**참고**  
데이터 스토리를 활성화하기 위한 SDK 옵션은 없습니다. 이전 단계에서와 같이 API로 데이터 스토리를 활성화하는 경우 등록된 사용자는 데이터 스토리를 사용할 수 있습니다.

     ```
     const contentOptions = {
         toolbarOptions: {
             executiveSummary: true, // Enable executive summaries
             buildVisual: true, // Enable Generative BI authoring
             dataQnA: true // Enable Q&A
         }
     };
     ```

# Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩
<a name="embedding-gen-bi"></a>


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 LLM에서 제공하는 향상된 NLQ 기능을 사용하는 임베디드 생성형 Q&A 환경을 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다. 생성형 Q&A 환경은 임베디드 Q Search Bar의 권장 대체 기능이며 사용자에게 업데이트된 BI 환경을 제공합니다.

**Topics**
+ [등록된 사용자를 위한 Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩](#embedded-analytics-gen-bi-authenticated-users)
+ [익명(미등록) 사용자를 위한 빠른 생성형 Q&A 환경에 Amazon Q 임베딩](#embedded-analytics-gen-bi-anonymous-users)

## 등록된 사용자를 위한 Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩
<a name="embedded-analytics-gen-bi-authenticated-users"></a>

다음 섹션에서는 Amazon Quick Sight의 등록된 사용자를 위해 임베디드 생성형 Q&A 환경을 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-analytics-gen-bi-authenticated-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-analytics-gen-bi-authenticated-users-step-2)
+ [3단계: 생성형 Q&A 환경 URL 임베드](#embedded-analytics-gen-bi-authenticated-users-step-3)
+ [임베디드 생성형 Q&A 환경 기능 옵션](#embedded-analytics-gen-bi-authenticated-users-step-4)

### 1단계: 권한 설정
<a name="embedded-analytics-gen-bi-authenticated-users-step-1"></a>

다음 섹션에서는 생성형 Q&A 환경을 임베드할 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아볼 수 있습니다. 이 작업을 수행하려면 AWS Identity and Access Management (IAM)에 대한 관리 액세스 권한이 필요합니다.

생성형 Q&A 환경에 액세스하는 각 사용자는 Amazon Quick Sight에 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면 AWS 계정에서 IAM 역할을 생성합니다. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 특정 사용자 풀의 임베딩 URL을 검색할 수 있는 권한을 제공해야 합니다.

와일드카드 문자 \$1를 사용하여, 특정 네임스페이스의 모든 사용자에 대해 URL을 생성할 권한을 부여할 수 있습니다. 또는 특정 네임스페이스에 있는 사용자 하위 집합에 대해 URL을 생성할 권한을 부여할 수 있습니다. 이를 위해 `quicksight:GenerateEmbedUrlForRegisteredUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForRegisteredUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자에게 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의하고 생성된 URL에 액세스할 수 있는 최대 3개의 도메인 또는 하위 도메인을 나열할 수 있는 옵션을 부여합니다. 그러면 이 URL이 개발자 웹 사이트에 포함됩니다. 파라미터에 나열된 도메인만 임베디드 생성형 Q&A 환경에 액세스할 수 있습니다. 이 조건이 없으면, 개발자는 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForRegisteredUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

다음 샘플 정책은 이러한 권한을 제공합니다.

또한 Amazon Quick Sight 독자가 될 사용자를 처음 생성하는 경우 정책에 `quicksight:RegisterUser` 권한을 추가해야 합니다.

다음 샘플 정책은 Amazon Quick Sight 리더인 처음 사용자를 위해 임베딩 URL을 검색할 수 있는 권한을 제공합니다.

마지막으로, 방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스할 때 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다.

다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
    "Sid": "AllowLambdaFunctionsToAssumeThisRole",
                "Effect": "Allow",
                "Principal": {
    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            },
            {
    "Sid": "AllowEC2InstancesToAssumeThisRole",
                "Effect": "Allow",
                "Principal": {
    "Service": "ec2.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
```

------

OpenID Connect 또는 Security Assertion Markup Language(SAML) 인증의 신뢰 정책에 대한 자세한 내용은, IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 아이덴티티 또는 OpenID Connect 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

### 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-analytics-gen-bi-authenticated-users-step-2"></a>

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 Q 주제 URL을 가져오는 방법을 알아볼 수 있습니다. IAM 또는 Amazon Quick Sight 자격 증명 유형에 대한 생성형 Q&A 환경을 포함하려는 경우 Q 주제를 사용자와 공유합니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 앱은 사용자가 아직 없는 경우 사용자를 Amazon Quick Sight에 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

설명된 단계를 수행하면 Q 주제의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다. 태그 기반 행 수준 보안은 Q 표시줄의 익명 사용자 임베딩에 사용할 수 있습니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

#### Java
<a name="embedded-analytics-gen-bi-authenticated-users-java"></a>

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResult;
import com.amazonaws.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration;
import com.amazonaws.services.quicksight.model.RegisteredUserGenerativeQnAEmbeddingConfiguration;

/**
 * Class to call QuickSight AWS SDK to get url for embedding Generative Q&A experience.
 */
public class RegisteredUserGenerativeQnAEmbeddingSample {

    private final AmazonQuickSight quickSightClient;

    public RegisteredUserGenerativeQnAEmbeddingSample() {
        this.quickSightClient = AmazonQuickSightClientBuilder
                    .standard()
                    .withRegion(Regions.US_EAST_1.getName())
                    .withCredentials(new AWS CredentialsProvider() {
                            @Override
                            public AWSCredentials getCredentials() {
                                // provide actual IAM access key and secret key here
                                return new BasicAWSCredentials("access-key", "secret-key");
                            }

                            @Override
                            public void refresh() {
                            }
                        }
                    )
                    .build();
            }

    public String getQuicksightEmbedUrl(
            final String accountId, // AWS Account ID
            final String topicId, // Topic ID to embed
            final List<String> allowedDomains, // Runtime allowed domain for embedding
            final String userArn // Registered user arn to use for embedding. Refer to Get Embed Url section in developer portal to find how to get user arn for a QuickSight user.
            ) throws Exception {

        final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = new RegisteredUserEmbeddingExperienceConfiguration()
                .withGenerativeQnA(new RegisteredUserGenerativeQnAEmbeddingConfiguration().withInitialTopicId(topicId));
        final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest = new GenerateEmbedUrlForRegisteredUserRequest();
        generateEmbedUrlForRegisteredUserRequest.setAwsAccountId(accountId);
        generateEmbedUrlForRegisteredUserRequest.setUserArn(userArn);
        generateEmbedUrlForRegisteredUserRequest.setAllowedDomains(allowedDomains);
        generateEmbedUrlForRegisteredUserRequest.setExperienceConfiguration(experienceConfiguration);

        final GenerateEmbedUrlForRegisteredUserResult generateEmbedUrlForRegisteredUserResult = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest);

        return generateEmbedUrlForRegisteredUserResult.getEmbedUrl();
    }
}
```

#### JavaScript
<a name="embedded-analytics-gen-bi-authenticated-users-js"></a>

**참고**  
임베드 URL 생성 API는 브라우저에서 직접 호출할 수 없습니다. 대신 Node.JS 예제를 참조하세요.

#### Python3
<a name="embedded-analytics-gen-bi-authenticated-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError

sts = boto3.client('sts')

# Function to generate embedded URL  
# accountId: AWS account ID
# topicId: Topic ID to embed
# userArn: arn of registered user
# allowedDomains: Runtime allowed domain for embedding
# roleArn: IAM user role to use for embedding
# sessionName: session name for the roleArn assume role
def getEmbeddingURL(accountId, topicId, userArn, allowedDomains, roleArn, sessionName):
    try:
        assumedRole = sts.assume_role(
            RoleArn = roleArn,
            RoleSessionName = sessionName,
        )
    except ClientError as e:
        return "Error assuming role: " + str(e)
    else: 
        assumedRoleSession = boto3.Session(
            aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
            aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
            aws_session_token = assumedRole['Credentials']['SessionToken'],
        )
        try:
            quicksightClient = assumedRoleSession.client('quicksight', region_name='us-west-2')
            response = quicksightClient.generate_embed_url_for_registered_user(
                AwsAccountId=accountId,
                ExperienceConfiguration = {
                    'GenerativeQnA': {
                        'InitialTopicId': topicId
                    }
                },
                UserArn = userArn,
                AllowedDomains = allowedDomains,
                SessionLifetimeInMinutes = 600
            )
            
            return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
                'body': json.dumps(response),
                'isBase64Encoded':  bool('false')
            }
        except ClientError as e:
            return "Error generating embedding url: " + str(e)
```

#### Node.js
<a name="embedded-analytics-gen-bi-authenticated-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    region: 'us-east-1'
});

quicksightClient.generateEmbedUrlForRegisteredUser({
    'AwsAccountId': '111122223333',
    'ExperienceConfiguration': { 
        'GenerativeQnA': {
            'InitialTopicId': 'U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f'
        }
    },
    'UserArn': 'REGISTERED_USER_ARN',
    'AllowedDomains': allowedDomains,
    'SessionLifetimeInMinutes': 100
}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

#### .NET/C\$1
<a name="embedded-analytics-gen-bi-authenticated-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 Q 검색 창에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 Q 검색 창을 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateGenerativeQnAEmbedUrlForRegisteredUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                RegisteredUserGenerativeQnAEmbeddingConfiguration registeredUserGenerativeQnAEmbeddingConfiguration
                    = new RegisteredUserGenerativeQnAEmbeddingConfiguration
                    {
                        InitialTopicId = "U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f"
                    };
                RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration
                    = new RegisteredUserEmbeddingExperienceConfiguration
                    {
                        GenerativeQnA = registeredUserGenerativeQnAEmbeddingConfiguration
                    }; 
                
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForRegisteredUserAsync(new GenerateEmbedUrlForRegisteredUserRequest
                    {
                        AwsAccountId = "111122223333",
                        ExperienceConfiguration = registeredUserEmbeddingExperienceConfiguration,
                        UserArn = "REGISTERED_USER_ARN",
                        AllowedDomains = allowedDomains,
                        SessionLifetimeInMinutes = 100
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

#### AWS CLI
<a name="embedded-analytics-gen-bi-authenticated-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForRegisteredUser`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 Q 검색 창의 주제를 사용할 때 사용자를 추가하는 적시 접근 방식을 취하려면, 역할에 `quicksight:RegisterUser`에 대한 사용 권한도 활성화해야 합니다.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_q_generative_qna_role" \
     --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터의 경우, `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_q_search_bar_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 생성형 Q&A 환경에 처음 액세스할 때 사용자를 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
    --aws-account-id 111122223333 \
    --namespace default \
    --identity-type IAM\
    --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_q_generative_qna_role" \
    --user-role READER \
    --user-name jhnd \
    --session-name "john.doe@example.com" \
    --email john.doe@example.com \
    --region us-east-1 \
    --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는 설정을 위해 `RegisterUser`를 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 Amazon 리소스 이름(ARN)을 얻는 데 `DescribeUser`을(를) 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때 대시보드가 공유되는 그룹에이 사용자를 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
    --aws-account-id 111122223333 \
    --namespace default \
    --group-name financeusers \
    --member-name "embedding_quicksight_q_generative_qna_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 대시보드에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 대시보드에 대해 서명된 URL을 가져오려면 앱 서버에서 `generate-embed-url-for-registered-user`을 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 Single Sign-On(IAM Identity Center)을 통해 인증된 사용자에 대한 서버 측 호출을 사용하여 임베디드 대시보드의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 111122223333 \
--namespace default-or-something-else \
--authorized-resource-arns '["topic-arn-topicId1","topic-arn-topicId2"]' \
--allowed-domains '["domain1","domain2"]' \
--experience-configuration 'GenerativeQnA={InitialTopicId="topicId1"}' \
--session-tags '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]' \
--session-lifetime-in-minutes 15
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

### 3단계: 생성형 Q&A 환경 URL 임베드
<a name="embedded-analytics-gen-bi-authenticated-users-step-3"></a>

다음 섹션에서는 웹 사이트 또는 애플리케이션 페이지에 생성형 Q&A 환경 URL을 임베드하는 방법을 알아볼 수 있습니다. [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여이 작업을 수행할 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ 생성형 Q&A 환경을 HTML 페이지에 배치합니다.
+ 애플리케이션 요구 사항에 맞게 임베디드 환경의 레이아웃과 모양을 사용자 지정합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

앱에 포함할 수 있는 URL을 생성하러면, `GenerateEmbedUrlForRegisteredUser` API 작업을 직접 호출하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code` 값을 제공합니다.

다음은 `generate-embed-url-for-registered-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete. 
{
 "Status": "200",
"EmbedUrl": "https://quicksightdomain/embedding/12345/q/search...",
"RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에 생성형 Q&A 환경을 임베드](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다.

임베디드 생성형 Q&A 환경을 호스팅할 도메인이 Amazon Quick Sight 구독에 대해 승인된 도메인 목록인 *허용 목록에* 있는지 확인합니다. 이 요건은 임베디드 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 생성형 Q&A 환경의 도메인 추가에 대한 자세한 정보는 [도메인 관리](manage-domains.md) 섹션을 참조하세요.

Amazon Quick Sight 임베딩 SDK를 사용하여 애플리케이션에 맞게 임베디드 생성형 Q&A 환경의 레이아웃과 모양을 사용자 지정할 수 있습니다. `panelType` 속성을 사용하여 애플리케이션에서 렌더링할 때 생성형 Q&A 환경의 랜딩 상태를 구성합니다. `panelType` 속성을 `'FULL'`로 설정하여 전체 생성형 Q&A 환경 패널을 렌더링합니다. 이 패널은 Amazon Quick Sight 사용자가 Amazon Quick Sight 콘솔에서 겪는 경험과 유사합니다. 패널의 프레임 높이는 사용자 상호 작용에 따라 변경되지 않으며 `frameOptions.height` 속성에서 설정한 값을 존중합니다. 아래 이미지에서는 `panelType` 값을 `'FULL'`로 설정할 때 렌더링하는 생성형 Q&A 환경 패널을 보여줍니다.

`panelType` 속성을 `'SEARCH_BAR'`로 설정하여 생성형 Q&A 환경 패널을 검색 표시줄로 렌더링합니다. 이 검색 표시줄은 Q Search Bar가 애플리케이션에 임베드될 때 렌더링하는 방식과 유사합니다. 생성형 Q&A 검색 표시줄은 주제 선택 옵션, 질문 제안 목록, 응답 패널 또는 핀보드를 표시하는 더 큰 패널로 확장됩니다.

기본 생성형 Q&A 검색 표시줄의 기본 최소 높이는 임베디드 자산이 로드될 때 렌더링됩니다. 검색 표시줄 환경을 최적화하려면 `frameOptions.height` 값을 `"38px"`로 설정하는 것이 좋습니다. `focusedHeight` 속성을 사용하여 주제 선택 드롭다운 및 질문 제안 목록의 최적 크기를 설정합니다. `expandedHeight` 속성을 사용하여 답변 패널과 핀보드의 최적 크기를 설정합니다. `'SEARCH_BAR'` 옵션을 선택하는 경우 애플리케이션에서 원치 않는 콘텐츠 이동을 방지하기 위해 상위 컨테이너를 절대 위치로 스타일링하는 것이 좋습니다. 아래 이미지에서는 `panelType` 값을 `'SEARCH_BAR'`로 설정할 때 렌더링하는 생성형 Q&A 환경 검색 표시줄을 보여줍니다.

`panelType` 속성을 구성한 후 Amazon Quick Sight 임베딩 SDK를 사용하여 생성형 Q&A 경험의 다음 속성을 사용자 지정합니다.
+ 생성형 Q&A 패널의 제목(`panelType: FULL` 옵션에만 적용됨)입니다.
+ 검색 표시줄의 자리 표시자 텍스트입니다.
+ 주제 선택을 허용할지 여부입니다.
+ 주제 이름을 표시할지 숨길지 여부입니다.
+ Amazon Q 아이콘을 표시할지 숨길지 여부입니다(`panelType: FULL` 옵션에만 적용됨).
+ 핀보드를 숨길지 여부입니다.
+ 사용자가 생성형 Q&A 패널을 전체 화면으로 최대화할 수 있는지 여부입니다.
+ 생성형 Q&A 패널의 테마입니다. 사용자 지정 테마 ARN을 SDK에 전달하여 프레임 콘텐츠의 모양을 변경할 수 있습니다. Amazon Quick Sight 스타터 테마는 임베디드 생성형 BI 패널에서 지원되지 않습니다. Amazon Quick Sight 스타터 테마를 사용하려면 Amazon Quick Sight에 사용자 지정 테마로 저장합니다.

Amazon Quick Sight 임베딩 SDK를 사용하는 경우 페이지의 생성형 Q&A 환경은 상태에 따라 동적으로 크기가 조정됩니다. Amazon Quick Sight 임베딩 SDK를 사용하면 생성형 Q&A 환경 내에서 파라미터를 제어하고 페이지 로드 완료, 상태 변경 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

#### SDK 2.0
<a name="collapsible-gen-bi-embedding-example"></a>

```
<!DOCTYPE html>
<html>
    <head>
        <title>Generative Q&A Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.7.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedGenerativeQnA = async() => {    
                const {createEmbeddingContext} = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    // Optional panel settings. Default behavior is equivalent to {panelType: 'FULL'}
                    panelOptions: {
                        panelType: 'FULL',
                        title: 'custom title', // Optional
                        showQIcon: false, // Optional, Default: true
                    },
                    // Use SEARCH_BAR panel type for the landing state to be similar to embedQSearchBar
                    // with generative capability enabled topics
                    /*
                    panelOptions: {
                        panelType: 'SEARCH_BAR',
                        focusedHeight: '250px',
                        expandedHeight: '500px',
                    },
                    */
                    showTopicName: false, // Optional, Default: true
                    showPinboard: false, // Optional, Default: true
                    allowTopicSelection: false, // Optional, Default: true
                    allowFullscreen: false, // Optional, Default: true
                    searchPlaceholderText: "custom search placeholder", // Optional
                    themeOptions: { // Optional
                        themeArn: 'arn:aws:quicksight:<Region>:<AWS-Account-ID>:theme/<Theme-ID>'
                    }
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'Q_SEARCH_OPENED': {
                                // called when pinboard is shown / visuals are rendered
                                console.log("Do something when SEARCH_BAR type panel is expanded");
                                break;
                            }
                            case 'Q_SEARCH_FOCUSED': {
                                // called when question suggestions or topic selection dropdown are shown
                                console.log("Do something when SEARCH_BAR type panel is focused");
                                break;
                            }
                            case 'Q_SEARCH_CLOSED': {
                                // called when shrinked to initial bar height
                                console.log("Do something when SEARCH_BAR type panel is collapsed");
                                break;
                            }
                            case 'Q_PANEL_ENTERED_FULLSCREEN': {
                                console.log("Do something when panel enters full screen mode");
                                break;
                            }
                            case 'Q_PANEL_EXITED_FULLSCREEN': {
                                console.log("Do something when panel exits full screen mode");
                                break;
                            }
                            case 'CONTENT_LOADED': {
                                console.log("Do something after experience is loaded");
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Do something when experience fails to load");
                                break;
                            }
                        }
                    }
                };
                const embeddedGenerativeQnExperience = await embeddingContext.embedGenerativeQnA(frameOptions, contentOptions);
            };
        </script>
    </head>

    <body onload="embedGenerativeQnA()">
        <div id="experience-container"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에서 임베디드 생성형 Q&A 환경을 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

### 임베디드 생성형 Q&A 환경 기능 옵션
<a name="embedded-analytics-gen-bi-authenticated-users-step-4"></a>

임베딩 SDK를 사용하여 임베디드 생성형 Q&A 환경에 기능 옵션을 사용할 수 있습니다.

#### 생성형 Q&A 검색 표시줄 작업 호출
<a name="w2aac35c27c21c43c29b9c21b5"></a>
+ 질문 설정 - 이 기능은 생성형 Q&A 환경에 질문을 전송하고 즉시 질문을 쿼리합니다.

  ```
  embeddedGenerativeQnExperience.setQuestion('show me monthly revenue');
  ```
+ 응답 패널 닫기(생성형 Q&A 검색 표시줄 옵션에 적용) - 이 기능은 응답 패널을 닫고 iframe을 원래 검색 표시줄 상태로 되돌립니다.

  ```
  embeddedGenerativeQnExperience.close();
  ```

자세한 내용은 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

## 익명(미등록) 사용자를 위한 빠른 생성형 Q&A 환경에 Amazon Q 임베딩
<a name="embedded-analytics-gen-bi-anonymous-users"></a>


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 익명(등록되지 않은) 사용자를 위해 임베디드 생성형 Q&A 환경을 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-analytics-gen-bi-anonymous-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-analytics-gen-bi-anonymous-users-step-2)
+ [3단계: 생성형 Q&A 환경 URL 임베드](#embedded-analytics-gen-bi-anonymous-users-step-3)
+ [임베디드 생성형 Q&A 환경 기능 옵션](#embedded-analytics-gen-bi-anonymous-users-step-4)

### 1단계: 권한 설정
<a name="embedded-analytics-gen-bi-anonymous-users-step-1"></a>

다음 섹션에서는 생성형 Q&A 환경을 임베드할 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아볼 수 있습니다. 이 작업을 수행하려면 AWS Identity and Access Management (IAM)에 대한 관리 액세스 권한이 필요합니다.

생성형 Q&A 환경에 액세스하는 각 사용자는 Amazon Quick Sight에 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면 AWS 계정에서 IAM 역할을 생성합니다. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 특정 사용자 풀의 임베딩 URL을 검색할 수 있는 권한을 제공해야 합니다.

와일드카드 문자 \$1를 사용하여, 특정 네임스페이스의 모든 사용자에 대해 URL을 생성할 권한을 부여할 수 있습니다. 또는 특정 네임스페이스에 있는 사용자 하위 집합에 대해 URL을 생성할 권한을 부여할 수 있습니다. 이를 위해 `quicksight:GenerateEmbedUrlForAnonymousUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForAnonymousUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자에게 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의하고 생성된 URL에 액세스할 수 있는 최대 3개의 도메인 또는 하위 도메인을 나열할 수 있는 옵션을 부여합니다. 그러면 이 URL이 개발자 웹 사이트에 포함됩니다. 파라미터에 나열된 도메인만 임베디드 Q 검색 창에 액세스할 수 있습니다. 이 조건이 없으면, 개발자는 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForAnonymousUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면 애플리케이션이 사용자를 대신하여 역할을 맡아서 생성형 Q&A 환경을 로드할 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
    "Statement": [
        {
"Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
"Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
"Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
"Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

자세한 내용은 IAM 사용 설명서의 [IAM의 임시 보안 인증](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 단원을 참조하세요.

### 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-analytics-gen-bi-anonymous-users-step-2"></a>

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 Q 주제 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 앱은 사용자가 아직 없는 경우 사용자를 Amazon Quick Sight에 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

#### Java
<a name="embedded-analytics-gen-bi-anonymous-users-java"></a>

```
import java.util.List;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.AnonymousUserGenerativeQnAEmbeddingConfiguration;
import com.amazonaws.services.quicksight.model.AnonymousUserEmbeddingExperienceConfiguration;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserRequest;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserResult;
import com.amazonaws.services.quicksight.model.SessionTag;

/**
* Class to call QuickSight AWS SDK to generate embed url for anonymous user.
*/
public class GenerateEmbedUrlForAnonymousUserExample {

    private final AmazonQuickSight quickSightClient;

    public GenerateEmbedUrlForAnonymousUserExample() {
        quickSightClient = AmazonQuickSightClientBuilder
            .standard()
            .withRegion(Regions.US_EAST_1.getName())
            .withCredentials(new AWSCredentialsProvider() {
                    @Override
                    public AWSCredentials getCredentials() {
                        // provide actual IAM access key and secret key here
                        return new BasicAWSCredentials("access-key", "secret-key");
                    }

                    @Override
                    public void refresh() {
                    }
                }
            )
            .build();
    }

    public String GenerateEmbedUrlForAnonymousUser(
        final String accountId, // YOUR AWS ACCOUNT ID
        final String initialTopicId, // Q TOPIC ID TO WHICH THE CONSTRUCTED URL POINTS AND EXPERIENCE PREPOPULATES INITIALLY
        final String namespace, // ANONYMOUS EMBEDDING REQUIRES SPECIFYING A VALID NAMESPACE FOR WHICH YOU WANT THE EMBEDDING URL
        final List<String> authorizedResourceArns, // Q TOPIC ARN LIST TO EMBED
        final List<String> allowedDomains, // RUNTIME ALLOWED DOMAINS FOR EMBEDDING
        final List<SessionTag> sessionTags // SESSION TAGS USED FOR ROW-LEVEL SECURITY
    ) throws Exception {
        AnonymousUserEmbeddingExperienceConfiguration experienceConfiguration = new AnonymousUserEmbeddingExperienceConfiguration();
        AnonymousUserGenerativeQnAEmbeddingConfiguration generativeQnAConfiguration = new AnonymousUserGenerativeQnAEmbeddingConfiguration();
        generativeQnAConfiguration.setInitialTopicId(initialTopicId);
        experienceConfiguration.setGenerativeQnA(generativeQnAConfiguration);

        GenerateEmbedUrlForAnonymousUserRequest generateEmbedUrlForAnonymousUserRequest = new GenerateEmbedUrlForAnonymousUserRequest()
            .withAwsAccountId(accountId)
            .withNamespace(namespace)
            .withAuthorizedResourceArns(authorizedResourceArns)
            .withExperienceConfiguration(experienceConfiguration)
            .withSessionTags(sessionTags)
            .withSessionLifetimeInMinutes(600L); // OPTIONAL: VALUE CAN BE [15-600]. DEFAULT: 600
            .withAllowedDomains(allowedDomains);

        GenerateEmbedUrlForAnonymousUserResult result = quickSightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserRequest);

        return result.getEmbedUrl();
    }

}
```

#### JavaScript
<a name="embedded-analytics-gen-bi-anonymous-users-js"></a>

**참고**  
임베드 URL 생성 API는 브라우저에서 직접 호출할 수 없습니다. 대신 Node.JS 예제를 참조하세요.

#### Python3
<a name="embedded-analytics-gen-bi-anonymous-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError
import time

# Create QuickSight and STS clients
quicksightClient = boto3.client('quicksight',region_name='us-west-2')
sts = boto3.client('sts')

# Function to generate embedded URL for anonymous user
# accountId: YOUR AWS ACCOUNT ID
# topicId: Topic ID to embed
# quicksightNamespace: VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
# authorizedResourceArns: TOPIC ARN LIST TO EMBED
# allowedDomains: RUNTIME ALLOWED DOMAINS FOR EMBEDDING
# sessionTags: SESSION TAGS USED FOR ROW-LEVEL SECURITY
def generateEmbedUrlForAnonymousUser(accountId, quicksightNamespace, authorizedResourceArns, allowedDomains, sessionTags):
    try:
        response = quicksightClient.generate_embed_url_for_anonymous_user(
            AwsAccountId = accountId,
            Namespace = quicksightNamespace,
            AuthorizedResourceArns = authorizedResourceArns,
            AllowedDomains = allowedDomains,
            ExperienceConfiguration = {
                'GenerativeQnA': {
                        'InitialTopicId': topicId
                    }
            },
            SessionTags = sessionTags,
            SessionLifetimeInMinutes = 600
        )
            
        return {
            'statusCode': 200,
            'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
            'body': json.dumps(response),
            'isBase64Encoded':  bool('false')
        }
    except ClientError as e:
        print(e)
        return "Error generating embeddedURL: " + str(e)
```

#### Node.js
<a name="embedded-analytics-gen-bi-anonymous-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    region: 'us-east-1',
});

quicksightClient.generateEmbedUrlForAnonymousUser({
    'AwsAccountId': '111122223333',
    'Namespace': 'DEFAULT'
    'AuthorizedResourceArns': '["topic-arn-topicId1","topic-arn-topicId2"]',
    'AllowedDomains': allowedDomains,
    'ExperienceConfiguration': { 
        'GenerativeQnA': {
            'InitialTopicId': 'U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f'
        }
    },
    'SessionTags': '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]',
    'SessionLifetimeInMinutes': 15
}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

#### .NET/C\$1
<a name="embedded-analytics-gen-bi-anonymous-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 Q 검색 창에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 Q 검색 창을 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateGenerativeQnAEmbedUrlForAnonymousUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                AnonymousUserGenerativeQnAEmbeddingConfiguration anonymousUserGenerativeQnAEmbeddingConfiguration
                    = new AnonymousUserGenerativeQnAEmbeddingConfiguration
                    {
                        InitialTopicId = "U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f"
                    };
                AnonymousUserEmbeddingExperienceConfiguration anonymousUserEmbeddingExperienceConfiguration
                    = new AnonymousUserEmbeddingExperienceConfiguration
                    {
                        GenerativeQnA = anonymousUserGenerativeQnAEmbeddingConfiguration
                    }; 
                
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForAnonymousUserAsync(new GenerateEmbedUrlForAnonymousUserRequest
                    {
                        AwsAccountId = "111122223333",
                        Namespace = "DEFAULT",
                        AuthorizedResourceArns '["topic-arn-topicId1","topic-arn-topicId2"]',
                        AllowedDomains = allowedDomains,
                        ExperienceConfiguration = anonymousUserEmbeddingExperienceConfiguration,
                        SessionTags = '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]',
                        SessionLifetimeInMinutes = 15,
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

#### AWS CLI
<a name="embedded-analytics-gen-bi-anonymous-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForAnonymousUser`에 대한 권한이 활성화되어 있어야 합니다.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_generative_qna_role" \
     --role-session-name anonymous caller
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터의 경우, `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_q_search_bar_role/QuickSightEmbeddingAnonymousPolicy`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다. 또한 각 세션을 분리하고 구분할 수 있습니다. 로드 밸런싱 등을 위해 여러 웹 서버를 사용하는 경우, 세션이 다른 서버에 다시 연결되면 새 세션이 시작됩니다.

대시보드에 대해 서명된 URL을 가져오려면, 앱 서버에서 `generate-embed-url-for-anynymous-user`을(를) 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제는 웹 포털 또는 앱을 익명으로 방문하는 사용자에 대해 서버 측 직접 호출을 사용하여 임베디드 대시보드의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 111122223333 \
--namespace default-or-something-else \
--authorized-resource-arns '["topic-arn-topicId","topic-arn-topicId2"]' \
--allowed-domains '["domain1","domain2"]' \
--experience-configuration 'GenerativeQnA={InitialTopicId="topicId1"}' \
--session-tags '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]' \
--session-lifetime-in-minutes 15
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

### 3단계: 생성형 Q&A 환경 URL 임베드
<a name="embedded-analytics-gen-bi-anonymous-users-step-3"></a>

다음 섹션에서는 웹 사이트 또는 애플리케이션 페이지에 생성형 Q&A 환경 URL을 임베드하는 방법을 알아볼 수 있습니다. [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여이 작업을 수행할 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ 생성형 Q&A 환경을 HTML 페이지에 배치합니다.
+ 애플리케이션 요구 사항에 맞게 임베디드 환경의 레이아웃과 모양을 사용자 지정합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

앱에 포함할 수 있는 URL을 생성하러면, `GenerateEmbedUrlForAnonymousUser` API 작업을 직접 호출하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code` 값을 제공합니다.

다음은 `generate-embed-url-for-anonymous-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.{
     "Status": "200",
     "EmbedUrl": "https://quicksightdomain/embedding/12345/q/search...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에 생성형 Q&A 환경을 임베딩](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다.

생성형 Q&A 환경을 호스팅할 도메인이 Amazon Quick Sight 구독에 대해 승인된 도메인 *목록인 허용* 목록에 있는지 확인합니다. 이 요건은 미승인 도메인이 임베디드 생성형 Q&A 환경을 호스팅하지 못하도록 방지하여 데이터를 보호합니다. 임베디드 생성형 Q&A 환경의 도메인 추가에 대한 자세한 정보는 [도메인 관리](manage-domains.md) 섹션을 참조하세요.

Amazon Quick Sight 임베딩 SDK를 사용하여 애플리케이션에 맞게 임베디드 생성형 Q&A 환경의 레이아웃과 모양을 사용자 지정할 수 있습니다. `panelType` 속성을 사용하여 애플리케이션에서 렌더링할 때 생성형 Q&A 환경의 랜딩 상태를 구성합니다. `panelType` 속성을 `'FULL'`로 설정하여 전체 생성형 Q&A 환경 패널을 렌더링합니다. 이 패널은 Amazon Quick Sight 사용자가 Amazon Quick Sight 콘솔에서 겪는 경험과 유사합니다. 패널의 프레임 높이는 사용자 상호 작용에 따라 변경되지 않으며 `frameOptions.height` 속성에서 설정한 값을 존중합니다. 아래 이미지에서는 `panelType` 값을 `'FULL'`로 설정할 때 렌더링하는 생성형 Q&A 환경 패널을 보여줍니다.

`panelType` 속성을 `'SEARCH_BAR'`로 설정하여 생성형 Q&A 환경 패널을 검색 표시줄로 렌더링합니다. 이 검색 표시줄은 Q Search Bar가 애플리케이션에 임베드될 때 렌더링하는 방식과 유사합니다. 생성형 Q&A 검색 표시줄은 주제 선택 옵션, 질문 제안 목록, 응답 패널 또는 핀보드를 표시하는 더 큰 패널로 확장됩니다.

기본 생성형 Q&A 검색 표시줄의 기본 최소 높이는 임베디드 자산이 로드될 때 렌더링됩니다. 검색 표시줄 환경을 최적화하려면 `frameOptions.height` 값을 `"38px"`로 설정하는 것이 좋습니다. `focusedHeight` 속성을 사용하여 주제 선택 드롭다운 및 질문 제안 목록의 최적 크기를 설정합니다. `expandedHeight` 속성을 사용하여 답변 패널과 핀보드의 최적 크기를 설정합니다. `'SEARCH_BAR'` 옵션을 선택하는 경우 애플리케이션에서 원치 않는 콘텐츠 이동을 방지하기 위해 상위 컨테이너를 절대 위치로 스타일링하는 것이 좋습니다. 아래 이미지에서는 `panelType` 값을 `'SEARCH_BAR'`로 설정할 때 렌더링하는 생성형 Q&A 환경 검색 표시줄을 보여줍니다.

`panelType` 속성을 구성한 후 Amazon Quick Sight 임베딩 SDK를 사용하여 생성형 Q&A 경험의 다음 속성을 사용자 지정합니다.
+ 생성형 Q&A 패널의 제목(`panelType: FULL` 옵션에만 적용됨)입니다.
+ 검색 표시줄의 자리 표시자 텍스트입니다.
+ 주제 선택을 허용할지 여부입니다.
+ 주제 이름을 표시할지 숨길지 여부입니다.
+ Amazon Q 아이콘을 표시할지 숨길지 여부입니다(`panelType: FULL` 옵션에만 적용됨).
+ 핀보드를 숨길지 여부입니다.
+ 사용자가 생성형 Q&A 패널을 전체 화면으로 최대화할 수 있는지 여부입니다.
+ 생성형 Q&A 패널의 테마입니다. 사용자 지정 테마 ARN을 SDK에 전달하여 프레임 콘텐츠의 모양을 변경할 수 있습니다. Amazon Quick Sight 스타터 테마는 임베디드 생성형 BI 패널에서 지원되지 않습니다. Amazon Quick Sight 스타터 테마를 사용하려면 Amazon Quick Sight에 사용자 지정 테마로 저장합니다.

Amazon Quick Sight 임베딩 SDK를 사용하는 경우 페이지의 생성형 Q&A 환경은 상태에 따라 동적으로 크기가 조정됩니다. Amazon Quick Sight 임베딩 SDK를 사용하면 생성형 Q&A 환경 내에서 파라미터를 제어하고 페이지 로드 완료, 상태 변경 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

#### SDK 2.0
<a name="embedded-analytics-gen-bi-anonymous-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>
    <head>
        <title>Generative Q&A Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.7.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedGenerativeQnA = async() => {    
                const {createEmbeddingContext} = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    // Optional panel settings. Default behavior is equivalent to {panelType: 'FULL'}
                    panelOptions: {
                        panelType: 'FULL',
                        title: 'custom title', // Optional
                        showQIcon: false, // Optional, Default: true
                    },
                    // Use SEARCH_BAR panel type for the landing state to be similar to embedQSearchBar
                    // with generative capability enabled topics
                    /*
                    panelOptions: {
                        panelType: 'SEARCH_BAR',
                        focusedHeight: '250px',
                        expandedHeight: '500px',
                    },
                    */
                    showTopicName: false, // Optional, Default: true
                    showPinboard: false, // Optional, Default: true
                    allowTopicSelection: false, // Optional, Default: true
                    allowFullscreen: false, // Optional, Default: true
                    searchPlaceholderText: "custom search placeholder", // Optional
                    themeOptions: { // Optional
                        themeArn: 'arn:aws:quicksight:<Region>:<AWS-Account-ID>:theme/<Theme-ID>'
                    }
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'Q_SEARCH_OPENED': {
                                // called when pinboard is shown / visuals are rendered
                                console.log("Do something when SEARCH_BAR type panel is expanded");
                                break;
                            }
                            case 'Q_SEARCH_FOCUSED': {
                                // called when question suggestions or topic selection dropdown are shown
                                console.log("Do something when SEARCH_BAR type panel is focused");
                                break;
                            }
                            case 'Q_SEARCH_CLOSED': {
                                // called when shrinked to initial bar height
                                console.log("Do something when SEARCH_BAR type panel is collapsed");
                                break;
                            }
                            case 'Q_PANEL_ENTERED_FULLSCREEN': {
                                console.log("Do something when panel enters full screen mode");
                                break;
                            }
                            case 'Q_PANEL_EXITED_FULLSCREEN': {
                                console.log("Do something when panel exits full screen mode");
                                break;
                            }
                            case 'CONTENT_LOADED': {
                                console.log("Do something after experience is loaded");
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Do something when experience fails to load");
                                break;
                            }
                        }
                    }
                };
                const embeddedGenerativeQnExperience = await embeddingContext.embedGenerativeQnA(frameOptions, contentOptions);
            };
        </script>
    </head>

    <body onload="embedGenerativeQnA()">
        <div id="experience-container"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에서 임베디드 생성형 Q&A 환경을 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

### 임베디드 생성형 Q&A 환경 기능 옵션
<a name="embedded-analytics-gen-bi-anonymous-users-step-4"></a>

임베딩 SDK를 사용하여 임베디드 생성형 Q&A 환경에 기능 옵션을 사용할 수 있습니다.

#### 생성형 Q&A 검색 표시줄 작업 호출
<a name="w2aac35c27c21c43c29c13c25b5"></a>
+ 질문 설정 - 이 기능은 생성형 Q&A 환경에 질문을 전송하고 즉시 질문을 쿼리합니다.

  ```
  embeddedGenerativeQnExperience.setQuestion('show me monthly revenue');
  ```
+ 응답 패널 닫기(생성형 Q&A 검색 표시줄 옵션에 적용) - 이 기능은 응답 패널을 닫고 iframe을 원래 검색 표시줄 상태로 되돌립니다.

  ```
  embeddedGenerativeQnExperience.close();
  ```

자세한 내용은 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

# Amazon Quick Sight Q 검색 창 임베딩(클래식)
<a name="embedding-quicksight-q"></a>


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html).

다음 주제를 사용하여 Amazon Quick Sight APIs에 Amazon Quick Sight Q 검색 창을 포함하는 방법에 대해 알아봅니다.

**Topics**
+ [등록된 사용자를 위한 Amazon Quick Sight Q 검색 창 임베딩](embedded-analytics-q-search-bar-for-authenticated-users.md)
+ [익명(미등록) 사용자를 위한 Amazon Quick Sight Q 검색 창 임베딩](embedded-analytics-q-search-bar-for-anonymous-users.md)

# 등록된 사용자를 위한 Amazon Quick Sight Q 검색 창 임베딩
<a name="embedded-analytics-q-search-bar-for-authenticated-users"></a>


|  | 
| --- |
|  적용 대상:  Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

다음 섹션에서는 Amazon Quick Sight의 등록된 사용자를 위해 임베디드 Amazon Quick Sight Q 검색 창을 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-q-bar-for-authenticated-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-q-bar-for-authenticated-users-step-2)
+ [3단계: Q 검색 창 URL 포함](#embedded-q-bar-for-authenticated-users-step-3)
+ [선택적 Amazon Quick Sight Q 검색 창 임베딩 기능](#embedded-q-bar-for-authenticated-users-step-4)

## 1단계: 권한 설정
<a name="embedded-q-bar-for-authenticated-users-step-1"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

다음 단원에서 임베디드 Q 검색 창에 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 AWS Identity and Access Management (IAM)에 대한 관리 액세스 권한이 필요합니다.

대시보드에 액세스하는 각 사용자는 Amazon Quick Sight에 대시보드에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면에서 IAM 역할을 생성합니다 AWS 계정. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 특정 사용자 풀의 임베딩 URL을 검색할 수 있는 권한을 제공해야 합니다.

와일드카드 문자 \$1를 사용하여, 특정 네임스페이스의 모든 사용자에 대해 URL을 생성할 권한을 부여할 수 있습니다. 또는 특정 네임스페이스에 있는 사용자 하위 집합에 대해 URL을 생성할 권한을 부여할 수 있습니다. 이를 위해 `quicksight:GenerateEmbedUrlForRegisteredUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForRegisteredUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자에게 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의하고 생성된 URL에 액세스할 수 있는 최대 3개의 도메인 또는 하위 도메인을 나열할 수 있는 옵션을 부여합니다. 그러면 이 URL이 개발자 웹 사이트에 포함됩니다. 파라미터에 나열된 도메인만 임베디드 Q 검색 창에 액세스할 수 있습니다. 이 조건이 없으면, 개발자는 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForRegisteredUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

다음 샘플 정책은 이러한 권한을 제공합니다.

또한 Amazon Quick Sight 독자가 될 사용자를 처음 생성하는 경우 정책에 `quicksight:RegisterUser` 권한을 추가해야 합니다.

다음 샘플 정책은 Amazon Quick Sight 리더인 처음 사용자를 위해 임베딩 URL을 검색할 수 있는 권한을 제공합니다.

마지막으로, 방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스할 때 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다.

다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

OpenID Connect 또는 Security Assertion Markup Language(SAML) 인증의 신뢰 정책에 대한 자세한 내용은, IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 아이덴티티 또는 OpenID Connect 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-q-bar-for-authenticated-users-step-2"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 Q 주제 URL을 가져오는 방법을 알아볼 수 있습니다. IAM 또는 Amazon Quick Sight 자격 증명 유형에 대한 Q 막대를 포함하려는 경우 Q 주제를 사용자와 공유합니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 앱은 사용자가 아직 없는 경우 사용자를 Amazon Quick Sight에 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

설명된 단계를 수행하면 Q 주제의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

### Java
<a name="embedded-q-bar-for-embedded-q-bar-for-authenticated-users-java"></a>

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
        import com.amazonaws.auth.AWSCredentialsProvider;
        import com.amazonaws.regions.Regions;
        import com.amazonaws.services.quicksight.AmazonQuickSight;
        import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest;
import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResult;
import com.amazonaws.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration;
import com.amazonaws.services.quicksight.model.RegisteredUserQSearchBarEmbeddingConfiguration;

        /**
 * Class to call QuickSight AWS SDK to get url for embedding the Q search bar.
        */
public class RegisteredUserQSearchBarEmbeddingConfiguration {

            private final AmazonQuickSight quickSightClient;

    public RegisteredUserQSearchBarEmbeddingConfiguration() {
        this.quickSightClient = AmazonQuickSightClientBuilder
                    .standard()
                    .withRegion(Regions.US_EAST_1.getName())
                    .withCredentials(new AWSCredentialsProvider() {
                            @Override
                            public AWSCredentials getCredentials() {
                                // provide actual IAM access key and secret key here
                                return new BasicAWSCredentials("access-key", "secret-key");
                            }

                            @Override
                            public void refresh() {
                            }
                        }
                    )
                    .build();
            }

    public String getQuicksightEmbedUrl(
            final String accountId, // AWS Account ID
            final String topicId, // Topic ID to embed
            final List<String> allowedDomains, // Runtime allowed domain for embedding
            final String userArn // Registered user arn to use for embedding. Refer to Get Embed Url section in developer portal to find how to get user arn for a QuickSight user.
            ) throws Exception {
        final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = new RegisteredUserEmbeddingExperienceConfiguration()
                .withQSearchBar(new RegisteredUserQSearchBarEmbeddingConfiguration().withInitialTopicId(topicId));
        final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest = new GenerateEmbedUrlForRegisteredUserRequest();
        generateEmbedUrlForRegisteredUserRequest.setAwsAccountId(accountId);
        generateEmbedUrlForRegisteredUserRequest.setUserArn(userArn);
        generateEmbedUrlForRegisteredUserRequest.setAllowedDomains(allowedDomains);
        generateEmbedUrlForRegisteredUserRequest.setExperienceConfiguration(QSearchBar);

        final GenerateEmbedUrlForRegisteredUserResult generateEmbedUrlForRegisteredUserResult = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest);

        return generateEmbedUrlForRegisteredUserResult.getEmbedUrl();
            }
        }
```

### JavaScript
<a name="embedded-q-bar-for-embedded-q-bar-for-authenticated-users-js"></a>

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function generateEmbedUrlForRegisteredUser(
    accountId,
    topicId, // Topic ID to embed
    openIdToken, // Cognito-based token
    userArn, // registered user arn
    roleArn, // IAM user role to use for embedding
    sessionName, // Session name for the roleArn assume role
    allowedDomains, // Runtime allowed domain for embedding
    getEmbedUrlCallback, // GetEmbedUrl success callback method
    errorCallback // GetEmbedUrl error callback method
    ) {
    const stsClient = new AWS.STS();
    let stsParams = {
        RoleSessionName: sessionName,
        WebIdentityToken: openIdToken,
        RoleArn: roleArn
        }
    
    stsClient.assumeRoleWithWebIdentity(stsParams, function(err, data) {
        if (err) {
            console.log('Error assuming role');
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const getQSearchBarParams = {
        "AwsAccountId": accountId,
                "ExperienceConfiguration": {
                    "QSearchBar": {
                        "InitialTopicId": topicId
                    }
                },
                "UserArn": userArn,
        "AllowedDomains": allowedDomains,
        "SessionLifetimeInMinutes": 600
    };

            const quicksightGetQSearchBar = new AWS.QuickSight({
        region: process.env.AWS_REGION,
                credentials: {
                    accessKeyId: data.Credentials.AccessKeyId,
                    secretAccessKey: data.Credentials.SecretAccessKey,
                    sessionToken: data.Credentials.SessionToken,
                    expiration: data.Credentials.Expiration
                }
    });

            quicksightGetQSearchBar.generateEmbedUrlForRegisteredUser(getQSearchBarParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const result = {
                "statusCode": 200,
                "headers": {
                            "Access-Control-Allow-Origin": "*", // Use your website domain to secure access to GetEmbedUrl API
                    "Access-Control-Allow-Headers": "Content-Type"
                },
                "body": JSON.stringify(data),
                "isBase64Encoded": false
            }
                    getEmbedUrlCallback(result);
                }
            });
        }
    });
}
```

### Python3
<a name="embedded-q-bar-for-embedded-q-bar-for-authenticated-users-python"></a>

```
import json
import boto3
from botocore.exceptions import ClientError

sts = boto3.client('sts')

# Function to generate embedded URL  
# accountId: AWS account ID
# topicId: Topic ID to embed
# userArn: arn of registered user
# allowedDomains: Runtime allowed domain for embedding
# roleArn: IAM user role to use for embedding
# sessionName: session name for the roleArn assume role
def getEmbeddingURL(accountId, topicId, userArn, allowedDomains, roleArn, sessionName):
    try:
        assumedRole = sts.assume_role(
            RoleArn = roleArn,
            RoleSessionName = sessionName,
        )
    except ClientError as e:
        return "Error assuming role: " + str(e)
    else: 
        assumedRoleSession = boto3.Session(
            aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
            aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
            aws_session_token = assumedRole['Credentials']['SessionToken'],
        )
        try:
            quicksightClient = assumedRoleSession.client('quicksight', region_name='us-west-2')
            response = quicksightClient.generate_embed_url_for_registered_user(
                AwsAccountId=accountId,
                ExperienceConfiguration = {
                    "QSearchBar": {
                        "InitialTopicId": topicId
                    }
                },
                UserArn = userArn,
                AllowedDomains = allowedDomains,
                SessionLifetimeInMinutes = 600
            )
            
            return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
                'body': json.dumps(response),
                'isBase64Encoded':  bool('false')
            }
        except ClientError as e:
            return "Error generating embedding url: " + str(e)
```

### Node.js
<a name="embedded-q-bar-for-embedded-q-bar-for-authenticated-users-node"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    apiConfig: require('./quicksight-2018-04-01.min.json'),
    region: 'us-east-1',
});

quicksightClient.generateEmbedUrlForRegisteredUser({
    'AwsAccountId': '111122223333',
    'ExperienceConfiguration': { 
        'QSearchBar': {
            'InitialTopicId': 'U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f'
        }
    },
    'UserArn': 'REGISTERED_USER_ARN',
    'AllowedDomains': allowedDomains,
    'SessionLifetimeInMinutes': 100
}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    { 
        Status: 200,
        EmbedUrl: "https://quicksightdomain/embed/12345/dashboards/67890/sheets/12345/visuals/67890...",
        RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' 
    }
```

### .NET/C\$1
<a name="embedded-q-bar-for-embedded-q-bar-for-authenticated-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 Q 검색 창에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 Q 검색 창을 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateDashboardEmbedUrlForRegisteredUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                RegisteredUserQSearchBarEmbeddingConfiguration registeredUserQSearchBarEmbeddingConfiguration
                    = new RegisteredUserQSearchBarEmbeddingConfiguration
                    {
                        InitialTopicId = "U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f"
                    };
                RegisteredUserEmbeddingExperienceConfiguration registeredUserEmbeddingExperienceConfiguration
                    = new RegisteredUserEmbeddingExperienceConfiguration
                    {
                        QSearchBar = registeredUserQSearchBarEmbeddingConfiguration
                    }; 
                
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForRegisteredUserAsync(new GenerateEmbedUrlForRegisteredUserRequest
                    {
                        AwsAccountId = "111122223333",
                        ExperienceConfiguration = registeredUserEmbeddingExperienceConfiguration,
                        UserArn = "REGISTERED_USER_ARN",
                        AllowedDomains = allowedDomains,
                        SessionLifetimeInMinutes = 100
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

### AWS CLI
<a name="embedded-q-bar-for-embedded-q-bar-for-authenticated-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForRegisteredUser`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 Q 검색 창의 주제를 사용할 때 사용자를 추가하는 적시 접근 방식을 취하려면, 역할에 `quicksight:RegisterUser`에 대한 사용 권한도 활성화해야 합니다.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_q_search_bar_role" \
     --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터의 경우, `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_q_search_bar_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 Q 검색 창에 처음 액세스할 때 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
    --aws-account-id 111122223333 \
    --namespace default \
    --identity-type IAM \
    --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_q_search_bar_role" \
    --user-role READER \
    --user-name jhnd \
    --session-name "john.doe@example.com" \
    --email john.doe@example.com \
    --region us-east-1 \
    --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는 설정을 위해 `RegisterUser`를 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 Amazon 리소스 이름(ARN)을 얻는 데 `DescribeUser`을(를) 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때 대시보드가 공유되는 그룹에이 사용자를 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
    --aws-account-id=111122223333 \
    --namespace=default \
    --group-name=financeusers \
    --member-name="embedding_quicksight_q_search_bar_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 대시보드에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 대시보드에 대해 서명된 URL을 가져오려면 앱 서버에서 `generate-embed-url-for-registered-user`을 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 Single Sign-On(IAM Identity Center)을 통해 인증된 사용자에 대한 서버 측 호출을 사용하여 임베디드 대시보드의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-registered-user \
--aws-account-id 111122223333 \
--session-lifetime-in-minutes 600 \
--user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_q_search_bar_role/embeddingsession
--allowed-domains '["domain1","domain2"]' \
--experience-configuration QSearchBar={InitialTopicId=U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f}
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: Q 검색 창 URL 포함
<a name="embedded-q-bar-for-authenticated-users-step-3"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html).

다음 섹션에서는 3단계의 Q 검색 창 URL을 웹사이트 또는 애플리케이션 페이지에 포함하는 방법을 알아볼 수 있습니다. [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여이 작업을 수행할 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ Q 검색 창을 HTML 페이지에 배치하세요.
+ Q 검색창에 파라미터를 전달합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

앱에 포함할 수 있는 URL을 생성하러면, `GenerateEmbedUrlForRegisteredUser` API 작업을 직접 호출하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code` 값을 제공합니다.

다음은 `generate-embed-url-for-registered-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
{
     "Status": "200",
     "EmbedUrl": "https://quicksightdomain/embedding/12345/q/search...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에 Q 검색 창을 임베드](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다.

이렇게 하려면 임베디드 Q 검색 창을 호스팅할 도메인이 Amazon Quick Sight 구독에 대해 승인된 도메인 목록인 *허용 목록에* 있는지 확인합니다. 이 요건은 임베디드 대시보드에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 Q 검색 창에 대한 도메인 추가에 대한 자세한 내용은 [도메인 관리 및 임베딩](https://docs.aws.amazon.com/quicksight/latest/user/manage-qs-domains-and-embedding.html)을 참조하세요.

Amazon Quick Sight 임베딩 SDK를 사용하는 경우 페이지의 Q 검색 창은 상태에 따라 동적으로 크기가 조정됩니다. Amazon Quick Sight 임베딩 SDK를 사용하면 Q 검색 창에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

### SDK 2.0
<a name="embedded-q-bar-for-authenticated-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Q Search Bar Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedQSearchBar = async() => {    
                const {
                    createEmbeddingContext,
                } = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    hideTopicName: false, 
                    theme: '<YOUR_THEME_ID>',
                    allowTopicSelection: true,
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'Q_SEARCH_OPENED': {
                                console.log("Do something when Q Search content expanded");
                                break;
                            }
                            case 'Q_SEARCH_CLOSED': {
                                console.log("Do something when Q Search content collapsed");
                                break;
                            }
                            case 'Q_SEARCH_SIZE_CHANGED': {
                                console.log("Do something when Q Search size changed");
                                break;
                            }
                            case 'CONTENT_LOADED': {
                                console.log("Do something when the Q Search is loaded.");
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Do something when the Q Search fails loading.");
                                break;
                            }
                        }
                    }
                };
                const embeddedDashboardExperience = await embeddingContext.embedQSearchBar(frameOptions, contentOptions);
            };
        </script>
    </head>

    <body onload="embedQSearchBar()">
        <div id="experience-container"></div>
    </body>

</html>
```

### SDK 1.0
<a name="embedded-q-bar-for-authenticated-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>QuickSight Q Search Bar Embedding</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@1.18.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            var session

            function onError(payload) {
                console.log("Do something when the session fails loading");
            }

            function onOpen() {
                console.log("Do something when the Q search bar opens");
            }

            function onClose() {
                console.log("Do something when the Q search bar closes");
            }

            function embedQSearchBar() {
                var containerDiv = document.getElementById("embeddingContainer");
                var options = {
                    url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode", // replace this dummy url with the one generated via embedding API
                    container: containerDiv,
                    width: "1000px",
                    locale: "en-US",
                    qSearchBarOptions: {
                        expandCallback: onOpen,
                        collapseCallback: onClose,
                        iconDisabled: false,
                        topicNameDisabled: false, 
                        themeId: 'bdb844d0-0fe9-4d9d-b520-0fe602d93639',
                        allowTopicSelection: true
                    }
                };
                session = QuickSightEmbedding.embedQSearchBar(options);
                session.on("error", onError);
            }

            function onCountryChange(obj) {
                session.setParameters({country: obj.value});
            }
        </script>
    </head>

    <body onload="embedQSearchBar()">
        <div id="embeddingContainer"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 대시보드를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

## 선택적 Amazon Quick Sight Q 검색 창 임베딩 기능
<a name="embedded-q-bar-for-authenticated-users-step-4"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

임베딩 SDK를 사용하여 내장된 Q 검색 창에 다음과 같은 선택적 기능을 사용할 수 있습니다.

### Q 검색 창 작업 간접 호출
<a name="w2aac35c27c21c43c31c15c21b7"></a>

다음 옵션은 Q 검색 창 임베딩에만 지원됩니다.
+ Q 검색 창 질문 설정 - 이 기능은 질문을 Q 검색 창으로 보내고 질문을 즉시 쿼리합니다. 또한 Q 팝오버도 자동으로 열립니다.

  ```
  qBar.setQBarQuestion('show me monthly revenue');
  ```
+ Q 팝오버 닫기 - 이 기능은 Q 팝오버를 닫고 iframe을 원래 Q 검색창 크기로 되돌립니다.

  ```
  qBar.closeQPopover();
  ```

자세한 내용은 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

# 익명(미등록) 사용자를 위한 Amazon Quick Sight Q 검색 창 임베딩
<a name="embedded-analytics-q-search-bar-for-anonymous-users"></a>


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

다음 섹션에서는 익명(미등록) 사용자를 위해 임베디드 Amazon Quick Sight Q 검색 창을 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](#embedded-q-bar-for-anonymous-users-step-1)
+ [2단계: 인증 코드가 첨부된 URL 생성](#embedded-q-bar-for-anonymous-users-step-2)
+ [3단계: Q 검색 창 URL 포함](#embedded-q-bar-for-anonymous-users-step-3)
+ [선택적 Amazon Quick Sight Q 검색 창 임베딩 기능](#embedded-q-bar-for-anonymous-users-step-4)

## 1단계: 권한 설정
<a name="embedded-q-bar-for-anonymous-users-step-1"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

다음 단원에서 임베디드 Q 검색 창에 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 AWS Identity and Access Management (IAM)에 대한 관리 액세스 권한이 필요합니다.

Q 검색 창에 액세스하는 각 사용자는 Amazon Quick Sight에 Q 검색 창에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면에서 IAM 역할을 생성합니다 AWS 계정. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 특정 사용자 풀의 임베딩 URL을 검색할 수 있는 권한을 제공해야 합니다.

와일드카드 문자 \$1를 사용하여, 특정 네임스페이스의 모든 사용자에 대해 URL을 생성할 권한을 부여할 수 있습니다. 또는 특정 네임스페이스에 있는 사용자 하위 집합에 대해 URL을 생성할 권한을 부여할 수 있습니다. 이를 위해 `quicksight:GenerateEmbedUrlForAnonymousUser`을(를) 추가합니다.

IAM 정책에 개발자가 `GenerateEmbedUrlForAnonymousUser` API 작업의 `AllowedDomains` 파라미터에 나열할 수 있는 도메인을 제한하는 조건을 만들 수 있습니다. `AllowedDomains` 파라미터는 선택 파라미터입니다. 개발자에게 **Amazon Quick Sight 관리** 메뉴에 구성된 정적 도메인을 재정의하고 생성된 URL에 액세스할 수 있는 최대 3개의 도메인 또는 하위 도메인을 나열할 수 있는 옵션을 부여합니다. 그러면 이 URL이 개발자 웹 사이트에 포함됩니다. 파라미터에 나열된 도메인만 임베디드 Q 검색 창에 액세스할 수 있습니다. 이 조건이 없으면, 개발자는 인터넷에 있는 모든 도메인을 `AllowedDomains` 파라미터에 나열할 수 있습니다.

개발자가 이 파라미터로 사용할 수 있는 도메인을 제한하려면 IAM 정책에 `AllowedEmbeddingDomains` 조건을 추가하세요. `AllowedDomains` 파라미터에 대한 자세한 내용은 Amazon Quick Sight API 참조의 [GenerateEmbedUrlForAnonymousUser](https://docs.aws.amazon.com//quicksight/latest/APIReference/API_GenerateEmbedUrlForAnonymousUser.html)를 참조하세요. ** 

**IAM 조건 연산자에 대한 보안 모범 사례**  
잘못 구성된 IAM 조건 연산자는 URL 변형을 통해 임베디드 Quick 리소스에 대한 무단 액세스를 허용할 수 있습니다. IAM 정책에서 `quicksight:AllowedEmbeddingDomains` 조건 키를 사용하는 경우 특정 도메인을 허용하거나 특별히 허용되지 않는 모든 도메인을 거부하는 조건 연산자를 사용합니다. IAM 조건 연산자에 대한 자세한 내용은 [IAM 사용 설명서의 IAM JSON 정책 요소: 조건 연산자를](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html) 참조하세요.  
다양한 URL 변형이 동일한 리소스를 가리킬 수 있습니다. 예를 들어 다음 URLs 모두 동일한 콘텐츠로 확인됩니다.  
`https://example.com`
`https://example.com/`
`https://Example.com`
정책에서 이러한 URL 변형을 고려하지 않는 연산자를 사용하는 경우 공격자는 동등한 URL 변형을 제공하여 제한을 우회할 수 있습니다.  
IAM 정책이 적절한 조건 연산자를 사용하여 우회 취약성을 방지하고 의도한 도메인만 임베디드 리소스에 액세스할 수 있는지 확인해야 합니다.

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면, 애플리케이션이 사용자를 대신하여 역할을 맡아서 Q 검색 창을 열 수 있습니다. 다음 예제는 샘플 신뢰 정책입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowLambdaFunctionsToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AllowEC2InstancesToAssumeThisRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

자세한 내용은 IAM 사용 설명서의 [IAM의 임시 보안 인증](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 단원을 참조하세요.

## 2단계: 인증 코드가 첨부된 URL 생성
<a name="embedded-q-bar-for-anonymous-users-step-2"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html).

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 Q 주제 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 앱은 사용자가 아직 없는 경우 사용자를 Amazon Quick Sight에 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/AnonymousUserQSearchBarEmbeddingConfiguration.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/AnonymousUserQSearchBarEmbeddingConfiguration.html) 단원을 참조하십시오.

### Java
<a name="embedded-q-bar-for-anonymous-users-java"></a>

```
        import java.util.List;
        import com.amazonaws.auth.AWSCredentials;
        import com.amazonaws.auth.AWSCredentialsProvider;
        import com.amazonaws.auth.BasicAWSCredentials;
        import com.amazonaws.regions.Regions;
        import com.amazonaws.services.quicksight.AmazonQuickSight;
        import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
        import com.amazonaws.services.quicksight.model.AnonymousUserQSearchBarEmbeddingConfiguration;
        import com.amazonaws.services.quicksight.model.AnonymousUserEmbeddingExperienceConfiguration;
        import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserRequest;
        import com.amazonaws.services.quicksight.model.GenerateEmbedUrlForAnonymousUserResult;
        import com.amazonaws.services.quicksight.model.SessionTag;


        /**
        * Class to call QuickSight AWS SDK to generate embed url for anonymous user.
        */
        public class GenerateEmbedUrlForAnonymousUserExample {

            private final AmazonQuickSight quickSightClient;

            public GenerateEmbedUrlForAnonymousUserExample() {
                quickSightClient = AmazonQuickSightClientBuilder
                    .standard()
                    .withRegion(Regions.US_EAST_1.getName())
                    .withCredentials(new AWSCredentialsProvider() {
                            @Override
                            public AWSCredentials getCredentials() {
                                // provide actual IAM access key and secret key here
                                return new BasicAWSCredentials("access-key", "secret-key");
                            }

                            @Override
                            public void refresh() {
                            }
                        }
                    )
                    .build();
            }

            public String GenerateEmbedUrlForAnonymousUser(
                final String accountId, // YOUR AWS ACCOUNT ID
                final String initialTopicId, // Q TOPIC ID TO WHICH THE CONSTRUCTED URL POINTS AND SEARCHBAR PREPOPULATES INITIALLY
                final String namespace, // ANONYMOUS EMBEDDING REQUIRES SPECIFYING A VALID NAMESPACE FOR WHICH YOU WANT THE EMBEDDING URL
                final List<String> authorizedResourceArns, // Q SEARCHBAR TOPIC ARN LIST TO EMBED
                final List<String> allowedDomains, // RUNTIME ALLOWED DOMAINS FOR EMBEDDING
                final List<SessionTag> sessionTags // SESSION TAGS USED FOR ROW-LEVEL SECURITY
            ) throws Exception {
                AnonymousUserEmbeddingExperienceConfiguration experienceConfiguration = new AnonymousUserEmbeddingExperienceConfiguration();
                AnonymousUserQSearchBarEmbeddingConfiguration qSearchBarConfiguration = new AnonymousUserQSearchBarEmbeddingConfiguration();
                qSearchBarConfiguration.setInitialTopicId(initialTopicId);
                experienceConfiguration.setQSearchBar(qSearchBarConfiguration);

                GenerateEmbedUrlForAnonymousUserRequest generateEmbedUrlForAnonymousUserRequest = new GenerateEmbedUrlForAnonymousUserRequest()
                    .withAwsAccountId(accountId)
                    .withNamespace(namespace)
                    .withAuthorizedResourceArns(authorizedResourceArns)
                    .withExperienceConfiguration(experienceConfiguration)
                    .withSessionTags(sessionTags)
                    .withSessionLifetimeInMinutes(600L); // OPTIONAL: VALUE CAN BE [15-600]. DEFAULT: 600
                    .withAllowedDomains(allowedDomains);

                GenerateEmbedUrlForAnonymousUserResult qSearchBarEmbedUrl = quickSightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserRequest);

                return qSearchBarEmbedUrl.getEmbedUrl();
            }

        }
```

### JavaScript
<a name="embedded-q-bar-for-anonymous-users-js"></a>

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function generateEmbedUrlForAnonymousUser(
    accountId, // YOUR AWS ACCOUNT ID
    initialTopicId, // Q TOPIC ID TO WHICH THE CONSTRUCTED URL POINTS
    quicksightNamespace, // VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
    authorizedResourceArns, // Q SEARCHBAR TOPIC ARN LIST TO EMBED
    allowedDomains, // RUNTIME ALLOWED DOMAINS FOR EMBEDDING
    sessionTags, // SESSION TAGS USED FOR ROW-LEVEL SECURITY
    generateEmbedUrlForAnonymousUserCallback, // SUCCESS CALLBACK METHOD
    errorCallback // ERROR CALLBACK METHOD
    ) {
    const experienceConfiguration = {
        "QSearchBar": {
            "InitialTopicId": initialTopicId // TOPIC ID CAN BE FOUND IN THE URL ON THE TOPIC AUTHOR PAGE
        }
    };
    
    const generateEmbedUrlForAnonymousUserParams = {
        "AwsAccountId": accountId,
        "Namespace": quicksightNamespace,
        "AuthorizedResourceArns": authorizedResourceArns,
        "AllowedDomains": allowedDomains,
        "ExperienceConfiguration": experienceConfiguration,
        "SessionTags": sessionTags,
        "SessionLifetimeInMinutes": 600
    };

    const quicksightClient = new AWS.QuickSight({
        region: process.env.AWS_REGION,
        credentials: {
            accessKeyId: AccessKeyId,
            secretAccessKey: SecretAccessKey,
            sessionToken: SessionToken,
            expiration: Expiration
        }
    });

    quicksightClient.generateEmbedUrlForAnonymousUser(generateEmbedUrlForAnonymousUserParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const result = {
                "statusCode": 200,
                "headers": {
                    "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO THIS API
                    "Access-Control-Allow-Headers": "Content-Type"
                },
                "body": JSON.stringify(data),
                "isBase64Encoded": false
            }
            generateEmbedUrlForAnonymousUserCallback(result);
        }
    });
}
```

### Python3
<a name="embedded-q-bar-for-anonymous-users-py"></a>

```
import json
import boto3
from botocore.exceptions import ClientError
import time

# Create QuickSight and STS clients
quicksightClient = boto3.client('quicksight',region_name='us-west-2')
sts = boto3.client('sts')

# Function to generate embedded URL for anonymous user
# accountId: YOUR AWS ACCOUNT ID
# quicksightNamespace: VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
# authorizedResourceArns: TOPIC ARN LIST TO EMBED
# allowedDomains: RUNTIME ALLOWED DOMAINS FOR EMBEDDING
# experienceConfiguration: configuration which specifies the TOPIC ID to point URL to
# sessionTags: SESSION TAGS USED FOR ROW-LEVEL SECURITY
def generateEmbedUrlForAnonymousUser(accountId, quicksightNamespace, authorizedResourceArns, allowedDomains, experienceConfiguration, sessionTags):
    try:
        response = quicksightClient.generate_embed_url_for_anonymous_user(
            AwsAccountId = accountId,
            Namespace = quicksightNamespace,
            AuthorizedResourceArns = authorizedResourceArns,
            AllowedDomains = allowedDomains,
            ExperienceConfiguration = experienceConfiguration,
            SessionTags = sessionTags,
            SessionLifetimeInMinutes = 600
        )
            
        return {
            'statusCode': 200,
            'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
            'body': json.dumps(response),
            'isBase64Encoded':  bool('false')
        }
    except ClientError as e:
        print(e)
        return "Error generating embeddedURL: " + str(e)
```

### Node.js
<a name="embedded-q-bar-for-anonymous-users-nodejs"></a>

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 생성하는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
const https = require('https');

var quicksightClient = new AWS.Service({
    apiConfig: require('./quicksight-2018-04-01.min.json'),
    region: 'us-east-1',
});

quicksightClient.generateEmbedUrlForAnonymousUser({
    'AwsAccountId': '111122223333',
    'Namespace': 'DEFAULT'
    'AuthorizedResourceArns': '["topic-arn-topicId1","topic-arn-topicId2"]',
    'AllowedDomains': allowedDomains,
    'ExperienceConfiguration': { 
        'QSearchBar': {
            'InitialTopicId': 'U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f'
        }
    },
    'SessionTags': '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]',
    'SessionLifetimeInMinutes': 15
}, function(err, data) {
    console.log('Errors: ');
    console.log(err);
    console.log('Response: ');
    console.log(data);
});
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
    { 
        Status: 200,
        EmbedUrl : 'https://quicksightdomain/embed/12345/dashboards/67890/sheets/12345/visuals/67890...',
        RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' 
    }
```

### .NET/C\$1
<a name="embedded-q-bar-for-anonymous-users-cs"></a>

다음 예제는 앱 서버에서 임베디드 Q 검색 창에 대한 URL를 생성하는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 Q 검색 창을 표시할 수 있습니다.

**Example**  

```
using System;
using Amazon.QuickSight;
using Amazon.QuickSight.Model;

namespace GenerateQSearchBarEmbedUrlForAnonymousUser
{
    class Program
    {
        static void Main(string[] args)
        {
            var quicksightClient = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                SessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                AnonymousUserQSearchBarEmbeddingConfiguration anonymousUserQSearchBarEmbeddingConfiguration
                    = new AnonymousUserQSearchBarEmbeddingConfiguration
                    {
                        InitialTopicId = "U4zJMVZ2n2stZflc8Ou3iKySEb3BEV6f"
                    };
                AnonymousUserEmbeddingExperienceConfiguration anonymousUserEmbeddingExperienceConfiguration
                    = new AnonymousUserEmbeddingExperienceConfiguration
                    {
                        QSearchBar = anonymousUserQSearchBarEmbeddingConfiguration
                    }; 
                
                Console.WriteLine(
                    quicksightClient.GenerateEmbedUrlForAnonymousUserAsync(new GenerateEmbedUrlForAnonymousUserRequest
                    {
                        AwsAccountId = "111122223333",
                        Namespace = "DEFAULT",
                        AuthorizedResourceArns '["topic-arn-topicId1","topic-arn-topicId2"]',
                        AllowedDomains = allowedDomains,
                        ExperienceConfiguration = anonymousUserEmbeddingExperienceConfiguration,
                        SessionTags = '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]',
                        SessionLifetimeInMinutes = 15,
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
```

### AWS CLI
<a name="embedded-q-bar-for-anonymous-users-cli"></a>

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GenerateEmbedUrlForAnonymousUser`에 대한 권한이 활성화되어 있어야 합니다.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_q_search_bar_role" \
     --role-session-name anonymous caller
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터의 경우, `export` 대신 `set`을(를) 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_q_search_bar_role/QuickSightEmbeddingAnonymousPolicy`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다. 또한 각 세션을 분리하고 구분할 수 있습니다. 로드 밸런싱 등을 위해 여러 웹 서버를 사용하는 경우, 세션이 다른 서버에 다시 연결되면 새 세션이 시작됩니다.

대시보드에 대해 서명된 URL을 가져오려면, 앱 서버에서 `generate-embed-url-for-anynymous-user`을(를) 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제는 웹 포털 또는 앱을 익명으로 방문하는 사용자에 대해 서버 측 직접 호출을 사용하여 임베디드 대시보드의 URL을 생성하는 방법을 보여줍니다.

```
aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id 111122223333 \
--namespace default-or-something-else \
--authorized-resource-arns '["topic-arn-topicId1","topic-arn-topicId2"]' \
--allowed-domains '["domain1","domain2"]' \
--experience-configuration 'QSearchBar={InitialTopicId="topicId1"}' \
--session-tags '["Key": tag-key-1,"Value": tag-value-1,{"Key": tag-key-1,"Value": tag-value-1}]' \
--session-lifetime-in-minutes 15
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GenerateEmbedUrlForRegisteredUser.html) 단원을 참조하세요. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

## 3단계: Q 검색 창 URL 포함
<a name="embedded-q-bar-for-anonymous-users-step-3"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html) 참조하세요.

다음 섹션에서는 3단계의 Q 검색 창 URL을 웹사이트 또는 애플리케이션 페이지에 포함하는 방법을 알아볼 수 있습니다. [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여이 작업을 수행할 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ Q 검색 창을 HTML 페이지에 배치하세요.
+ Q 검색창에 파라미터를 전달합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

앱에 포함할 수 있는 URL을 생성하러면, `GenerateEmbedUrlForAnonymousUser` API 작업을 직접 호출하세요. 이 URL은 5분 동안 유효하며, 결과 세션은 10시간까지 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code` 값을 제공합니다.

다음은 `generate-embed-url-for-anonymous-user`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
{
     "Status": "200",
     "EmbedUrl": "https://quicksightdomain/embedding/12345/q/search...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에 Q 검색 창을 임베드](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다.

이렇게 하려면 임베디드 Q 검색 창을 호스팅할 도메인이 Amazon Quick Sight 구독에 대해 승인된 도메인 목록인 *허용 목록에* 있는지 확인합니다. 이 요건은 임베디드 Q 검색 창에서 미승인 도메인을 제외함으로써 데이터를 보호합니다. 임베디드 Q 검색 창에 대한 도메인 추가에 대한 자세한 내용은 [도메인 관리 및 임베딩](https://docs.aws.amazon.com/quicksight/latest/user/manage-qs-domains-and-embedding.html)을 참조하세요.

Amazon Quick Sight 임베딩 SDK를 사용하는 경우 페이지의 Q 검색 창은 상태에 따라 동적으로 크기가 조정됩니다. Amazon Quick Sight 임베딩 SDK를 사용하면 Q 검색 창에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

### SDK 2.0
<a name="embedded-q-bar-for-anonymous-users-sdkv2"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>Q Search Bar Embedding Example</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@2.0.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            const embedQSearchBar = async() => {    
                const {
                    createEmbeddingContext,
                } = QuickSightEmbedding;

                const embeddingContext = await createEmbeddingContext({
                    onChange: (changeEvent, metadata) => {
                        console.log('Context received a change', changeEvent, metadata);
                    },
                });

                const frameOptions = {
                    url: "<YOUR_EMBED_URL>", // replace this value with the url generated via embedding API
                    container: '#experience-container',
                    height: "700px",
                    width: "1000px",
                    onChange: (changeEvent, metadata) => {
                        switch (changeEvent.eventName) {
                            case 'FRAME_MOUNTED': {
                                console.log("Do something when the experience frame is mounted.");
                                break;
                            }
                            case 'FRAME_LOADED': {
                                console.log("Do something when the experience frame is loaded.");
                                break;
                            }
                        }
                    },
                };

                const contentOptions = {
                    hideTopicName: false, 
                    theme: '<YOUR_THEME_ID>',
                    allowTopicSelection: true,
                    onMessage: async (messageEvent, experienceMetadata) => {
                        switch (messageEvent.eventName) {
                            case 'Q_SEARCH_OPENED': {
                                console.log("Do something when Q Search content expanded");
                                break;
                            }
                            case 'Q_SEARCH_CLOSED': {
                                console.log("Do something when Q Search content collapsed");
                                break;
                            }
                            case 'Q_SEARCH_SIZE_CHANGED': {
                                console.log("Do something when Q Search size changed");
                                break;
                            }
                            case 'CONTENT_LOADED': {
                                console.log("Do something when the Q Search is loaded.");
                                break;
                            }
                            case 'ERROR_OCCURRED': {
                                console.log("Do something when the Q Search fails loading.");
                                break;
                            }
                        }
                    }
                };
                const embeddedDashboardExperience = await embeddingContext.embedQSearchBar(frameOptions, contentOptions);
            };
        </script>
    </head>

    <body onload="embedQSearchBar()">
        <div id="experience-container"></div>
    </body>

</html>
```

### SDK 1.0
<a name="embedded-q-bar-for-anonymous-users-sdkv1"></a>

```
<!DOCTYPE html>
<html>

    <head>
        <title>QuickSight Q Search Bar Embedding</title>
        <script src="https://unpkg.com/amazon-quicksight-embedding-sdk@1.18.0/dist/quicksight-embedding-js-sdk.min.js"></script>
        <script type="text/javascript">
            var session

            function onError(payload) {
                console.log("Do something when the session fails loading");
            }

            function onOpen() {
                console.log("Do something when the Q search bar opens");
            }

            function onClose() {
                console.log("Do something when the Q search bar closes");
            }

            function embedQSearchBar() {
                var containerDiv = document.getElementById("embeddingContainer");
                var options = {
                    url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode", // replace this dummy url with the one generated via embedding API
                    container: containerDiv,
                    width: "1000px",
                    locale: "en-US",
                    qSearchBarOptions: {
                        expandCallback: onOpen,
                        collapseCallback: onClose,
                        iconDisabled: false,
                        topicNameDisabled: false, 
                        themeId: 'bdb844d0-0fe9-4d9d-b520-0fe602d93639',
                        allowTopicSelection: true
                    }
                };
                session = QuickSightEmbedding.embedQSearchBar(options);
                session.on("error", onError);
            }

            function onCountryChange(obj) {
                session.setParameters({country: obj.value});
            }
        </script>
    </head>

    <body onload="embedQSearchBar()">
        <div id="embeddingContainer"></div>
    </body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 Q 검색 창을 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

## 선택적 Amazon Quick Sight Q 검색 창 임베딩 기능
<a name="embedded-q-bar-for-anonymous-users-step-4"></a>

**참고**  
임베디드 Amazon Quick Sight Q 검색 창은 클래식 Amazon Quick Sight Q&A 환경을 제공합니다. Amazon Quick Sight는 Amazon Q Business와 통합되어 새로운 생성형 Q&A 환경을 시작합니다. 개발자는 새로운 생성형 Q&A 환경을 사용하는 것이 좋습니다. 임베디드 생성형 Q&A 환경에 대한 자세한 내용은 [Amazon Quick Sight 생성형 Q&A 환경에 Amazon Q 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-gen-bi.html).

임베딩 SDK를 사용하여 내장된 Q 검색 창에 다음과 같은 선택적 기능을 사용할 수 있습니다.

### Q 검색 창 작업 간접 호출
<a name="w2aac35c27c21c43c31c17c21b7"></a>

다음 옵션은 Q 검색 창 임베딩에만 지원됩니다.
+ Q 검색 창 질문 설정 - 이 기능은 질문을 Q 검색 창으로 보내고 질문을 즉시 쿼리합니다. 또한 Q 팝오버도 자동으로 열립니다.

  ```
  qBar.setQBarQuestion('show me monthly revenue');
  ```
+ Q 팝오버 닫기 - 이 기능은 Q 팝오버를 닫고 iframe을 원래 Q 검색창 크기로 되돌립니다.

  ```
  qBar.closeQPopover();
  ```

자세한 내용은 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk)를 참조하세요.

# GetDashboardEmbedURL 및 GetSessionEmbedURL API 작업을 사용한 분석 기능 임베딩
<a name="embedded-analytics-deprecated"></a>


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

Amazon Quick Sight 대시보드 및 Amazon Quick Sight 콘솔을 임베딩하기 위한 다음 API 작업은 GenerateEmbedUrlForAnonymousUser 및 GenerateEmbedUrlForRegisteredUser API 작업으로 대체되었습니다. 여전히 이를 사용하여 애플리케이션에 분석을 임베드할 수는 있지만 더 이상 유지 관리되지 않으며 최신 임베딩 기능을 포함하지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).
+ [GetDashboardEmbedUrl](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetDashboardEmbedUrl.html) API 작업에는 대화형 대시보드가 포함되어 있습니다.
+ [GetSessionEmbedUrl](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetSessionEmbedUrl.html) API 작업은 Amazon Quick Sight 콘솔을 포함합니다.

**Topics**
+ [(기존 API) GetDashboardEmbedURL을(를) 사용하는 모든 사용자를 위한 대시보드 임베딩](embedded-analytics-dashboards-with-anonymous-users-get.md)
+ [GetDashboardEmbedUrl(이전 API)을 사용하는 등록된 사용자를 위한 대시보드 임베딩](embedded-analytics-dashboards-for-authenticated-users-get.md)
+ [GetSessionEmbedUrl (이전 API)를 사용하여 Amazon Quick Sight 콘솔 임베딩](embedded-analytics-full-console-for-authenticated-users-get.md)

# (기존 API) GetDashboardEmbedURL을(를) 사용하는 모든 사용자를 위한 대시보드 임베딩
<a name="embedded-analytics-dashboards-with-anonymous-users-get"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 GetDashboardEmbedURL을 사용하여 모든 사용자(인증되지 않은 사용자)를 위해 임베디드 Amazon Quick Sight 대시보드를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](embedded-analytics-dashboards-with-anonymous-users-get-step-1.md)
+ [2단계: 인증 코드가 첨부된 URL 가져오기](embedded-analytics-dashboards-with-anonymous-users-get-step-2.md)
+ [3단계: 대시보드 URL 임베드](embedded-analytics-dashboards-with-anonymous-users-get-step-3.md)

# 1단계: 권한 설정
<a name="embedded-analytics-dashboards-with-anonymous-users-get-step-1"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

대시보드에 액세스하는 각 사용자는 Amazon Quick Sight에 대시보드에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면 AWS 계정에서 IAM 역할을 생성합니다. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다.

다음 샘플 정책은 `IdentityType=ANONYMOUS`을(를) 사용할 수 있는 권한을 제공합니다. 이 접근 방식이 작동하려면 AWS 계정에 세션 팩 또는 세션 용량 요금도 필요합니다. 그렇지 않으면 사용자가 대시보드에 액세스하려고 하면 `UnsupportedPricingPlanException` 오류가 반환됩니다.

------
#### [ JSON ]

****  

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

------

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면, 애플리케이션이 사용자를 대신하여 역할을 맡아서 대시보드를 열 수 있습니다. 다음 예에서는 이전의 샘플 정책을 리소스로 사용하는 `QuickSightEmbeddingAnonymousPolicy` 역할을 보여줍니다.

자세한 내용은 IAM 사용 설명서의 [IAM의 임시 보안 인증](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 단원을 참조하세요.

# 2단계: 인증 코드가 첨부된 URL 가져오기
<a name="embedded-analytics-dashboards-with-anonymous-users-get-step-2"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 단원에서는 익명의 방문자를 대신해 인증하고 애플리케이션 서버에서 임베딩 가능한 대시보드 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 식별자를 고유한 역할 세션 ID로 전달합니다. 이 코드는 앱 서버에서 실행됩니다.

------
#### [ Java ]

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.GetDashboardEmbedUrlRequest;
import com.amazonaws.services.quicksight.model.GetDashboardEmbedUrlResult;

/**
 * Class to call QuickSight AWS SDK to get url for dashboard embedding.
 */
public class GetQuicksightEmbedUrlNoAuth {

    private static String ANONYMOUS = "ANONYMOUS";

    private final AmazonQuickSight quickSightClient;

    public GetQuicksightEmbedUrlNoAuth() {
        this.quickSightClient = AmazonQuickSightClientBuilder
                .standard()
                .withRegion(Regions.US_EAST_1.getName())
                .withCredentials(new AWSCredentialsProvider() {
                                     @Override
                                     public AWSCredentials getCredentials() {
                                         // provide actual IAM access key and secret key here
                                         return new BasicAWSCredentials("access-key", "secret-key");
                                     }

                                     @Override
                                     public void refresh() {}
                                 }
                )
                .build();
    }

    public String getQuicksightEmbedUrl(
            final String accountId, // YOUR AWS ACCOUNT ID
            final String dashboardId, // YOUR DASHBOARD ID TO EMBED
            final String addtionalDashboardIds, // ADDITIONAL DASHBOARD-1 ADDITIONAL DASHBOARD-2
            final boolean resetDisabled, // OPTIONAL PARAMETER TO ENABLE DISABLE RESET BUTTON IN EMBEDDED DASHBAORD
            final boolean undoRedoDisabled // OPTIONAL PARAMETER TO ENABLE DISABLE UNDO REDO BUTTONS IN EMBEDDED DASHBAORD
    ) throws Exception {
        GetDashboardEmbedUrlRequest getDashboardEmbedUrlRequest = new GetDashboardEmbedUrlRequest()
                .withDashboardId(dashboardId)
                .withAdditionalDashboardIds(addtionalDashboardIds)
                .withAwsAccountId(accountId)
                .withNamespace("default") // Anonymous embedding requires specifying a valid namespace for which you want the embedding url
                .withIdentityType(ANONYMOUS)
                .withResetDisabled(resetDisabled)
                .withUndoRedoDisabled(undoRedoDisabled);

        GetDashboardEmbedUrlResult dashboardEmbedUrl = quickSightClient.getDashboardEmbedUrl(getDashboardEmbedUrlRequest);

        return dashboardEmbedUrl.getEmbedUrl();
    }
}
```

------
#### [ JavaScript ]

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function getDashboardEmbedURL(
    accountId, // YOUR AWS ACCOUNT ID
    dashboardId, // YOUR DASHBOARD ID TO EMBED
    additionalDashboardIds, // ADDITIONAL DASHBOARD-1 ADDITIONAL DASHBOARD-2
    quicksightNamespace, // VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
    resetDisabled, // OPTIONAL PARAMETER TO ENABLE DISABLE RESET BUTTON IN EMBEDDED DASHBAORD
    undoRedoDisabled, // OPTIONAL PARAMETER TO ENABLE DISABLE UNDO REDO BUTTONS IN EMBEDDED DASHBAORD
    getEmbedUrlCallback, // GETEMBEDURL SUCCESS CALLBACK METHOD
    errorCallback // GETEMBEDURL ERROR CALLBACK METHOD
    ) {
    const getDashboardParams = {
        AwsAccountId: accountId,
        DashboardId: dashboardId,
        AdditionalDashboardIds: additionalDashboardIds,
        Namespace: quicksightNamespace,
        IdentityType: 'ANONYMOUS',
        ResetDisabled: resetDisabled,
        SessionLifetimeInMinutes: 600,
        UndoRedoDisabled: undoRedoDisabled
    };

    const quicksightGetDashboard = new AWS.QuickSight({
        region: process.env.AWS_REGION,
    });

    quicksightGetDashboard.getDashboardEmbedUrl(getDashboardParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const result = {
                "statusCode": 200,
                "headers": {
                    "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO GETEMBEDURL API
                    "Access-Control-Allow-Headers": "Content-Type"
                },
                "body": JSON.stringify(data),
                "isBase64Encoded": false
            }
            getEmbedUrlCallback(result);
        }
    });
}
```

------
#### [ Python3 ]

```
import json
import boto3
from botocore.exceptions import ClientError
import time

# Create QuickSight and STS clients
qs = boto3.client('quicksight',region_name='us-east-1')
sts = boto3.client('sts')

# Function to generate embedded URL
# accountId: YOUR AWS ACCOUNT ID
# dashboardId: YOUR DASHBOARD ID TO EMBED
# additionalDashboardIds: ADDITIONAL DASHBOARD-1 ADDITIONAL DASHBOARD-2 WITHOUT COMMAS
# quicksightNamespace: VALID NAMESPACE WHERE YOU WANT TO DO NOAUTH EMBEDDING
# resetDisabled: PARAMETER TO ENABLE DISABLE RESET BUTTON IN EMBEDDED DASHBAORD
# undoRedoDisabled: OPTIONAL PARAMETER TO ENABLE DISABLE UNDO REDO BUTTONS IN EMBEDDED DASHBAORD
def getDashboardURL(accountId, dashboardId, quicksightNamespace, resetDisabled, undoRedoDisabled):
    try:
        response = qs.get_dashboard_embed_url(
            AwsAccountId = accountId,
            DashboardId = dashboardId,
            AdditionalDashboardIds = additionalDashboardIds,
            Namespace = quicksightNamespace,
            IdentityType = 'ANONYMOUS',
            SessionLifetimeInMinutes = 600,
            UndoRedoDisabled = undoRedoDisabled,
            ResetDisabled = resetDisabled
        )
            
        return {
            'statusCode': 200,
            'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
            'body': json.dumps(response),
            'isBase64Encoded':  bool('false')
        }
    except ClientError as e:
        print(e)
        return "Error generating embeddedURL: " + str(e)
```

------
#### [ Node.js ]

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 가져오는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
            const https = require('https');
            
            var quicksight = new AWS.Service({
                apiConfig: require('./quicksight-2018-04-01.min.json'),
                region: 'us-east-1',
            });
            
            quicksight.getDashboardEmbedUrl({
                'AwsAccountId': '111122223333',
                'DashboardId': 'dashboard-id',
                'AdditionalDashboardIds': 'added-dashboard-id-1 added-dashboard-id-2 added-dashboard-id-3'
                'Namespace' : 'default',
                'IdentityType': 'ANONYMOUS',
                'SessionLifetimeInMinutes': 100,
                'UndoRedoDisabled': false,
                'ResetDisabled': true
            
            }, function(err, data) {
                console.log('Errors: ');
                console.log(err);
                console.log('Response: ');
                console.log(data);
            });
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
            //readability and added ellipsis to indicate that it's incomplete.
                                { Status: 200,
              EmbedUrl: 'https://dashboards.example.com/embed/620bef10822743fab329fb3751187d2d…
              RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' }
```

------
#### [ .NET/C\$1 ]

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 가져오는 데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
            var client = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                sessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                Console.WriteLine(
                    client.GetDashboardEmbedUrlAsync(new GetDashboardEmbedUrlRequest
                    {
                        AwsAccountId = “111122223333”,
                        DashboardId = "dashboard-id",
                        AdditionalDashboardIds = "added-dashboard-id-1 added-dashboard-id-2 added-dashboard-id-3",
                        Namespace = default,
                        IdentityType = IdentityType.ANONYMOUS,
                        SessionLifetimeInMinutes = 600,
                        UndoRedoDisabled = false,
                        ResetDisabled = true
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
```

------
#### [ AWS CLI ]

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - Security Assertion Markup(SAML)을 사용하여 사용자를 인증하는 경우 이 작업을 사용하십시오.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GetDashboardEmbedURL`에 대한 권한이 활성화되어 있어야 합니다.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::11112222333:role/QuickSightEmbeddingAnonymousPolicy" \
     --role-session-name anonymous caller
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_dashboard_role/QuickSightEmbeddingAnonymousPolicy`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 방문 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 각 세션을 분리하고 구분할 수 있습니다. 로드 밸런싱 등을 위해 여러 웹 서버를 사용하는 경우, 세션이 다른 서버에 다시 연결되면 새 세션이 시작됩니다.

대시보드에 대해 서명된 URL을 가져오려면, 앱 서버에서 `get-dashboard-embed-url`을(를) 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제는 웹 포털 또는 앱을 익명으로 방문하는 사용자에 대해 서버 측 호출을 사용하여 임베디드 대시보드의 URL을 가져오는 방법을 보여줍니다.

```
aws quicksight get-dashboard-embed-url \
     --aws-account-id 111122223333 \
     --dashboard-id dashboard-id \
     --additional-dashboard-ids added-dashboard-id-1 added-dashboard-id-2 added-dashboard-id-3
     --namespace default-or-something-else \
     --identity-type ANONYMOUS \
     --session-lifetime-in-minutes 30 \
     --undo-redo-disabled true \
     --reset-disabled true \
     --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/QuickSightEmbeddingAnonymousPolicy/embeddingsession
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetDashboardEmbedUrl.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetDashboardEmbedUrl.html) 단원을 참조하십시오. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

------

# 3단계: 대시보드 URL 임베드
<a name="embedded-analytics-dashboards-with-anonymous-users-get-step-3"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 2단계에서 대시보드 URL을 임베드하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ HTML 페이지에 대시보드 배치
+ 대시보드에 파라미터 전달
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GetDashboardEmbedUrl` API 작업을 호출하여 앱에 포함할 수 있는 URL을 가져오세요. 이 URL은 5분 동안 유효하며 결과 세션은 10시간 동안 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `get-dashboard-embed-url`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
{
     "Status": "200",
     "EmbedUrl": "https: //dashboards.example.com/embed/620bef10822743fab329fb3751187d2d...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

Amazon Quick Sight 임베[딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 대시보드를 임베](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)딩합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 대시보드 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 실행됩니다.

```
<!DOCTYPE html>
<html>

<head>
    <title>Basic Embed</title>
    <!-- You can download the latest QuickSight embedding SDK version from https://www.npmjs.com/package/amazon-quicksight-embedding-sdk -->
    <!-- Or you can do "npm install amazon-quicksight-embedding-sdk", if you use npm for javascript dependencies -->
    <script src="./quicksight-embedding-js-sdk.min.js"></script>
    <script type="text/javascript">
        var dashboard;

        function embedDashboard() {
            var containerDiv = document.getElementById("embeddingContainer");
            var options = {
                // replace this dummy url with the one generated via embedding API
                url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode",  
                container: containerDiv,
                scrolling: "no",
                height: "700px",
                width: "1000px",
                footerPaddingEnabled: true
            };
            dashboard = QuickSightEmbedding.embedDashboard(options);
        }
    </script>
</head>

<body onload="embedDashboard()">
    <div id="embeddingContainer"></div>
</body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 대시보드를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 QuickSight 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# GetDashboardEmbedUrl(이전 API)을 사용하는 등록된 사용자를 위한 대시보드 임베딩
<a name="embedded-analytics-dashboards-for-authenticated-users-get"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 섹션에서는를 사용하여 등록된 사용자를 위해 임베디드 Amazon Quick Sight 대시보드를 설정하는 방법에 대한 자세한 정보를 확인할 수 있습니다`GetDashboardEmbedUrl`.

**Topics**
+ [1단계: 권한 설정](embedded-dashboards-for-authenticated-users-get-step-1.md)
+ [2단계: 인증 코드가 첨부된 URL 가져오기](embedded-dashboards-for-authenticated-users-get-step-2.md)
+ [3단계: 대시보드 URL 임베드](embedded-dashboards-for-authenticated-users-get-step-3.md)

# 1단계: 권한 설정
<a name="embedded-dashboards-for-authenticated-users-get-step-1"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

대시보드에 액세스하는 각 사용자는 Amazon Quick Sight에 대시보드에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면 AWS 계정에서 IAM 역할을 생성합니다. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. IAM 역할은 대시보드 URL을 검색할 수 있는 권한을 제공해야 합니다. 이를 위해 `quicksight:GetDashboardEmbedUrl`을(를) 추가합니다.

다음 샘플 정책은 `IdentityType=IAM`을(를) 사용할 수 있는 권한을 제공합니다.

------
#### [ JSON ]

****  

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

------

다음 샘플 정책은 대시보드 URL을 검색할 수 있는 권한을 제공합니다. Amazon Quick Sight 리더로 처음 사용자를 생성하는 `quicksight:RegisterUser` 경우 정책을와 함께 사용합니다.

------
#### [ JSON ]

****  

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

------

`QUICKSIGHT`을(를) `identityType`(으)로 사용하고 사용자의 Amazon 리소스 이름(ARN)을 제공하는 경우, 정책에서 `quicksight:GetAuthCode` 작업을 허용해야 합니다. 다음 샘플 정책은 이러한 권한을 제공합니다.

------
#### [ JSON ]

****  

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

------

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스할 때 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다. 다음 예에서는 이전의 샘플 정책을 리소스로 사용하는 `embedding_quicksight_dashboard_role` 역할을 보여줍니다.

OpenID Connect 또는 SAML 인증의 신뢰 정책에 대한 자세한 내용은 IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 아이덴티티 또는 OpenID Connect 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

# 2단계: 인증 코드가 첨부된 URL 가져오기
<a name="embedded-dashboards-for-authenticated-users-get-step-2"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 대시보드 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

설명된 단계를 수행하면 대시보드의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

------
#### [ Java ]

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicSessionCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.GetDashboardEmbedUrlRequest;
import com.amazonaws.services.quicksight.model.GetDashboardEmbedUrlResult;
import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
import com.amazonaws.services.securitytoken.model.AssumeRoleRequest;
import com.amazonaws.services.securitytoken.model.AssumeRoleResult;

/**
 * Class to call QuickSight AWS SDK to get url for dashboard embedding.
 */
public class GetQuicksightEmbedUrlIAMAuth {

    private static String IAM = "IAM";

    private final AmazonQuickSight quickSightClient;

    private final AWSSecurityTokenService awsSecurityTokenService;

    public GetQuicksightEmbedUrlIAMAuth(final AWSSecurityTokenService awsSecurityTokenService) {
        this.quickSightClient = AmazonQuickSightClientBuilder
                .standard()
                .withRegion(Regions.US_EAST_1.getName())
                .withCredentials(new AWSCredentialsProvider() {
                                     @Override
                                     public AWSCredentials getCredentials() {
                                         // provide actual IAM access key and secret key here
                                         return new BasicAWSCredentials("access-key", "secret-key");
                                     }

                                     @Override
                                     public void refresh() {}
                                 }
                )
                .build();
        this.awsSecurityTokenService = awsSecurityTokenService;
    }

    public String getQuicksightEmbedUrl(
            final String accountId, // YOUR AWS ACCOUNT ID
            final String dashboardId, // YOUR DASHBOARD ID TO EMBED
            final String openIdToken, // TOKEN TO ASSUME ROLE WITH ROLEARN
            final String roleArn, // IAM USER ROLE TO USE FOR EMBEDDING
            final String sessionName, // SESSION NAME FOR THE ROLEARN ASSUME ROLE
            final boolean resetDisabled, // OPTIONAL PARAMETER TO ENABLE DISABLE RESET BUTTON IN EMBEDDED DASHBAORD
            final boolean undoRedoDisabled // OPTIONAL PARAMETER TO ENABLE DISABLE UNDO REDO BUTTONS IN EMBEDDED DASHBAORD
    ) throws Exception {
        AssumeRoleRequest request = new AssumeRoleRequest()
                .withRoleArn(roleArn)
                .withRoleSessionName(sessionName)
                .withTokenCode(openIdToken)
                .withDurationSeconds(3600);
        AssumeRoleResult assumeRoleResult = awsSecurityTokenService.assumeRole(request);

        AWSCredentials temporaryCredentials = new BasicSessionCredentials(
                assumeRoleResult.getCredentials().getAccessKeyId(),
                assumeRoleResult.getCredentials().getSecretAccessKey(),
                assumeRoleResult.getCredentials().getSessionToken());
        AWSStaticCredentialsProvider awsStaticCredentialsProvider = new AWSStaticCredentialsProvider(temporaryCredentials);

        GetDashboardEmbedUrlRequest getDashboardEmbedUrlRequest = new GetDashboardEmbedUrlRequest()
                .withDashboardId(dashboardId)
                .withAwsAccountId(accountId)
                .withIdentityType(IAM)
                .withResetDisabled(resetDisabled)
                .withUndoRedoDisabled(undoRedoDisabled)
                .withRequestCredentialsProvider(awsStaticCredentialsProvider);

        GetDashboardEmbedUrlResult dashboardEmbedUrl = quickSightClient.getDashboardEmbedUrl(getDashboardEmbedUrlRequest);

        return dashboardEmbedUrl.getEmbedUrl();
    }
}
```

------
#### [ JavaScript ]

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function getDashboardEmbedURL(
    accountId, // YOUR AWS ACCOUNT ID
    dashboardId, // YOUR DASHBOARD ID TO EMBED
    openIdToken, // TOKEN TO ASSUME ROLE WITH ROLEARN
    roleArn, // IAM USER ROLE TO USE FOR EMBEDDING
    sessionName, // SESSION NAME FOR THE ROLEARN ASSUME ROLE
    resetDisabled, // OPTIONAL PARAMETER TO ENABLE DISABLE RESET BUTTON IN EMBEDDED DASHBAORD
    undoRedoDisabled, // OPTIONAL PARAMETER TO ENABLE DISABLE UNDO REDO BUTTONS IN EMBEDDED DASHBAORD
    getEmbedUrlCallback, // GETEMBEDURL SUCCESS CALLBACK METHOD
    errorCallback // GETEMBEDURL ERROR CALLBACK METHOD
    ) {
    const stsClient = new AWS.STS();
    let stsParams = {
        RoleSessionName: sessionName,
        WebIdentityToken: openIdToken,
        RoleArn: roleArn
    }

    stsClient.assumeRoleWithWebIdentity(stsParams, function(err, data) {
        if (err) {
            console.log('Error assuming role');
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const getDashboardParams = {
                AwsAccountId: accountId,
                DashboardId: dashboardId,
                IdentityType: 'IAM',
                ResetDisabled: resetDisabled,
                SessionLifetimeInMinutes: 600,
                UndoRedoDisabled: undoRedoDisabled
            };

            const quicksightGetDashboard = new AWS.QuickSight({
                region: process.env.AWS_REGION,
                credentials: {
                    accessKeyId: data.Credentials.AccessKeyId,
                    secretAccessKey: data.Credentials.SecretAccessKey,
                    sessionToken: data.Credentials.SessionToken,
                    expiration: data.Credentials.Expiration
                }
            });

            quicksightGetDashboard.getDashboardEmbedUrl(getDashboardParams, function(err, data) {
                if (err) {
                    console.log(err, err.stack);
                    errorCallback(err);
                } else {
                    const result = {
                        "statusCode": 200,
                        "headers": {
                            "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO GETEMBEDURL API
                            "Access-Control-Allow-Headers": "Content-Type"
                        },
                        "body": JSON.stringify(data),
                        "isBase64Encoded": false
                    }
                    getEmbedUrlCallback(result);
                }
            });
        }
    });
}
```

------
#### [ Python3 ]

```
import json
import boto3
from botocore.exceptions import ClientError

# Create QuickSight and STS clients
qs = boto3.client('quicksight',region_name='us-east-1')
sts = boto3.client('sts')

# Function to generate embedded URL  
# accountId: YOUR AWS ACCOUNT ID
# dashboardId: YOUR DASHBOARD ID TO EMBED
# openIdToken: TOKEN TO ASSUME ROLE WITH ROLEARN
# roleArn: IAM USER ROLE TO USE FOR EMBEDDING
# sessionName: SESSION NAME FOR THE ROLEARN ASSUME ROLE
# resetDisabled: PARAMETER TO ENABLE DISABLE RESET BUTTON IN EMBEDDED DASHBAORD
# undoRedoDisabled: PARAMETER TO ENABLE DISABLE UNDO REDO BUTTONS IN EMBEDDED DASHBAORD
def getDashboardURL(accountId, dashboardId, openIdToken, roleArn, sessionName, resetDisabled, undoRedoDisabled):
    try:
        assumedRole = sts.assume_role(
            RoleArn = roleArn,
            RoleSessionName = sessionName,
            WebIdentityToken = openIdToken
        )
    except ClientError as e:
        return "Error assuming role: " + str(e)
    else: 
        assumedRoleSession = boto3.Session(
            aws_access_key_id = assumedRole['Credentials']['AccessKeyId'],
            aws_secret_access_key = assumedRole['Credentials']['SecretAccessKey'],
            aws_session_token = assumedRole['Credentials']['SessionToken'],
        )
        try:
            quickSight = assumedRoleSession.client('quicksight',region_name='us-east-1')
            
            response = quickSight.get_dashboard_embed_url(
                 AwsAccountId = accountId,
                 DashboardId = dashboardId,
                 IdentityType = 'IAM',
                 SessionLifetimeInMinutes = 600,
                 UndoRedoDisabled = undoRedoDisabled,
                 ResetDisabled = resetDisabled
            )
            
            return {
                'statusCode': 200,
                'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
                'body': json.dumps(response),
                'isBase64Encoded':  bool('false')
            }
        except ClientError as e:
            return "Error generating embeddedURL: " + str(e)
```

------
#### [ Node.js ]

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 가져오는 데 사용할 수 있는 JavaScript(Node.js)를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
            const https = require('https');
            
            var quicksight = new AWS.Service({
                apiConfig: require('./quicksight-2018-04-01.min.json'),
                region: 'us-east-1',
            });
            
            quicksight.getDashboardEmbedUrl({
                'AwsAccountId': '111122223333',
                'DashboardId': '1c1fe111-e2d2-3b30-44ef-a0e111111cde',
                'IdentityType': 'IAM',
                'ResetDisabled': true,
                'SessionLifetimeInMinutes': 100,
                'UndoRedoDisabled': false,
                'StatePersistenceEnabled': true
            
            }, function(err, data) {
                console.log('Errors: ');
                console.log(err);
                console.log('Response: ');
                console.log(data);
            });
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
            //readability and added ellipsis to indicate that it's incomplete.
                                { Status: 200,
              EmbedUrl: 'https://dashboards.example.com/embed/620bef10822743fab329fb3751187d2d…
              RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' }
```

------
#### [ .NET/C\$1 ]

다음 예제는 앱 서버에서 임베디드 대시보드에 대한 URL를 가져오는 데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 대시보드를 표시할 수 있습니다.

**Example**  

```
            var client = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                sessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                Console.WriteLine(
                    client.GetDashboardEmbedUrlAsync(new GetDashboardEmbedUrlRequest
                    {
                        AwsAccountId = “111122223333”,
                        DashboardId = "1c1fe111-e2d2-3b30-44ef-a0e111111cde",
                        IdentityType = EmbeddingIdentityType.IAM,
                        ResetDisabled = true,
                        SessionLifetimeInMinutes = 100,
                        UndoRedoDisabled = false,
                        StatePersistenceEnabled = true
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
```

------
#### [ AWS CLI ]

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GetDashboardEmbedURL`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 대시보드를 처음 열 때 사용자를 추가하는 적시 접근 방식을 취하려면, 역할에 `quicksight:RegisterUser`에 대한 사용 권한도 활성화해야 합니다.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
     --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_dashboard_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. *조절*은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 대시보드에 처음 액세스할 때 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
     --aws-account-id 111122223333 \
     --namespace default \
     --identity-type IAM \
     --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
     --user-role READER \
     --user-name jhnd \
     --session-name "john.doe@example.com" \
     --email john.doe@example.com \
     --region us-east-1 \
     --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는 설정을 위해 `RegisterUser`를 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 ARN을 얻는 데 `DescribeUser`를 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때 대시보드가 공유되는 그룹에이 사용자를 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
     --aws-account-id=111122223333 \
     --namespace=default \
     --group-name=financeusers \
     --member-name="embedding_quicksight_dashboard_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 대시보드에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 대시보드에 대해 서명된 URL을 가져오려면 앱 서버에서 `get-dashboard-embed-url`을 호출합니다. 그러면 임베드 가능한 대시보드 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 IAM Identity Center를 통해 인증된 사용자에 대한 서버 측 호출을 사용하여 임베디드 대시보드의 URL을 가져오는 방법을 보여줍니다.

```
aws quicksight get-dashboard-embed-url \
     --aws-account-id 111122223333 \
     --dashboard-id 1a1ac2b2-3fc3-4b44-5e5d-c6db6778df89 \
     --identity-type IAM \
     --session-lifetime-in-minutes 30 \
     --undo-redo-disabled true \
     --reset-disabled true \
     --state-persistence-enabled true \
     --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_dashboard_role/embeddingsession
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetDashboardEmbedUrl.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetDashboardEmbedUrl.html) 단원을 참조하십시오. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

------

# 3단계: 대시보드 URL 임베드
<a name="embedded-dashboards-for-authenticated-users-get-step-3"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 섹션에서는 [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 3단계에서 대시보드 URL을 임베딩하는 방법을 알아볼 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ HTML 페이지에 대시보드 배치
+ 대시보드에 파라미터 전달
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GetDashboardEmbedUrl` API 작업을 호출하여 앱에 포함할 수 있는 URL을 가져오세요. 이 URL은 5분 동안 유효하며 결과 세션은 10시간 동안 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `get-dashboard-embed-url`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
{
     "Status": "200",
     "EmbedUrl": "https: //dashboards.example.com/embed/620bef10822743fab329fb3751187d2d...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

[Amazon Quick Sight 임베딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 대시보드를 임베드](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 대시보드 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

```
<!DOCTYPE html>
<html>

<head>
    <title>Basic Embed</title>

    <script src="./quicksight-embedding-js-sdk.min.js"></script>
    <script type="text/javascript">
        var dashboard;

        function embedDashboard() {
            var containerDiv = document.getElementById("embeddingContainer");
            var options = {
                // replace this dummy url with the one generated via embedding API
                url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode",  
                container: containerDiv,
                scrolling: "no",
                height: "700px",
                width: "1000px",
                footerPaddingEnabled: true
            };
            dashboard = QuickSightEmbedding.embedDashboard(options);
        }
    </script>
</head>

<body onload="embedDashboard()">
    <div id="embeddingContainer"></div>
</body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 대시보드를 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```

# GetSessionEmbedUrl (이전 API)를 사용하여 Amazon Quick Sight 콘솔 임베딩
<a name="embedded-analytics-full-console-for-authenticated-users-get"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).


|  | 
| --- |
|  적용 대상: Enterprise Edition  | 


|  | 
| --- |
|    대상:  Amazon Quick 개발자  | 

다음 섹션에서는 `GetSessionEmbedUrl` API를 사용하여 등록된 사용자에게 사용자 지정 브랜드 작성 포털에서 Amazon Quick Sight 콘솔 환경을 제공하는 방법에 대한 자세한 정보를 확인할 수 있습니다.

**Topics**
+ [1단계: 권한 설정](embedded-analytics-full-console-for-authenticated-users-get-step-1.md)
+ [2단계: 인증 코드가 첨부된 URL 가져오기](embedded-analytics-full-console-for-authenticated-users-get-step-2.md)
+ [3단계: 콘솔 세션 URL 임베드](embedded-analytics-full-console-for-authenticated-users-get-step-3.md)

# 1단계: 권한 설정
<a name="embedded-analytics-full-console-for-authenticated-users-get-step-1"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 단원에서 백엔드 애플리케이션 또는 웹 서버의 권한을 설정하는 방법을 알아봅니다. 이 작업을 수행하려면 IAM에 대한 관리자 액세스 권한이 있어야 합니다.

Amazon Quick Sight에 액세스하는 각 사용자는 Amazon Quick Sight에 콘솔 세션에 대한 액세스 및 권한을 부여하는 역할을 수임합니다. 이렇게 하려면 AWS 계정에서 IAM 역할을 생성합니다. IAM 정책을 역할과 연결하여 역할을 수행하는 사용자에게 권한을 제공합니다. 독자가 읽기 전용 방식으로 Amazon Quick Sight에 액세스할 수 있고 다른 데이터 또는 생성 기능에 액세스할 수 없도록 `quicksight:RegisterUser` 권한을 추가합니다. 또한 IAM 역할은 콘솔 세션 URL을 검색할 수 있는 권한을 제공해야 합니다. 이를 위해 `quicksight:GetSessionEmbedUrl`을(를) 추가합니다.

다음 샘플 정책은 `IdentityType=IAM`을(를) 사용할 수 있는 권한을 제공합니다.

------
#### [ JSON ]

****  

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

------

다음 샘플 정책은 콘솔 세션 URL을 검색할 수 있는 권한을 제공합니다. 임베디드 세션에 액세스하기 전에 사용자를 생성 중이면 `quicksight:RegisterUser` 없이 정책을 사용합니다.

------
#### [ JSON ]

****  

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

------

`QUICKSIGHT`을(를) `identityType`(으)로 사용하고 사용자의 Amazon 리소스 이름(ARN)을 제공하는 경우, 정책에서 `quicksight:GetAuthCode` 작업을 허용해야 합니다. 다음 샘플 정책은 이러한 권한을 제공합니다.

------
#### [ JSON ]

****  

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

------

방금 생성한 역할에 액세스하려면 애플리케이션의 IAM 자격 증명에 신뢰 정책이 연결되어 있어야 합니다. 즉, 사용자가 애플리케이션에 액세스하면 애플리케이션이 사용자를 대신하여 역할을 수임하고 Amazon Quick Sight에서 사용자를 프로비저닝할 수 있습니다. 다음 예에서는 이전의 샘플 정책을 리소스로 사용하는 `embedding_quicksight_console_session_role` 역할을 보여줍니다.

OpenID Connect 또는 SAML 인증의 신뢰 정책에 대한 자세한 내용은 IAM 사용 설명서의 다음 단원을 참조하십시오.
+ [웹 아이덴티티 또는 OpenID Connect 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)
+ [SAML 2.0 페더레이션을 위한 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html)

# 2단계: 인증 코드가 첨부된 URL 가져오기
<a name="embedded-analytics-full-console-for-authenticated-users-get-step-2"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 단원에서는 사용자를 인증하고 애플리케이션 서버에서 임베딩 가능한 콘솔 세션 URL을 가져오는 방법을 알아볼 수 있습니다.

사용자가 앱에 액세스할 때, 앱은 사용자를 대신하여 IAM 역할을 맡습니다. 그런 다음 사용자가 아직 없는 경우 Amazon Quick Sight에 사용자를 추가합니다. 다음으로 식별자를 고유한 역할 세션 ID로 전달합니다.

설명된 단계를 수행하면 콘솔 세션의 각 뷰어가 Amazon Quick Sight에서 고유하게 프로비저닝됩니다. 또한 사용자 단위 설정(예: 파라미터에 대한 동적 기본값 및 행 수준 보안)을 적용합니다.

다음 예는 사용자를 대신하여 IAM 인증을 수행합니다. 이 코드는 앱 서버에서 실행됩니다.

------
#### [ Java ]

```
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.quicksight.AmazonQuickSight;
import com.amazonaws.services.quicksight.AmazonQuickSightClientBuilder;
import com.amazonaws.services.quicksight.model.GetSessionEmbedUrlRequest;
import com.amazonaws.services.quicksight.model.GetSessionEmbedUrlResult;

/**
 * Class to call QuickSight AWS SDK to get url for session embedding.
 */
public class GetSessionEmbedUrlQSAuth {

    private final AmazonQuickSight quickSightClient;

    public GetSessionEmbedUrlQSAuth() {
        this.quickSightClient = AmazonQuickSightClientBuilder
                .standard()
                .withRegion(Regions.US_EAST_1.getName())
                .withCredentials(new AWSCredentialsProvider() {
                                     @Override
                                     public AWSCredentials getCredentials() {
                                         // provide actual IAM access key and secret key here
                                         return new BasicAWSCredentials("access-key", "secret-key");
                                     }

                                     @Override
                                     public void refresh() {}
                                 }
                )
                .build();
    }

    public String getQuicksightEmbedUrl(
            final String accountId, // YOUR AWS ACCOUNT ID
            final String userArn // REGISTERED USER ARN TO USE FOR EMBEDDING. REFER TO GETEMBEDURL SECTION IN DEV PORTAL TO FIND OUT HOW TO GET USER ARN FOR A QUICKSIGHT USER
    ) throws Exception {
        GetSessionEmbedUrlRequest getSessionEmbedUrlRequest = new GetSessionEmbedUrlRequest()
                .withAwsAccountId(accountId)
                .withEntryPoint("/start")
                .withUserArn(userArn);

        GetSessionEmbedUrlResult sessionEmbedUrl = quickSightClient.getSessionEmbedUrl(getSessionEmbedUrlRequest);

        return sessionEmbedUrl.getEmbedUrl();
    }
}
```

------
#### [ JavaScript ]

```
global.fetch = require('node-fetch');
const AWS = require('aws-sdk');

function getSessionEmbedURL(
    accountId, // YOUR AWS ACCOUNT ID
    userArn, // REGISTERED USER ARN TO USE FOR EMBEDDING. REFER TO GETEMBEDURL SECTION IN DEV PORTAL TO FIND OUT HOW TO GET USER ARN FOR A QUICKSIGHT USER
    getEmbedUrlCallback, // GETEMBEDURL SUCCESS CALLBACK METHOD
    errorCallback // GETEMBEDURL ERROR CALLBACK METHOD
    ) {
    const getSessionParams = {
        AwsAccountId: accountId,
        EntryPoint: "/start",
        UserArn: userArn,
        SessionLifetimeInMinutes: 600,
    };

    const quicksightGetSession = new AWS.QuickSight({
        region: process.env.AWS_REGION,
    });

    quicksightGetSession.getSessionEmbedUrl(getSessionParams, function(err, data) {
        if (err) {
            console.log(err, err.stack);
            errorCallback(err);
        } else {
            const result = {
                "statusCode": 200,
                "headers": {
                    "Access-Control-Allow-Origin": "*", // USE YOUR WEBSITE DOMAIN TO SECURE ACCESS TO GETEMBEDURL API
                    "Access-Control-Allow-Headers": "Content-Type"
                },
                "body": JSON.stringify(data),
                "isBase64Encoded": false
            }
            getEmbedUrlCallback(result);
        }
    });
}
```

------
#### [ Python3 ]

```
import json
import boto3
from botocore.exceptions import ClientError
import time

# Create QuickSight and STS clients
qs = boto3.client('quicksight',region_name='us-east-1')
sts = boto3.client('sts')

# Function to generate embedded URL
# accountId: YOUR AWS ACCOUNT ID
# userArn: REGISTERED USER ARN TO USE FOR EMBEDDING. REFER TO GETEMBEDURL SECTION IN DEV PORTAL TO FIND OUT HOW TO GET USER ARN FOR A QUICKSIGHT USER
def getSessionEmbedURL(accountId, userArn):
    try:
        response = qs.get_session_embed_url(
            AwsAccountId = accountId,
            EntryPoint = "/start",
            UserArn = userArn,
            SessionLifetimeInMinutes = 600
        )
            
        return {
            'statusCode': 200,
            'headers': {"Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type"},
            'body': json.dumps(response),
            'isBase64Encoded':  bool('false')
        }
    except ClientError as e:
        print(e)
        return "Error generating embeddedURL: " + str(e)
```

------
#### [ Node.js ]

다음 예제는 앱 서버에서 임베디드 콘솔 세션에 대한 URL를 가져오는데 사용할 수 있는 JavaScript(Node.js)를 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 콘솔 세션을 표시할 수 있습니다.

**Example**  

```
const AWS = require('aws-sdk');
            const https = require('https');
            
            var quicksight = new AWS.Service({
                apiConfig: require('./quicksight-2018-04-01.min.json'),
                region: 'us-east-1',
            });
            
            quicksight.GetSessionEmbedUrl({
                'AwsAccountId': '111122223333',
                'EntryPoint': 'https://url-for-console-page-to-open',
                'SessionLifetimeInMinutes': 600,
                'UserArn': 'USER_ARN'
            
            }, function(err, data) {
                console.log('Errors: ');
                console.log(err);
                console.log('Response: ');
                console.log(data);
            });
```

**Example**  

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
            //readability and added ellipsis to indicate that it's incomplete.
                                { Status: 200,
              EmbedUrl: 'https://dashboards.example.com/embed/620bef10822743fab329fb3751187d2d…
              RequestId: '7bee030e-f191-45c4-97fe-d9faf0e03713' }
```

------
#### [ .NET/C\$1 ]

다음 예제는 앱 서버에서 임베디드 콘솔 세션에 대한 URL를 가져오는데 사용할 수 있는 .NET/C\$1 코드를 보여줍니다. 웹 사이트 또는 앱에서 이 URL을 사용하여 콘솔을 표시할 수 있습니다.

**Example**  

```
            var client = new AmazonQuickSightClient(
                AccessKey,
                SecretAccessKey,
                sessionToken,
                Amazon.RegionEndpoint.USEast1);
            try
            {
                Console.WriteLine(
                    client.GetSessionEmbedUrlAsync(new GetSessionEmbedUrlRequest
                    {
                'AwsAccountId': '111122223333',
                'EntryPoint': 'https://url-for-console-page-to-open',
                'SessionLifetimeInMinutes': 600,
                'UserArn': 'USER_ARN'
                        AwsAccountId = 111122223333,
                        EntryPoint = https://url-for-console-page-to-open,
                        SessionLifetimeInMinutes = 600,
                        UserArn = 'USER_ARN'
                    }).Result.EmbedUrl
                );
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
```

------
#### [ AWS CLI ]

역할을 수임하려면 다음 AWS Security Token Service (AWS STS) API 작업 중 하나를 선택합니다.
+ [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) - IAM 자격 증명을 사용하여 역할을 수임하는 경우 사용합니다.
+ [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - 웹 ID 공급자를 사용하여 사용자를 인증하는 경우 이 작업을 사용하세요.
+ [AssumeRoleWithSaml](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) - SAML을 사용하여 사용자를 인증할 때 이 작업을 사용하세요.

다음 예에서는 IAM 역할을 설정하는 CLI 명령을 보여줍니다. 역할은 `quicksight:GetSessionEmbedUrl`에 대한 권한이 활성화되어 있어야 합니다. 사용자가 Amazon Quick Sight를 처음 열 때 사용자를 추가하기 위해 just-in-time 접근 방식을 취하는 경우 역할에는에 대한 권한도 활성화되어 있어야 합니다`quicksight:RegisterUser`.

```
aws sts assume-role \
     --role-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
     --role-session-name john.doe@example.com
```

`assume-role` 작업은 액세스 키, 보안 키 및 세션 토큰의 세 가지 출력 파라미터를 반환합니다.

**참고**  
`AssumeRole` 작업을 호출할 때 `ExpiredToken` 오류가 발생할 경우, 이는 아마도 이전의 `SESSION TOKEN`이(가) 환경 변수에 남아 있기 때문입니다. 다음 변수를 설정하여 이를 삭제합니다.  
*AWS\$1ACCESS\$1KEY\$1ID* 
*AWS\$1SECRET\$1ACCESS\$1KEY* 
*AWS\$1SESSION\$1TOKEN* 

다음 예에서는 CLI에서 세 파라미터를 설정하는 방법을 보여줍니다. Microsoft Windows 컴퓨터를 사용하는 경우 `export` 대신 `set`을 사용하십시오.

```
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"
```

이러한 명령을 실행하여 웹 사이트를 방문하는 사용자의 역할 세션 ID를 `embedding_quicksight_console_session_role/john.doe@example.com`으로 설정합니다. 역할 세션 ID는 `role-arn`의 역할 이름과 `role-session-name` 값으로 구성됩니다. 각 사용자에 대해 적절한 권한을 설정하려면 각 사용자에 대해 고유한 역할 세션 ID를 사용해야 합니다. 또한 사용자 액세스 조절을 방지할 수 있습니다. 조절은 동일한 사용자가 여러 위치에서 Amazon Quick Sight에 액세스하지 못하도록 하는 보안 기능입니다.

역할 세션 ID도 Amazon Quick Sight의 사용자 이름이 됩니다. 이 패턴을 사용하여 Amazon Quick Sight에서 사용자를 미리 프로비저닝하거나 콘솔 세션에 처음 액세스할 때 프로비저닝할 수 있습니다.

다음 예에서는 사용자를 프로비저닝하는 데 사용할 수 있는 CLI 명령을 보여줍니다. [RegisterUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_RegisterUser.html), [DescribeUser](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_DescribeUser.html) 및 기타 Amazon Quick Sight API 작업에 대한 자세한 내용은 [Amazon Quick Sight API 참조](https://docs.aws.amazon.com/quicksight/latest/APIReference/Welcome.html)를 참조하세요.

```
aws quicksight register-user \
     --aws-account-id 111122223333 \
     --namespace default \
     --identity-type IAM \
     --iam-arn "arn:aws:iam::111122223333:role/embedding_quicksight_dashboard_role" \
     --user-role READER \
     --user-name jhnd \
     --session-name "john.doe@example.com" \
     --email john.doe@example.com \
     --region us-east-1 \
     --custom-permissions-name TeamA1
```

사용자가 Microsoft AD를 통해 인증된 경우에는 설정을 위해 `RegisterUser`를 사용하지 않아도 됩니다. 대신 Amazon Quick Sight에 처음 액세스할 때 자동으로 구독해야 합니다. Microsoft AD 사용자의 경우 사용자 ARN을 얻는 데 `DescribeUser`를 사용할 수 있습니다.

사용자가 Amazon Quick Sight에 처음 액세스할 때이 사용자를 적절한 그룹에 추가할 수도 있습니다. 다음 예에서는 사용자를 그룹에 추가하는 CLI 명령을 보여줍니다.

```
aws quicksight create-group-membership \
     --aws-account-id=111122223333 \
     --namespace=default \
     --group-name=financeusers \
     --member-name="embedding_quicksight_dashboard_role/john.doe@example.com"
```

이제 Amazon Quick Sight 사용자이기도 하고 Amazon Quick Sight 콘솔 세션에 액세스할 수 있는 앱 사용자가 생겼습니다.

마지막으로 콘솔 세션에 대해 서명된 URL을 가져오려면, 앱 서버에서 `get-session-embed-url`을(를) 호출합니다. 그러면 임베드 가능한 콘솔 세션 URL이 반환됩니다. 다음 예제에서는 AWS Managed Microsoft AD 또는 Single Sign-On(IAM Identity Center)을 통해 인증된 사용자에 대한 서버 측 호출을 사용하여 임베디드 콘솔 세션의 URL을 가져오는 방법을 보여줍니다.

```
aws quicksight get-dashboard-embed-url \
     --aws-account-id 111122223333 \
     --entry-point the-url-for--the-console-session \
     --session-lifetime-in-minutes 600 \
     --user-arn arn:aws:quicksight:us-east-1:111122223333:user/default/embedding_quicksight_dashboard_role/embeddingsession
```

이 작업의 사용에 대한 자세한 내용은 [https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetSessionEmbedUrl.html](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_GetSessionEmbedUrl.html) 단원을 참조하십시오. 자체 코드에서 이 작업 및 다른 API 작업을 사용할 수 있습니다.

------

# 3단계: 콘솔 세션 URL 임베드
<a name="embedded-analytics-full-console-for-authenticated-users-get-step-3"></a>

**중요**  
Amazon Quick Sight에는 임베딩 분석을 위한 새로운 APIs인 `GenerateEmbedUrlForAnonymousUser` 및가 있습니다`GenerateEmbedUrlForRegisteredUser`.  
`GetDashboardEmbedUrl` 및 `GetSessionEmbedUrl` APIs를 사용하여 대시보드와 Amazon Quick Sight 콘솔을 임베딩할 수 있지만 최신 임베딩 기능은 포함되어 있지 않습니다. up-to-date 임베딩 환경은 [애플리케이션에 Amazon Quick Sight 분석 임베딩을 참조하세요](https://docs.aws.amazon.com/quicksight/latest/user/embedding-overview.html).

다음 섹션에서는 [Amazon Quick Sight 임베딩 SDK](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)(JavaScript)를 사용하여 웹 사이트 또는 애플리케이션 페이지의 3단계에서 콘솔 세션 URL을 임베딩하는 방법을 확인할 수 있습니다. SDK를 사용하여 다음 작업을 수행할 수 있습니다.
+ 콘솔 세션을 HTML 페이지에 배치합니다.
+ 콘솔 세션에 파라미터를 전달합니다.
+ 애플리케이션에 사용자 지정되는 메시지로 오류 상태 처리

`GetSessionEmbedUrl` API 작업을 호출하여 앱에 포함할 수 있는 URL을 가져오세요. 이 URL은 5분 동안 유효하며 결과 세션은 10시간 동안 유효합니다. 이 API 작업은 URL에 single-sign on 세션을 허용하는 `auth_code`을(를) 제공합니다.

다음은 `get-dashboard-embed-url`의 응답 예입니다.

```
//The URL returned is over 900 characters. For this example, we've shortened the string for
//readability and added ellipsis to indicate that it's incomplete.
{
     "Status": "200",
     "EmbedUrl": "https: //dashboards.example.com/embed/620bef10822743fab329fb3751187d2d...",
     "RequestId": "7bee030e-f191-45c4-97fe-d9faf0e03713"
}
```

Amazon Quick Sight 임베[딩 SDK를 사용하거나이 URL을 iframe에 추가하여 웹 페이지에이 콘솔 세션을 임베](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)딩합니다. 고정 높이 및 너비 숫자(픽셀)를 설정하면 Amazon Quick Sight는 이를 사용하며 창의 크기가 조정될 때 시각적 객체를 변경하지 않습니다. 상대 백분율 높이와 너비를 설정하면 Amazon Quick Sight는 창 크기가 변경될 때 수정되는 응답형 레이아웃을 제공합니다. Amazon Quick Sight 임베딩 SDK를 사용하면 콘솔 세션 내에서 파라미터를 제어하고 페이지 로드 완료 및 오류 측면에서 콜백을 수신할 수도 있습니다.

다음 예제는 생성된 URL을 사용하는 방법을 보여 줍니다. 이 코드는 앱 서버에서 생성됩니다.

```
<!DOCTYPE html>
<html>

<head>
    <title>Basic Embed</title>

    <script src="./quicksight-embedding-js-sdk.min.js"></script>
    <script type="text/javascript">
        var dashboard;

        function embedDashboard() {
            var containerDiv = document.getElementById("embeddingContainer");
            var options = {
                // replace this dummy url with the one generated via embedding API
                url: "https://us-east-1.quicksight.aws.amazon.com/sn/dashboards/dashboardId?isauthcode=true&identityprovider=quicksight&code=authcode",  
                container: containerDiv,
                scrolling: "no",
                height: "700px",
                width: "1000px",
                footerPaddingEnabled: true
            };
            dashboard = QuickSightEmbedding.embedDashboard(options);
        }
    </script>
</head>

<body onload="embedDashboard()">
    <div id="embeddingContainer"></div>
</body>

</html>
```

이 예제가 작동하려면 Amazon Quick Sight 임베딩 SDK를 사용하여 JavaScript를 사용하여 웹 사이트에 임베디드 콘솔 세션을 로드해야 합니다. 이 정보를 얻으려면 다음 중 하나를 수행합니다.
+ GitHub에서 [Amazon Quick Sight 임베딩 SDK](https://github.com/awslabs/amazon-quicksight-embedding-sdk#step-3-create-the-quicksight-session-object)를 다운로드합니다. 이 리포지토리는 Amazon Quick Sight 개발자 그룹이 유지 관리합니다.
+ [https://www.npmjs.com/package/amazon-quicksight-embedding-sdk](https://www.npmjs.com/package/amazon-quicksight-embedding-sdk)에서 최신 임베딩 SDK 버전을 다운로드하세요.
+ JavaScript 종속성에 `npm`을(를) 사용하는 경우 다음 명령을 실행하여 다운로드하고 설치합니다.

  ```
  npm install amazon-quicksight-embedding-sdk
  ```