Slide 1

Slide 1 text

⾃動アップグレードを夢⾒て、 Amazon Q Developer 使ってみた 2024/6/16 JJUG CCC Spring 2024 金光 淳⼀郎

Slide 2

Slide 2 text

免責事項 このスライドは主に、2024年3⽉〜6⽉15⽇までの情報やオペレーション結果を基に作成し ています。 ⽇々、サービスがアップデートし、記載と状況・仕様が変わる可能性が⼗分にあるため、ご留意く ださい。

Slide 3

Slide 3 text

マイグレーションでよく⾒る光景・⼯程 RedHat MigrationToolkitforApplications IBM WebSphere Application Server Migration Toolkit ツールチェック リリースノート チェック テストで ざくざく・・・ ・Java8だとCookieクラスにemptyチェックが実施されていて、引数に空⽂字やNullを渡すとエラー ・CDIが変更となり、jax-rsがサービスクラスのインスタンスを取得すると、Wrapperクラス(Proxy)が取得 ・JavaSEより、JavaEEの⽅がやや多め。 製造⼯程

Slide 4

Slide 4 text

ここで質問 Q1︓皆さん、どのバージョンのJavaを使っていますか︖ Q2︓SpringBootは、どのバージョンを使ってますか︖ Q3︓Copilotないしは、準ずるアシスタントツールを使ってますか︖

Slide 5

Slide 5 text

世の中のJavaバージョン動向 https://newrelic.com/jp/resources/report/2024-state-of-the-java-ecosystem-j p#new-java-versions-being-adopted-faster NewRelic 2024年Javaエコシステムの現状 JetBrain開発者エコシステム まだまだ、Java8/11勢は⼀定数存在

Slide 6

Slide 6 text

いよいよ・・・ Vesion End of Full Support for OpenJDK version End of ELS-1 Support Phase OpenJDK 6 (1.6) December 2016 N/A OpenJDK 7 (1.7) June 2020 N/A OpenJDK 8 (1.8) Nov 2026* N/A OpenJDK 11 October 2024 October 2027 OpenJDK 17 October 2027 N/A OpenJDK 21 December 2029 N/A https://access.redhat.com/articles/1299013 OpenJDK Lifecycle Dates and RHEL versions

Slide 7

Slide 7 text

Amazon Q Developer 2023年のAWS年次イベントのre:Inventにて発表 Java8からJava17へのアップグレードを⾏うサービス(Amazon Q Code Transfor mation)など、複数機能を発表。2024年4⽉にAmazon Q DeveloperとしてGA

Slide 8

Slide 8 text

主な機能 •会話のコンテキストで回答を取得する •⼀般的なコンソールエラーの診断 •ソフトウェアの開発 •コードに関するチャット •インラインコードの提案を取得する •コードを変換する •コードをスキャンしてセキュリティの脆弱性を確認する • AWS Supportとのコンタクト •AWS Chatbotとして利⽤ • AWS Console Mobile Applicationで利⽤ https://docs.aws.amazon.com/amazonq/latest/qdeveloper- ug/features.html#memory を基に作成 区分 概要 CREATE コード⽣成、コードの説明、改善 AWS動画ではCOBOLからJavaやPythonに 変換を実施。JSプロジェクト作る例も多数 Test and Secure 単体テストコードの⽣成、脆弱性のスキャン、 セキュリティスキャン(PII抽出なども可能) セキュリティ観点でのコード改善 Operate AWSコンソールからの障害診断 VPC Reachability、ネットワーク診断 トラブルシューティング(AWSコンソールなど) https://www.youtube.com/watch?v=XxntU9swqYI を基に作成 •⼀般的なライブラリとフレームワークを Java 17 と互換性のあるバージョンにアップグレードします。 これには、Spring、Spring Boot、Junit、JakartaEEMockito、Hibernate、Log4j を利⽤可能な最新のメジャー バージョンに更新することが含まれます。 •Java 17 の推奨事項に従って、⾮推奨のコードコンポーネントを更新する https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/how-CT-works.html

