AEM Cloud Migration Skillの使用 using-cloud-migration-skill

このリファレンスでは、サポートされている各移行パターン、BPAの調査結果の提供方法、大規模なプロジェクト全体でのセッションの管理方法について説明します。 概要と設定の手順については、概要を参照してください。

移行Runbookの生成 migration-runbook

プロジェクト全体を評価する場合は、単一のパターンに名前を付ける代わりに、Runbookから始めます。 担当者に次のプロンプトを入力します。

Review my code for AEMaaCS migration

スキルは、コードを変更することなく、プロジェクトルートで​ 読み取り専用migration-runbook.md ​を生成します。 Runbookは、移行スキルが対処できる​ 個の ​個のパターンをカバーし、それぞれに対して次のレコードを含みます。

  • 使用される検出戦略(BPA/CAM所見、アナライザー、またはヒューリスティックコンテンツスキャン)
  • 影響を受けるファイルとパターンごとの検索回数
  • パターンの移行セッションを開始するためのコピー&ペーストプロンプト

Runbookはマークダウンと共に調査結果キャッシュも書き込むため、後のパターンセッションでは、既に発見された調査結果を再利用します。エージェントは再スキャンしません。 ランブックを使用して、最初に取り組むパターンの優先順位を決め、次に説明するようにパターンセッションを開始します。

NOTE
Runbookは読み取り専用です。 コードを編集することはなく、ヒューリスティック(非BPA)の結果は、信頼できるカウントではなく、確認する候補の一致です。

セッションの仕組み workflow-overview

すべての移行セッションは、次の順序に従います。

  1. パターンに名前を付ける:1つのパターンを指定します(例:scheduler)
  2. 調査結果を提供: BPA CSV ファイル、MCP経由のCAM、または特定のファイル パスから
  3. エージェントが変換ルールを読み取ります: スキルは、コードを変更する前に、関連する変換ルールをコンパニオン code-assessment スキルから読み取ります
  4. 5人の最初のバッチ: エージェントは、最大5人の調査結果を変換し、変更された内容を報告します
  5. 確認して続行:各バッチを確認したら、continueに返信して次のバッチに進みます

エージェントは一度に1つのパターンと1つのバッチを処理します。 自動的には処理されません。各バッチには確認が必要です。

移行パターン patterns

スケジューラー scheduler

AEMaaCSのステートレスでコンテナ化されたランタイムと互換性のないsling.commons.schedulerまたはScheduler インジェクションを使用するJava クラスをターゲットにします。

BPA パターン ID: scheduler

エージェントは、コンストラクターベースのスケジューラー登録を@Activate / @Deactivateのライフサイクルメソッドに置き換えて、@Designateを使用してScheduler注入されたジョブをRunnable実装の@Componentに変換します。

ResourceChangeListener resource-change-listener

AEMaaCSの更新が必要なResourceChangeListenerまたはResourceChange個のリスナー実装をターゲットにします。

BPA パターン ID: resourceChangeListener

レプリケーション replication

AEMaaCSではサポートされていないcom.day.cq.replication.Replicatorまたは関連するレプリケーション APIを読み込むクラスをターゲットにします。 エージェントは、それらをContentDistribution ベースの同等のものに置き換え、対応するOSGi サービス参照を更新します。

BPA パターン ID: replication

イベントリスナー event-listener

AEMaaCS イベント処理セマンティクスのために更新する必要があるOSGi EventListenerまたはEventHandler実装をターゲットにします。

BPA パターン ID: eventListener

イベントハンドラー event-handler

AEMaaCSに適応させる必要がある同期OSGi EventHandler サービスをターゲットにします。

BPA パターン ID: eventHandler

Asset API asset-api

非推奨のAssetManager、DAMEvent、またはサポートされていないDAM APIを使用してクラスをターゲットにします。 Agentは、サポートされているAEM Assets API同等の機能に置き換えます。

BPA パターン ID: assetApi

カフェインへのGuava キャッシュ guava-cache

Guavaのキャッシュ (com.google.common.cache.*、Cache、CacheBuilder、LoadingCacheなど)を使用するバンドルをターゲットにします。 AEM as a Cloud Serviceでは、サポートされているインプロセスキャッシュライブラリはCaffeineであるため、エージェントはMavenの依存関係を入れ替え、インポートを更新し、影響を受けるコールサイトを調整します。 カフェインは同じ著者によって書かれており、そのAPIは意図的にほぼ同じであるため、変更はほとんどが機械的です。

