1. 개요/소개
웹, 애플리케이션 서버, 데이터베이스로 구성된 다중 계층 애플리케이션은 웹 개발의 기본이며 많은 웹사이트의 시작점이지만, 성공하면 확장성, 통합, 민첩성과 관련된 문제가 발생하는 경우가 많습니다. 예를 들어 데이터를 실시간으로 처리하고 여러 주요 비즈니스 시스템에 배포하는 방법이 있습니다. 이러한 문제와 인터넷 규모 애플리케이션의 요구사항으로 인해 분산 메시지 시스템이 필요해졌고 데이터 파이프라인을 사용하여 복원력 있는 실시간 시스템을 구현하는 아키텍처 패턴이 등장했습니다. 따라서 분산 메시지 시스템에 실시간 데이터를 게시하는 방법과 데이터 파이프라인을 빌드하는 방법을 이해하는 것은 개발자와 설계자 모두에게 중요한 기술입니다.
빌드할 항목
이 Codelab에서는 사물 인터넷 (IoT) 기기로 시작하고, 메시지 대기열을 활용하여 데이터를 수신 및 전송하고, 서버리스 함수를 활용하여 데이터를 데이터 웨어하우스로 이동한 다음, 정보를 표시하는 대시보드를 만드는 날씨 데이터 파이프라인을 빌드합니다. 날씨 센서가 있는 Raspberry Pi가 IoT 기기로 사용되고 Google Cloud Platform의 여러 구성요소가 데이터 파이프라인을 형성합니다. Raspberry Pi를 빌드하는 것은 유용하지만 이 Codelab의 선택사항이며 스트리밍 날씨 데이터는 스크립트로 대체할 수 있습니다.

이 Codelab의 단계를 완료하면 온도, 습도, 이슬점, 기압을 표시하는 대시보드에 데이터를 제공하는 스트리밍 데이터 파이프라인이 생성됩니다.

학습할 내용
- Google Pub/Sub 사용 방법
- Google Cloud 함수를 배포하는 방법
- Google BigQuery를 활용하는 방법
- Google 데이터 스튜디오를 사용하여 대시보드를 만드는 방법
- 또한 IoT 센서를 빌드하면 Google Cloud SDK를 활용하는 방법과 Google Cloud Platform에 대한 원격 액세스 호출을 보호하는 방법도 배우게 됩니다.
필요한 항목
- Google Cloud Platform 계정 Google Cloud Platform 신규 사용자는 $300 상당의 무료 체험판을 사용할 수 있습니다.
샘플 데이터와 스크립트를 활용하는 대신 이 Codelab의 IoT 센서 부분을 빌드하려면 다음 항목도 필요합니다 ( 여기에서 완전한 키트 또는 개별 부품으로 주문할 수 있음).
- 전원 공급 장치, SD 메모리 카드, 케이스가 포함된 Raspberry Pi Zero W
- USB 카드 리더
- USB 허브 (Raspberry Pi의 단일 USB 포트에 키보드와 마우스를 연결할 수 있음)
- 암-암 브레드보드 전선
- GPIO 해머 헤더
- BME280 센서
- 납땜 인두와 땜납
또한 HDMI 입력 단자가 있는 컴퓨터 모니터 또는 TV, HDMI 케이블, 키보드, 마우스에 액세스할 수 있다고 가정합니다.
2. 설정
자습형 환경 설정
아직 Google 계정 (Gmail 또는 G Suite)이 없으면 계정을 만들어야 합니다. 이미 Google 계정이 있든 없든 $300 상당의 무료 체험판을 꼭 사용해 보세요.
Google Cloud Platform 콘솔 ( console.cloud.google.com)에 로그인합니다. 이 실습에서는 기본 프로젝트 ('내 첫 번째 프로젝트')를 사용하거나 새 프로젝트를 만들 수 있습니다. 새 프로젝트를 만들려면 리소스 관리 페이지를 사용하세요. 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유한 이름이어야 합니다 (아래에 표시된 ID는 이미 사용되었으므로 사용할 수 없습니다). 나중에 필요하므로 프로젝트 ID (예: 프로젝트 ID는 _____)를 기록해 둡니다.


