기존 번들 서비스용 Sockets API


소켓의 트래픽 요금은 발신 대역폭으로 청구됩니다. 비동기 IO(예: Python의 Twisted)는 지원되지 않습니다. App Engine은 표준 Python 소켓 모듈 API를 아웃바운드 소켓용으로만 지원합니다. 간단히 다음 문을 사용하여 표준 소켓 라이브러리를 가져올 수 있습니다.

import socket

poplib 또는 nntplib와 같이 socket을 가져오고, 아래에 설명된 제한 및 제약사항을 위반하지 않는 라이브러리는 수정 없이 작동합니다.

Python 2 런타임은 소켓을 지원하지만 소켓을 사용할 때 알아야 할 몇 가지 제한 사항과 동작이 있습니다.

소켓 설명어를 피클하고 App Engine 인스턴스 간에 전달할 수 있습니다(예: 작업 페이로드의 일부). 이 경우에는 프런트엔드 인스턴스에서 소켓을 연 후 백엔드 인스턴스에 소켓을 전달하여 사용할 수 있습니다.

1.8.1 이전의 SDK 버전에서는 소켓에 대해 get/set 옵션을 호출할 수 없었습니다. 호출하면 "구현되지 않음" 예외가 발생했습니다. 하지만 이제 Sockets API는 이를 허용합니다.

지원되는 옵션의 경우, getsockopt를 호출하면 모의 값이 반환되고 setsockopt를 호출하면 자동으로 무시됩니다. 지원되지 않는 옵션에 대해서는 오류가 계속 발생합니다. 지원되는 옵션은 다음과 같습니다.

  • SO_KEEPALIVE
  • SO_DEBUG
  • TCP_NODELAY
  • SO_LINGER
  • SO_OOBINLINE
  • SO_SNDBUF
  • SO_RCVBUF
  • SO_REUSEADDR

제한 및 제약사항

App Engine의 소켓 지원에는 다음과 같은 제한사항이 있습니다.

  • 리슨 소켓을 만들 수 없으며 아웃바운드 소켓만 만들 수 있습니다.
  • FTP는 지원되지 않습니다.
  • 기본적으로 httpliburlfetch api를 사용하도록 구성됩니다. socket을 사용하여 urlfetch 제한을 우회해야 하는 경우, 이 기본값을 변경하여 httplib가 대신 소켓을 사용하도록 설정하면 됩니다. 자세한 내용은 httplib에서 소켓 사용을 참조하세요.
  • TCP 또는 UDP만 사용할 수 있습니다. 임의 프로토콜은 허용되지 않습니다.
  • 특정 IP 주소 또는 포트로 바인딩할 수 없습니다.
  • 포트 25(SMTP)가 차단됩니다. 제출 포트 587에서 인증된 SMTP를 계속 사용할 수 있습니다.
  • 비공개, 브로드캐스트, 멀티캐스트, Google IP 범위는 아래 나열된 항목을 제외하고 차단됩니다.

    • Google Public DNS: 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 포트 53
    • Gmail SMTPS: smtp.gmail.com 포트 465 및 587
    • Gmail POP3S: pop.gmail.com 포트 995
    • Gmail IMAPS: imap.gmail.com 포트 993
  • 소켓 설명자는 자신을 만든 App Engine 앱에 연결되며 전송될 수 없습니다(다른 앱에서 사용 불가).

  • 비활성 상태가 10분간 지속되는 소켓은 회수할 수 있습니다. 모든 소켓 작업에서 소켓이 10분 더 활성 상태로 유지됩니다.

  • 현재 socket.gethostbyaddr()는 Python에 구현되어 있지 않습니다. 계속 Python SMTP 표준 라이브러리(smtplib)를 사용하여 연결을 생성할 수 있습니다.

    # Open a connection to my mail server
    s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
    

개발 서버와 소켓 사용

특수 명령줄 매개변수를 사용하지 않고 개발 서버에서 소켓을 사용하여 코드를 실행하고 테스트할 수 있습니다.

OpenSSL에서 소켓 사용

App Engine은 Python 2.7 런타임용 기본 Python OpenSSL을 지원합니다. OpenSSL 지원에 설명된 대로 ssl 라이브러리를 로드하도록 app.yaml 파일을 구성해야 합니다.

URL 가져오기를 사용 중지하여 모든 아웃바운드 요청 처리

httplib를 가져오면 기본적으로 urlfetch api가 사용됩니다. httplib가 소켓을 사용하도록 변경하려면 app.yaml 파일에 다음 환경 변수를 추가합니다.

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

anyvalue를 빈 문자열을 포함하여 모든 값으로 바꿀 수 있습니다.

소켓을 사용하는 App Engine 샘플

소켓을 사용하는 샘플은 Google Cloud Platform GitHub의 소켓 데모 앱을 참조하세요.