이 페이지는 Apigee 및 Apigee Hybrid에 적용됩니다.
Apigee Edge 문서 보기
제목
ServiceCallout 정책을 사용하면 API 프록시 흐름에서 다른 서비스를 호출할 수 있습니다. 외부 서비스(예: 외부 RESTful 서비스 엔드포인트) 또는 내부 서비스(예: 동일한 조직 및 환경의 API 프록시)에 콜아웃을 만들 수 있습니다.
이 정책은 확장 가능한 정책이며, 이 정책을 사용하면 Apigee 라이선스에 따라 비용 또는 사용률이 영향을 받을 수 있습니다. 정책 유형 및 사용 영향에 대한 자세한 내용은 정책 유형을 참조하세요.
- 외부 사용 사례에서는 프록시 외부의 타사 API에 대한 콜아웃을 만듭니다. 타사 API의 응답은 파싱되어 API의 응답 메시지에 삽입되고 앱 최종 사용자를 위한 데이터를 보강하고 매시업합니다. 요청 흐름에서 ServiceCallout 정책을 사용하여 요청을 보낸 다음 응답의 정보를 API 프록시의 TargetEndpoint로 전달할 수도 있습니다.
- 또 다른 사용 사례에서는 호출을 보내는 동일한 조직 및 환경에 있는 프록시를 호출합니다. 예를 들어 하나 이상의 다른 프록시가 소비하는 개별 하위 수준 기능을 사용하는 프록시가 있는 경우 이 방법이 유용할 수 있습니다. 예를 들어 백엔드 데이터 저장소와 함께 생성/읽기/업데이트/삭제 작업을 노출하는 프록시는 클라이언트에 데이터를 노출하는 다른 여러 프록시의 대상 프록시가 될 수 있습니다.
이 정책은 HTTP 및 HTTPS를 통한 요청을 지원합니다.
샘플
내부 프록시 로컬 호출
<LocalTargetConnection> <APIProxy>data-manager</APIProxy> <ProxyEndpoint>default</ProxyEndpoint> </LocalTargetConnection>
이 예시에서는 data-manager
라는 로컬 API 프록시(즉, 동일한 조직 및 환경에 있는 프록시)에 대한 콜아웃을 만들어 이름이 default
인 프록시 엔드포인트를 지정합니다.
변수로서의 URL
<HTTPTargetConnection> <URL>http://example.com/{request.myResourcePath}</URL> </HTTPTargetConnection>
이 예시에서는 URL에 있는 변수를 사용하여 타겟의 URL을 동적으로 채웁니다. URL의 프로토콜 부분인 http://
은 변수로 지정할 수 없습니다. 또한 URL의 도메인 부분과 그 외 부분에 별도의 변수를 사용해야 합니다.
Google Geocoding / 요청 정의
<ServiceCallout name="ServiceCallout-GeocodingRequest1"> <DisplayName>Inline request message</DisplayName> <Request variable="authenticationRequest"> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.postalcode}</QueryParam> <QueryParam name="region">{request.queryparam.country}</QueryParam> <QueryParam name="sensor">false</QueryParam> </QueryParams> </Set> </Request> <Response>GeocodingResponse</Response> <Timeout>30000</Timeout> <HTTPTargetConnection> <URL>https://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
요청 객체를 생성하기 위해 AssignMessage 정책과 같은 정책을 사용하는 대신 ServiceCallout 정책에서 직접 정의할 수 있습니다. 이 예시에서 ServiceCallout 정책은 외부 서비스에 전달된 세 가지 쿼리 매개변수의 값을 설정합니다. ServiceCallout 정책에서 페이로드, 인코딩 유형(예: application/xml
, 헤더, 양식 매개변수 등)을 지정하는 전체 요청 메시지를 만들 수 있습니다.
다음은 ServiceCallout 정책에 도달하기 전에 요청이 형성되는 또 다른 예시입니다.
<ServiceCallout name="ServiceCallout-GeocodingRequest2"> <Request clearPayload="false" variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <Timeout>30000</Timeout> <HTTPTargetConnection> <URL>https://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
요청 메시지의 내용은 GeocodingRequest
라는 변수(예: AssignMessage 정책에 의해 채워질 수 있는 변수)에서 추출됩니다. 응답 메시지는 GeocodingResponse
라는 변수에 할당되며 이 변수는 ExtractVariables 정책이나 자바스크립트 또는 자바로 작성된 커스텀 코드로 파싱될 수 있습니다. 정책은 Google Geocoding API의 응답을 30초 동안 기다린 후에 타임아웃됩니다.
대상 서버 호출
<ServiceCallout async="false" continueOnError="false" enabled="true" name="service-callout"> <DisplayName>service-callout</DisplayName> <Properties/> <Request clearPayload="true" variable="myRequest"> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </Request> <Response>myResponse</Response> <HTTPTargetConnection> <LoadBalancer> <Algorithm>RoundRobin</Algorithm> <Server name="httpbin"/> <Server name="yahoo"/> </LoadBalancer> <Path>/get</Path> </HTTPTargetConnection> </ServiceCallout>
이 정책은 LoadBalancer 속성을 사용하여 대상 서버를 호출하고 서버 간 부하 분산을 수행합니다. 이 예시에서는 httpbin
및 yahoo
라는 대상 서버 두 개에 부하가 분산됩니다. 프록시에 대상 서버를 설정하고 부하 분산을 구성하는 방법에 대한 자세한 내용은 백엔드 서버 간 부하 분산을 참조하세요.
ServiceCallout 정책 정보
API 프록시에서 ServiceCallout 정책을 사용할 수 있는 사례는 다양합니다. 예를 들어 외부 서비스에 호출을 수행하여 Geolocation 데이터, 고객 리뷰, 파트너의 소매 카탈로그 항목 등을 전달하기 위해 API 프록시를 구성할 수 있습니다.
콜아웃은 일반적으로 두 가지 정책 즉, AssignMessage 및 ExtractVariables와 함께 사용됩니다.
- 요청: AssignMessage는 원격 서비스로 전송된 요청 메시지를 채웁니다.
-
응답: ExtractVariables는 응답을 파싱하고 특정 콘텐츠를 추출합니다.
일반적인 ServiceCallout 정책 구성에는 다음이 포함됩니다.
- AssignMessage 정책: 요청 메시지를 만들고, HTTP 헤더 및 쿼리 매개변수를 채우고, HTTP 동사 설정 등을 수행합니다.
-
ServiceCallout 정책: AssignMessage 정책으로 생성된 메시지를 참조하여 외부 호출의 대상 URL을 정의하고, 대상 서비스가 반환하는 응답 객체의 이름을 정의합니다.
성능 향상을 위해 ServiceCallout 응답도 캐시할 수 있습니다(참조: ServiceCallout 정책의 결과를 캐시에 저장하려면 어떻게 해야 하나요? 나중에 캐시에서 데이터를 가져올 수 있나요?).
- ExtractVariables 정책: 일반적으로 ServiceCallout으로 생성된 메시지를 파싱하는 JSONPath 또는 XPath 표현식을 정의합니다. 그런 다음 정책은 ServiceCallout 응답에서 파싱된 값이 포함된 변수를 설정합니다.
커스텀 오류 처리
요소 참조
이 정책에 구성할 수 있는 요소와 속성은 다음과 같습니다.
<ServiceCallout async="false" continueOnError="false" enabled="true" name="Service-Callout-1"> <DisplayName>Custom label used in UI</DisplayName> <Request clearPayload="true" variable="myRequest"> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <Remove> <StatusCode/> <Path/> <Version/> <Verb/> </Remove> <Copy> <StatusCode/> <Path/> <Version/> <Verb/> </Copy> <Add> <Headers/> <QueryParams/> <FormParams/> </Add> <Set> <Headers/> <QueryParams/> <FormParams/> <Payload/> <StatusCode/> <Path/> <Version/> <Verb/> </Set> </Request> <Response>calloutResponse</Response> <Timeout>30000</Timeout> <HTTPTargetConnection> <URL>http://example.com</URL> <LoadBalancer/> <SSLInfo/> <Properties/> <Authentication> <HeaderName ref="{variable}">STRING</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> <LifetimeInSeconds ref="{variable}">3600</LifetimeInSeconds> </GoogleAccessToken> </Authentication> <Authentication> <HeaderName ref="{variable}">STRING</HeaderName> <GoogleIDToken> <Audience ref="{variable}" useTargetUrl="BOOLEAN">{hostname}</Audience> <IncludeEmail ref="{variable}">true</IncludeEmail> </GoogleIDToken> </Authentication> </HTTPTargetConnection> <LocalTargetConnection> <APIProxy/> <ProxyEndpoint/> <Path/> </LocalTargetConnection> </ServiceCallout>
<ServiceCallout> 속성
<ServiceCallout async="false" continueOnError="false" enabled="true" name="Service-Callout-1">
다음 표는 모든 정책 상위 요소의 공통 속성에 대해 설명합니다.
속성 | 설명 | 기본값 | 접속 상태 |
---|---|---|---|
name |
정책의 내부 이름입니다. 원하는 경우 |
해당 사항 없음 | 필수 |
continueOnError |
정책이 실패할 경우 오류가 반환되도록 하려면 정책이 실패해도 흐름 실행이 계속되도록 하려면 |
거짓 | 선택사항 |
enabled |
정책을 시행하려면 정책을 중지하려면 |
참 | 선택사항 |
async |
이 속성은 지원이 중단되었습니다. |
거짓 | 지원 중단됨 |
<DisplayName> 요소
name
속성 외에도 이 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름으로 라벨을 지정합니다.
<DisplayName>Policy Display Name</DisplayName>
기본값 |
해당 사항 없음 이 요소를 생략하면 정책 |
---|---|
접속 상태 | 선택사항 |
유형 | 문자열 |
<Request> 요소
API 프록시에서 다른 서비스로 전송되는 요청 메시지가 포함된 변수를 지정합니다. 이 변수는 흐름의 이전 정책에 의해 생성되거나 ServiceCallout 정책에서 인라인으로 만들 수 있습니다.
<Request clearPayload="true" variable="myRequest"> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <Remove> <StatusCode/> <Path/> <Version/> <Verb/> </Remove> <Copy> <StatusCode/> <Path/> <Version/> <Verb/> </Copy> <Add> <Headers/> <QueryParams/> <FormParams/> </Add> <Set> <Headers/> <QueryParams/> <FormParams/> <Payload/> <StatusCode/> <Path/> <Version/> <Verb/> </Set> </Request>
<Remove>, <Copy>, <Add>, <Set> 태그의 구문은 AssignMessage 정책과 동일합니다.
요청 메시지를 확인할 수 없거나 잘못된 요청 메시지 유형인 경우 정책이 오류를 반환합니다.
가장 간단한 예시에서는 API 프록시의 흐름 초반부에 채워진 요청 메시지가 포함된 변수를 전달합니다.
<Request clearPayload="true" variable="myRequest"/>
또는 ServiceCallout 정책 자체에서 외부 서비스로 전송된 요청 메시지를 채울 수 있습니다.
<Request> <Set> <Headers> <Header name="Accept">application/json</Header> </Headers> <Verb>POST</Verb> <Payload contentType="application/json">{"message":"my test message"}</Payload> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </Request>
기본값 | Request(요청) 요소 또는 관련 속성을 생략하면 Apigee는 다음의 기본값을 할당합니다. <Request clearPayload="true" variable="servicecallout.request"/> 이 기본값이 무엇을 의미하는지 살펴보겠습니다. 먼저
데이터 마스킹을 사용하는 경우 이 기본 이름을 알고 있어야 합니다. 변수 이름을 생략하면 |
Presence | 선택사항 |
유형 | 해당 없음 |
속성
속성 | 설명 | 기본값 | Presence |
---|---|---|---|
변수 |
요청 메시지를 포함할 변수의 이름입니다. |
servicecallout.request |
선택사항 |
clearPayload |
ServiceCallout이 실행된 후 요청 메시지가 필요한 경우에만 clearPayload 옵션을 false로 설정합니다. |
참 | 선택사항 |
<Request>/<IgnoreUnresolvedVariables> 요소
true로 설정하면 정책은 요청에서 해결되지 않은 변수 오류를 무시합니다.
<Request clearPayload="true" variable="myRequest"> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </Request>
기본값 | false |
Presence | 선택사항 |
유형 | 부울 |
<Response> 요소
API 프록시 로직이 추가 처리를 위해 원격 호출의 응답이 필요한 경우 이 요소를 포함합니다.
이 요소가 있는 경우 외부 서비스에서 수신한 응답 메시지를 포함할 변수의 이름을 지정합니다. 대상의 응답은 정책에서 전체 응답을 성공적으로 읽는 경우에만 변수에 할당됩니다. 어떠한 이유로든 원격 호출이 실패하면 정책에서 오류를 반환합니다.
이 요소를 생략하면 API 프록시가 응답을 기다리지 않으며, API 프록시 흐름 실행은 모든 후속 흐름 단계를 통해 계속 진행됩니다. 또한 명확히 하자면 Response
요소가 없으면 대상의 응답을 후속 단계에 따라 처리할 수 없으며, 프록시 흐름에서 원격 호출의 실패를 감지할 방법이 없습니다.
ServiceCallout을 사용할 때 Response
요소를 생략하는 것의 일반적인 용도는 외부 시스템에 로깅하기 위함입니다.
<Response>calloutResponse</Response>
기본값 | NA |
Presence | 선택사항 |
유형 | 문자열 |
<Timeout> 요소
ServiceCallout 정책이 대상의 응답을 대기하는 시간(밀리초)입니다. 런타임 시 이 값을 동적으로 설정할 수 없습니다. ServiceCallout이 제한 시간에 도달하면 오류 처리에 설명된 대로 HTTP 500이 반환되고, 정책이 실패하며, API 프록시는 오류 상태가 됩니다.
<Timeout>30000</Timeout>
기본값 | 55,000밀리초(55초), Apigee의 HTTP 제한 시간 기본 설정 |
Presence | 선택사항 |
유형 | 정수 |
<HTTPTargetConnection> 요소
URL, TLS/SSL, HTTP 속성과 같은 전송 세부정보를 제공합니다. <TargetEndpoint>
구성 참조를 확인하세요.
<HTTPTargetConnection> <URL>http://example.com</URL> <LoadBalancer/> <SSLInfo/> <Properties/> </HTTPTargetConnection>
기본값 | 해당 없음 |
Presence | 필수 |
유형 | 해당 사항 없음 |
<HTTPTargetConnection>/<Authentication> 요소
Google OAuth 2.0 또는 Google에서 발급한 OpenID Connect 토큰을 생성하여 특정 Cloud Functions 및 Cloud Run과 같은 Google Cloud 제품에서 실행되는 Google 서비스와 커스텀 서비스에 인증된 호출을 수행합니다. 이 요소를 사용하려면 Google 인증 사용에 설명된 설정과 배포 단계가 필요합니다. 올바르게 설정하면 정책에서 인증 토큰을 자동으로 만들어 서비스 요청에 추가합니다.
하위 요소 GoogleAccessToken
및 GoogleIDToken
을 사용하면 Google OAuth 또는 OpenID Connect 토큰을 생성하도록 정책을 구성할 수 있습니다. 호출하려는 서비스 유형에 따라 이러한 하위 요소 중 하나를 선택해야 합니다.
ServiceCallout 정책은 HTTP 기반 서비스 호출만 지원합니다.
기본값 | 해당 사항 없음 |
필수 여부 | 선택사항. |
유형 | 복합 유형 |
상위 요소 | <HTTPTargetConnection> |
하위 요소 | <HeaderName> <GoogleAccessToken> <GoogleIDToken>
|
Authentication
요소는 다음 구문을 사용합니다.
구문
<ServiceCallout> ... <HTTPTargetConnection> <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> <!-- NOTE: The default value for LifetimeInSeconds is 3600. Change the default only if you want to limit the risk of leaked access tokens or improve performance. --> <LifetimeInSeconds ref="{variable}">INTEGER</LifetimeInSeconds> </GoogleAccessToken> --OR-- <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleIDToken> <Audience ref="{variable}" useTargetUrl="BOOLEAN">STRING</Audience> <IncludeEmail ref="{variable}">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </HTTPTargetConnection> </ServiceCallout>
GoogleAccessToken 사용
다음 예시에서는 GoogleAccessToken
요소를 보여줍니다.
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
GoogleIDToken 사용
다음 예시에서는 GoogleIDToken
요소를 보여줍니다.
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> <IncludeEmail>false</IncludeEmail> </GoogleIDToken> </Authentication>
HeaderName 사용
다음 예시에서는 HeaderName
요소를 보여줍니다.
<Authentication> <HeaderName>X-Serverless-Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>"https://www.googleapis.com/auth/cloud-platform"</Scope> </Scopes> </GoogleAccessToken> </Authentication>
LifetimeInSeconds 사용
다음 예시에서는 HeaderName
요소를 보여줍니다.
<Authentication> <GoogleAccessToken> <Scopes> <Scope>"https://www.googleapis.com/auth/cloud-platform"</Scope> </Scopes> <LifetimeInSeconds ref="variable">3600</LifetimeInSeconds> </GoogleAccessToken> </Authentication>
속성
없음
HeaderName 하위 요소
기본적으로 인증 구성이 있으면 Apigee는 Bearer 토큰을 생성하고 대상 시스템으로 전송된 메시지의 Authorization
헤더에 삽입합니다.
HeaderName
요소를 사용하면 Bearer 토큰을 저장할 다른 헤더의 이름을 지정할 수 있습니다. 이 기능은 대상이 X-Serverless-Authorization
헤더를 사용하는 Cloud Run 서비스일 때 특히 유용합니다. Authorization
헤더가 있는 경우 이 헤더는 수정되지 않은 상태로 유지되고 요청에서 전송됩니다.
기본 | 해당 사항 없음 |
필수 여부 | 아니요 |
유형 | 문자열 |
상위 요소 | <Authentication> |
하위 요소 | 없음 |
HeaderName
요소는 다음 구문을 사용합니다.
구문
<ServiceCallout> ... <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleAccessToken> ... </GoogleAccessToken> </Authentication> ... </ServiceCallout>
정적 문자열 사용
이 예시에서는 생성된 Bearer 토큰이 기본적으로 대상 시스템으로 전송되는 X-Serverless-Authorization
이라는 헤더에 추가됩니다. Authorization
헤더가 있는 경우 이 헤더는 수정되지 않은 상태로 유지되고 요청에서 전송됩니다.
<Authentication> <HeaderName>X-Serverless-Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
변수 참조 사용
이 예시에서는 생성된 Bearer 토큰이 기본적으로 대상 시스템으로 전송되는 X-Serverless-Authorization
이라는 헤더에 추가됩니다. my-variable
에 값이 있으면 기본 문자열 대신 해당 값이 사용됩니다. Authorization
헤더가 있는 경우 이 헤더는 수정되지 않은 상태로 유지되고 요청에서 전송됩니다.
<Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
GoogleAccessToken 하위 요소
Google OAuth 2.0 토큰을 생성하여 Google 서비스에 인증된 호출을 수행합니다. Google OAuth 토큰은 Cloud Logging 및 Secret Manager와 같은 다양한 종류의 Google 서비스를 호출하는 데 사용될 수 있습니다.
기본값 | 해당 사항 없음 |
필수 여부 | GoogleAccessToken 또는 GoogleIDToken 하위 요소가 있어야 합니다. |
유형 | 문자열 |
상위 요소 | <Authentication> |
하위 요소 | <Scopes> <LifetimeInSeconds> |
GoogleAccessToken
요소는 다음 구문을 사용합니다.
구문
<ServiceCallout> ... <Authentication> <GoogleAccessToken> <Scopes> <Scope>SCOPE_1</Scope> ... </Scopes> <!-- NOTE: The default value for LifetimeInSeconds is 3600. We do not recommend changing the default unless you want to limit the risk of leaked access tokens or improve performance. --> <LifetimeInSeconds ref="FLOW_VARIABLE">INTEGER</LifetimeInSeconds> </GoogleAccessToken> </Authentication> ... </ServiceCallout>
예시 1
다음 예시에서는 GoogleAccessToken
요소를 보여줍니다.
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
예 2
다음 예시에서는 ServiceCallout 정책을 사용하여 보안 비밀을 검색하기 위해 secret manager에 연결하는 방법을 보여줍니다.
<ServiceCallout name="ServiceCallout-sm"> <Response>SecretManagerResponse</Response> <Timeout>30000</Timeout> <HTTPTargetConnection> <Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication> <URL> https://secretmanager.googleapis.com/v1/projects/project-id/secrets/secret-id </URL> </HTTPTargetConnection> </ServiceCallout>
예 3
다음 예시에서는 ServiceCallout 정책에서 Cloud Run에 대한 콜아웃을 수행하는 방법을 보여줍니다.
<ServiceCallout name="ServiceCallout-CloudRun"> <Response>CloudRunResponse</Response> <Timeout>30000</Timeout> <HTTPTargetConnection> <Authentication> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app/test</Audience> </GoogleIDToken> </Authentication> <URL>https://cloudrun-hostname.a.run.app/test</URL> </HTTPTargetConnection> </ServiceCallout>
Scopes 하위 요소
OAuth 2.0 액세스 토큰에 포함할 범위를 식별합니다. 자세한 내용은 Google API의 OAuth 2.0 범위를 참조하세요. 이 요소 아래에 <Scope>
하위 요소를 하나 이상 추가할 수 있습니다.
기본값 | 해당 사항 없음 |
필수 여부 | 필수 |
유형 | 문자열 |
상위 요소 | <GoogleAccessToken> |
하위 요소 | <Scope> |
Scope 하위 요소
유효한 Google API 범위를 지정합니다. 자세한 내용은 Google API의 OAuth 2.0 범위를 참조하세요.
기본값 | 해당 사항 없음 |
필수 여부 | 값을 하나 이상 입력해야 합니다. |
유형 | 문자열 |
상위 요소 | <Scopes> |
하위 요소 | 없음 |
LifetimeInSeconds 하위 요소
액세스 토큰의 전체 기간을 초 단위로 지정합니다.
기본값 | 3600 |
필수 여부 | 선택사항 |
유형 | 정수 |
상위 요소 | <GoogleAccessToken> |
하위 요소 | 없음 |
GoogleIDToken 하위 요소
Google에서 발생한 OpenID Connect 토큰을 생성하여 Google 서비스에 인증된 호출을 수행합니다.
기본값 | 해당 사항 없음 |
필수 여부 | GoogleAccessToken 또는 GoogleIDToken 하위 요소가 있어야 합니다. |
유형 | 문자열 |
상위 요소 | <Authentication> |
하위 요소 | <Audience> <IncludeEmail> |
GoogleIDToken
요소는 다음 구문을 사용합니다.
구문
<ServiceCallout> ... <Authentication> <GoogleIDToken> <Audience ref="{variable}" useTargetUrl="BOOLEAN">STRING</Audience> <IncludeEmail ref="{variable}">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </ServiceCallout>
예시 1
다음 예시에서는 GoogleIDToken
요소를 보여줍니다.
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> <IncludeEmail>true</IncludeEmail> </GoogleIDToken> </Authentication>
Audience 하위 요소
토큰에서 액세스 권한을 부여하는 계정이나 API와 같은 생성된 인증 토큰의 대상입니다.
Audience
값이 비어 있거나 ref
변수가 유효한 값으로 확인되지 않고 useTargetUrl
이 true
인 경우 대상의 URL(쿼리 매개변수 제외)이 잠재고객으로 사용됩니다. useTargetUrl
의 기본값은 false
입니다.
<Audience>explicit-audience-value-here</Audience> or: <Audience ref='variable-name-here'/> or: <Audience ref='variable-name-here' useTargetUrl='true'/> or: <Audience useTargetUrl='true'/>
기본값 | 해당 사항 없음 |
필수 여부 | 필수 |
유형 | 문자열 |
상위 요소 | <GoogleIDToken> |
하위 요소 | 없음 |
IncludeEmail 하위 요소
true
로 설정하면 생성된 인증 토큰에 서비스 계정 email
및 email_verified
클레임이 포함됩니다.
기본값 | false |
필수 여부 | 선택사항 |
유형 | 부울 |
상위 요소 | <GoogleIDToken> |
하위 요소 | 없음 |
<HTTPTargetConnection>/<URL> 요소
호출되는 서비스의 URL입니다.
<HTTPTargetConnection> <URL>http://example.com</URL> </HTTPTargetConnection>
변수를 통해 URL의 일부를 동적으로 제공할 수 있습니다. 그러나 아래의 URL http://의 프로토콜 부분은 변수로 지정될 수 없습니다. 다음 예시에서는 변수를 사용하여 쿼리 매개변수의 값을 지정합니다.
<URL>http://example.com/forecastrss?w=${request.header.woeid}</URL>
또는 변수를 사용하여 URL 경로의 일부를 설정합니다.
<URL>http://example.com/{request.resourcePath}?w=${request.header.woeid}</URL>
변수를 사용하여 URL의 도메인과 포트를 지정하려면 도메인 및 포트에만 첫 번째 변수를 사용하고 URL의 다른 부분에 두 번째 변수를 사용합니다.
<URL>http://{request.dom_port}/{request.resourcePath}</URL>
기본값 | 해당 없음 |
Presence | 필수 |
유형 | 문자열 |
<HTTPTargetConnection>/<SSLInfo> 요소
백엔드 서비스에 대한 TLS/SSL 구성입니다. TLS/SSL 구성에 대한 도움말은 API 프록시 구성 참조에서 TLS 구성 옵션 및 'TLS/SSL TargetEndpoint 구성'을 참조하세요.
<HTTPTargetConnection> <URL>https://example.com</URL> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://mykeystoreref</KeyStore> ## Use of a reference is recommended <KeyAlias>myKey</KeyAlias> <TrustStore>myTruststore</TrustStore> <Ciphers/> <Protocols/> </SSLInfo> </HTTPTargetConnection>
기본값 | 해당 없음 |
Presence | 선택사항 |
유형 | 해당 사항 없음 |
<HTTPTargetConnection>/<Properties> 요소
백엔드 서비스로의 HTTP 전송 속성입니다. 자세한 내용은 엔드포인트 속성 참조를 확인하세요.
<HTTPTargetConnection> <URL>http://example.com</URL> <Properties> <Property name="allow.http10">true</Property> <Property name="request.retain.headers"> User-Agent,Referer,Accept-Language </Property> </Properties> </HTTPTargetConnection>
기본값 | 해당 없음 |
Presence | 선택사항 |
유형 | 해당 사항 없음 |
<HTTPTargetConnection>/<LoadBalancer> 요소
하나 이상의 대상 서버를 호출하고 서버에서 부하 분산을 수행합니다. 샘플 섹션에서 호출 대상 서버 샘플을 참조하세요. 백엔드 서버 간 부하 분산도 참조하세요. ServiceCallout 정책과 경로 규칙을 사용하여 대상 서버를 호출하는 방법을 설명하는 대상 엔드포인트/서버 콜아웃도 참조하세요.
<HTTPTargetConnection> <LoadBalancer> <Algorithm>RoundRobin</Algorithm> <Server name="httpbin"/> <Server name="yahoo"/> </LoadBalancer> <Path>/get</Path> </HTTPTargetConnection>
기본값 | 해당 없음 |
Presence | 선택사항 |
유형 | 해당 사항 없음 |
<LocalTargetConnection> 요소
로컬 프록시(즉, 동일한 조직 및 환경의 프록시)를 서비스 콜아웃의 대상으로 지정합니다.
타겟을 추가로 지정하려면 <APIProxy>
또는 <ProxyEndpoint>
요소를 사용하거나 <Path>
요소를 사용합니다.
<LocalTargetConnection> <APIProxy/> <ProxyEndpoint/> <Path/> </LocalTargetConnection>
기본값 | 해당 없음 |
Presence | 필수 |
유형 | 해당 사항 없음 |
<LocalTargetConnection>/<APIProxy> 요소
로컬 호출의 타겟인 API 프록시의 이름입니다. 프록시는 호출을 수행하는 프록시와 동일한 조직 및 환경에 있어야 합니다.
<LocalTargetConnection> <APIProxy>data-manager</APIProxy> <ProxyEndpoint>default</ProxyEndpoint> </LocalTargetConnection>
<APIProxy>
요소와 함께 <ProxyEndpoint>
요소를 포함하여 호출의 대상이어야 하는 프록시 엔드포인트의 이름을 지정합니다.
<LocalTargetConnection> <APIProxy/> <ProxyEndpoint/> </LocalTargetConnection>
기본값 | 해당 없음 |
Presence | 필수 |
유형 | 문자열 |
<LocalTargetConnection>/<ProxyEndpoint> 요소
호출 대상이어야 하는 프록시 엔드포인트의 이름입니다. 이는 <APIProxy>
요소로 지정된 API 프록시의 프록시 엔드포인트입니다.
<LocalTargetConnection> <APIProxy>data-manager</APIProxy> <ProxyEndpoint>default</ProxyEndpoint> </LocalTargetConnection>
기본값 | 해당 없음 |
Presence | 선택사항 |
유형 | 해당 사항 없음 |
<LocalTargetConnection>/<Path> 요소
대상이 되는 엔드포인트의 경로입니다. 엔드포인트는 호출을 수행하는 프록시와 동일한 조직 및 환경의 프록시를 참조해야 합니다.
프록시 이름을 모르거나 의존할 수 없는 경우 <APIProxy>/<ProxyEndpoint>
쌍 대신 이를 사용하세요. 경로가 안정적인 대상일 수 있습니다.
<LocalTargetConnection> <Path>/data-manager</Path> </LocalTargetConnection>
기본값 | 해당 없음 |
Presence | 선택사항 |
유형 | 해당 사항 없음 |
스키마
흐름 변수
흐름 변수를 사용하면 HTTP 헤더, 메시지 콘텐츠 또는 흐름 컨텍스트를 기반으로 런타임 시 정책 및 흐름의 동적 동작을 사용 설정할 수 있습니다. ServiceCallout 정책이 실행된 후에 다음과 같은 사전 정의된 흐름 변수를 사용할 수 있습니다. 흐름 변수에 대한 자세한 내용은 흐름 변수 참조를 참조하세요.
ServiceCallouts에는 자체 요청과 응답이 있으며 변수를 통해 해당 데이터에 액세스할 수 있습니다. 기본 메시지는 request.*
및 response.*
변수 프리픽스를 사용하므로 myrequest.*
및 calloutResponse.*
프리픽스(ServiceCallout 구성의 기본값)를 사용하여 ServiceCallout 관련 메시지 데이터를 가져옵니다. 다음 표의 첫 번째 예시는 ServiceCallout에서 HTTP 헤더를 가져오는 방법을 보여줍니다.
변수 | 설명 |
---|---|
다음은 ServiceCallout 요청과 응답 헤더를 가져오는 예시로 기본 요청 및 응답에서 헤더를 가져오는 방식과 유사합니다.
여기서 calloutResponse는 Service Callout의 Response 변수 이름이고 myRequest는 Request 변수 이름입니다. 예를 들면 다음과 같습니다.
ServiceCallout 응답의 Content-Length 헤더를 반환합니다. |
범위: ServiceCallout 전달부터 ServiceCallout 요청 또는 응답의 메시지 헤더입니다. 예를 들어 API 프록시 대상이 http://example.com이고 ServiceCallout 대상이 http://mocktarget.apigee.net인 경우 이러한 변수는 http://mocktarget.apigee.net에 대한 콜아웃의 헤더입니다. |
servicecallout.requesturi |
범위: ServiceCallout 요청부터 ServiceCallout 정책의 TargetEndpoint URI입니다. URI는 프로토콜 및 도메인 사양이 없는 TargetEndpoint URL입니다. |
servicecallout.{policy-name}.target.url |
범위: ServiceCallout 요청부터 ServiceCallout의 대상 URL입니다. |
여기서 |
범위: ServiceCallout 응답부터 ServiceCallout의 응답 본문입니다. |
servicecallout.{policy-name}.expectedcn |
범위: ServiceCallout 요청부터 ServiceCallout 정책에서 참조하는 TargetEndpoint의 일반적인 예상 이름입니다. 이는 TargetEndpoint가 TLS/SSL 엔드포인트를 참조하는 경우에만 의미가 있습니다. |
servicecallout.{policy-name}.failed |
범위: ServiceCallout 응답부터 정책의 성공, 참, 실패, 거짓 여부를 나타내는 부울입니다. |
오류
이 섹션에서는 반환되는 오류 코드 및 오류 메시지와 이 정책이 오류를 트리거할 때 Apigee에서 설정한 오류 변수를 설명합니다. 오류를 처리하기 위해 오류 규칙을 개발 중인 경우, 이 정보는 중요합니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항 및 오류 처리를 참조하세요.
런타임 오류
이러한 오류는 정책이 실행될 때 발생할 수 있습니다.
오류 코드 | HTTP 상태 | 원인 | 수정 |
---|---|---|---|
steps.servicecallout.ExecutionFailed |
500 |
이 오류는 다음과 같은 때에 발생할 수 있습니다.
|
build |
steps.servicecallout.RequestVariableNotMessageType |
500 |
정책에 지정된 Request 변수가 Message 유형이 아닙니다. 예를 들어 문자열이거나 기타 메시지 외 유형인 경우 이 오류가 표시됩니다. |
build |
steps.servicecallout.RequestVariableNotRequestMessageType |
500 |
정책에 지정된 Request 변수가 RequestMessage 유형이 아닙니다. 예를 들어 응답 유형인 경우 이 오류가 표시됩니다. |
build |
googletoken.EmptyIDTokenAudience |
500 |
|
|
messaging.adaptors.http.filter.GoogleTokenGenerationFailure |
500 |
이 오류는 API 프록시가 <Authentication> 요소로 구성된 경우에 발생할 수 있습니다. 원인은 다음과 같습니다.
<GoogleAccessToken> 요소가 사용되고 잘못된 범위가 하나 이상 제공됩니다. 예를 들어 오타나 빈 범위가 있는지 확인합니다.
Apigee Hybrid의 경우 문제 디버깅에 도움이 될 수 있는 보다 자세한 오류 메시지를 찾으려면 런타임 컨테이너 로그에서 |
배포 오류
이 오류는 이 정책이 포함된 프록시를 배포할 때 발생할 수 있습니다.
오류 이름 | 원인 | 수정 |
---|---|---|
URLMissing |
<HTTPTargetConnection> 내의 <URL> 요소가 없거나 비어 있습니다. |
build |
ConnectionInfoMissing |
이 오류는 정책에 <HTTPTargetConnection> 또는 <LocalTargetConnection> 요소가 없는 경우 발생합니다. |
build |
InvalidTimeoutValue |
이 오류는 <Timeout> 값이 음수이거나 0이면 발생합니다. |
build |
FAILED_PRECONDITION |
이 오류는 프록시가 <Authentication> 태그로 구성되었을 때 서비스 계정이 누락된 경우에 발생합니다.
예를 들면 다음과 같습니다. Deployment of \"organizations/foo/apis/apiproxy/revisions/1\" requires a service account identity, but one was not provided with the request. |
|
PERMISSION_DENIED |
이 오류는 프록시가 <Authentication> 태그로 구성된 경우 서비스 계정에 권한 문제가 있으면 발생합니다. 가능한 원인은 다음과 같습니다.
|
오류 변수
이러한 변수는 런타임 오류가 발생하면 설정됩니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항을 참조하세요.
변수 | 장소 | 예 |
---|---|---|
fault.name="fault_name" |
fault_name은 위의 런타임 오류 표에 나열된 오류 이름입니다. 오류 이름은 오류 코드의 마지막 부분입니다. | fault.name = "RequestVariableNotMessageType" |
servicecallout.policy_name.failed |
policy_name은 오류를 발생시킨 정책의 사용자 지정 이름입니다. | servicecallout.SC-GetUserData.failed = true |
오류 응답 예시
{ "fault":{ "detail":{ "errorcode":"steps.servicecallout.RequestVariableNotMessageType" }, "faultstring":"ServiceCallout[ServiceCalloutGetMockResponse]: request variable data_str value is not of type Message" } }
오류 규칙 예시
<FaultRule name="RequestVariableNotMessageType"> <Step> <Name>AM-RequestVariableNotMessageType</Name> </Step> <Condition>(fault.name = "RequestVariableNotMessageType")</Condition> </FaultRule>
관련 주제
- 메시지 생성 또는 수정: AssignMessage 정책
- 변수 추출: ExtractVariables 정책
- 변수: 흐름 변수 참조
- TLS/SSL 구성
- TLS 구성 옵션
- API 프록시 구성 참조의 'TLS/SSL TargetEndpoint 구성'
- HTTP 전송 속성: 엔드포인트 속성 참조
- ServiceCallout 대안으로 자바스크립트로 작성된 HTTPClient는 자바스크립트 객체 모델을 참조하세요.