이 Codelab을 실행하는 데는 많은 비용이 들지 않지만 더 많은 리소스를 사용하거나 실행 중일 경우 비용이 더 들 수 있습니다. Codelab 끝에 있는 정리 섹션을 확인하세요.
3. BigQuery 테이블 만들기
BigQuery는 확장성이 뛰어난 서버리스 저비용 엔터프라이즈 데이터 웨어하우스로, IoT 기기에서 스트리밍되는 데이터를 저장하는 데 적합하며 분석 대시보드에서 정보를 쿼리할 수도 있습니다.
모든 IoT 날씨 데이터를 저장할 표를 만들어 보겠습니다. Cloud 콘솔에서 BigQuery를 선택합니다. 그러면 새 창에서 BigQuery가 열립니다 (나중에 다시 액세스해야 하므로 원래 창을 닫지 마세요).

프로젝트 이름 옆에 있는 아래쪽 화살표 아이콘을 클릭한 다음 '새 데이터 세트 만들기'를 선택합니다.

데이터 세트에 'weatherData'를 입력하고 저장할 위치를 선택한 후 '확인'을 클릭합니다.

데이터 세트 옆에 있는 '+' 기호를 클릭하여 새 테이블을 만듭니다.

소스 데이터에서 빈 테이블 만들기를 선택합니다. 대상 테이블 이름에 weatherDataTable을 입력합니다. 스키마에서 필드 추가 버튼을 클릭하여 총 9개의 필드를 추가합니다. 아래와 같이 필드를 채우고 각 필드에 적절한 유형을 선택합니다. 모든 항목을 완료한 후 표 만들기 버튼을 클릭합니다.

다음과 같은 결과가 표시됩니다.

이제 날씨 데이터를 수신하도록 데이터 웨어하우스가 설정되었습니다.
4. Pub/Sub 주제 만들기
Cloud Pub/Sub는 스트림 분석 및 이벤트 기반 컴퓨팅 시스템에 사용되는 간단하고도 안정적인 확장형 기반입니다. 따라서 수신되는 IoT 메시지를 처리한 후 다운스트림 시스템에서 이를 처리하도록 허용하는 데 적합합니다.
BigQuery 창에 계속 있는 경우 Cloud 콘솔로 다시 전환합니다. Cloud 콘솔을 닫은 경우 https://console.cloud.google.com으로 이동합니다.
Cloud Console에서 Pub/Sub를 선택한 다음 Topics를 선택합니다.

API 사용 설정 메시지가 표시되면 API 사용 설정 버튼을 클릭합니다.

주제 만들기 버튼을 클릭합니다.

주제 이름으로 'weatherdata'를 입력하고 '만들기'를 클릭합니다.

새로 생성된 주제가 표시됩니다.

이제 IoT 메시지를 게시하고 다른 프로세스가 해당 메시지에 액세스할 수 있도록 하는 Pub/Sub 주제가 있습니다.
주제에 보안 게시
Google Cloud 콘솔 외부의 리소스 (예: IoT 센서)에서 Pub/Sub 주제에 메시지를 게시하려는 경우 서비스 계정을 사용하여 액세스를 더 엄격하게 제어하고 신뢰 인증서를 만들어 연결의 보안을 보장해야 합니다.
Cloud 콘솔에서 IAM 및 관리자를 선택한 후 서비스 계정을 선택합니다.

'서비스 계정 만들기' 버튼을 클릭합니다.

역할 드롭다운에서 Pub/Sub 게시자 역할을 선택합니다.

서비스 계정 이름 (iotWeatherPublisher)을 입력하고 '새 비공개 키 제공' 체크박스를 선택한 후 '키 유형'이 'JSON'으로 설정되어 있는지 확인하고 '만들기'를 클릭합니다.

