이 튜토리얼에서는 Cloud 감사 로그를 사용하여 Cloud Storage의 이벤트를 인증되지 않은 Cloud Run 서비스로 Eventarc를 사용해 라우팅할 때 발생하는 런타임 오류 문제를 해결하는 방법을 설명합니다.
목표
이 튜토리얼에서는 다음 작업을 완료하는 방법을 보여줍니다.
- 컨테이너 이미지를 저장할 Artifact Registry 표준 저장소를 만듭니다.
- 이벤트 소스로 사용할 Cloud Storage 버킷을 만듭니다.
- 컨테이너 이미지를 Cloud Run에 빌드, 업로드, 배포합니다.
- Eventarc 트리거를 만듭니다.
- 파일을 Cloud Storage 버킷에 업로드합니다.
- 런타임 오류 문제를 해결합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
프로젝트 생성자에게는 기본 소유자 역할(
roles/owner
)이 부여됩니다. 기본적으로 Identity and Access Management(IAM) 역할에는 대부분의 Google Cloud 리소스에 대한 전체 액세스에 필요한 권한이 포함되며, 이 단계를 건너뛸 수 있습니다.프로젝트 생성자가 아니면 프로젝트에서 적합한 주 구성원에 대해 필수 권한을 부여해야 합니다. 예를 들어 주 구성원은 Google 계정(최종 사용자)이거나 서비스 계정(애플리케이션 및 컴퓨팅 워크로드)일 수 있습니다. 자세한 내용은 이벤트 대상의 역할 및 권한 페이지를 참조하세요.
기본적으로 Cloud Build 권한에는 Artifact Registry 아티팩트를 업로드 및 다운로드할 수 있는 권한이 포함됩니다.
필수 권한
튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
Cloud Build 편집자(
roles/cloudbuild.builds.editor
) -
Cloud Run 관리자(
roles/run.admin
) -
Eventarc 관리자(
roles/eventarc.admin
) -
로그 뷰 접근자 (
roles/logging.viewAccessor
) -
프로젝트 IAM 관리자(
roles/resourcemanager.projectIamAdmin
) -
서비스 계정 관리자(
roles/iam.serviceAccountAdmin
) -
서비스 계정 사용자(
roles/iam.serviceAccountUser
) -
서비스 사용량 관리자(
roles/serviceusage.serviceUsageAdmin
) -
스토리지 관리자(
roles/storage.admin
)
역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.
-
Cloud Build 편집자(
- Cloud Storage의 경우
ADMIN_READ
,DATA_WRITE
,DATA_READ
데이터 액세스 유형에 감사 로깅을 사용 설정합니다.- Google Cloud 프로젝트, 폴더 또는 조직과 관련된 Identity and Access Management(IAM) 정책을 읽고 임시 파일에 저장합니다.
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- 텍스트 편집기에서
/tmp/policy.yaml
을 열고auditConfigs
섹션의 감사 로그 구성만 추가하거나 변경합니다.auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- 다음과 같이 새 IAM 정책을 씁니다.
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
앞의 명령어가 다른 변경사항과의 충돌을 보고할 경우 이 단계를 반복하면서 IAM 정책 읽기를 시작합니다. 자세한 내용은 API로 데이터 액세스 감사 로그 구성을 참조하세요.
- Google Cloud 프로젝트, 폴더 또는 조직과 관련된 Identity and Access Management(IAM) 정책을 읽고 임시 파일에 저장합니다.
- Compute Engine 서비스 계정에
eventarc.eventReceiver
역할을 부여합니다.export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- 2021년 4월 8일 이전에 Pub/Sub 서비스 계정을 사용 설정한 경우 Pub/Sub 서비스 계정에
iam.serviceAccountTokenCreator
역할을 부여합니다.gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- 이 튜토리얼에서 사용되는 기본값을 설정합니다.
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
Artifact Registry 표준 저장소 만들기
컨테이너 이미지를 저장할 Artifact Registry 표준 저장소를 만듭니다.
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY
를 저장소의 고유한 이름으로 바꿉니다.
Cloud Storage 버킷 만들기
두 리전 각각에 Cloud Run 서비스의 이벤트 소스로 Cloud Storage 버킷을 만듭니다.
us-east1
에 버킷을 만듭니다.export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gsutil mb -l us-east1 gs://${BUCKET1}
us-west1
에 버킷을 만듭니다.export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gsutil mb -l us-west1 gs://${BUCKET2}
이벤트 소스가 생성되면 Cloud Run에 이벤트 수신자 서비스를 배포합니다.
이벤트 수신자 배포
이벤트를 수신하고 로깅하는 Cloud Run 서비스를 배포합니다.
GitHub 저장소를 클론하여 코드 샘플을 검색합니다.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git cd golang-samples/eventarc/audit_storage
자바
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/eventarc/audit-storage
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git cd dotnet-docs-samples/eventarc/audit-storage
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git cd nodejs-docs-samples/eventarc/audit-storage
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/eventarc/audit-storage
다음과 같이 구성된 이 튜토리얼의 코드를 검토합니다.
HTTP
POST
요청 내에서 들어오는 이벤트를 CloudEvent로 수신하는 이벤트 핸들러:Go
자바
.NET
Node.js
Python
이벤트 핸들러를 사용하는 서버:
Go
자바
.NET
Node.js
Python
서비스의 작동 환경을 정의하는 Dockerfile입니다. Dockerfile의 콘텐츠는 언어별로 다릅니다.
Go
자바
.NET
Node.js
Python
Cloud Build로 컨테이너 이미지를 빌드하고 해당 이미지를 Artifact Registry에 업로드합니다.
export PROJECT_ID=$(gcloud config get-value project) export SERVICE_NAME=troubleshoot-service gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
컨테이너 이미지를 Cloud Run에 배포합니다.
gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \ --allow-unauthenticated
배포가 성공하면 명령줄에 서비스 URL이 표시됩니다.
트리거 만들기
Cloud Run 서비스를 배포한 후 감사 로그를 통해 Cloud Storage의 이벤트를 리슨하도록 트리거를 설정합니다.
Cloud 감사 로그를 사용하여 라우팅되는 Cloud Storage 이벤트를 리슨하는 Eventarc 트리거를 만듭니다.
gcloud eventarc triggers create troubleshoot-trigger \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
그러면
troubleshoot-trigger
라는 트리거가 생성됩니다.troubleshoot-trigger
가 생성되었는지 확인하려면 다음을 실행합니다.gcloud eventarc triggers list
출력은 다음과 비슷하게 표시됩니다.
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
이벤트 생성 및 확인
서비스가 성공적으로 배포되었고 Cloud Storage에서 이벤트를 수신할 수 있는지 확인합니다.
파일을 만들고
BUCKET1
스토리지 버킷에 업로드합니다.echo "Hello World" > random.txt gsutil cp random.txt gs://${BUCKET1}/random.txt
로그를 모니터링하여 서비스에서 이벤트가 수신되었는지 확인합니다. 로그 항목을 보려면 다음 단계를 완료하세요.
로그 항목을 필터링하고 JSON 형식으로 출력을 반환합니다.
gcloud logging read "resource.labels.service_name=troubleshoot-service \ AND textPayload:random.txt" \ --format=json
다음과 같은 로그 항목을 찾습니다.
"textPayload": "Detected change in Cloud Storage bucket: ..."
처음에는 로그 항목이 반환되지 않습니다. 이는 조사해야 하는 설정에 문제가 있음을 나타냅니다.
문제 조사
서비스에서 이벤트를 수신하지 않는 이유를 조사하는 프로세스를 진행합니다.
초기화 시간
트리거는 즉시 생성되지만 트리거에서 이벤트를 전파하고 필터링하는 데 최대 2분이 걸릴 수 있습니다. 다음 명령어를 실행하여 트리거가 활성 상태인지 확인합니다.
gcloud eventarc triggers list
출력에 트리거 상태가 표시됩니다. 다음 예시에서 troubleshoot-trigger
는 14:16:56에 활성화됩니다.
NAME TYPE DESTINATION_RUN_SERVICE ACTIVE
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service By 14:16:56
트리거가 활성화되면 스토리지 버킷에 파일을 다시 업로드합니다. 이벤트는 Cloud Run 서비스 로그에 기록됩니다. 서비스가 이벤트를 수신하지 않는 경우 이벤트 크기와 관련이 있을 수 있습니다.
감사 로그
이 튜토리얼에서는 Cloud Storage 이벤트가 Cloud 감사 로그를 사용하여 라우팅되고 Cloud Run으로 전송됩니다. Cloud Storage에 감사 로그가 사용 설정되어 있는지 확인합니다.
Google Cloud 콘솔에서 감사 로그 페이지로 이동합니다.
- Google Cloud Storage 체크박스를 선택합니다.
- 관리자 읽기, 데이터 읽기, 데이터 쓰기 로그 유형이 선택되어 있는지 확인합니다.
Cloud 감사 로그를 사용 설정한 후에는 파일을 스토리지 버킷에 다시 업로드하고 로그를 확인합니다. 서비스가 여전히 이벤트를 수신하지 않으면 트리거 위치와 관련이 있을 수 있습니다.
트리거 위치
서로 다른 위치에 여러 리소스가 있을 수 있으며, Cloud Run 대상과 동일한 리전에 있는 소스의 이벤트를 필터링해야 합니다. 자세한 내용은 Eventarc에서 지원되는 위치와 Eventarc 위치 이해를 참조하세요.
이 튜토리얼에서는 Cloud Run 서비스를 us-central1
에 배포했습니다. eventarc/location
을 us-central1
으로 설정했으므로 동일한 위치에 트리거도 만들었습니다.
그러나 us-east1
및 us-west1
위치에 두 개의 Cloud Storage 버킷을 만들었습니다. 이러한 위치에서 이벤트를 수신하려면 해당 위치에 Eventarc 트리거를 만들어야 합니다.
us-east1
에 있는 Eventarc 트리거를 만듭니다.
기존 트리거의 위치를 확인합니다.
gcloud eventarc triggers describe troubleshoot-trigger
위치 및 리전을
us-east1
으로 설정합니다.gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
컨테이너 이미지를 빌드하고 Cloud Run에 배포하여 다시 이벤트 수신자를 배포합니다.
us-east1
에 있는 새 트리거를 만듭니다.gcloud eventarc triggers create troubleshoot-trigger-new \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
트리거가 생성되었는지 확인합니다.
gcloud eventarc triggers list
트리거가 이벤트를 라우팅하기 시작하기 전에 초기화하는 데 최대 2분이 걸릴 수 있습니다.
트리거가 이제 올바르게 배포되었는지 확인하려면 이벤트를 생성하고 확인합니다.
발생할 수 있는 기타 문제
Eventarc를 사용할 때 다른 문제가 발생할 수 있습니다.
이벤트 크기
전송하는 이벤트가 이벤트 크기 한도를 초과해서는 안 됩니다.
이전에 이벤트를 전달한 트리거의 작동이 중지됨
소스가 이벤트를 생성하는지 확인합니다. Cloud 감사 로그를 확인하고 모니터링되는 서비스가 로그를 내보내는지 확인합니다. 로그가 기록되지만 이벤트가 전송되지 않으면 지원팀에 문의합니다.
트리거 이름이 동일한 Pub/Sub 주제가 있는지 확인합니다. Eventarc는 Pub/Sub를 전송 계층으로 사용하고 기존 Pub/Sub 주제를 사용하거나 자동으로 주제를 생성하고 관리합니다.
- 트리거를 나열하려면
gcloud eventarc triggers list
를 참조하세요. Pub/Sub 주제를 나열하려면 다음을 실행합니다.
gcloud pubsub topics list
Pub/Sub 주제 이름에 생성된 트리거의 이름이 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.
name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123
Pub/Sub 주제가 누락된 경우 특정 제공업체, 이벤트 유형, Cloud Run 대상에 대한 트리거를 다시 만듭니다.
- 트리거를 나열하려면
서비스에 트리거가 구성되었는지 확인합니다.
Google Cloud 콘솔에서 서비스 페이지로 이동합니다.
서비스 이름을 클릭하여 서비스 세부정보 페이지를 엽니다.
트리거 탭을 클릭합니다.
서비스와 연결된 Eventarc 트리거가 나열됩니다.
Pub/Sub 측정항목 유형을 사용하여 Pub/Sub 주제 및 구독의 상태를 확인합니다.
subscription/dead_letter_message_count
측정항목을 사용하여 전달된 전송할 수 없는 메시지를 모니터링할 수 있습니다. 이 측정항목에서는 Pub/Sub가 구독에서 전달하는 전송할 수 없는 메시지 수를 보여줍니다.메시지가 주제에 게시되지 않으면 Cloud 감사 로그를 확인하고 모니터링되는 서비스가 로그를 내보내는지 확인합니다. 로그가 기록되지만 이벤트가 전송되지 않으면 지원팀에 문의합니다.
subscription/push_request_count
측정항목을 사용하고response_code
및subcription_id
로 측정항목을 그룹화하여 푸시 구독을 모니터링할 수 있습니다.푸시 오류가 보고되면 Cloud Run 서비스 로그를 확인합니다. 수신 엔드포인트가 OK가 아닌 상태 코드를 반환하면 Cloud Run 코드가 예상대로 작동하지 않는다는 의미이며 지원팀에 문의해야 합니다.
자세한 내용은 측정항목 임곗값 알림 정책 만들기를 참조하세요.
삭제
이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
튜토리얼 리소스 삭제
이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다.
gcloud run services delete SERVICE_NAME
여기서
SERVICE_NAME
은 선택한 서비스 이름입니다.Google Cloud Console에서 Cloud Run 서비스를 삭제할 수도 있습니다.
튜토리얼 설정 중에 추가한 gcloud CLI 기본 구성을 삭제합니다.
예를 들면 다음과 같습니다.
gcloud config unset run/region
또는
gcloud config unset project
이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.
- Eventarc 트리거를 삭제합니다.
gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
을 트리거 이름으로 바꿉니다.
- Eventarc 트리거를 삭제합니다.