1) まずは “外から” dev-portal に疎通(ALB/Ingress経由)
1-1. ベースURL確認(Ingress/ALBのDNS)
kubectl -n portal-prod get ingress
kubectl -n portal-prod describe ingress portal-api # 名前は環境に合わせて
Address または annotation の ALB DNS を控える。
1-2. /openapi.json or /docs or /status を叩く(認証なしで見えるか確認)
export DEVPORTAL_BASE="https://<your-devportal-domain-or-alb-dns>"
curl -i "$DEVPORTAL_BASE/openapi.json" | head
curl -i "$DEVPORTAL_BASE/docs" | head
curl -i "$DEVPORTAL_BASE/status/summary" | head
curl -i "$DEVPORTAL_BASE/health" | head
- 200が返れば「ALBまでOK」
- 301/302ならリダイレクト先も確認(
-L) - 401/403なら「到達はOK、認証が必要」
1-3. 認証が必要な場合(Bearer例)
export DEVPORTAL_TOKEN="<your_jwt_or_api_token>"
curl -i \
-H "Authorization: Bearer $DEVPORTAL_TOKEN" \
"$DEVPORTAL_BASE/status/summary" | head
2) 次に “クラスタ内” から疎通(nlq-devが本当に到達できるか)
ALB経由より先に、まず Service直叩きでクラスタ内経路を潰すのが確実です。
2-1. Service名を確認
kubectl -n portal-prod get svc | grep -E 'portal|api'
2-2. 一時curl Podを立てて叩く(最強の疎通確認)
kubectl -n portal-prod run curl --rm -it \
--image=curlimages/curl:8.5.0 --restart=Never -- sh
Pod内で:
# Service DNS で到達確認(例)
curl -i http://portal-api.portal-prod.svc.cluster.local/openapi.json | head
curl -i http://portal-api.portal-prod.svc.cluster.local/status/summary | head
# 認証が要るなら
curl -i -H "Authorization: Bearer $DEVPORTAL_TOKEN" \
http://portal-api.portal-prod.svc.cluster.local/status/summary | head
ここが通れば「nlq-dev Podからも通る可能性が高い」=ネットワークの問題がほぼ消えます。
(NetworkPolicyがある場合は nlq-dev の namespace からの許可が必要)
3) nlq-dev から dev-portal を叩く(実装に繋げる)
nlq-dev 側のENVをまず固定します:
# 例:nlq-dev Deployment の env に追加する想定
DEVPORTAL_URL=https://<your-devportal-domain-or-service>
DEVPORTAL_AUTH_MODE=bearer # none|bearer|apikey 等、あなたの実装に合わせて
DEVPORTAL_TOKEN=<token>
DEVPORTAL_TIMEOUT_SECONDS=15
そして nlq-dev 内部で最小の “ping” を用意(実装前でもCLIでOK):
3-1. Pythonでの最小疎通(requests)
import os, requests
base = os.environ["DEVPORTAL_URL"].rstrip("/")
token = os.environ.get("DEVPORTAL_TOKEN")
headers = {}
if token:
headers["Authorization"] = f"Bearer {token}"
r = requests.get(f"{base}/openapi.json", headers=headers, timeout=15)
print(r.status_code, r.text[:200])
4) 失敗したときの切り分け(原因を一撃で特定)
- 外からはOK、クラスタ内がNG
- NetworkPolicy / セキュリティグループ / service DNS / namespace違い
- クラスタ内はOK、外(ALB)がNG
- Ingress/ALB/ACM/TLS/Hostヘッダ/パスルール
- どちらも401/403
- 認証方式の食い違い(JWT/JWKS、aud/iss、ヘッダ名など)
確認用にこれも有効です:
curl -vk "$DEVPORTAL_BASE/openapi.json" 2>&1 | tail -n 30
次の一手(最短で前に進める)
あなたが今いる状況で、まずやるべきはこれです:
kubectl -n portal-prod get ingress,svcの結果で URL/Service名を確定- 上の curl 2本(外から + クラスタ内curl Pod)を実行
- 返ってきた HTTPステータスとレスポンス冒頭をこちらに貼ってください(トークンは伏せてOK)
貼ってもらえれば、その結果だけで「どこが詰まってるか(ALB/認証/NetworkPolicy/Service)」を即断して、次の修正箇所(k8s/ENV/コード)まで落とします。
コメントを残す