みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Cloud Runでアクセス元のIPアドレスを取得する

結論

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には専用のロードバランサが含まれているらしいので,同様に動作するものと思われます.