고급 서비스를 사용한 BigQuery 행 수준 보안

예를 들어 영업 조직을 위한 솔루션을 만들려고 한다고 가정해 보겠습니다. 영업 조직은 여러 리전으로 나뉘며, 각 리전에는 자체 리전 관리자가 있습니다. BigQuery의 판매 데이터 세트에는 지역별 및 날짜별 판매 금액이 있습니다

제안된 솔루션에는 지역 관리자가 해당 지역의 판매 데이터만 볼 수 있는 단일 대시보드가 있습니다.

요구사항

  • 대시보드 뷰어는 Google 계정으로 로그인하게 됩니다.
  • 사용자의 이메일과 사용자가 액세스할 수 있는 데이터/행 간에 매핑을 사용할 수 있습니다.
  • 서비스 계정은 BigQuery 데이터에 액세스하는 데 사용됩니다. 따라서 청구는 중앙 집중화되고 대시보드 제공업체가 관리합니다.

제한사항

  • 대시보드를 처음 볼 때 각 뷰어의 일회성 승인이 필요합니다.
  • 뷰어는 대시보드를 수정하거나 다른 사용자와 공유할 수 없습니다.
  • Workspace 고객이고 관리자가 '링크가 있는 모든 사용자'와의 Drive 파일 공유를 사용 중지한 경우 공유 제한을 삭제하거나 Gmail.com 계정에서 솔루션을 개발하세요.

해결 방법

솔루션을 구현하려면 다음 단계를 모두 완료하세요.

새 커뮤니티 커넥터 만들기

커뮤니티 커넥터 작동 방식을 검토하고 커뮤니티 커넥터 Codelab을 완료하여 시작하세요. 커넥터 생성을 위한 개발자 도구를 사용하면 개발 프로세스를 더 빠르고 쉽게 수행할 수 있습니다.

커넥터 코드 작성

  1. getAuthType()NONE를 반환해야 합니다.
  2. getConfig()는 빈 구성을 반환해야 합니다.
    • 선택사항: 대시보드 구성을 위한 특정 입력이 필요한 경우 여기에서 사용자 입력을 요청할 수 있습니다.
  3. getSchema()는 쿼리의 스키마를 반환해야 합니다.
    • 선택사항: SQL 쿼리에서 또는 계산된 필드를 스키마의 일부로 사용하여 맞춤 필드와 계산을 추가할 수 있습니다.
  4. getData() 작업은 나중 단계에서 완료됩니다.

매니페스트 업데이트

매니페스트 참조를 확인하고 다음을 포함한 모든 필수 정보로 매니페스트를 작성합니다.

  1. dataStudio.forceViewersCredentialstrue로 설정합니다.
  2. dataStudio.advancedServices.datatrue로 설정합니다.
  3. oauthScopes의 경우 https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/script.external_request를 추가합니다. 자세한 내용은 Apps Script의 승인 범위를 참조하세요.
    • 조건부: 커넥터에서 사용되는 서비스의 모든 관련 범위를 추가합니다.

매니페스트는 다음과 같이 표시됩니다.

{
  ...
  "dataStudio": {
    "forceViewersCredentials": true,
    "advancedServices": {
       "data": true
    },
    ...
  }
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/userinfo.email"
    ],
  ...
}

서비스 계정 구현

  1. Google Cloud 프로젝트에서 서비스 계정을 만듭니다. 이것이 결제 프로젝트가 됩니다.
  2. 이 서비스 계정에 클라우드 프로젝트에서 BigQuery 액세스 권한이 있는지 확인하세요.
    • 필요한 Identity and Access Management (IAM) 역할: BigQuery Data Viewer, BigQuery Job User
  3. JSON 파일을 다운로드하여 서비스 계정 키를 가져옵니다. 커넥터 프로젝트의 스크립트 속성에 키를 저장하세요.
  4. Apps Script 프로젝트에 Apps Script용 OAuth2 라이브러리를 포함합니다.
  5. 서비스 계정에 필요한 OAuth2 코드를 구현합니다.
    var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
    var SERVICE_ACCOUNT_KEY = 'private_key';
    var SERVICE_ACCOUNT_EMAIL = 'client_email';
    var BILLING_PROJECT_ID = 'project_id';
    
    /**
     * Copy the entire credentials JSON file from creating a service account in GCP.
     */
    function getServiceAccountCreds() {
      return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
    }
    
    function getOauthService() {
      var serviceAccountCreds = getServiceAccountCreds();
      var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
      var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];
    
      return OAuth2.createService('RowLevelSecurity')
        .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
        .setTokenUrl('https://accounts.google.com/o/oauth2/token')
        .setPrivateKey(serviceAccountKey)
        .setIssuer(serviceAccountEmail)
        .setPropertyStore(scriptProperties)
        .setCache(CacheService.getScriptCache())
        .setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
    }
    

getData() 구현

  1. BigQuery 쿼리를 작성합니다.
    • 이메일을 사용하여 이메일과 데이터 간의 매핑을 조회합니다.
    • JOIN 또는 WHERE 절을 사용하여 데이터를 필터링합니다.
  2. 유효 사용자의 이메일을 가져옵니다 (사용자 ID 참조).
  3. Looker Studio 고급 서비스를 사용하여 getData에서 쿼리 구성을 반환합니다.
    • 구성된 쿼리, 결제 프로젝트, 서비스 계정 OAuth 토큰을 전달합니다.
    • 조건부: getConfig 커넥터를 통해 사용자 입력을 받는 경우 입력을 BigQuery 매개변수로 통합해야 합니다.

대시보드 만들기

  1. 커넥터의 배포 및 버전 작동 방식을 이해합니다.
  2. 커넥터의 프로덕션 배포를 만듭니다.
  3. 프로덕션 배포를 사용하여 Looker Studio에서 데이터 소스와 새 보고서를 만듭니다.
  4. 보고서에 표와 차트를 모두 추가합니다.
  5. 이제 대시보드를 사용자와 공유할 준비가 되었습니다.

사용자가 대시보드를 사용할 수 있도록 설정

  1. 선택한 사용자 또는 '링크가 있는 모든 사용자'와 커넥터 스크립트를 공유합니다.
  2. 선택한 사용자 또는 '링크가 있는 모든 사용자'와 대시보드를 공유합니다.
  3. 선택사항: URL 단축기 서비스를 사용하여 대시보드 URL의 단축 링크를 만듭니다. 단축 URL을 사용자와 공유합니다. 이렇게 하면 필요한 경우 나중에 대시보드 URL을 바꾸는 데 도움이 됩니다.
  4. 선택사항: 보고서에 Google 애널리틱스를 설정하여 대시보드 사용량을 측정합니다.

예시 코드