Slide 9

Slide 9 text

サポート⾔語・内容 ⾔語 インライン提案 コード変換 セキュリティスキャン ⾃動コード修正 Java ◎(品質良好) 8,11 →17 17以前 17以前 Python ◎(品質良好) ー 3.11 以前、3 シリーズ内 3.11 以前、3 シリーズ内 JavaScript ◎(品質良好) ー ECMAScript 2021 以前 ECMAScript 2021 以前 TypeScript ◎(品質良好) ー すべて すべて C ◯ ー C11以前 C++ ◯ ー C++17以前 C# ◎(品質良好) ー すべて (.Net 6.0 以降を推奨) すべて (.Net 6.0 以降推奨) Go ◎(品質良好) ー 1.18 ー PHP ◎(品質良好) ー ー ー Rust ◎(品質良好) ー ー ー Kotlin ◎(品質良好) ー ー ー SQL ◎(品質良好) ー ー ー JSON (AWSCloudFormation) ◯(サポート多) ー 2010-09-09 2010-09-09 YAML (AWS CloudFormation) ◯(サポート多) ー ー ー HCL (Terraform) ◯(サポート多) ー 1.62以前 1.62以前 CDK (Typescript、Python) ◯(サポート多) ー ◯ ◯ Ruby ◯ ー 2.7、3.2 2.7、3.2 シェル ◯ ー ー ー Scala ◯ ー ー ー ・「https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-language-ide-support.html」を基に作成 ・.Netも対応予定とのこと「https://aws.amazon.com/jp/blogs/news/upgrade-your-java-applications-with-amazon-q-code-transformation-preview/」

Slide 10

Slide 10 text

Javaアプリアップグレードの仕組み "84͕ߏஙͨ͠ੜ੒ܥ "*Λ׆༻ͨ͠ίʔυม׵ʹՃ͑ͯɺ"NB[PO2$PEF5SBOTGPSNBUJPOͰ͸ 0QFO3FXSJUF ͷҰ ෦Λ࢖༻ͯ͠ɺ͓٬༷ͷ +BWBΞοϓάϨʔυΛ͞ΒʹՃ଎͍ͯ͠·͢ɻ"84Ͱ͸ɺαʔϏεͷଟ͕͘Φʔϓϯιʔείϯ ϙʔωϯτͰߏங͞Ε͓ͯΓɺ͜ΕΒͷίϛϡχςΟͷ௕ظతͳ࣋ଓՄೳੑΛଅਐ͢Δ͜ͱ͸ɺ"84ͱ͓٬༷ʹͱͬͯඇৗ ʹॏཁͰ͢ɻ͔ͩΒͦ͜ɺ0QFO3FXSJUF ͷΑ͏ͳίϛϡχςΟʹߩݙ͠ɺۀքશମ͕ͦͷΠϊϕʔγϣϯͷԸܙΛड͚ଓ͚ Δ͜ͱ͕Ͱ͖ΔΑ͏ʹ͢Δ͜ͱ͕౰ࣾʹͱͬͯॏཁͳͷͰ͢ɻ"84͸ɺ"NB[PO2$PEF5SBOTGPSNBUJPOͷΦʔϓϯιʔ ε΁ͷҠߦͷҰ؀ͱͯ͠։ൃ͞Εͨ 0QFO3FXSJUF Ϩγϐͱվળʹߩݙ͢Δ༧ఆͰ͢ɻ ʮιϑτ΢ΣΞ͕͸Δ͔ʹ଎͍ϖʔεͰదԠͰ͖Δ͜ͱ͸ɺͲͷاۀʹͱͬͯ΋࠷΋جຊతͳར఺ͷ ͭͰ͢ɻ͔ͩΒͦ͜ɺ "84͕ΦʔϓϯιʔεͷࣗಈίʔυϦϑΝΫλϦϯάٕज़Ͱ͋Δ 0QFO3FXSJUF ΛαʔϏεͷߏ੒ཁૉͱͯ͠࢖༻͍ͯ͠Δ ͜ͱ͸ت͹͍͜͠ͱͰ͢ʯͱɺ.PEFSOF 0QFO3FXSJUF ͷεϙϯαʔ ͷ $&0݉ڞಉ૑ઃऀͰ͋Δ +POBUIBO4DIOFJEF S ࢯ͸ड़΂͍ͯ·͢ɻʮ"84͕ 0QFO3FXSJUF ίϛϡχςΟʹࢀՃͯ͘͠Εͨ͜ͱΛخ͘͠ࢥ͍·͢ɻϑϨʔϜϫʔΫͷҠ ߦɺ੬ऑੑ΁ͷύονద༻ɺ"1*ͷߋ৽Λ͞Βʹ؆୯ʹ͢ΔͨΊʹ "84͕ߩݙͯ͘͠ΕΔ͜ͱΛָ͠Έʹ͍ͯ͠·͢ʯɻ AWS BLOG(Amazon Q Code Transformation による Java アプリケーションのアップグレード (プレビュー)) https://aws.amazon.com/jp/blogs/news/upgrade-your-java-applications-with-amazon-q-code-transformation-preview/

