HerokuやAWSといったクラウドのサービスを利用してWebアプリケーションを動かすと、サービス独自の情報がheaderに追加されることがあります。
GCPのApp Engineスタンダード環境で動くアプリケーション(Cloud Load Balancingの配下に置き、Network EndPoint Groupを使って設定)にどんなheaderが渡されるのか、アプリケーションを作って確認してみました。
HTTP Header情報
環境変数経由でHTTP Headerが渡されてくるので、設定されている環境変数を表示させました。Header名がそのまま環境変数名になっているというわけではなさそうなので、ちょっと注意が必要ですが。
wsgi.errors=<gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x3e8d773fc100>
wsgi.version=(1, 0)
wsgi.multithread=True
wsgi.multiprocess=True
wsgi.run_once=False
wsgi.file_wrapper=<class 'gunicorn.http.wsgi.FileWrapper'>
wsgi.input_terminated=True
SERVER_SOFTWARE=gunicorn/20.1.0
wsgi.input=<gunicorn.http.body.Body object at 0x3e8d773fc6d0>
gunicorn.socket=<socket.socket fd=10, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8081), raddr=('127.0.0.1', 25260)>
REQUEST_METHOD=GET
QUERY_STRING=
RAW_URI=/
SERVER_PROTOCOL=HTTP/1.1
HTTP_HOST=35.yy.126.58
HTTP_X_FORWARDED_FOR=xx.249.56.yy, 35.yy.126.58, 169.254.1.1
HTTP_X_FORWARDED_PROTO=http
HTTP_FORWARDED=for="xx.249.56.yy";proto=http
HTTP_DNT=1
HTTP_UPGRADE_INSECURE_REQUESTS=1
HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
HTTP_ACCEPT_LANGUAGE=ja,en-US;q=0.9,en;q=0.8
HTTP_X_CLOUD_TRACE_CONTEXT=xxxx89499d067a63be4beddab522406d/8818857697168667032;o=1
HTTP_X_APPENGINE_COUNTRY=JP
HTTP_X_APPENGINE_CITYLATLONG=35.661yyy,139.7037zz
HTTP_X_APPENGINE_CITY=XXXXXXXX city
HTTP_X_APPENGINE_REGION=13
HTTP_VIA=1.1 google
HTTP_TRACEPARENT=00-xxxx89499d067a63be4beddab522406d-7a62e059ec753198-01
HTTP_X_GOOGLE_SERVERLESS_NODE_ENVOY_CONFIG_GAE=
HTTP_X_APPENGINE_TIMEOUT_MS=599999
HTTP_X_APPENGINE_HTTPS=off
HTTP_X_APPENGINE_USER_IP=xx.249.56.yy
HTTP_X_APPENGINE_API_TICKET=ChA4OTg2NTM1NWJlMTBjYjU0EIS8rRcQk7ytFxCx7tUXEMLu1RcQyK/oFxDZr+gXEOGx6BcQ8rHoFxC27ukXEMfu6RcQz6ztFxDgrO0XEJjW7RcQqdbtFxCwn/UXEMGf9RcQu6H1FxDMofUXEPK39xcQg7j3FxoTCKW86rCvnPwCFYbGFwod1EkECA==
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTP_X_APPENGINE_REQUEST_LOG_ID=xxxxyyyy00ff0bb7e52ecfc2e60001737e666573746976652d736869656c642d333031383031000173686f772d686561646572733a323032323132323874313234313537000100
HTTP_X_APPENGINE_DEFAULT_VERSION_HOSTNAME=xxxx-yyyy-0000.uc.r.appspot.com
wsgi.url_scheme=http
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=25260
SERVER_NAME=0.0.0.0
SERVER_PORT=8081
PATH_INFO=/
SCRIPT_NAME=
アプリケーション
最近、意識的にPythonを使うようにしているので、これもPythonで書きました。App Engineスタンダード環境でPythonを使う場合、Defaultだとgunicornをアプリケーションサーバとして使うので、WSGIアプリケーションにしました。
WSGIってなに?というのは、この記事がわかりやすかったです。
プログラムはこちら。Dev Containerを使ってPythonの環境を作っています。
クラウドサービスを乗り換えるには、ベンダーロックイン/サービスロックインされないように
X-で始まるHeaderは独自の拡張なので、クラウドベンダーやサービスによってつかなかったり違う名前になったりします。HTTP_X_APPENGINE_DEFAULT_VERSION_HOSTNAME なんて、明らかにApp Engineのサービスを使ったから付与されたもので、VM上で動かしていたら付かなかっただろうなと。
ロックインを防ぐには、ベンダー/サービスの拡張機能は使わないようにしなければなりません。クラウドサービスを短時間で乗り換えられるようにするには、こういったことに気を配っておく必要がありますね。経験者の腕の見せ所かと。
コメント