보안 키가 자동으로 다운로드됩니다. 키는 하나만 있으므로 분실하지 않는 것이 중요합니다. 닫기를 클릭합니다.

서비스 계정이 생성되었고 연결된 키 ID가 표시됩니다.

나중에 키에 쉽게 액세스할 수 있도록 Google Cloud Storage에 저장합니다. Cloud 콘솔에서 스토리지와 브라우저를 선택합니다.

'버킷 만들기' 버튼을 클릭합니다.

스토리지 버킷의 이름을 선택합니다 (Google Cloud 전체에서 전역적으로 고유한 이름이어야 함). '만들기' 버튼을 클릭합니다.

자동으로 다운로드된 보안 키를 찾아 스토리지 버킷으로 드래그 앤 드롭하거나 업로드합니다.

키 업로드가 완료되면 Cloud Storage 브라우저에 표시됩니다.

나중에 사용할 수 있도록 스토리지 버킷 이름과 보안 키 파일 이름을 기록해 둡니다.
5. Cloud 함수 만들기
클라우드 컴퓨팅을 통해 어디에서나 발생하는 이벤트에 대한 응답으로 필요에 따라 로직을 가동할 수 있는 완전한 서버리스 컴퓨팅 모델이 가능해졌습니다. 이 실습에서는 메시지가 날씨 주제에 게시될 때마다 Cloud 함수가 시작되고, 메시지를 읽은 다음 BigQuery에 저장합니다.
Cloud Console에서 Cloud Functions를 선택합니다.

API 메시지가 표시되면 API 사용 설정 버튼을 클릭합니다.

함수 만들기 버튼을 클릭합니다.

'이름' 필드에 function-weatherPubSubToBQ를 입력합니다. 트리거에서 Cloud Pub/Sub 주제를 선택하고 주제 드롭다운에서 weatherdata를 선택합니다. 소스 코드의 경우 인라인 편집기를 선택합니다. index.js 탭에서 기존 코드를 다음 코드로 바꿉니다. projectId, datasetId, tableId의 상수를 환경에 맞게 변경해야 합니다.
/**
* Background Cloud Function to be triggered by PubSub.
*
* @param {object} event The Cloud Functions event.
* @param {function} callback The callback function.
*/
exports.subscribe = function (event, callback) {
const BigQuery = require('@google-cloud/bigquery');
const projectId = "myProject"; //Enter your project ID here
const datasetId = "myDataset"; //Enter your BigQuery dataset name here
const tableId = "myTable"; //Enter your BigQuery table name here -- make sure it is setup correctly
const PubSubMessage = event.data;
// Incoming data is in JSON format
const incomingData = PubSubMessage.data ? Buffer.from(PubSubMessage.data, 'base64').toString() : "{'sensorID':'na','timecollected':'1/1/1970 00:00:00','zipcode':'00000','latitude':'0.0','longitude':'0.0','temperature':'-273','humidity':'-1','dewpoint':'-273','pressure':'0'}";
const jsonData = JSON.parse(incomingData);
var rows = [jsonData];
console.log(`Uploading data: ${JSON.stringify(rows)}`);
// Instantiates a client
const bigquery = BigQuery({
projectId: projectId
});
// Inserts data into a table
bigquery
.dataset(datasetId)
.table(tableId)
.insert(rows)
.then((foundErrors) => {
rows.forEach((row) => console.log('Inserted: ', row));
if (foundErrors && foundErrors.insertErrors != undefined) {
foundErrors.forEach((err) => {
console.log('Error: ', err);
})
}
})
.catch((err) => {
console.error('ERROR:', err);
});
// [END bigquery_insert_stream]
callback();
};
package.json 탭에서 자리표시자 코드를 다음 코드로 바꿉니다.
{
"name": "function-weatherPubSubToBQ",
"version": "0.0.1",
"private": true,
"license": "Apache-2.0",
"author": "Google Inc.",
"dependencies": {
"@google-cloud/bigquery": "^0.9.6"
}
}
실행할 함수가 'HelloWorld'로 설정된 경우 'subscribe'로 변경합니다. 만들기 버튼을 클릭합니다.