BPA パターン ID: guavaCache

BPAはこのパターンを​ バンドル ​の精度(サブタイプ custom.guava.cache)で報告するので、エージェントはバンドルをGuava キャッシュを実際に読み込むJava ファイルに解決し、それらを編集します。 Guava キャッシュの使用は、従来のCloud Serviceから引き継いだコードでのみ行われ、ネイティブのAEM コードでは行われないので、このパターンはcode-assessmentではなく、移行スキルでのみ提供されます。

NOTE
guavaCacheは信頼できる唯一の情報源としてBPAを利用しています。 BPAまたはCAM ソースが利用できない場合、エージェントはフォールバックしてJava ファイルをスキャンし、未確認の候補としてimport com.google.common.cache インポートします。

InputStream使用状況 input-stream

BPAがjava.io.InputStream使用にフラグを付けるJava コードをターゲットにします(サブタイプ java.io.inputstream)。 AEM as a Cloud Serviceでは、JVMを介して大きなバイナリをストリーミングするとコンテナメモリを使い果たすことができるため、バイナリを直接Cloud Blob StoreおよびCDNからアップロードして配信する必要があります(開発ガイドライン ​および直接バイナリアップロード ​を参照)。

BPA パターン ID: inputStream

エージェントはリスクごとに調査結果を分類し、各グループを異なる方法で処理します。

結果
エージェントアクション
ストリームまたはJCR Binaryが閉じられていません
Try-with-resourcesで自動的に修正
メモリに読み込まれたストリーム全体
安全な制限が明確な場合、境界のある読み取りまたはストリーミング。そうでない場合は確認します
ローカルファイルシステム、JVM経由でストリーミングされるバイナリ、またはJavaのデシリアライズ
修正を提案し、決定を待ちます
良性使用
変更なし

次の内容でセッションを開始:

Fix inputStream findings using BPA CSV at ./reports/bpa.csv
NOTE
inputStreamは信頼できる唯一の情報源としてBPAを利用しています。 BPAまたはCAM ソースが使用できない場合、エージェントはJava ファイルのスキャンにフォールバックします。 製品またはサードパーティのバンドルなど、ワークスペースにないコードの結果は、情報提供のみを目的として報告されます。

HTL Lint (data-sly-test) htl-lint

data-sly-test: redundant constant value comparison回のプリント警告を生成するui.apps以下のHTL テンプレートをターゲットにします。 エージェントは、コンテンツパッケージを直接スキャンすることで、影響を受けるテンプレートを検出します。このパターンでは、BPA CSVまたはCAM接続は必要ありません。

BPA パターン ID: htlLint

NOTE
htlLint件の調査結果がBPA CSV書き出しに表示されません。 このパターンのセッションを開始すると、エージェントはダイレクトファイルスキャンを通じてこれらのパターンを検出します。

CLOUD MANAGERへのOSGi設定 osgi-cloud-manager

ui.configのOSGi設定を、完全な環境固有の処理を使用して、Cloud Manager互換の.cfg.json形式に変換します。 いくつかの関連タスクについて説明します。

形式の変換​を構成

AEMaaCSでは、OSGi設定を.cfg.json ファイルとして保存し、環境固有の設定を実行モードでスコープ設定されたフォルダー(config.author/、config.publish/、config.dev/など)に格納する必要があります。 エージェント:

  • 既存の.config、.cfg、およびXML形式のOSGi設定を.cfg.jsonに変換します
  • オーサー固有の値とパブリッシュ固有の値の両方を含む設定を、実行モードでスコープ設定されたファイルに分割します
  • OSGi メタタイプの仕様(文字列、整数、ブール値、配列)に対してプロパティタイプを検証します
  • Adobeが所有するPIDを自動変換するのではなく、手作業によるレビュー用にフラグを付けます

秘密鍵と環境変数

コミットされた設定ファイルからプレーンテキストシークレットと環境固有の値を移動し、Cloud Managerのプレースホルダーに置き換えます。

  • $[secret:NAME]: パスワード、トークン、その他の機密値の場合
  • $[env:NAME]:環境ごとに異なる機密性のない値(サービス URLなど)の場合

対応する変数とシークレットはCloud Managerに適用され、実行時に挿入されます。値はソースコントロールに保存されません。

