이 가이드에서는 Cloud Vision API와 Cloud Video Intelligence API를 사용하여 이미지 및 동영상을 처리하도록 일련의 Cloud Functions 집합을 배포하는 방법을 설명합니다. 이 기능은 Cloud Video Intelligence 및 Cloud Vision API를 사용하여 사용자 제작 콘텐츠 처리에 설명되어 있습니다.
이 가이드에 따라 솔루션에 필요한 Cloud Functions와 기타 Google Cloud Platform(GCP) 구성요소를 배포하세요.
목표
- 4가지 Cloud Functions를 배포합니다.
- 지원되는 Cloud Storage 버킷, Cloud Pub/Sub 주제, Cloud Storage Pub/Sub 알림을 만듭니다.
- 지원되는 BigQuery 데이터세트 및 테이블을 만듭니다.
비용
이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Cloud Platform 구성요소를 사용합니다.
- Cloud Functions
- Cloud Pub/Sub
- Cloud Storage
- BigQuery
- Vision API
- Video Intelligence API
이 가이드를 실행하는 비용은 무료 등급 가격으로 완료할 수 있습니다. 무료 등급이 없을 경우 비용은 이미지 10개와 동영상 10개를 테스트하는 데 약 $5가 듭니다. 가격 계산기를 사용하면 예상 사용량을 토대로 예상 비용을 산출할 수 있습니다. Cloud Platform 신규 사용자는 무료 체험판을 사용할 수 있습니다.
시작하기 전에
Google Cloud Platform(GCP) 프로젝트를 만들거나 기존 프로젝트를 사용합니다.
-
Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
- Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence API를 사용 설정합니다.
Google Cloud SDK를 설치하고 초기화합니다.
gcloud
구성요소를 업데이트 및 설치합니다.gcloud components update && gcloud components install beta
Node.js 개발 환경을 준비합니다.
아키텍처
다음 다이어그램은 대략적인 아키텍처를 보여줍니다.
github 저장소 복제
이 가이드의 모든 Cloud Functions는 GitHub에서 확인할 수 있습니다. 원하는 도구를 사용하여 GitHub에서 코드를 다운로드하거나 다음 명령어를 사용하세요.
git clone https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs
클론된 저장소 디렉터리로 이동합니다.
cd cloud-functions-intelligentcontent-nodejs
Cloud Storage 버킷 만들기
Cloud Storage 버킷은 이미지와 동영상을 업로드할 수 있는 저장소 위치를 제공합니다. 네 가지 Cloud Storage 버킷을 만들려면 다음 단계를 따르세요.
이미지 및 동영상 파일을 저장할 버킷을 만듭니다.
[IV_BUCKET_NAME]
을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.gsutil mb gs://[IV_BUCKET_NAME]
필터링된 이미지 및 동영상 파일을 저장할 버킷을 만듭니다.
[FILTERED_BUCKET_NAME]
을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.gsutil mb gs://[FILTERED_BUCKET_NAME]
플래그가 지정된 이미지 및 동영상 파일을 저장할 버킷을 만듭니다.
[FLAGGED_BUCKET_NAME]
을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.gsutil mb gs://[FLAGGED_BUCKET_NAME]
Cloud Functions가 스테이징 위치로 사용할 버킷을 만듭니다.
[STAGING_BUCKET_NAME]
을 유효한 Cloud Storage 버킷 이름으로 바꿉니다.gsutil mb gs://[STAGING_BUCKET_NAME]
Cloud Pub/Sub 주제 만들기
Cloud Storage 알림 메시지 및 Cloud Functions 간의 메시지에 Cloud Pub/Sub 주제를 사용합니다.
파일 중 하나가 Cloud Storage에 업로드될 때마다 Cloud Storage 알림을 수신할 주제를 만듭니다.
[UPLOAD_NOTIFICATION_TOPIC]
을 유효한 Cloud Pub/Sub 주제 이름으로 바꿉니다.gcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
Vision API에서 메시지를 수신할 주제를 만듭니다.
[VISION_TOPIC_NAME]
을 유효한 주제 이름으로 바꿉니다.config.json
파일의 기본값은visionapiservice
입니다.gcloud pubsub topics create [VISION_TOPIC_NAME]
Video Intelligence API에서 메시지를 수신할 주제를 만듭니다.
[VIDEOIQ_TOPIC_NAME]
을 유효한 주제 이름으로 바꿉니다.config.json
파일의 기본값은videointelligenceservice
입니다.gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
BigQuery에 저장할 메시지를 수신할 주제를 만듭니다.
[BIGQUERY_TOPIC_NAME]
을 유효한 주제 이름으로 바꿉니다.config.json
파일의 기본값은bqinsert
입니다.gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]
Cloud Storage 알림 만들기
새 객체 중 하나가 Cloud Storage 파일 업로드 버킷에 배치될 때에만 실행되는 알림을 만듭니다.
[UPLOAD_NOTIFICATION_TOPIC]
을 주제로[IV_BUCKET]
을 파일 업로드 버킷 이름으로 바꿉니다.gsutil notification create -t [UPLOAD_NOTIFICATION_TOPIC] -f json -e OBJECT_FINALIZE gs://[IV_BUCKET_NAME]
버킷에 대한 알림이 만들어졌는지 확인합니다.
gsutil notification list gs://[IV_BUCKET_NAME]
함수가 성공했을 경우 출력 결과는 다음과 같습니다.
Filters: Event Types: OBJECT_FINALIZE
BigQuery 데이터세트 및 테이블 만들기
Vision 및 Video Intelligence API의 결과는 BigQuery에 저장됩니다.
BigQuery 데이터 세트를 만듭니다.
[PROJECT_ID]
를 프로젝트 ID로 바꾸고[DATASET_ID]
를 데이터 세트 이름으로 바꿉니다.config.json
파일의[DATASET_ID]
기본값은intelligentcontentfilter
입니다.bq --project_id [PROJECT_ID] mk [DATASET_ID]
스키마 파일에서 BigQuery 테이블을 만듭니다.
[PROJECT_ID]
를 프로젝트 ID로 바꾸고[DATASET_ID].[TABLE_NAME]
을 데이터 세트 ID와 테이블 이름으로 바꿉니다.config.json
파일의[DATASET_ID]
기본값은intelligentcontentfilter
이고[TABLE_NAME]
의 기본값은filtered_content
입니다.bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
BigQuery 테이블이 만들어졌는지 확인합니다.
[PROJECT_ID]
를 프로젝트 ID로 바꾸고[DATASET_ID].[TABLE_NAME]
을 데이터 세트 ID와 테이블 이름으로 바꿉니다.bq --project_id [PROJECT_ID] show [DATASET_ID].[TABLE_NAME]
출력 결과는 다음과 같습니다.
Cloud Functions 배포
다음 단계는 Cloud Functions를 배포하는 것입니다.
JSON 구성 파일 수정
코드를 다운로드한 후 특정 Cloud Storage 버킷, Cloud Pub/Sub 주제 이름, BigQuery 데이터 세트 ID 및 테이블 이름을 사용하도록 config.json
파일을 수정합니다.
GCStoPubsub
함수 배포
Cloud Pub/Sub에서 Cloud Storage 알림 메시지를 수신하고 이 메시지를 다른 Cloud Pub/Sub 메시지와 함께 적절한 함수로 전달하는 로직이 포함된 GCStoPubsub
Cloud 함수를 배포합니다.
[STAGING_BUCKET_NAME]
을 Cloud Storage 스테이징 버킷 이름으로 바꾸고[UPLOAD_NOTIIFICATION_TOPIC]
을 파일 업로드 알림 주제 이름으로 바꿉니다.gcloud functions deploy GCStoPubsub \ --stage-bucket [STAGING_BUCKET_NAME] \ --trigger-topic [UPLOAD_NOTIIFICATION_TOPIC] \ --entry-point GCStoPubsub \ --runtime=nodejs10
각 Cloud Functions에 대한 명령줄 출력은 다음과 비슷합니다.
Copying file:///var/folders/69/wsyfjkld5fq1w_wf7d5pxbv80030br/T/tmphzfCsc/fun.zip [Content-Type=application/zip]... / [1 files][138.4 KiB/138.4 KiB] Operation completed over 1 objects/138.4 KiB. Deploying function (may take a while - up to 2 minutes)... ...............................................................done. availableMemoryMb: 256 entryPoint: GCStoPubsub eventTrigger: eventType: providers/cloud.pubsub/eventTypes/topic.publish failurePolicy: {} resource: projects/[PROJECT-ID]/topics/intelligentcontentfileupload latestOperation: operations/c2VjcmV0LXplcGh5ci0xMTIxL3VzLWNlbnRyYWwxL0dDU3RvUHVic3ViL0tRaGxHeVFhZHdR name: projects/[PROJECT-ID]/locations/us-central1/functions/GCStoPubsub serviceAccount: [PROJECT-ID]@appspot.gserviceaccount.com sourceArchiveUrl: gs://[STAGING_BUCKET_NAME]/us-central1-GCStoPubsub-bnnmzdzqtjoo.zip status: READY timeout: 60s updateTime: '2017-09-01T14:59:03Z' versionId: '01'
visionAPI
함수 배포
Cloud Pub/Sub로 메시지를 수신하고, Vision API를 호출하고, 수신한 메시지를 다른 Cloud Pub/Sub 메시지와 함께
insertIntoBigQuery
Cloud 함수로 전달하는 로직이 포함된visionAPI
Cloud 함수를 배포합니다.[STAGING_BUCKET_NAME]
을 Cloud Storage 스테이징 버킷 이름으로 바꾸고[VISION_TOPIC_NAME]
을 Vision API 주제 이름으로 바꿉니다.gcloud functions deploy visionAPI \ --stage-bucket [STAGING_BUCKET_NAME] \ --trigger-topic [VISION_TOPIC_NAME] \ --entry-point visionAPI \ --runtime=nodejs10
videoIntelligenceAPI
함수 배포
Cloud Pub/Sub로 메시지를 수신하고, Video Intelligence API를 호출하고, 수신한 메시지를 다른 Cloud Pub/Sub 메시지와 함께
insertIntoBigQuery
Cloud 함수로 전달하는 로직이 포함된videoIntelligenceAPI
Cloud 함수를 배포합니다.[STAGING_BUCKET_NAME]
을 Cloud Storage 스테이징 버킷 이름으로 바꾸고[VIDEOIQ_TOPIC_NAME]
을 Video Intelligence API 주제 이름으로 바꿉니다.gcloud functions deploy videoIntelligenceAPI \ --stage-bucket [STAGING_BUCKET_NAME] \ --trigger-topic [VIDEOIQ_TOPIC_NAME] \ --entry-point videoIntelligenceAPI \ --timeout 540 \ --runtime=nodejs10
insertIntoBigQuery
함수 배포
Cloud Pub/Sub로 메시지를 수신하고, BigQuery API를 호출하여 데이터를 BigQuery 테이블에 삽입하는 로직이 포함된
insertIntoBigQuery
Cloud 함수를 배포합니다.[STAGING_BUCKET_NAME]
을 Cloud Storage 스테이징 버킷 이름으로 바꾸고[BIGQUERY_TOPIC_NAME]
을 BigQuery 주제 이름으로 바꿉니다.gcloud functions deploy insertIntoBigQuery \ --stage-bucket [STAGING_BUCKET_NAME] \ --trigger-topic [BIGQUERY_TOPIC_NAME] \ --entry-point insertIntoBigQuery \ --runtime=nodejs10
흐름 테스트
다음 다이어그램은 처리 흐름을 대략적으로 보여줍니다.
Cloud Storage에 파일을 업로드하고, 로그를 확인하고, 결과를 BigQuery에서 확인하여 처리 과정을 테스트합니다.
[IV_BUCKET_NAME]
에 이미지 및 동영상 파일을 업로드합니다. 여기에서[LOCAL_FILE_NAME]
은 파일 이름입니다.gsutil cp [LOCAL_FILE_NAME] gs://[IV_BUCKET_NAME]
Cloud Logging에 캡처된 Cloud Functions 로그를 확인하여 Cloud Functions가 시작되고 성공적으로 실행되었는지 확인합니다.
GCStoPubsub
를 테스트합니다.gcloud functions logs read --filter "finished with status" "GCStoPubsub" --limit 100
출력 결과는 다음과 같습니다.
insertIntoBigQuery
를 테스트합니다.gcloud functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100
출력 결과는 다음과 같습니다.
BigQuery를 쿼리하는 SQL 명령어를 만듭니다.
[PROJECT_ID]
,[DATASET_ID]
,[TABLE_NAME]
을 프로젝트 ID, 데이터세트 ID, BigQuery 테이블 이름으로 바꿉니다.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
다음 명령어를 사용하여 BigQuery 결과를 확인합니다.
bq --project_id [PROJECT_ID] query < sql.txt
출력 결과는 다음과 같습니다.
또는 BigQuery 웹 UI에 로그인하여 쿼리를 실행할 수 있습니다.
- 브라우저에서 https://bigquery.cloud.google.com을 엽니다.
쿼리 작성을 클릭하여 아래와 같이 쿼리를 시작합니다.
텍스트 상자에 다음 SQL을 입력합니다.
[PROJECT_ID]
,[DATASET_ID]
,[TABLE_NAME]
을 프로젝트 ID, 데이터세트 ID, BigQuery 테이블 이름으로 바꿉니다.#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
다음과 같이 UI에 SQL이 표시됩니다.
출력 결과는 다음과 같습니다.
삭제
이 가이드에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
가이드를 완료한 후에는 할당량을 차지하지 않고 이후에 요금이 청구되지 않도록 Google Cloud에서 만든 리소스를 삭제할 수 있습니다. 다음 섹션에서는 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- Cloud Console에서 프로젝트 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 프로젝트 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭합니다.
모든 구성요소 삭제
Cloud Functions를 삭제합니다.
gcloud functions delete GCStoPubsub gcloud functions delete visionAPI gcloud functions delete videoIntelligenceAPI gcloud functions delete insertIntoBigQuery
변수를 값으로 대체하여 BigQuery 테이블 및 데이터세트를 삭제합니다.
bq --project_id [PROJECT_ID] rm -r -f [DATASET_ID]
변수를 값으로 대체하여 Cloud Storage 버킷을 삭제합니다.
gsutil -m rm -r gs://[IV_BUCKET_NAME]
gsutil -m rm -r gs://[FLAGGED_BUCKET_NAME]
gsutil -m rm -r gs://[FILTERED_BUCKET_NAME]
gsutil -m rm -r gs://[STAGING_BUCKET_NAME]
변수를 값으로 대체하여 Cloud Pub/Sub 주제를 삭제합니다.
gcloud pubsub topics delete [UPLOAD_NOTIFICATION_TOPIC]
gcloud pubsub topics delete [VISION_TOPIC_NAME]
gcloud pubsub topics delete [VIDEOIQ_TOPIC_NAME]
gcloud pubsub topics delete [BIGQUERY_TOPIC_NAME]
다음 단계
- GitHub의 Video Intelligence API 및 Cloud Vision API를 사용하여 사용자 제작 콘텐츠 처리 저장소에서 샘플 코드를 검토합니다.
- 다른 패턴 인식 솔루션에 대해 알아보기
- Video Intelligence API에 대해 자세히 알아봅니다.
- Cloud Vision API 자세히 알아보기
- Cloud Functions에 대해 자세히 알아봅니다.
- 다른 Google Cloud 기능을 직접 사용해보세요. 가이드 살펴보기.