Pub/Sub 사용 중에 문제가 발생할 경우 유용하게 활용할 수 있는 문제 해결 단계를 알아봅니다.
주제를 만들 수 없음
필요한 권한이 있는지 확인합니다.
Pub/Sub 주제를 만들려면 프로젝트에 대해 Pub/Sub 편집자 (roles/pubsub.editor
) Identity and Access Management 역할이 필요합니다. 이 역할이 없으면 관리자에게 문의하세요.
주제 관련 문제 해결에 대한 자세한 내용은 다음 페이지를 참고하세요.
구독 생성 불가
다음을 완료했는지 확인합니다.
필요한 권한이 있는지 확인합니다. Pub/Sub 구독을 만들려면 프로젝트에 대해 Pub/Sub 편집자(roles/pubsub.editor) IAM 역할이 필요합니다. 이 역할이 없으면 관리자에게 문의하세요.
구독 이름을 지정했습니다.
구독을 연결하려는 기존 주제 이름을 지정했습니다.
푸시 구독을 만드는 경우
pushEndpoint
필드에 수신 URL의 프로토콜로https://
를 소문자 (http://
또는HTTPS://
아님)로 지정했습니다.
구독에 관한 문제 해결 정보는 다음 페이지를 참고하세요.
풀, 푸시, BigQuery 또는 Cloud Storage 문제 해결
권한 문제 해결
Pub/Sub 권한은 Pub/Sub 리소스에 대해 작업을 실행할 수 있는 사용자 및 서비스 계정을 제어합니다. 권한이 잘못 구성되면 권한 거부 오류가 발생하고 메시지 흐름이 중단될 수 있습니다. 감사 로그는 모든 권한 변경사항에 대한 자세한 기록을 제공하므로 이러한 문제의 소스를 파악할 수 있습니다.
감사 로그와 관련된 Pub/Sub 권한 문제를 해결하려면 다음 단계를 따르세요.
로그 탐색기를 볼 수 있는 필수 권한을 획득합니다.
자세한 내용은 시작하기 전에를 참조하세요.
Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
기존 Google Cloud 프로젝트, 폴더 또는 조직을 선택합니다.
관련 로그를 찾는 데 사용할 수 있는 필터 목록은 다음과 같습니다.
resource.type="pubsub_topic" OR resource.type="pubsub_subscription"
: 주제 또는 구독 구성이나 액세스 제어의 변경과 관련된 문제를 해결할 때 이 쿼리를 시작점으로 사용하세요. 다른 필터와 결합하여 검색을 더욱 세부적으로 조정할 수 있습니다.protoPayload.methodName="google.iam.v1.SetIamPolicy"
: 문제가 잘못되었거나 누락된 권한으로 인해 발생한다고 의심되는 경우 이 쿼리를 사용하세요. IAM 정책을 변경한 사용자와 변경사항을 추적하는 데 도움이 됩니다. 이는 사용자가 주제에 게시하거나 구독을 구독할 수 없는 문제, 애플리케이션의 Pub/Sub 리소스 액세스가 거부된 문제, 액세스 제어의 예기치 않은 변경사항과 같은 문제를 해결하는 데 유용합니다.protoPayload.status.code=7
: 권한과 명시적으로 관련된 오류가 발생할 때 이 질문을 사용하세요. 이렇게 하면 실패한 작업과 해당 작업을 시도한 사용자를 정확하게 파악할 수 있습니다. 이 쿼리를 이전 쿼리와 결합하여 권한 거부를 유발할 수 있는 특정 리소스 및 IAM 정책 변경사항을 식별할 수 있습니다.
로그를 분석하여 이벤트의 타임스탬프, 변경을 수행한 주 구성원, 적용된 변경사항의 유형과 같은 요소를 확인합니다.
감사 로그에서 수집한 정보를 바탕으로 수정 조치를 취할 수 있습니다.
구독이 삭제됨
Pub/Sub 구독은 다음 두 가지 기본 방법으로 삭제할 수 있습니다.
충분한 권한이 있는 사용자 또는 서비스 계정이 의도적으로 구독을 삭제합니다.
구독은 일정 기간(기본적으로 31일) 동안 활동이 없으면 자동으로 삭제됩니다. 정기 결제 만료 정책에 대한 자세한 내용은 만료 기간을 참고하세요.
삭제된 구독 문제를 해결하려면 다음 단계를 따르세요.
Google Cloud 콘솔에서 Pub/Sub 구독 페이지로 이동하여 구독이 더 이상 나열되지 않는지 확인합니다. 정기 결제를 나열하는 방법에 대한 자세한 내용은 정기 결제 나열을 참고하세요.
감사 로그를 확인합니다. 로그 탐색기로 이동합니다. 필터
protoPayload.methodName="google.pubsub.v1.Subscriber.DeleteSubscription"
를 사용하여 삭제된 구독을 찾습니다. 로그를 검토하여 누군가 구독을 삭제했는지 아니면 활동이 없어 삭제되었는지 확인합니다.InternalExpireInactiveSubscription
는 비활성 상태로 인해 구독이 삭제되었음을 나타냅니다. 감사 로그를 사용하여 문제를 해결하는 방법에 대한 자세한 내용은 감사 로그를 사용하여 Pub/Sub 문제 해결을 참고하세요.
오류 403 (Forbidden)
개
403 오류는 일반적으로 작업을 수행할 올바른 권한이 없음을 의미합니다. 예를 들어 주제에 게시하거나 구독에서 가져오려고 하면 403 User not authorized
오류가 발생할 수 있습니다.
이 오류가 발생한다면 다음을 수행하세요.
- Google Cloud 콘솔에서 Pub/Sub API를 사용 설정했는지 확인합니다.
특히 프로젝트 간 통신에 Pub/Sub API를 사용하는 경우, 요청을 수행하는 주 구성원이 관련 Pub/Sub API 리소스에 필요한 권한을 갖고 있는지 확인합니다.
Dataflow를 사용하는 경우
{PROJECT_NUMBER}@cloudservices.gserviceaccount.com
및 Compute Engine 서비스 계정{PROJECT_NUMBER}-compute@developer.gserviceaccount.com
에 모두 관련 Pub/Sub API 리소스에 대한 필수 권한이 있는지 확인합니다. 자세한 내용은 Dataflow 보안 및 권한을 참조하세요.App Engine을 사용한다면 프로젝트의 권한 페이지를 확인해 App Engine 서비스 계정이 Pub/Sub 편집자로 표시되어 있는지 살펴봅니다. 그렇지 않다면 App Engine 서비스 계정을 Pub/Sub 편집자로 추가해야 합니다. 일반적으로 App Engine 서비스 계정은
<project-id>@appspot.gserviceaccount.com
형식입니다.감사 로그를 사용하여 권한 문제를 해결할 수 있습니다.
기타 일반적인 오류 코드
Pub/Sub API와 관련된 기타 일반적인 오류 코드 목록과 설명은 오류 코드를 참고하세요.
과도한 관리 작업 사용
관리 작업에 할당량을 너무 많이 사용하고 있는 경우 코드를 리팩터링해야 할 수도 있습니다. 다음 유사 코드를 예로 들어 보겠습니다. 이 예시에서는 리소스를 소모하기 전에 관리 작업 (GET
)을 사용하여 구독이 있는지 확인합니다. GET
및 CREATE
모두 관리 작업입니다.
if !GetSubscription my-sub {
CreateSubscription my-sub
}
Consume from subscription my-sub
보다 효율적인 패턴은 구독에서 메시지를 소비하려고 시도하는 것입니다(구독 이름을 합리적으로 확신할 수 있다고 가정). 이 낙관적 접근 방식에서는 오류가 있는 경우에만 구독을 가져오거나 생성합니다. 다음 예를 참조하세요.
try {
Consume from subscription my-sub
} catch NotFoundError {
CreateSubscription my-sub
Consume from subscription my-sub
}
다음 코드 샘플을 사용하여 원하는 언어로 이 패턴을 구현할 수 있습니다.
Go
다음 샘플에서는 Go Pub/Sub 클라이언트 라이브러리의 주요 버전 (v2)을 사용합니다. 아직 v1 라이브러리를 사용하고 있다면 v2로의 마이그레이션 가이드를 참고하세요. v1 코드 샘플 목록을 보려면 지원 중단된 코드 샘플을 참고하세요.
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Go API 참고 문서를 참조하세요.
자바
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Java 설정 안내를 따르세요. 자세한 내용은 Pub/Sub 자바 API 참조 문서를 참조하세요.
Node.js
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Node.js 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Node.js API 참조 문서를 참조하세요.
Node.ts
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Node.js 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Node.js API 참조 문서를 참조하세요.
Python
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Python API 참조 문서를 참조하세요.
C++
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 C++ 설정 안내를 따르세요. 자세한 내용은 Pub/Sub C++ API 참고 문서를 확인하세요.