IMPORTANT
エージェントは会話で秘密値を出力しません。 機密データはすべてデジタル化されたハンドオフファイルに書き込まれ、Cloud Manager APIまたはUIを介して適用されます。

サポートされていない実行モード (URC)

AEM as a Cloud Serviceでは、固定の実行モード ID セットをサポートしています。 サポートされていない実行モードを使用する設定フォルダーは、一度デプロイしても効果がありません。 エージェントは、次のようなサポートされていない実行モード設定(URC)にフラグを立てます。

  • 不明な実行モードトークン (例:config.qaまたはinstall.local)
  • 有効なconfig.author.devの代わりに環境トークン – config.dev.authorの前に続く階層トークン
  • config.Author.devなどの小文字でないトークンと、予約されたconfig.preview (プレビューはパブリッシュから継承)

URCの結果は、最初にベストプラクティスアナライザー(サブタイプ unsupported.runmode、重大度CRITICAL)から得られます。BPA ソースが報告しない場合、エージェントはconfig.*およびinstall.*個のフォルダーをセーフティネットとしてローカルにスキャンします。 検出するたびに、フォルダーパス、問題のある実行モード、および修復が報告されます。設定がまだ必要かどうかを評価し、サポートされている実行モードに変更するか、古い場合は削除します。 注文のみの違反の場合、すべてのトークンが有効ですが、注文されていない場合、エージェントは安全な再注文を自動的に適用できます(例えば、config.dev.authorをconfig.author.devに変更)。不明なトークンやその他のあいまいなケースにはフラグが付けられ、解決できます。

構成形式の変換と秘密鍵の外部化にはBPA CSVまたはCAMは必要ありません。URC検出では、使用可能な場合にBPAの結果が使用されます。 次の内容でセッションを開始:

Scan my config files and create Cloud Manager environment secrets or variables.

ダイアログの移行(レガシーUI) dialog-migration

クラシック UI ダイアログをタッチ UIに変換します。 エージェントは2つのダイアログサブタイプを処理します。ExtJS / Classic UI cq:Dialogの定義はCoral 3 _cq_dialog構造として再構築され、既存のCoral 2 ダイアログはCoral 3にアップグレードされます。 また、リスナー、optionsProvider、namePrefixおよび更新filter.xmlも引き継ぎます。

BPA パターン ID: lui (ダイアログ サブタイプのみ)

同じコンポーネントに対してダイアログとカスタムウィジェットの両方の結果が存在する場合は、最初にカスタムウィジェットの移行を実行して、ダイアログが変換される前にすべてのxtype参照が解決されるようにします。

Convert my Classic UI dialogs to Touch UI Coral 3.

カスタムデザインウィジェット(従来のUI) custom-design-widgets

カスタム ExtJS ウィジェット (cq:Widget定義とカスタム xtype値)を移行します。 エージェントはウィジェットをインベントリし、各xtypeを既知のCoral 3にマッピングするか、直接マッピングが存在しない場合にGranite UI フォームコンポーネントを基礎モードにします。

BPA パターン ID: cdw

Migrate my custom ExtJS widgets (CDW findings) from CAM.

テンプレートの近代化 template-modernization

静的テンプレートを編集可能なテンプレートに変換し、対応するAEM Modernize Tools書き換えルール(構造、コンポーネント、ポリシールール)を生成します。 エージェントは、テンプレートを検出してテンプレートごとのプランを生成し、テンプレートごとにプラン テンプレートを実行し、生成された/conf構造を検証するという3つのフェーズで実行されます。

発見時に、エージェントは、ネストまたはグループ化されたテンプレートフォルダーを含むapps/<appId>/templates/の下のテンプレートを任意の深さで移動し、ページコンポーネントのリソースタイプに基づいて、各静的テンプレートをレガシーまたはカスタムとして分類します。 この分類は、BPA レポートがなくても保持されるため、カスタムテンプレートはレガシーテンプレートとは異なる方法で処理されます。

このパターンでは、BPA パターン IDは使用されません。 次の内容でセッションを開始:

Migrate my static templates to editable templates and generate the Modernize Tools rewrite rules.

Dispatcher コンバージョン dispatcher-conversion

AMSまたはオンプレミスのApache HTTPDおよびDispatcher設定をAEM as a Cloud Service構造に変換します。 この機能は、Adobeが管理するDispatcher Converter ツールをラップし、検出、設定の生成、出力検証、検証を追加します。