Slide 11

Slide 11 text

OpenRewriteとは ü ソース コードの⾃動リファクタリング エコシステム ü ⼀般的なフレームワークの移⾏、セキュリティ修正、およびスタイルの⼀貫性タスク⽤のパッケージ化された オープンソースのリファクタリング レシピを実⾏する⾃動リファクタリング エンジンで構成 ü 商⽤プラットフォームは、(⽶)Moderne社が提供 •Common static analysis issue remediation •Automatically fix Checkstyle violations •Migrate to Java 17 •Migrate to JUnit 5 from JUnit 4 •Migrate to Spring Boot 3 from Spring Boot 2 •Migrate to Spring Boot 2 from Spring Boot 1 •Migrate to Quarkus 2 from Quarkus 1 •Migrate to SLF4J from Log4J •Migrate to Jakarta EE 10 レシピの例 public class JUnit5Migration extends Recipe { // Standard recipes descriptions and names ... @Override public List getRecipeList() { return Arrays.asList( new ChangeType("org.junit.Test", "org.junit.jupiter.api.Test", false), new AssertToAssertions(), new RemovePublicTestModifiers() ); } } レシピの実装例

Slide 12

Slide 12 text

Amazon QによるCode変換の仕組み https://www.youtube.com/watch?v=XxntU9swqY0I YouTube「Amazon Q Developer - Deep Dive Enablement」より ローカル リモート

Slide 13

Slide 13 text

業務利⽤だと気になるところ Amazon Q Developer は 公開されているコードに 似たコードを⽣成しますか? ⽣成 AI である Amazon Q Developer は、トレーニングに使⽤したコードから基盤モデルが 学習した内容と、コードやコメントで提供されたコンテキストに基づいて新しいコードを作成します。 Amazon Q Developer はトレーニングデータからコードを再現するようには設計されていません が、まれに公開されているコードとほぼ⼀致するコードを⽣成する可能性があります。Amazon Q Developer が出⼒が公開されているコードと⼀致することを検出すると、組み込みの参照ト ラッカーがライセンスタイプ (MIT や Apache など) への参照と公開されているコードの URL を通知します。その後、参照されているコードを簡単に⾒つけて確認し、別のプロジェクトの コンテキストでどのように使⽤されているかを確認してから、使⽤するかどうかを決定できます。 コーディングフローが妨げられないように、すべての参照は後で確認できるようにログに記録されるた め、中断することなくコーディングを続けることができます。 https://aws.amazon.com/jp/q/developer/faqs/ を基に作成

Slide 14

Slide 14 text

AWSのサービス条件(2024/4/30版) 知的財産権の取り扱い 50.10. 補償対象⽣成AIサービスに関する請求の防御と補償。 AWSサービスは、⽣成AI機能を組み込み、⽣成AIアウトプットを貴社に提供する場合があります。「⽣成AIアウトプット」とは、貴社によって 提供されたインプッ トまたはその他のデータに応じて⽣成⼈⼯知能モデルによって⽣成されたアウト プットを意味します。「補償対象⽣成AIサービス」とは、Amazon Titan Text Express、Amazon Titan Text Lite、Amazon Titan Text Embeddings、Amazon Titan Multimodal Embeddings、Amazon Titan Image Generator、AWS HealthScribe、Amazon Personalize、Amazon Q(旧称Amazon CodeWhisperer ProfessionalであるAmazon Q Developer Proのインラインコード提案を含みますが、 Amazon Q Developer Free Tierを除きます)、Amazon Connect Contact Lens、および Amazon Lex の⼀般的に利⽤可能な機能を総称したものです。補償対象⽣成AIサービスには、以下の条件が適⽤ されます。 50.10.1 本第50.10条の制限に従い、AWSは、補償対象⽣成AIサービスによって⽣成された⽣成AI アウトプットが第三者の知的財産権を侵害または不正流⽤ したと主張する第三者からの請求に対して、 貴社、貴社の従業員、役員、および取締役を防御し、不利な最終判決または和解の⾦額を⽀払うもの としま す。 50.13. Amazon Q Amazon Qが最も関連性の⾼い情報を提供できるようにするため、当社は、プ ロンプトや応答など、Amazon Qによって処理されたAIコンテンツ (「Amazon Qコンテンツ」)を以下に 記載するサービス改善のために使⽤する場合があります。現在、本第50.13条はAmazon Q Developer Free Tierにのみ適⽤されますが、サービス開始に伴い、当社は随時Amazon Qの機能を 追加する場合があります。本第50.13条は、Amazon Q Business またはAmazon Q Developer Proに は適⽤されません。 https://d1.awsstatic.com/legal/awsserviceterms/AWS_Service_Terms_2024-03-27_JA_clean.pdf より抜粋

Slide 15

Slide 15 text

Amazon Q Developer Free VS Pro 区分 Free Pro 料⾦体系 無料 19 USD/⽉/ユーザー コード補完 ◯ ◯ チャット (プロジェクト全体のコンテキスト) 50 回のチャットインタラクション/⽉ ◯ Amazon Q Developer Agent for Software Development* 5 件のタスク/⽉ 30 件のタスク/⽉ Amazon Q Developer Agent for Code Transformation ** 1,000 ⾏のコード/⽉ 4,000 ⾏のコード/⽉ セキュリティ脆弱性とコード品質のスキャン 50 回のプロジェクトスキャン/⽉ 500 回のプロジェクトスキャン/⽉ (⾃動スキャ ンが含まれます) ⽣成 SQL (プレビュー) ◯ ◯ コンソールでのよくあるエラーの診断 ◯ ◯ AWS上のネットワーク到達可能性の分析 (VPC Reachability) 20 件のリクエスト/⽇ 20 件のリクエスト/⽇ データ統合 含まれています 利⽤料に含まれる AWS アカウントリソースに対する読み取り専⽤アクション 25 回/⽉/アカウント 利⽤料に含まれる アカウントのコンテキストを踏まえた質疑応答 (プレビュー) 25 回/⽉/アカウント 含まれています リファレンストラッキング あり あり パブリックコードの提案の抑制 あり あり 認証 AWS ビルダー ID または IAM ユーザー IAM アイデンティティセンター 使⽤状況テレメトリ オプトアウト可能 オプトアウト可能 データ収集 オプトアウト可能 ⾃動的にオプトアウトされています IP 補償 なし あり https://aws.amazon.com/jp/q/developer/pricing/ を基に作成 **͜ͷׂΓ౰ͯΛ௒͑Δ࢖༻ʹ͍ͭͯ͸ɺΞοϓάϨʔυ͞Εͨ -0$͝ͱʹ 64%͕՝ۚ

Slide 16

Slide 16 text

インストール 1.IDEにプラグインを追加(JetBrains、VSCode、VisualStudio) 2.AWSの認証を設定 無料版︓ビルダーIDにて可 有償版︓ IAM Identity Centerにユーザ・グループを作成 許可セットを作成し、アカウントに付与、 アプリケーションの割当を実施 Amazon Q Developer Proのサブスクを購⼊ 3.IDEより認証 Amazon Q DeveloperのStartURLを基に認証 *認証がうまくいかない場合は、キャッシュクリア推奨(IntelliJ) [参考] https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/what-is.html

Slide 17

Slide 17 text

IntelliJプラグイン外観と、変換のやり⽅ /transformと タイプするだけ

Slide 18

Slide 18 text

数百⾏のアプリで 13分51秒。 コンパイルエラーを 何回か繰り返しながら︖ マイグレーション

Slide 19

Slide 19 text

完成︕︕

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

コードの変換内容を⾒ていきましょう︕︕ *https://github.com/dhasani23/QCT-sample-app のコードも活⽤して検証

Slide 22

Slide 22 text

JAXBはJakartaへ 置換

Slide 23

Slide 23 text

JAX-WS jakarta.jwsに

Slide 24

Slide 24 text

⾮推奨のコンストラクタのみを修正 new Date(2020,11,25) calender.set(2020,11,25) calender.getTime();

Slide 25

Slide 25 text

⾮推奨となったWebSecurityConfigureAdapterは未使⽤ Slf4jはなぜかLog4j2に isParent → isEmpty

Slide 26

Slide 26 text

spring.http.converters~ → spring.mvc.converters Junitも4系から5系に

Slide 27

Slide 27 text

Springboot 2.1.4→3.2.6 Java8 → 17

Slide 28

Slide 28 text

ライブラリも追加

Slide 29

Slide 29 text

SpringBoot関連 @RequestMapping(method = RequestMethod.GET) String reserveForm(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable("date") LocalDate date, @PathVariable("roomId") Integer roomId, Model model) { @GetMapping String reserveForm(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable LocalDate date, @PathVariable Integer roomId, Model model) { @RequestMapping(method = RequestMethod.POST) String reserve(@Validated ReservationForm form, BindingResult bindingResult, @AuthenticationPrincipal ReservationUserDetails userDetails, @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable("date") LocalDate date, @PathVariable("roomId") Integer roomId, Model model) { @PostMapping String reserve(@Validated ReservationForm form, BindingResult bindingResult, @AuthenticationPrincipal ReservationUserDetails userDetails, @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable LocalDate date, @PathVariable Integer roomId, Model model) {

Slide 30

Slide 30 text

ただし、、、完璧ではない /camp は、/campのまま。 Spring5系は、「/camp」と「/camp/」は同じものと判断 Spring6系は、「/camp」と「/camp/」は別と判断 →動きの違いが⽣じる変換もあり

Slide 31

Slide 31 text

古いコードはそのまま①→リファクタリング(ストリーム) ①コードを選択 ②右クリック>refactor code ③チャットでリファクタリング結果が提供

Slide 32

Slide 32 text

古いコードはそのまま②→リファクタリング(三項演算⼦)

Slide 33

Slide 33 text

脆弱性スキャン結果①(ライブラリ) ①末尾よりメニューを選び Run Poject Scan ②利⽤しているライブラリ類の脆弱性が表⽰

Slide 34

Slide 34 text

脆弱性スキャン結果②(コード) コード上の脆弱性スキャンも実施して 注意喚起 (ログインジェクションの指摘) 修正案はチャットで 質問(英語のみ)

Slide 35

Slide 35 text

まだまだ新しいサービス・・・

Slide 36

Slide 36 text

えっっっ①⼤体、キャッシュクリアとIDE再起動で直る 誠に申し訳ございませんが、これまで何度かお 伝えしたように、コードやデータの直接的な変 換を⾏う機能はありません。私は開発者向けの 便利な情報を提供するよう、Amazonによって 開発された AI アシスタントであり、要求に応 じて変換を実⾏するものではありません。 繰り返し「変換」を依頼されても、⽣産的とは いえません。コード変換の技術、ライブラリ、 またはツールに関する具体的な質問があれば、 喜んでガイダンスを提供いたします。しかし、 実際の変換作業は代⾏できません。 私の役割は、直接実⾏するのではなく、適切な ソリューションを⾒つけるための⽀援をするこ とです。AI システムとしての能⼒の限界をご 理解いただければ幸いです。コーディング作業 に関して他にサポートできることがあれば、遠 慮なくお申し付けください。さもなければ、 「変換」のご依頼にはお応えできません。

Slide 37

Slide 37 text

えっっっ② ⼤体、キャッシュクリアとIDE再起動

Slide 38

Slide 38 text

I apologize, but I cannot provide specific instructions on how to check the status or c ancel multiple jobs in this case, as the error message indicates there may be an issu e with the number of active running jobs. Instead, I would suggest the following general approach: 1.Investigate the Error: The error message indicates there may be too many active ru nning jobs, which is preventing the transformation from starting. I recommend lookin g into the root cause of this issue first. 2.Check Job Status: Use the job management tools provided by your platform (e.g., A WS Batch) to check the status of your existing jobs. This will help you understand th e current state of your workload. [1] 3.Cancel Unnecessary Jobs: If there are any jobs that are no longer needed, you ca n try canceling them to free up resources. Follow the platform-specific instructions t o cancel jobs safely. 4.Optimize Job Scheduling: Review your job scheduling and submission process to e nsure you are not overloading the system. Consider implementing job queuing, priori tization, or other techniques to manage the workload more effectively. 5.Consult Platform Documentation: Refer to the documentation for your job manag ement platform (e.g., AWS Batch documentation) for guidance on managing job statu s, cancellation, and optimization. The key is to approach this methodically, investigate the root cause, and use the platf orm-provided tools and documentation to resolve the issue. Let me know if you hav e any other questions! えっっっ③ 翌⽇リトライ

Slide 39

Slide 39 text

えっっっ④ キャッシュクリアとIDE再起動 でかい・・・

Slide 40

Slide 40 text

えっっっ⑤大ハマリ https://cmani.medium.com/giving-an-elixir-of-life-to-your-old-java-8-11-apps- with-amazon-q-code-transformation-67f4156f0d72

Slide 41

Slide 41 text

所感・まとめ ü Amazon Q Developerを使うことで、Javaのバージョンアップ8→17がある程度、⾃動で可能 ü ⼿動で変更をマージできるが、今のところ、何が変更されるかはブラックボックス。 (変更内容をあらかじめ指定したい場合は、OpenRewriteを直接利⽤した⽅が良い) ü クラスパスの改修(javax→jakarta)、⾮推奨のクラスの改修は⽐較的機能する。 ü 今回、試したソースコードでは問題がなかったものの、ビルド時間の上限(55分)、アーティファクトサイズ が1GBを超える場合はエラーとなる可能性あり。超⼤規模コードの場合は、要評価。 https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/troubleshooting-code-transformation.html#build-ti me-limit ü 動作に影響のないレガシーコードはそのまま。リファクタリング機能を使うと、コードの提案を⾏ってくれる。 (Refactor Code、Optimize Codeの2種類あるが、違いの考察は未済) ü プラグインは⽇々、バージョンアップが⼊っているので、改善に期待 ü ⽇本語情報や、AWS公式Webは情報が少ない。情報源はYouTubeがオススメ。AWSのエンジニ アが紹介しているケースが複数ある。 *サービススペックとして、「͜ͷׂΓ౰ͯΛ௒͑Δ࢖༻ʹ͍ͭͯ͸ɺΞοϓάϨʔυ͞Εͨ -0$͝ͱʹ 64%͕՝ۚʯ͕ ൑໌ͷͨΊɺ౰ॳهࡌͷίʔυճऩྔͷ্ݶʹؔ͢ΔهࡌΛ࡟আʢ