ご覧いただきありがとうございます。
##やろうとしていること
・Ingress(ロードバランサ、リバースプロキシ)
・client(Next.jsアプリ)
・auth(認証用サービス)
という3つのサービスをKubernetesで管理している。
SSR時にClientからIngressにaxiosでリクエストを送り、Ingressのpath設定に従って、送ったリクエストをauthに伝えるようにしたい。
つまりclient→Ingress→auth
という順にデータが流れることを想定しています。
##ソースコードと想定している処理の流れ
私自身は以下のフローで処理が進んでいくことを想定しています。
①まずindex.jsのgetInitialPropsで、SSR時にaxiosでリクエストを送ります。
IngressとClientではnamespaceが違うため、http://SERVICENAME.NAMESPACE.svc.cluster.local
というURLでリクエストを作成しています。
今回の場合、それぞれ
SERVICENAME:ingress-nginx-controller
NAMESPACE:ingress-nginx
です。
index.js
import axios from 'axios'; const LandingPage = ({ currentUser }) => { console.log(currentUser); return <h1>Landing Page</h1>; }; LandingPage.getInitialProps = async () => { if (typeof window === 'undefined') { // we are on the server! const { data } = await axios.get( 'http://ingress-nginx-controller.ingress-nginx.svc.cluster.local/api/users/currentuser', { headers: { Host: 'ticket-app.dev', }, } ); return data; } else { // we are on the browser! const { data } = await axios.get('/api/users/currentuser'); return data; }; }; export default LandingPage;
②リクエストを受け取ったIngressはheaderに記載されているホスト名がticket-app.dev
の場合にpathに従って処理を続ける。
Ingressの設定は以下の通りです。
Ingress.yaml
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-srv annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: 'true' spec: rules: - host: ticket-app.dev http: paths: - path: /api/users/?(.*) backend: serviceName: auth-srv servicePort: 3000 - path: /?(.*) backend: serviceName: client-srv servicePort: 3000
③api/users/?(.*)
のpath設定に従ってauthサービスにアクセス!
Ingress.yamlに記載されているpath設定に従って問題なくauthにリクエストが伝わる、はず。。。
##実際の挙動
掲題の通り【401 Unauthorized】となります。
実際のエラーは以下の通りです。(長いので一部抜粋します。)
[client] error - Error: Request failed with status code 401 [client] at createError (/app/node_modules/axios/lib/core/createError.js:16:15) [client] at settle (/app/node_modules/axios/lib/core/settle.js:17:12) [client] at IncomingMessage.handleStreamEnd (/app/node_modules/axios/lib/adapters/http.js:293:11) [client] at IncomingMessage.emit (node:events:402:35) [client] at IncomingMessage.emit (node:domain:475:12) [client] at endReadableNT (node:internal/streams/readable:1343:12) [client] at processTicksAndRejections (node:internal/process/task_queues:83:21) { ・・・ [client] request: <ref *1> ClientRequest { [client] _events: [Object: null prototype] { [client] abort: [Function (anonymous)], ・・・ [client] _header: 'GET /api/users/currentuser HTTP/1.1\r\n' + [client] 'Accept: application/json, text/plain, */*\r\n' + [client] 'Host: ticket-app.dev\r\n' + [client] 'User-Agent: axios/0.23.0\r\n' + [client] 'Connection: close\r\n' + [client] '\r\n', ・・・ [client] response: { [client] status: 401, [client] statusText: 'Unauthorized', [client] headers: { [client] date: 'Fri, 15 Oct 2021 07:07:33 GMT', [client] 'content-type': 'application/json; charset=utf-8', [client] 'content-length': '41', [client] connection: 'close', [client] 'x-powered-by': 'Express', [client] etag: 'W/"29-oajN2itm3/KqZElY2WBp5riy1x8"' [client] }, ・・・ [client] _header: 'GET /api/users/currentuser HTTP/1.1\r\n' + [client] 'Accept: application/json, text/plain, */*\r\n' + [client] 'Host: ticket-app.dev\r\n' + [client] 'User-Agent: axios/0.23.0\r\n' + [client] 'Connection: close\r\n' + [client] '\r\n',
requestとresponseのどちらも、headerを見る限り
・host名はticket-app.dev
・リクエストのpathは/api/users/currentuser
と何も間違っていないように見えます。
一体どこがUnauthorizedなのでしょうか?
host名のみ合っていればauthorizedとなりそうですが。。。
アドバイスを頂けますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。