エージェントは段階的なフローで動作します。

  1. 検出とインベントリ – 設定​ モード ​を決定し、フィルター、書き換え、キャッシュ ルールのベースライン カウントを記録します。 認識されるモードは、standard (AMS)、flexible (モノリシックオンプレミス)、v1 (古いレイアウト)、already-cloud、not-dispatcherおよびunknownです。 already-cloud、not-dispatcher、またはunknownの場合、エージェントは停止し、続行する前に確認を求めます。
  2. コンフィギュレーションの計画と生成 - コンバーターの構成を構築し、プランを確認します。
  3. Convert - AdobeのDispatcher コンバーターを実行します(初回使用時に自動インストールされます)。
  4. Verify – 出力をベースラインに照らし合わせてチェックします。 空のフィルターセット (filter-acl-loss)は、続行する前に解決する必要があるハードストップです。
  5. 境界を越えたハンドオフ - Cloud Manager環境変数をOSGi設定フローにルーティングし、CDNまたはセキュリティヘッダー候補にフラグを付けます。
  6. Validate - Cloud Service Dispatcher バリデーターを実行し、統合コンバージョンレポートを生成します。

Runbook パターン id: dispatcherConversion (設定レイアウトからヒューリスティックに検出されました)。 このパターンでは、BPAやCAMは使用されません。 次の内容でセッションを開始:

Convert my AMS / on-prem Dispatcher config to AEM as a Cloud Service.
NOTE
クリーンな作業ツリーに対してこれを実行し、変換された出力を簡単にレビューしてロールバックできるようにします。 自動処理の程度は、検出されたモードによって異なります。standard (AMS)設定はほぼ自動化されていますが、flexibleおよびv1 レイアウトにはさらにレビューが必要です。

Oak インデックスの移行 oak-index

NOTE
Oak index migrationはベータ版です。 変換されたインデックス定義を本番環境にデプロイする前に、慎重に確認してください。

ui.apps/.../_oak_index/の従来のOak インデックス定義をAEM as a Cloud Service互換の定義に変換します。 この機能により、Adobeは、コンバージョンルールを再実装するのではなく、Index Converter ツールを維持しています。 カスタム Lucene インデックスと、その場で変更された標準のインデックスについて説明します。

BPA パターン ID: oakIndex (サブタイプ index.rule.violationおよびstandard.index.modification)

エージェントはコンバーターを実行し、データタイプの互換性チェックで差分を表示し、確認した後にのみ変更を適用し、次にui.appsをビルドしてAEM アナライザーを実行します。

AEM as a Cloud Serviceでは、-custom-<n> バージョンのサフィックスを含めるカスタムインデックスが必要です。定義が変更されるたびに<n>は増加します(​ インデックス名を参照)。 エージェントは次の空き<n>を選択するので、繰り返し移行しても既存のインデックスは上書きされません。

  • すぐに使用できるインデックス: <indexName>-<version>-custom-<n>を変更しました(例:damAssetLucene-8-custom-1)
  • 新しいカスタムインデックス : <originalName>-custom-<n>
  • 既に準拠しているインデックス:​は変更されません

パターンは現在、従来の_oak_index形式を生成しています。 ターゲット形式としての簡易インデックス管理は計画されていますが、まだサポートされていません。

次の内容でセッションを開始:

Fix oakIndex findings using BPA CSV at ./reports/bpa.csv
NOTE
oakIndexは信頼できる唯一の情報源としてBPAを利用しています。 _oak_indexおよびnt:base Lucene インデックス以外のインデックスはスコープ外であり、エージェントは名前変更されたインデックスに依存するクエリを更新しません。 ​ コンテンツの検索とインデックス作成も参照してください。

移行の検証 validate-migration

NOTE
移行の検証はベータ版です。 パスを保証ではなく強力なシグナルとして扱い、プルリクエストを発行したりCloud Service環境にデプロイしたりする前に、検証レポートを確認します。

パターンを移行した後、エージェントはローカルのAEM as a Cloud Service SDKで結果を確認できます。 検証はコードに対して読み取り専用です。エージェントはパスを取得するためにソースを編集しません。 チェックが失敗した場合、修正はコードを所有する移行パターンに戻ります。

検証はこれらのパターンをサポートします。

