フォーム読み込み中
Alibaba Cloudからサーバレス型汎用PaaSのServerless Application Engine(SAE)がリリースされたので、JARパッケージからDubboフレームワークをベースにしたサンプルマイクロサービスをSAEにデプロイしてみたので、その方法を記事にします。
Alibaba CloudからServerless Application Engine(SAE)が日本リージョンにて新しくリリースされました。Serverless Application Engine(SAE)は、万能なPaaSプラットフォームで完全に管理されており、運用やメンテナンスの必要がなく、非常に高い耐久性を備えています。SAEでは、Spring Cloudアプリケーション、Dubboアプリケーション、HSFアプリケーション、Webアプリケーション、XXL-JOBジョブ、ElasticJobジョブなど、様々なアプリケーションをコードを変更することなく、手動でコンテナ化することなく、完全に管理できます。これにより、開発者はアプリケーションの開発に集中でき、インフラストラクチャの管理に関する心配から解放されます。
SAEはマイクロサービス、ジョブホスティング、CI/CD、ゾーンディザスタリカバリなどで広く利用されており、SAEを利用している企業は100社を超えるなどと様々な実績が出ています。SAEはゲートウェイルート、ヘルスチェック、ウェブシェル、ログ監視、権限管理など、アプリケーションのO&Mに役立つ機能を多数提供しています。
<参考> 対応シナリオ
本記事では、JARパッケージからサンプルのDubboマイクロサービスをSAE上にデプロイする方法を説明します。
今回は、Alibaba Cloudが提供するサンプルパッケージを使用し、SAEコンソール上でサービスプロバイダとコンシューマを別々にJARパッケージからデプロイします。想定するアウトプットイメージとして、コンシューマアプリケーションに公開SLBインスタンスをバインドした後、Webブラウザからサービスにアクセスできるようになります。コードに基づいて、入力情報と共にWelcomeメッセージが表示されることをイメージしています。
SAEコンソールに初めてアクセスすると、サービスアクティベーションページに移動します。利用規約に同意した上で「Activate Now」ボタンをクリックすると、新しいオーダーが生成されSAEサービスがアクティブになります。
SAEコンソールに戻ると、デフォルトロール(AliyunServiceRoleForSAE)とポリシー(AliyunServiceRolePolicyForSAE)の作成を求めるポップアップウィンドウが表示されます。SAEサービスが他のクラウドサービスにアクセスする必要がある場合、サービスリンクロールによりSAEサービスに他サービスへのアクセス権限が付与されます。
<参考> サービスに関連する役割
「Confirm」ボタンをクリックすると、操作が自動的に行われます。RAMコンソールから詳細情報を確認することができます。
その後、SAEコンソールにアクセスすると、アプリケーションがまだ作成されていないため、関連ページにはデータが表示されません。
SAEアプリケーションは構成上VPCインスタンスに基づいており、セキュリティグループは関連ポートへのアクセス権限を管理しています。さらに、名前空間は異なるアプリケーションのランタイム環境を論理的に隔離します。そのため、アプリケーションを展開する前に関連リソースを準備する必要があります。すべてのリソースが同じRegionであることを確認します。今回は日本リージョンを使用します。
VPCコンソールで、日本RegionにvSwitchを持つVPCインスタンスを作成します。
「Create VPC」ボタンをクリックし、処理に入ります。
VPCインスタンスとvSwitchの設定を記入します。
「OK」ボタンをクリックし、操作を実行します。
操作が完了すると、成功メッセージと作成されたインスタンスが表示されます。
次に、ECSコンソールのセキュリティグループ管理ページに移動します。上記で作成したVPCインスタンスの下に、対象のセキュリティグループを作成します。
「Create Security Group」ボタンをクリックし、処理を開始します。
セキュリティグループの設定を記入します。VPCインスタンスが上記手順で作成したものと同じであることを確認します。アクセスルールについては、各自の要件に基づき更新します。ここでは、テスト用にデフォルトのものを使用します。
「Create Security Group」ボタンをクリックし、操作を実行します。
これで、必要なセキュリティグループが使用できるようになります。
名前空間は、ランタイム環境を論理的に分離するために使用されます。例えば、開発環境、テスト環境、本番環境用に複数の名前空間を作成することができます。
<参考> 名前空間
この場合、サービスプロバイダとコンシューマのための新しい名前空間を作成します。
「Create Namespace」ボタンをクリックし、処理を開始します。
名前空間の設定を記入しますが、名前空間IDの制限に注意。
「OK」ボタンをクリックして操作を実行します。
入力情報が正しければ、成功のメッセージが表示され、作成された名前空間がリストに表示されます。
名前空間IDには、小文字のアルファベットまたは数字のみを含めることができます。また、IDが長すぎて保存できない場合は、関連するエラーメッセージが表示されます。
前述通り、SAEサービスでは、複数のアプリケーションをサポートしています。ここでは、DubboマイクロサービスフレームワークとJARパッケージを使用して、アプリケーションデプロイメントのプロセスを示します。
JAVA WARパッケージ、PHP Zipパッケージ、Python Zipパッケージなど、自分のパッケージを使用することもできます。デプロイメントプロセスはほぼ同じです。ただ、適切なランタイム環境とファイルアップロード方法を選択していることを確認してください。
<参考> SAEでアプリケーションを作成する
アプリケーションの基本情報を入力します。
上記の手順で作成した対象のVPCインスタンス、vSwitches、セキュリティグループを選択します。
適切なSAEインスタンスの仕様をピックアップします。サンプルアプリケーションでは、デフォルトのVCPUとMemoryを使用します。
「Next: Application Deployment Configuration」をクリックすると、デプロイメント設定ページにジャンプします。
デプロイメント設定ページをフォームに記入します。
用意されたJARパッケージを元に、「Program Language」として「JAVA」、「Deployment Method」として「JAR package」を選択します。
実行環境は「Standard JAVA Runtime Environment」と「Dragonwell 8」を選択します。JAVAをベースにアプリケーションを構築する場合は、OpenJDKをサポートし、アプリケーションの開始や実行時の高速化、GC効率の向上などを提供するDragonwell Xを推奨します。
コードパッケージのアップロードには、パッケージを直接アップロードする方法と、パッケージのパスを入力する方法の2種類があります。今回は、Alibaba cloudが提供するサンプルパッケージを使用します。JARパッケージのパスは以下の通りです: https://aliware-images.oss-cn-hangzhou.aliyuncs.com/demo/sae/spring-boot-provider-1.0-SNAPSHOT.jar
バージョンタグはリリース処理で使用されるので、特定の情報を入力するか、タイムスタンプを直接使用することができます。
サンプルとして、高度な設定のためのデフォルトの設定を使用するだけです。要件に応じて変更することができます。オプションの中には、開始コマンドやヘルスチェックなど、アプリケーションに役立つものもあります。
「Next: Confirm Specifications」をクリックすると、確認ページにジャンプします。
リストアップされたSAEインスタンス仕様情報を確認し、「Confirm」ボタンをクリックして操作を実行します。
<参考>
成功のメッセージが表示され、リストに作成されたアプリケーションが表示されます。SAEインスタンスの作成とアプリケーションのデプロイには、1~2分かかります。
SAEコンソールでは、アプリケーションに関して多くの機能が提供されています。ここでは、いくつかの一般的な操作について説明します。
アプリケーションが作成されると、関連するインスタンスが作成され、KubernetesクラスターのPodのようにデプロイされます。すべてが順調に進むと、インスタンスの状態はPending → Init → Runningと更新されます。インスタンスでアプリケーションが正常に実行されない場合、CrashLoopBackOffやErrorのステータスが表示されることがあります。この場合、ログやイベントをチェックしてエラーを特定します。
SAEコンソールで使用されていないアプリケーション(Idle Application)がある場合、余分なコストが発生します。そのような場合、それらのアプリケーションを停止することをお勧めします。
これらのアプリケーションの下にあるSAEインスタンスは解放されますが、アプリケーションの設定や構成は保存されます。つまり、将来必要に応じて開始したい場合、数秒でアプリケーションを素早く再開始することができます。操作は簡単で、「Stop Application」ボタンをクリックし、ポップアップウィンドウで確認するだけです。
アプリケーション停止後、対象アプリケーションの下でリリースされたインスタンスを確認することができます。
アプリケーションの開始はECSインスタンスの開始・停止操作と同じくらい簡単です。目的のアプリケーションの詳細ページに入り、「Start Application」ボタンをクリックしてポップアップウィンドウで操作を確認します。その後、対象アプリケーションのためにSAEインスタンスが作成され、アプリケーションが再び利用可能になります。
シナリオ次第では、複数のアプリケーションを同時に開始または停止したい場合があります。それらを1つ1つずつ処理するのは効率的ではありません。そこで、特定の名前空間で、バッチ操作で管理する方法があります。バッチ操作は特定の一つの名前空間でのみ利用可能です。複数の名前空間に対してバッチアクションを実行することはできません。
アプリケーションが特定の期間にのみ使用される場合は、スケジュールされた開始と停止のスケジュール機能が非常に役立ちます。この機能も単一の名前空間のみをサポートしているため、適切な名前空間を使用してアプリケーションを管理することが重要です。この機能では、対象となる名前空間の下にあるすべてのアプリケーションまたは特定のアプリケーションに対して、スケジュールされた開始と停止のルールを設定することができます。
<参考> スケジュールされた開始・停止ルールの管理
ログとイベントは運用および保守管理に役立ちます。SAEコンソールでは、インスタンスレベル、アプリケーションレベル、名前空間レベルの3つのレベルで情報を提供しています。例えば、インスタンスの詳細ページのボタンをクリックすることで、期待される情報を閲覧できます。ログやイベントに加えて、アプリケーションのHealth Statusを確認したり、ファイルをアップロード・ダウンロードするためのWebshell機能も提供されています。
<参考>
対象アプリケーションの「Change Record」、「Application Events」、「Log Management」というメニューがあります。これらのページは、アプリケーションレベルで関連する情報を表示するために使用されます。
表示ボタンや展開ボタンをクリックすることで、関心のある項目の詳細を確認することができます。
名前空間レベルでも同じメニューがあり、変更記録やイベント情報を確認することができます。
アプリケーションやインスタンスが正常にデプロイされない場合、ログやイベントを確認することで、根本的な原因を突き止め、問題を解決することができます。
一方、SAEコンソールはデバッグ機能も備えています。インスタンスがデバッグモードになると、「No Service Traffic Received」というステータスになります。
対象のインスタンスを見つけ、「CrashLoopBackOff」のステータスの上にマウスを移動させます。
ポップアップヒントの「One-click Debugging」リンクをクリックします。
通知メッセージを確認します。
「Next」ボタンをクリックしてデバッグ環境を準備します。
デバッグのためにインスタンスが再開始するのを待ちます。
インスタンスの準備ができたら、「Debug Instance」ボタンをクリックして、Webshell経由でインスタンスにアクセスします。
そうすれば、様々なデバッグ作業をすることができます。
Health Checkに加えて、パフォーマンスデータもアプリケーションにとって重要な指標です。SAEコンソールは基本的なモニタリングだけでなく、アプリケーションモニタリングも提供します。ARMS機能を有効にすることで、より高度なモニタリング情報を取得できます。
<参考> アプリケーション監視
サービスプロバイダの準備ができたら、サンプルのマイクロサービスを構築するために、サービスコンシューマをデプロイする必要があります。同じようにコンシューマーアプリケーションをデプロイし、今回は「JAR Package Path」を「File Upload Method」として使用します。対象となるコンシューマのJARパッケージは、https://aliware-images.oss-cn-hangzhou.aliyuncs.com/demo/sae/spring-boot-consumer-1.0-SNAPSHOT.jar に配置されています。
そして、サービスプロバイダーとコンシューマの双方が、次のステップに進むための準備を整えます。
サービス・コンシューマアプリケーションのインスタンスの準備が整うまで待ちます。
マイクロサービスをインターネット上で利用できるようにするには、EIP、SLB、Gatewayルーティングなど、いくつかの方法があります。本記事では、それを実現するために、サービスコンシューマーアプリケーションにSLBインスタンスをバインドし、それを実現します。ウェブサイトからマイクロサービスにアクセスするためには、アプリケーションにSLBインスタンスをバインドする必要があります。
<参考>
サービスコンシューマーアプリケーションの詳細ページに移動し、「Add Internet-facing SLB Instance」リンクをクリックします。
SLBインスタンスのリスナーを設定します。今回は、アプリケーションコードに基づいて、コンテナポート「9091」のHTTPリスナーを追加します。ご自身の要件に合わせて設定します
「OK」ボタンをクリックし、操作を実行します。
操作の実行中に、変更記録ページで詳細な状況を確認することができます。
すべて完了すると、成功のメッセージとSLBインスタンスIPがページに表示されます。
SAEアプリケーションはVPCインスタンスに基づいており、セキュリティグループが関連ポートへのアクセス権限を管理します。サンプルサービスは、http://<インターネット向けSLBインスタンスのエンドポイント>:<ポート>/sayHello/<カスタム文字列>のURLで提供されます。ウェブブラウザでURLにアクセスすると、返されたウェルカムメッセージが表示されます。
URLが間違っている場合は、代わりに一般的なエラーページにジャンプします。
デプロイの際、JAVA環境にはいくつかの選択肢があります。資料によると、Alibaba cloudによって加速されGC効率が向上しているため、Dragonwell Xが推奨されています。しかし、実行環境としてDragonwell 17を選択すると、エラーが発生します。エラーログによると、クラスの読み込みに問題があることが原因とのことです。
java.lang.IllegalStateException: Cannot load configuration class: com.alibaba.edas.boot.DubboProvider
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:403) ~[spring-context-4.3.12.RELEASE.jar!/:4.3.12.RELEASE]
......
Caused by: java.lang.ExceptionInInitializerError: null
at org.springframework.context.annotation.ConfigurationClassEnhancer.newEnhancer(ConfigurationClassEnhancer.java:122) ~[spring-context-4.3.12.RELEASE.jar!/:4.3.12.RELEASE]
......
... 20 common frames omitted
Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @51016012
at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:464) ~[spring-core-4.3.12.RELEASE.jar!/:4.3.12.RELEASE]
......
... 23 common frames omitted
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @51016012
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na]
......
... 35 common frames omitted
JAVAの環境を変更することで解決します。このトピックでは、代わりにDragonwell 8を使用しています。
SAEを使用することで、マイクロサービス展開においてサーバーレス環境の提供、自動スケーリング、簡単なデプロイメント、コスト効率、柔軟性・拡張性、高可用性、そして強固なセキュリティを享受しながら、さくっとマイクロサービスを構築できます。それだけでなく、効率的な運用、コスト削減、ビジネスの柔軟な拡張が可能となりますので、マイクロサービスを構築したい場合、SAEを使う選択肢もありますので、是非参考にしてみてください。
Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。
MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。
条件に該当するページがございません