/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } dev-portal疎通方法 – Raqqa

dev-portal疎通方法


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

次の一手(最短で前に進める)

あなたが今いる状況で、まずやるべきはこれです:

  1. kubectl -n portal-prod get ingress,svc の結果で URL/Service名を確定
  2. 上の curl 2本(外から + クラスタ内curl Pod)を実行
  3. 返ってきた HTTPステータスとレスポンス冒頭をこちらに貼ってください(トークンは伏せてOK)

貼ってもらえれば、その結果だけで「どこが詰まってるか(ALB/認証/NetworkPolicy/Service)」を即断して、次の修正箇所(k8s/ENV/コード)まで落とします。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です