結論
Cloud Run で,アクセス元のIPアドレスを取得するには,x-forwarded-for
ヘッダーを使用します.
検証
リクエストヘッダーを返すWebサーバーを作成して,Cloud Runにデプロイし,動作を確認しました.
main.ts
import express from 'express'; const app = express(); app.use(express.json()); app.get('/', (req, res) => { res.json([ { message: 'Hello, World' }, ]); }); app.get('/headers', (req, res) => { res.json(req.headers); }) app.listen(8000, '0.0.0.0', () => console.log('http://localhost:8000'));
結果
Cloud Runの/headers
にアクセスしたところ,以下のようなレスポンスが得られました.なお,一部の情報は...
やxxx
で省略しています.
{ "host": "test-rd75gacopq-an.a.run.app", "sec-ch-ua": "...", "sec-ch-ua-mobile": "...", "sec-ch-ua-platform": "...", "upgrade-insecure-requests": "1", "user-agent": "...", "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", "sec-fetch-site": "none", "sec-fetch-mode": "navigate", "sec-fetch-user": "?1", "sec-fetch-dest": "document", "accept-language": "en-US,en;q=0.9,ja;q=0.8", "authorization": "bearer ...xxx.SIGNATURE_REMOVED_BY_GOOGLE", "x-cloud-trace-context": ".../...", "traceparent": "00-...-...-00", "x-forwarded-for": "203.0.113.12", "x-forwarded-proto": "https", "forwarded": "for=\"203.0.113.12\";proto=https", "accept-encoding": "gzip, deflate, br" }
x-forwarded-for
にアクセス元のIPアドレスが記載されていました.
なお,GCPのロードバランサのドキュメントには以下のように記載されていました.
ロードバランサは、1 つのカンマで区切られた 2 つの IP アドレスを次の順序で X-Forwarded-For ヘッダーに追加します。
- ロードバランサに接続するクライアントの IP アドレス
- ロードバランサの転送ルールの IP アドレス
外部 HTTP(S) 負荷分散の概要 | Google Cloud
Cloud Runには専用のロードバランサが含まれているらしいので,同様に動作するものと思われます.