함수가 배포되었음을 표시하는 데 약 2분이 걸립니다.

축하합니다. 함수를 통해 Pub/Sub을 BigQuery에 연결했습니다.
6. IoT 하드웨어 설정 (선택사항)
Raspberry Pi와 센서 조립
핀이 7개를 초과하는 경우 헤더를 7개의 핀으로만 자릅니다. 헤더 핀을 센서 보드에 납땜합니다.

Raspberry Pi에 해머 헤더 핀을 설치합니다.

여기의 단계에 따라 SD 카드를 포맷하고 NOOBS (New Out Of Box Software) 설치 프로그램을 설치합니다. SD 카드를 Raspberry Pi에 삽입하고 Raspberry Pi를 케이스에 넣습니다.

브레드보드 와이어를 사용하여 아래 다이어그램에 따라 센서를 Raspberry Pi에 연결합니다.

Raspberry Pi 핀 | 센서 연결 |
핀 1 (3.3V) | VIN |
핀 3 (CPIO2) | SDI |
핀 5 (GPIO3) | SCK |
핀 9 (접지) | GND |

모니터 (미니 HDMI 커넥터 사용), 키보드/마우스 (USB 허브 사용), 전원 어댑터를 차례로 연결합니다.
Raspberry Pi 및 센서 구성
Raspberry Pi의 부팅이 완료되면 원하는 운영체제로 Raspbian을 선택하고 원하는 언어가 올바른지 확인한 후 설치 (창의 왼쪽 상단에 있는 하드 드라이브 아이콘)를 클릭합니다.

Wi-Fi 아이콘 (화면 오른쪽 상단)을 클릭하고 네트워크를 선택합니다. 보안 네트워크인 경우 비밀번호 (사전 공유 키)를 입력합니다.

라즈베리 아이콘 (화면 왼쪽 상단)을 클릭하고 환경설정, Raspberry Pi 구성 순으로 선택합니다. 인터페이스 탭에서 I2C를 사용 설정합니다. 현지화 탭에서 언어와 시간대를 설정합니다. 표준 시간대를 설정한 후 Raspberry Pi를 재부팅합니다.

재부팅이 완료되면 터미널 아이콘을 클릭하여 터미널 창을 엽니다.

다음 명령어를 입력하여 센서가 올바르게 연결되었는지 확인합니다.
sudo i2cdetect -y 1
결과는 다음과 같이 표시됩니다. 77이 표시되는지 확인하세요.