パターン
チェック内容
ローカルのSDKが必要
scheduler, assetApi, eventListener, eventHandler, resourceChangeListener, replication
ビルドされたOSGi サービス契約、デプロイメント後のバンドルとコンポーネントの状態
はい
lui, cdw
ビルドされたパッケージ内の移行されたダイアログ
いいえ
テンプレートの近代化
コンポーネントマッピング、SDKの正常性、AEM 6.5 インスタンスとの並べてページの比較
はい

Dispatcherのコンバージョン設定やOSGi設定など、その他のパターンは検証の対象外です。

必要なパターンについては、Cloud SDKを起動し(デフォルトではhttp://localhost:4602)、AEM クイックスタート MCP サーバーをIDEに追加します。 担当者は次の操作を行います。

  1. セットアップを確認 – 必要なツール、インスタンス、およびMCP サーバーが使用可能であることを確認し、不足している機能を開始するよう求めます。
  2. 準備 - プロジェクトをビルドし、変更されたバンドルをプロジェクトのMaven インストールプロファイルを通じてデプロイします。
  3. 診断 - AEM クイックスタート MCPからバンドルとコンポーネントの状態を読み取ります。 オフラインパターン (lui, cdw)は、この手順をスキップします。
  4. 検証 - プロジェクトの.validate-migration/に検証レポートを書き込みます。

プロジェクトがCloud Acceleration Manager プロジェクトにリンクされている場合(移行ランブックを介してリンクされている場合など)、エージェントはAEM MCP ServerのCloud Migration機能を使用してCAMの検証結果も記録します。

次の内容でセッションを開始:

Validate my scheduler migration on the local Cloud SDK.
NOTE
検証は、ビジネスロジックではなく、移行契約とデプロイメントの正常性を証明します。 ビルドテストは単体テストをスキップするので、独自のテストを別々に実行します。 バンドルをインストールするとスケジューラーやリスナーが起動する可能性があるため、デプロイメントの前に、エージェントは実稼動システムへの接続などの副作用について設定を確認します。

BPA Source オプション bpa-source

ソース
用途
BPA CSV ファイル
AEM インスタンスまたはCloud Acceleration ManagerからCSVを書き出しました。 セッションの開始時にファイルパスを指定します。
MCP経由のCAM
AEM MCP Serverが設定されています。 エージェントはCAM プロジェクトをリストし、どのプロジェクトを使用するかを確認し、調査結果を直接取得します。 AEM MCP Server Cloud Migration Capabilitiesの使用を参照してください。
手動ファイル パス
BPA レポートなしで特定のファイルを移行する場合。 プロンプトで直接パスを指定します。

MCP エラー処理 mcp-errors

MCP接続がエラー(プロジェクトが見つからないエラーや認証エラーを含む)を返した場合、エージェントは停止し、エラーを表示します。 自動的に別のソースに切り替わることはありません。 停止した状態から、次のことができます。

  • 表示されたエージェントのリストから正しいプロジェクトを確認します
  • 代替としてBPA CSV パスを指定します
  • 手動による移行用に特定のJava ファイルパスを指定する

大規模なレポートをまたいだセッション管理 large-reports

多くの発見があるBPA レポートの場合、バッチによるバッチ処理のアプローチにより、次の段階的な検証が可能になります。

  1. 各バッチの差分の確認
  2. パターン範囲のコミットメッセージでバッチをコミットする
  3. 次のバッチを開始するには、continueに返信してください
  4. パターンのすべての調査結果が完了したことをエージェントが報告するまで繰り返します

コミットごとに​ 1つのパターン ​を使用すると、Git履歴を読み取り可能な状態に保つことができ、必要に応じて個々のパターン変換を簡単に元に戻すことができます。

NOTE
すべての調査結果が処理される前にセッションを終了した場合は、新しいセッションで同じパターンとBPA ソースで再起動します。 エージェントは中断したところから再開します。

Workspace範囲 workspace-scope

エージェントは、開いているIDE ワークスペースフォルダー内でのみファイルを検索および編集します。 親ディレクトリ、兄弟フォルダー、またはディスク上の他の場所はスキャンしません。

BPA検索がワークスペースに存在しないファイルパスを参照する場合、エージェントは停止し、欠落しているパスを通知します。 正しいプロジェクトフォルダーを開くか、パスを明示的に指定して続行します。

recommendation-more-help
experience-manager-cloud-service-help-main-toc