Cloud Run Admin API로 서비스를 가져올 때의 주의 사항

8356 단어 5CloudRungcp
특정 Cloud Run 서비스에 대한 정보를 얻으려고 할 때 마음껏 끼어 들었으므로 비망록을 남겨 둡니다.

먼저 Cloud Run을 조작하는 API는 다음과 같이 제공됩니다.

위 라이브러리를 읽으면 다음 방법으로 Cloud Run 서비스 정보를 얻을 수 있습니다.
// Get: Get information about a service.
//
// - name: The name of the service to retrieve. For Cloud Run (fully
//   managed), replace {namespace_id} with the project ID or number.
func (r *NamespacesServicesService) Get(name string) *NamespacesServicesGetCall {
    c := &NamespacesServicesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
    c.name = name
    return c
}
name 를 어떤 형식으로 넣어야 하는지 확실하지 않으므로 공식 Google Cloud 문서를 검토합니다.

이하에 API에 관한 정보가 기재되어 있어, 이 내용을 읽으면(자) namespaces/{namespace_id}/services/{service_id} 의 형식으로 건네주면 좋다고 알 수 있습니다. namespace_idservice_id의 변수 부분은 각각 Google Cloud 프로젝트 ID와 Cloud Run 서비스 이름을 전달합니다.

여기까지 조사한 내용을 바탕으로 다음과 같은 코드를 썼습니다.
import (
    "context"
    "fmt"

    "google.golang.org/api/run/v1"
)

func FetchURLByServiceName(ctx context.Context, projectID, name string) (string, error) {
    c, err := run.NewService(ctx)
    if err != nil {
        return "", err
    }

    service, err := c.Namespaces.Services.Get(fmt.Sprintf("namespaces/%s/services/%s", projectID, name)).Do()
    if err != nil {
        return "", err
    }

    return service.Status.Url, nil
}

그러나 다음과 같이 오류가 발생합니다 ....
googleapi: Error 404: Requested entity was not found.

아무데도 이상한 곳은 없을 것 같지만, 존재하지 않는 엔티티에 요청을 던지고 있다고 합니다.



대충 봐도 기대대로의 값이 들어가 있으므로 엄청 살아 버렸습니다.
여기서 몇 시간 괴롭히고 있었습니다만, 이하의 문서에 단서가 쓰여져 있었습니다.

htps // 룬. ㅇㅜㅜㅜㅜ 이 m (Global API endpoint, supports list methods only)


기본적으로 부여되는 엔드포인트 https://run.googleapis.com 는 List 메소드에서만 사용할 수 있었고, 다른 메소드를 사용하려면 리전별 엔드포인트에 요청을 던져야 했습니다.

이 점을 근거로 이하와 같이 실장했는데, 드디어 기대 동작하게 되었습니다.
import (
    "context"
    "fmt"

    "google.golang.org/api/run/v1"
)

func FetchURLByServiceName(ctx context.Context, name, projectID, region string) (string, error) {
    c, err := run.NewService(ctx)
    if err != nil {
        return "", err
    }
    c.BasePath = fmt.Sprintf("https://%s-run.googleapis.com/", region)

    service, err := c.Namespaces.Services.Get(fmt.Sprintf("namespaces/%s/services/%s", projectID, name)).Do()
    if err != nil {
        return "", err
    }

    return service.Status.Url, nil
}

문서는 제대로 읽을 수 있습니다.

좋은 웹페이지 즐겨찾기