質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

Ingress

Ingressとは、Googleがリリースしたスマートフォン向けのゲームアプリ。Googleマップでの技術と地図情報に拡張現実(AR)を融合し、ゲームのフィールドに現実世界の風景を使った位置ゲーです。現実世界を探索して拠点に印を置き、自陣の勢力範囲を拡大していきます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1705閲覧

【Kubernetes】Ingressにアクセスしようとすると401 UnAuthorizedエラーが出る。

tenchim

総合スコア8

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

Ingress

Ingressとは、Googleがリリースしたスマートフォン向けのゲームアプリ。Googleマップでの技術と地図情報に拡張現実(AR)を融合し、ゲームのフィールドに現実世界の風景を使った位置ゲーです。現実世界を探索して拠点に印を置き、自陣の勢力範囲を拡大していきます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/10/15 08:28

編集2021/10/18 10:21

ご覧いただきありがとうございます。

##やろうとしていること
・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となりそうですが。。。

アドバイスを頂けますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

こちら自己解決いたしました。

原因としては、リクエストを送信したURL(api/users/currentuser)の処理に、誤って不適切なミドルウェアが入っていたことが原因です。
そちらが401のレスポンスを返していることを突き止めました。

くだらない理由でお騒がせして申し訳ございません。

投稿2021/10/18 12:36

tenchim

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問