구조
클라우드 저장소 만들기
# 변수명 설정. 버킷 유일성을 보장하기 위하여 postfix를 붙임.
export PROJECT_ID=$(gcloud info --format='value(config.project)')
export IV_BUCKET_NAME=${PROJECT_ID}-upload
export FILTERED_BUCKET_NAME=${PROJECT_ID}-filtered
export FLAGGED_BUCKET_NAME=${PROJECT_ID}-flagged
export STAGING_BUCKET_NAME=${PROJECT_ID}-staging
# 클라우드 저장소 버킷 만들기
gsutil mb gs://${IV_BUCKET_NAME}
gsutil mb gs://${FILTERED_BUCKET_NAME}
gsutil mb gs://${FLAGGED_BUCKET_NAME}
gsutil mb gs://${STAGING_BUCKET_NAME}
gsutil ls
Pub/Sub 만들기
클라우드 저장소 통지 메시지와 클라우드 함수간 메시지 전송용으로 사용.
export UPLOAD_NOTIFICATION_TOPIC=upload_notification
gcloud pubsub topics create ${UPLOAD_NOTIFICATION_TOPIC}
gcloud pubsub topics create visionapiservice
gcloud pubsub topics create videointelligenceservice
gcloud pubsub topics create bqinsert
gcloud pubsub topics list
클라우드 저장소 통지 생성하기
새로운 객체가 클라우드 저장소 업로드 버킷에 올라오면 촉발되게 한다.
gsutil notification create -t upload_notification -f json -e OBJECT_FINALIZE gs://${IV_BUCKET_NAME}
gsutil notification list gs://${IV_BUCKET_NAME}
배포용 클라우드 함수 준비하기
실습에서 사용되는 설정 파일은 config.json
함수는 index.js에 정의된다.
소스코드를 다운로드하여서 살펴보자.
gsutil -m cp -r gs://spls/gsp138/cloud-functions-intelligentcontent-nodejs .
cd cloud-functions-intelligentcontent-nodejs
빅쿼리 데이터셋과 테이블 생성하기
비전 API를 사용한 결과를 빅쿼리에 저장할 예정. 데이터셋을 intelligentcontentfilter로, 테이블은 filtered_content로 명명한다. (그냥 config.json에 정의된 대로 생성하는 것에 불과)
export DATASET_ID=intelligentcontentfilter
export TABLE_NAME=filtered_content
bq --project_id ${PROJECT_ID} mk ${DATASET_ID}
bq --project_id ${PROJECT_ID} mk --schema intelligent_content_bq_schema.json -t ${DATASET_ID}.${TABLE_NAME}
#빅쿼리 테이블이 잘 생성되었나 확인
bq --project_id ${PROJECT_ID} show ${DATASET_ID}.${TABLE_NAME}
설정 파일의 placeholder를 실제 값으로 바꾸기
sed -i "s/\[PROJECT-ID\]/$PROJECT_ID/g" config.json
sed -i "s/\[FLAGGED_BUCKET_NAME\]/$FLAGGED_BUCKET_NAME/g" config.json
sed -i "s/\[FILTERED_BUCKET_NAME\]/$FILTERED_BUCKET_NAME/g" config.json
sed -i "s/\[DATASET_ID\]/$DATASET_ID/g" config.json
sed -i "s/\[TABLE_NAME\]/$TABLE_NAME/g" config.json
참고로 config.json파일은 다음과 같이 생겼다.
{
"VISION_TOPIC": "projects/[PROJECT-ID]/topics/visionapiservice",
"VIDEOINTELLIGENCE_TOPIC": "projects/[PROJECT-ID]/topics/videointelligenceservice",
"BIGQUERY_TOPIC": "projects/[PROJECT-ID]/topics/bqinsert",
"REJECTED_BUCKET": "[FLAGGED_BUCKET_NAME]",
"RESULT_BUCKET": "[FILTERED_BUCKET_NAME]",
"DATASET_ID": "[DATASET_ID]",
"TABLE_NAME": "[TABLE_NAME]",
"GCS_AUTH_BROWSER_URL_BASE": "https://storage.cloud.google.com/" ,
"API_Constants": {
"ADULT" : "adult",
"VIOLENCE" : "violence",
"SPOOF" : "spoof",
"MEDICAL" : "medical"
}
}
클라우드 함수 배포하기
함수 구현은 깃헙(https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs/blob/master/index.js)에 정의되어 있음.
# 클라우드 펍/섭에서 클라우드 저장소 통지 메시지를 받고, 이 메시지를 클라우드 펍/섭 메시지와 함께 다른 클라우드 함수를 호출하는 함수 배포
gcloud functions deploy GCStoPubsub --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic ${UPLOAD_NOTIFICATION_TOPIC} --entry-point GCStoPubsub
# 클라우드 펍/섭에서 메시지를 받아서 비전 API를 호출하고 이를 insertIntoBigQuert클라우드 함수로 메시지를 전달하는 함수
gcloud functions deploy visionAPI --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic visionapiservice --entry-point visionAPI
# 클라우드 펍/섭에서 메시지를 받아서 비전 API를 호출하고 이를 insertIntoBigQuert클라우드 함수로 메시지를 전달하는 함수
gcloud functions deploy videoIntelligenceAPI --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic videointelligenceservice --entry-point videoIntelligenceAPI --timeout 540
# 클라우드 펍/섭에서 메시지를 받아서 데이터를 빅쿼리 테이블로 넣기 위한 API를 호출하는 함수
gcloud functions deploy insertIntoBigQuery --runtime nodejs10 --stage-bucket gs://${STAGING_BUCKET_NAME} --trigger-topic bqinsert --entry-point insertIntoBigQuery
#배포된 함수 확인
gcloud beta functions list
전체 앱 동작 확인
클라우드 콘솔에서 저장소의 -upload가 붙은 버킷에 이미지/동영상 파일을 업로드해본다.
로그 동작 모니터링
클라우드 함수가 잘 실행되었는지 확인해보기
gcloud beta functions logs read --filter "finished with status" "GCStoPubsub" --limit 100
gcloud beta functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100
# sql.txt 파일 만들기. PLACEHOLDER 값 변경해야 함.
echo "
#standardSql
SELECT insertTimestamp,
contentUrl,
flattenedSafeSearch.flaggedType,
flattenedSafeSearch.likelihood
FROM \`$PROJECT_ID.$DATASET_ID.$TABLE_NAME\`
CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
ORDER BY insertTimestamp DESC,
contentUrl,
flattenedSafeSearch.flaggedType
LIMIT 1000
" > sql.txt
bq --project_id ${PROJECT_ID} query < sql.txt
반응형
'2. 개발 > 2.8 OSS' 카테고리의 다른 글
GSP 411: Ingesting New Datasets into BigQuery (0) | 2021.07.17 |
---|---|
GSP 409: Explore and Create Reports with Data Studio (0) | 2021.07.17 |
GSP 729: Data Catalog: Qwik Start (0) | 2021.07.17 |