/** * 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/nlq-devデプロイ工程 – Raqqa

DeciKG/nlq-devデプロイ工程

了解。あなたのAWSで「顧客にもらう想定のロール(=権限セット)」を先に作って、各工程ごとに“できること”を確認しながら固める、という進め方に合わせて、工程案を切ります。
(ポイント:課金ゼロでできる検証を先に、EC2/ログ/Secrets/S3など“使うと課金”は後回し)


工程0 ルール決め(10分)

目的:後で迷わないための前提固定

  • リージョン:ap-northeast-1
  • 命名(デモ向け・衝突しにくい)
    • Role名(顧客にもらう想定): demo-operator
    • ECR repos: decikg, nlq-dev-ui, nlq-dev-analytics
    • Secrets prefix: decikg/, nlq-dev/ui/, nlq-dev/analytics/
    • S3 bucket(将来): decikg-demo-<ACCOUNT_ID>-apne1
  • 方針:ロールは分けない(デモなので統合ロールでOK)

成果物

  • 命名メモ(テキストでOK)

工程1 ロール作成(権限は最小からスタート)

目的:顧客に依頼する「ロール雛形」をあなたのAWSで作れる状態にする

  1. IAM Role demo-operator を作る(Assumeは一旦自分のIAM Userでも、今は“作るだけ”でもOK)
  2. Inline policy ではなく Managed Policy(1枚) を作ってAttach(後で差し替えやすい)

最初は “Read-only + ECRリポジトリ作成” までに絞る(安全に前へ進むため)。

  • IAM: List/Get(確認用)
  • ECR: CreateRepository / Describe / List
  • CloudWatch/Secrets/S3 は “まだ付けなくてもOK”

確認(課金ほぼゼロ)

  • ロールが作れた
  • ポリシーがAttachできた
  • (自分でAssumeできるなら)Assumeして ecr:DescribeRepositories が通る

成果物

  • Role ARN
  • Policy JSON(v1)

工程2 ECR だけで検証(pushはしない)

目的:ECR関連の権限が揃っているか、顧客にも渡せる粒度か固める

  1. ECR repo を3つ作成(あなたのAWSで)
    • decikg
    • nlq-dev-ui
    • nlq-dev-analytics

確認(課金ほぼゼロ)

  • repo が作れる
  • 一覧が見える
  • 削除できる(掃除できるか)

※ push/pull は “やると少額でも課金が動きやすい” ので、ここでは不要。

成果物

  • repos一覧(名前とARN)
  • Policy JSON(v2:ECRを確定)

工程3 “デプロイ方式=SSM” に向けた権限を足す(疎通はしない)

目的:顧客側でEC2/SSM疎通するときに権限不足にならない状態にする

ロールに以下を追加(Operator側=あなたが操作する側):

  • ssm:StartSession
  • ssm:SendCommand
  • ssm:GetCommandInvocation
  • ssm:DescribeInstanceInformation

確認(課金ゼロ)

  • ポリシー作成/attachできた
  • 権限としてレビューが通る(ここでは実行確認はしない)

成果物

  • Policy JSON(v3:SSM追加)

工程4 EC2を“触れる”権限を足す(起動はしない)

目的:顧客側でEC2作成/SG調整が必要になった時に詰まらないようにする
(あなたは顧客側でEC2起動しない方針でも、権限セットとしては持っておくと依頼がスムーズ

追加:

  • ec2:Describe*
  • ec2:RunInstances など lifecycle
  • SG操作(Create/Authorize/Revoke)

確認(課金ゼロ)

  • 付与できること
  • ConsoleでEC2ウィザードを進められる(最後の起動ボタンは押さない)

成果物

  • Policy JSON(v4:EC2/SG追加)

工程5 Secrets/S3/Logs を“権限だけ”入れる(まだ使わない)

目的:将来それらを使う時の権限不足を潰す(ただし使わないので課金回避)

追加(権限のみ):

  • Secrets Manager: Create/Get/Put(prefix運用想定)
  • S3: List/Get/Put(1バケット固定想定)
  • CloudWatch Logs: CreateLogGroup/Stream/PutLogEvents

確認(課金ゼロ)

  • ポリシーが作れてAttachできる(実体は作らない)

成果物

  • Policy JSON(v5:統合版完成)

工程6 “顧客依頼パッケージ”に落とす

目的:顧客にお願いする内容がブレないように、提出物を固定

  • 作ってほしいもの
    • Operator(あなたのログイン:SSO or IAM User)
    • 上記と同等の権限(Permission set または IAM policy)
    • (将来)EC2 Instance Role(SSM + ECR pull + Secrets/S3/Logs)※必要になったら
  • 渡してもらうもの
    • ログイン情報(SSO URL or IAM user)
    • Account ID / region
    • (必要なら)Role ARN / Permission set名

成果物

  • 顧客向け依頼文(コピペ用)
  • Policy JSON(最終版)
  • 命名表

進め方のコツ(迷いを減らす)

  • 各工程で Policyをバージョン管理(v1→v5)して、いつでも戻せるようにする
  • “実行して確認できない工程” は、Consoleの画面で操作が進むか(ボタンが押せるか)で代替確認する
  • 課金が動くのは基本「リソースを作って使ったとき」なので、今は 作らない/流さない でOK

Comments

コメントを残す

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