/** * 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'] ); } } } } } } } } Decikgデプロイ – Raqqa

Decikgデプロイ

DeciKG ローカルアクセス到達までの工程(分割版)

工程1:EC2実行ロール(Instance profile)を作る

目的:SSH無しでSSM接続でき、ECRを使う将来も詰まらない土台を作る

  1. IAM → Roles → Create role
    • Trusted entity: EC2
  2. 付与(最低限)
    • AmazonSSMManagedInstanceCore
  3. (推奨:あとでECRからpullするなら)ECR Pull最小ポリシーを追加
    • ecr:GetAuthorizationToken(Resource *
    • ecr:BatchGetImage, ecr:GetDownloadUrlForLayer, ecr:BatchCheckLayerAvailability(repoは repository/* でOK)
  4. Instance profile(自動で作られる/または作成)をEC2起動時に付与できる状態にする

DoD

  • Roleが作成できた(名前例:demo-app-ec2-role

工程2:Security Group を作る(SSHなし・公開なし)

目的:DeciKGは外から触れない形を最初から作る

  • Inbound:何も開けない(0でもSSMは動く)
  • Outbound:0.0.0.0/0 許可(apt/ECR/SSMに必要)

DoD

  • SGが作成できた(例:demo-app-sg

工程3:EC2 を起動する

目的:SSMで入れる“箱”を作る(ここから課金は発生)

推奨パラメータ(あなたの想定でOK)

  • AMI:Ubuntu 22.04 LTS(またはAL2023でも可)
  • Instance type:t3a.xlarge
  • EBS:gp3 100GB
  • Key pair:不要
  • IAM role:工程1のEC2ロール
  • Security Group:工程2のSG
  • Subnet:既存VPCの適切なサブネット(インターネットへ出られる必要あり)
  • User data(任意だが推奨):docker + compose + swap を入れる

DoD

  • インスタンスが running になった
  • SSMの “Managed nodes” に出てくる(次工程)

工程4:SSM Session Manager でログインできることを確認

目的:SSH無し運用が成立していることの確認

  • Systems Manager → Session Manager → Start session → 対象インスタンス

DoD

  • シェルが開く

工程5:EC2にDocker / Compose / Swap を用意

目的:DeciKGを起動できる状態にする

SSMで入った後に確認:

docker version
docker compose version
free -h
swapon --show || true

(User dataで入れていない場合はここでセットアップ)

DoD

  • docker と docker compose が使える

工程6:DeciKG の compose を配置して起動(まずはローカルバインド)

目的:DeciKG APIを外部公開せず起動する

6-1) compose をEC2に置く

  • Git clone(推奨)または scp(SSHなし方針なら避ける)
  • SSMセッションで git clone できるようにしておく(repoがprivateならdeploy key/https tokenは後続で)

6-2) ポートを “ローカル限定” にする(重要)

あなたのcomposeから最低限ここだけ直す(DeciKG/Neo4jを閉じる):

  • decikg-api
    • ports: - "127.0.0.1:18000:8000"(例。将来の衝突回避で18000推奨)
  • neo4j
    • ports: - "127.0.0.1:17474:7474"
    • ports: - "127.0.0.1:17687:7687"

(pg/jupyter/pgadminは既に127.0.0.1でOK)

6-3) 起動

docker compose up -d --build
docker compose ps

DoD

  • docker compose psdecikg-apiUp になっている

工程7:EC2内でDeciKGの疎通確認(ローカル)

目的:まず “EC2上で” APIが返ることを確実にする

例(healthがある想定。無ければ //openapi.json を見る):

curl -sS http://127.0.0.1:18000/health || true
curl -sS http://127.0.0.1:18000/openapi.json | head || true

DoD

  • 200系が返る(または期待する最小レスポンスが返る)

工程8:ローカルPCからSSMポートフォワードで叩けるようにする(ゴール)

目的:あなたのローカルから DeciKG に JSON を投げて I/O ができる状態にする

ローカルPCで(例:18000を転送)

aws ssm start-session \
--target i-xxxxxxxxxxxxxxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{
"host":["127.0.0.1"],
"portNumber":["18000"],
"localPortNumber":["18000"]
}'

別ターミナルで:

curl http://127.0.0.1:18000/openapi.json | head
# あるいは nlq-dev が投げる JSON を curl で代替してPOST

DoD(今回のゴール)

  • ローカルPCから http://127.0.0.1:18000 で DeciKG に到達できる

後続工程(必要になったら入れる)

  • ECR push/pull に切り替える(buildをEC2でやめる)
  • CloudWatch Logs / Secrets / S3 を導入
  • nlq-dev UI/analytics 同居(80/443集約、DeciKGは内部呼び出し)

Comments

コメントを残す

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