예를 들어 영업을 위한 솔루션을 만든다고 가정해 보겠습니다. 되었습니다. 영업 조직은 여러 지역으로 나뉘며 각 지역이 에는 자체 지역 관리자가 있습니다. BigQuery의 영업 데이터 세트에는 판매가 있습니다. 확인할 수 있습니다.
제안된 솔루션에는 단일 대시보드가 있으며, 여기에서 지역 관리자가 은(는) 해당 지역의 판매 데이터만 볼 수 있습니다.
요구사항
- 대시보드 뷰어는 Google 계정으로 로그인됩니다.
- 사용자의 이메일과 보유한 데이터/행 간에 매핑을 사용할 수 있음 액세스할 수 있습니다
- BigQuery 데이터에 액세스하는 데 서비스 계정이 사용됩니다. 따라서 결제는 대시보드 제공업체가 중앙 집중화하고 관리합니다
제한사항
- 대시보드에서는 처음에는 각 뷰어의 일회성 승인이 필요합니다. 합니다.
- 뷰어는 대시보드를 수정하거나 다른 사용자와 공유할 수 없습니다.
- Workspace 고객이며 관리자가 공유를 사용 중지한 경우 Drive 파일을 '링크가 있는 모든 사용자'에 추가하려면 공유를 중지하세요. Gmail.com 계정에서 솔루션을 개발할 수 있습니다.
솔루션
다음 단계를 모두 완료하여 솔루션을 구현합니다.
새 커뮤니티 커넥터 만들기
커뮤니티 커넥터 작동 방식을 검토하고 커뮤니티 커넥터 Codelab을 참고하세요. 개발자 도구를 사용하여 커넥터 생성 개발 프로세스가 더 빠르고 간편해집니다.
커넥터 코드 작성
getAuthType()
는NONE
를 반환해야 합니다.getConfig()
는 빈 구성을 반환해야 합니다.- 선택사항: 대시보드 구성을 위해 특정 입력이 필요한 경우 사용자 입력을 요청할 수 있습니다
getSchema()
는 쿼리의 스키마를 반환해야 합니다.- 선택사항: SQL 또는 BigQuery API 중 하나에서 맞춤 필드와 계산을 추가할 수 있습니다. 계산된 필드를 스키마의 일부로 사용할 수 있습니다.
getData()
작업은 이후 단계에서 완료됩니다.
매니페스트 업데이트
매니페스트 참조를 확인하고 필요한 모든 항목을 포함하여 매니페스트를 작성합니다. 다음과 같은 정보를 포함합니다.
dataStudio.forceViewersCredentials
를true
로 설정합니다.dataStudio.advancedServices.data
를true
로 설정합니다.oauthScopes
에https://www.googleapis.com/auth/userinfo.email
추가 및https://www.googleapis.com/auth/script.external_request
입니다. 승인을 참조하세요. Apps Script 범위를 참조하세요. <ph type="x-smartling-placeholder">- </ph>
- 조건부: 커넥터가 있습니다.
매니페스트는 다음과 같이 표시됩니다.
{
...
"dataStudio": {
"forceViewersCredentials": true,
"advancedServices": {
"data": true
},
...
}
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
],
...
}
서비스 계정 구현
- Google Cloud 프로젝트에서 서비스 계정을 만듭니다. 사용 중인 결제 프로젝트에 액세스할 수 있습니다
- 이 서비스 계정에 클라우드 프로젝트의 BigQuery 액세스 권한이 있는지 확인하세요.
- 필요한 Identity and Access Management (IAM) 역할:
BigQuery Data Viewer
,BigQuery Job User
- 필요한 Identity and Access Management (IAM) 역할:
- JSON 파일을 다운로드하여 서비스 계정 키를 가져옵니다. 키를 커넥터 프로젝트의 스크립트 속성을 따라야 합니다.
- Apps Script 프로젝트에 Apps Script용 OAuth2 라이브러리를 포함합니다.
- 서비스 계정에 필요한 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()
구현
- BigQuery 쿼리를 구성합니다.
- 이메일을 사용하여 이메일과 데이터 간의 매핑을 조회합니다.
- JOIN 및/또는 WHERE 절을 사용하여 데이터 필터링
- 유효 사용자의 이메일 (사용자 ID 참조)을 가져옵니다.
- Looker Studio 고급 서비스를 사용하여 쿼리 구성을 반환합니다.
할 수 있습니다.
- 구성된 쿼리, 결제 프로젝트, 서비스 계정 전달 OAuth 토큰입니다.
- 조건부:
getConfig
커넥터를 통해 사용자 입력을 받는 경우 입력을 BigQuery 매개변수로 통합해야 합니다.
대시보드 만들기
- 커넥터의 배포 및 버전 작동 방식을 이해합니다.
- 커넥터의 프로덕션 배포를 만듭니다.
- 프로덕션 배포를 사용하여 Looker Studio로 이동합니다.
- 보고서에 모든 표와 차트를 추가합니다.
- 이제 대시보드를 사용자와 공유할 준비가 되었습니다.
사용자에게 대시보드 제공
- 선택한 사용자 또는 '모든 사용자'와 커넥터 스크립트 공유 링크가 표시됩니다.
- 선택한 사용자 또는 '다음이 있는 모든 사용자'와 대시보드 공유 링크'를 클릭하세요.
- 선택사항: URL Shortener 서비스를 사용하여 대시보드 URL을 클릭합니다. 단축된 URL을 사용자와 공유합니다. 이렇게 하면 필요한 경우 나중에 대시보드 URL을 변경할 수 있습니다.
- 선택사항: 다음에 대해 Google 애널리틱스를 설정하여 대시보드 사용을 측정합니다. 확인할 수 있습니다
예시 코드
다음은 커넥터 코드의 전체 예입니다.
기본.js
var cc = DataStudioApp.createCommunityConnector();
var scriptProperties = PropertiesService.getScriptProperties();
function isAdminUser() {
return true;
}
function getAuthType() {
var AuthTypes = cc.AuthType;
return cc
.newAuthTypeResponse()
.setAuthType(AuthTypes.NONE)
.build();
}
function getConfig(request) {
var config = cc.getConfig();
config
.newInfo()
.setId('generalInfo')
.setText('This is an example connector to showcase row level security.');
return config.build();
}
function getFields() {
var fields = cc.getFields();
var types = cc.FieldType;
var aggregations = cc.AggregationType;
fields
.newDimension()
.setId('region')
.setName('Region')
.setType(types.TEXT);
fields
.newMetric()
.setId('sales')
.setName('Sales')
.setType(types.NUMBER)
.setAggregation(aggregations.SUM);
fields
.newDimension()
.setId('date')
.setName('Date')
.setType(types.YEAR_MONTH_DAY);
return fields;
}
function getSchema(request) {
return {schema: getFields().build()};
}
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']);
}
var BASE_SQL =
'SELECT d.region, d.sales, d.date ' +
'FROM `datastudio-solutions.row_level_security.data` d ' +
'INNER JOIN `datastudio-solutions.row_level_security.access` a ' +
'ON d.region = a.region ' +
'where a.email=@email';
function getData(request) {
var accessToken = getOauthService().getAccessToken();
var serviceAccountCreds = getServiceAccountCreds();
var billingProjectId = serviceAccountCreds[BILLING_PROJECT_ID];
var email = Session.getEffectiveUser().getEmail();
var bqTypes = DataStudioApp.createCommunityConnector().BigQueryParameterType;
return cc
.newBigQueryConfig()
.setAccessToken(accessToken)
.setBillingProjectId(billingProjectId)
.setUseStandardSql(true)
.setQuery(BASE_SQL)
.addQueryParameter('email', bqTypes.STRING, email)
.build();
}