Google Cloud SDK 설치
Google Cloud 플랫폼의 도구를 활용하려면 Raspberry Pi에 Google Cloud SDK를 설치해야 합니다. SDK에는 Google Cloud Platform을 관리하고 활용하는 데 필요한 도구가 포함되어 있으며 여러 프로그래밍 언어로 제공됩니다.
아직 열려 있지 않은 경우 Raspberry Pi에서 터미널 창을 열고 SDK 버전을 Raspberry Pi의 운영체제와 일치하도록 환경 변수를 설정합니다.
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
이제 설치 도구에서 SDK를 설치하라는 메시지가 표시될 때 어디를 찾아야 하는지 알 수 있도록 Google Cloud SDK 패키지가 저장된 위치를 추가합니다.
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
설치 중에 Raspberry Pi가 보안을 확인하고 콘텐츠를 신뢰할 수 있도록 Google 패키지 저장소에서 공개 키를 추가합니다.
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
Raspberry Pi의 모든 소프트웨어가 최신 상태인지 확인하고 핵심 Google Cloud SDK를 설치합니다.
sudo apt-get update && sudo apt-get install google-cloud-sdk
'계속 진행하시겠어요?' 메시지가 표시되면 Enter 키를 누릅니다.
Python 패키지 관리자를 사용하여 tendo 패키지를 설치합니다. 이 패키지는 스크립트가 두 번 이상 실행되고 있는지 확인하는 데 사용되며 날씨 스크립트 애플리케이션에 설치됩니다.
pip install tendo
Python 패키지 관리자를 사용하여 Python용 Google Cloud PubSub 및 OAuth2 패키지가 설치되어 있고 최신 상태인지 확인합니다.
sudo pip install --upgrade google-cloud-pubsub
sudo pip install --upgrade oauth2client
Google Cloud SDK 초기화
SDK를 사용하면 인증된 사용자가 Google Cloud에 원격으로 액세스할 수 있습니다. 이 Codelab에서는 보안 키를 Raspberry Pi에 쉽게 다운로드할 수 있도록 스토리지 버킷에 액세스하는 데 사용됩니다.
Raspberry Pi의 명령줄에서 다음을 입력합니다.
gcloud init --console-only
'로그인하시겠어요 (Y/n)?'라는 메시지가 표시되면 Enter 키를 누릅니다.
'브라우저에서 다음 링크로 이동하세요'라는 메시지와 https://accounts.google.com/o/oauth로 시작하는 긴 URL이 표시되면 마우스를 URL 위로 가져가 마우스 오른쪽 버튼을 클릭하고 'URL 복사'를 선택합니다. 그런 다음 웹브라우저 (화면 왼쪽 상단의 파란색 지구본 아이콘)를 열고 주소 표시줄을 마우스 오른쪽 버튼으로 클릭한 다음 '붙여넣기'를 클릭합니다.
로그인 화면이 표시되면 Google Cloud 계정과 연결된 이메일 주소를 입력하고 Enter 키를 누릅니다. 그런 다음 비밀번호를 입력하고 다음 버튼을 클릭합니다.
Google Cloud SDK에서 Google 계정에 액세스하려고 한다는 메시지가 표시됩니다. 허용 버튼을 클릭합니다.
인증 코드가 표시됩니다. 마우스를 사용하여 강조 표시한 다음 마우스 오른쪽 버튼을 클릭하고 복사를 선택합니다. 터미널 창으로 돌아가 커서가 'Enter verification code:' 오른쪽에 있는지 확인하고 마우스 오른쪽 버튼을 클릭한 다음 붙여넣기를 선택합니다. Enter 버튼을 누릅니다.
'사용할 클라우드 프로젝트를 선택하세요'라는 메시지가 표시되면 이 Codelab에서 사용한 프로젝트 이름에 해당하는 번호를 입력한 다음 Enter 키를 누릅니다.
컴퓨트 API를 사용 설정하라는 메시지가 표시되면 Enter 버튼을 눌러 사용 설정합니다. 그런 다음 Google Compute Engine 설정을 구성하라는 메시지가 표시됩니다. Enter 키를 누릅니다. 가능한 리전/영역 목록이 표시됩니다. 가까운 리전을 선택하고 해당 번호를 입력한 후 Enter 키를 누릅니다.
잠시 후 추가 정보가 표시됩니다. 이제 Google Cloud SDK가 구성되었습니다. 앞으로 필요하지 않으므로 웹브라우저 창을 닫아도 됩니다.
센서 소프트웨어 및 날씨 스크립트 설치
Raspberry Pi의 명령줄에서 입력/출력 핀에서 정보를 읽는 데 필요한 패키지를 클론합니다.
git clone https://github.com/adafruit/Adafruit_Python_GPIO
다운로드한 패키지 설치
cd Adafruit_Python_GPIO
sudo python setup.py install
cd ..
날씨 센서를 사용 설정하는 프로젝트 코드 클론
git clone https://github.com/googlecodelabs/iot-data-pipeline
센서 드라이버를 다운로드한 나머지 소프트웨어와 동일한 디렉터리에 복사합니다.
cd iot-data-pipeline/third_party/Adafruit_BME280
mv Adafruit_BME280.py ../..
cd ../..
다음과 같이 입력하여 스크립트를 수정합니다.
nano checkWeather.py
프로젝트를 프로젝트 ID로, 주제를 Pub/Sub 주제의 이름으로 변경합니다 (이 Codelab의 설정 및 Pub/Sub 주제 만들기 섹션에 기록되어 있음).
sensorID, sensorZipCode, sensorLat, sensorLong 값을 원하는 값으로 변경합니다. 특정 위치 또는 주소의 위도 및 경도 값은 여기에서 확인할 수 있습니다.
필요한 변경사항을 완료한 후 Ctrl-X를 눌러 nano 편집기를 종료합니다. Y를 눌러 확인합니다.
# constants - change to fit your project and location
SEND_INTERVAL = 10 #seconds
sensor = BME280(t_mode=BME280_OSAMPLE_8, p_mode=BME280_OSAMPLE_8, h_mode=BME280_OSAMPLE_8)
credentials = GoogleCredentials.get_application_default()
project="myProject" #change this to your Google Cloud project id
topic = "myTopic" #change this to your Google Cloud PubSub topic name
sensorID = "s-Googleplex"
sensorZipCode = "94043"
sensorLat = "37.421655"
sensorLong = "-122.085637"
보안 키 설치하기
'주제로 보안 게시' 섹션의 보안 키를 Raspberry Pi에 복사합니다.
SFTP 또는 SCP를 사용하여 로컬 머신에서 Raspberry Pi로 보안 키를 복사한 경우(/home/pi 디렉터리) 다음 단계를 건너뛰고 경로 내보내기로 바로 이동할 수 있습니다.
보안 키를 저장 버킷에 넣은 경우 저장 버킷의 이름과 파일 이름을 기억해야 합니다. gsutil 명령어를 사용하여 보안 키를 복사합니다. 이 명령어는 Google 스토리지에 액세스할 수 있습니다 (이름이 gsutil이고 파일 경로가 gs://로 시작하는 이유). 아래 명령어를 버킷 이름과 파일 이름으로 변경해야 합니다.
gsutil cp gs://nameOfYourBucket/yourSecurityKeyFilename.json .
파일이 복사되고 작업이 완료되었다는 메시지가 표시됩니다.
Raspberry Pi의 명령줄에서 보안 키의 경로를 내보냅니다 (파일 이름을 사용 중인 파일 이름과 일치하도록 변경).
export GOOGLE_APPLICATION_CREDENTIALS=/home/pi/iot-data-pipeline/yourSecurityKeyFilename.json
이제 Google Cloud로 데이터를 전송할 준비가 된 IoT 날씨 센서가 완성되었습니다.
7. 데이터 파이프라인 시작
Compute API를 사용 설정해야 할 수 있음
Raspberry Pi에서 데이터 스트리밍
Raspberry Pi IoT 날씨 센서를 구성한 경우 날씨 데이터를 읽고 Google Cloud Pub/Sub에 푸시하는 스크립트를 시작합니다. /home/pi/iot-data-pipeline 디렉터리에 있지 않다면 먼저 이동합니다.
cd /home/pi/iot-data-pipeline
날씨 스크립트 시작
python checkWeather.py
터미널 창에 날씨 데이터 결과가 매분 표시됩니다. 데이터가 흐르면 다음 섹션 (데이터가 흐르는지 확인)으로 건너뛸 수 있습니다.
시뮬레이션된 데이터 스트리밍
IoT 날씨 센서를 빌드하지 않은 경우 Google Cloud Storage에 저장된 공개 데이터 세트를 사용하여 데이터 스트리밍을 시뮬레이션하고 기존 Pub/Sub 주제에 데이터를 제공할 수 있습니다. Cloud Storage에서 읽고 Pub/Sub에 게시하기 위한 Google 제공 템플릿과 함께 Google Dataflow가 사용됩니다.
이 과정의 일환으로 Dataflow에 임시 스토리지 위치가 필요하므로 이 용도로 사용할 스토리지 버킷을 만들어 보겠습니다.
Cloud 콘솔에서 스토리지와 브라우저를 선택합니다.

'버킷 만들기' 버튼을 클릭합니다.

스토리지 버킷의 이름을 선택합니다 (모든 Google Cloud에서 전역적으로 고유한 이름이어야 함). '만들기' 버튼을 클릭합니다. 이 스토리지 버킷의 이름은 곧 필요하므로 기억해 둡니다.

Cloud 콘솔에서 Dataflow를 선택합니다.

템플릿에서 작업 만들기 (화면 상단)를 클릭합니다.

아래와 같이 작업 세부정보를 입력합니다. 다음 사항에 유의하세요.
- dataflow-gcs-to-pubsub의 작업 이름을 입력합니다.
- 프로젝트가 호스팅되는 위치에 따라 리전이 자동으로 선택되므로 변경할 필요가 없습니다.
- GCS 텍스트를 Cloud Pub/Sub로 변환하는 Cloud Dataflow 템플릿을 선택합니다.
- 입력 Cloud Storage 파일에 gs://codelab-iot-data-pipeline-sampleweatherdata/*.json을 입력합니다(공개 데이터 세트임).
- 출력 Pub/Sub 주제의 정확한 경로는 프로젝트 이름에 따라 다르며 'projects/yourProjectName/topics/weatherdata'와 같은 형식입니다.
- 임시 위치를 방금 만든 Google Cloud Storage 버킷의 이름과 파일 이름 접두사 'tmp'으로 설정합니다. 'gs://myStorageBucketName/tmp'와 같은 형식이어야 합니다.
모든 정보를 입력한 후 (아래 참고) '작업 실행' 버튼을 클릭합니다.

Dataflow 작업이 실행되기 시작합니다.

Dataflow 작업이 완료되는 데 약 1분이 소요됩니다.

8. 데이터 흐름 확인
Cloud 함수 로그
Cloud 함수가 Pub/Sub에 의해 트리거되는지 확인
gcloud beta functions logs read function-weatherPubSubToBQ
로그에는 함수가 실행되고 데이터가 수신되며 BigQuery에 삽입되고 있음을 보여야 합니다.

BigQuery 데이터
데이터가 BigQuery 테이블로 흐르고 있는지 확인합니다. Cloud Console에서 BigQuery (bigquery.cloud.google.com)로 이동합니다.

프로젝트 이름 (창의 왼쪽)에서 데이터 세트 (weatherData)를 클릭한 다음 테이블 (weatherDataTable)을 클릭하고 테이블 쿼리 버튼을 클릭합니다.

SQL 문에 별표를 추가하여 아래와 같이 SELECT * FROM...으로 표시되도록 한 다음 쿼리 실행 버튼을 클릭합니다.

메시지가 표시되면 쿼리 실행 버튼을 클릭합니다.

결과가 표시되면 데이터가 올바르게 흐르고 있는 것입니다.

데이터가 흐르면 이제 분석 대시보드를 빌드할 수 있습니다.
9. 데이터 스튜디오 대시보드 만들기
Google 데이터 스튜디오에서는 데이터를 활용하여 읽기 쉽고 공유하기 간편하며 완벽하게 맞춤설정이 가능한 대시보드와 보고서를 만들 수 있습니다.
웹브라우저에서 https://datastudio.google.com으로 이동합니다.

'새 보고서 시작'에서 '빈 보고서'를 클릭한 다음 '시작하기' 버튼을 클릭합니다.

체크박스를 클릭하여 약관에 동의하고 '다음' 버튼을 클릭한 다음 수신할 이메일을 선택하고 '완료' 버튼을 클릭합니다. '새 보고서 시작'에서 '빈 보고서'를 다시 클릭합니다.

새 데이터 소스 만들기 버튼을 클릭합니다.

BigQuery를 클릭한 다음 승인 버튼을 클릭하고 데이터 스튜디오에서 사용할 Google 계정을 선택합니다 (코드랩에서 사용한 계정과 동일해야 함).

'허용' 버튼을 클릭합니다.

프로젝트 이름, 데이터 세트, 테이블을 선택합니다. 그런 다음 연결 버튼을 클릭합니다.

아래와 같이 유형 필드를 변경합니다 (timecollected 및 sensorID를 제외한 모든 항목이 숫자여야 함). timecollected는 날짜 시간 (날짜만 아님)으로 설정됩니다. 아래와 같이 집계 필드를 변경합니다 (이슬점, 온도, 습도, 기압은 평균이어야 하고 나머지는 '없음'으로 설정해야 함). '보고서 만들기' 버튼을 클릭합니다.

'보고서에 추가' 버튼을 클릭하여 확인합니다.

Google 계정을 선택하라는 메시지가 표시되면 계정을 선택한 다음 허용 버튼을 클릭하여 데이터 스튜디오가 Google 드라이브에 보고서를 저장하도록 허용합니다.

대시보드를 만들 수 있는 빈 캔버스가 표시됩니다. 상단 행의 아이콘에서 시계열을 선택합니다.

빈 시트의 왼쪽 상단에 직사각형을 그립니다. 전체 빈 시트의 약 1/4을 차지해야 합니다.

창 오른쪽에서 스타일 탭을 선택합니다. 누락된 데이터를 '선을 0으로'에서 '선 끊김'으로 변경합니다. 왼쪽 Y축 섹션에서 축 최소값의 0을 삭제하여 (자동)으로 변경합니다.

시트에서 그래프를 클릭하고 복사/붙여넣기 (Ctrl-C/Ctrl-V)를 3번 실행합니다. 각 그래프가 레이아웃의 1/4을 차지하도록 정렬합니다.

각 그래프를 클릭하고 '시계열 속성 및 데이터' 섹션에서 기존 측정항목 (이슬점)을 클릭한 후 4가지 날씨 측정값 (이슬점, 온도, 습도, 기압) 각각에 그래프가 표시될 때까지 다른 측정항목을 선택합니다.


이제 기본 대시보드가 만들어졌습니다.

10. 축하합니다.
전체 데이터 파이프라인을 만들었습니다. 이 과정에서 Google Pub/Sub 사용 방법, 서버리스 함수 배포 방법, BigQuery 활용 방법, Looker Studio를 사용하여 분석 대시보드를 만드는 방법을 배웠습니다. 또한 Google Cloud SDK를 안전하게 사용하여 데이터를 Google Cloud Platform으로 가져오는 방법을 살펴보았습니다. 마지막으로, 가용성을 유지하면서 대량의 데이터를 처리할 수 있는 중요한 아키텍처 패턴을 직접 경험했습니다.

삭제
날씨 데이터와 분석 파이프라인을 사용한 실험이 완료되면 실행 중인 리소스를 삭제할 수 있습니다.
IoT 센서를 직접 만든 경우 센서를 종료합니다. 터미널 창에서 Ctrl-C를 눌러 스크립트를 중지한 다음 다음을 입력하여 Raspberry Pi를 종료합니다.
shutdown -h now
Cloud Functions로 이동하여 function-weatherPubSubToBQ 옆의 체크박스를 클릭한 다음 삭제를 클릭합니다.

Pub/Sub로 이동하여 '주제'를 클릭하고 weatherdata 주제 옆에 있는 체크박스를 클릭한 다음 '삭제'를 클릭합니다.

스토리지로 이동하여 스토리지 버킷 옆의 체크박스를 클릭한 다음 삭제를 클릭합니다.

bigquery.cloud.google.com으로 이동하여 프로젝트 이름 옆에 있는 아래쪽 화살표를 클릭하고 weatherData 데이터 세트 오른쪽에 있는 아래쪽 화살표를 클릭한 다음 데이터 세트 삭제를 클릭합니다.

프롬프트가 표시되면 데이터 삭제를 완료하기 위해 데이터 세트 ID (weatherData)를 입력합니다.
