Amazon Web Services ブログ

AWS App2Container – Java および ASP.NET アプリケーション用の新しいコンテナ化ツール

お客様は、コンテナサーバーレステクノロジーを使用して新しいアプリケーションを開発することが多くなり、ソフトウェアデリバリーライフサイクルを自動化するために最新の継続的インテグレーションおよび継続的デリバリー (CI/CD) ツールを使用しています。また、手動で、または従来のシステムを使用して、構築および管理される多数の既存のアプリケーションを維持しています。異なるツールを使用してこれら 2 つのアプリケーションのセットを維持することで、運用上のオーバーヘッドが増加し、新しいビジネス機能の提供ペースが低下します。お客様は、既存のアプリケーションと新しいアプリケーションの両方について、管理ツールと CI/CD プロセスを可能な限り標準化できるようにしたいと考えています。その目的を達成するための最初のステップとして、既存のアプリケーションをコンテナにパッケージ化するオプションに目を向けています。

しかし、既存のアプリケーションをコンテナ化するには、アプリケーションの依存関係の識別、dockerfiles の書き込み、各アプリケーションのビルドプロセスとデプロイメントプロセスの設定など、手動による多くの作業を必要とします。これらの手動による作業は時間がかかり、エラーが発生しやすく、最新化に向けた取り組みの速度を低下させる可能性があります。

本日、当社は AWS App2Container をリリースします。これは、コードを変更することなく、オンプレミス、Amazon Elastic Compute Cloud (EC2)、または他のクラウドで実行されている既存のアプリケーションをコンテナ化するのに役立つ新しいコマンドラインツールです。App2Container は、サーバーで実行されているアプリケーションを検出し、それらの依存関係を識別して、Amazon ECS および Amazon EKS へのシームレスなデプロイのために、関連するアーティファクトを生成します。また、AWS CodeBuild および AWS CodeDeploy との統合を提供して、コンテナ化されたアプリケーションを繰り返し構築およびデプロイすることを可能にします。

AWS App2Container は、アプリケーションコンポーネントごとに、アプリケーションファイル/フォルダー、Dockerfiles、Amazon Elastic Container Registry (ECR) のコンテナイメージ、ECS タスク定義、Kubernetes デプロイ YAML、Amazon ECS または EKS にアプリケーションをデプロイする CloudFormation テンプレート、および AWS CodeBuild と CodeDeploy を活用する AWS Codepipeline でビルド/リリースパイプラインを設定するためのテンプレートといったアーティファクトを生成します。

本日より、App2Container を使用して、Windows 上の IIS 7.5 以降で実行されている ASP.NET (.NET 3.5 以降) ウェブアプリケーション、および Linux 上で実行されている Java アプリケーション (スタンドアロンの JBoss、Apache Tomcat、Spring Boot、IBM WebSphere、Oracle WebLogic などの汎用 Java アプリケーション) をコンテナ化できます。

コンテナを使用して既存のアプリケーションを最新化することにより、それらをポータブルにし、開発の俊敏性を高め、CI/CD プロセスを標準化し、運用コストを削減できます。早速仕組みを見ていきましょう!

AWS App2Container – 開始方法
AWS App2Container では、AWS コマンドラインインターフェイス (CLI) バージョン 1.14 以降、Docker ツール、および (ASP.NET の場合) Windows で実行されるアプリケーション用の Powershell 5.0+ が、アプリケーションをホストするサーバーにインストールされていることが前提条件として求められます。さらに、AWS のサービスとやり取りするために、App2Container に適切な IAM アクセス許可を提供する必要があります。

例えば、既存の Java アプリケーションをコンテナ化する方法を見てみましょう。Linux 向けの App2Container CLI は、tar.gz アーカイブとしてパッケージ化されています。このファイルは、App2Container CLIをインストールするために、対話型シェルスクリプトである install.sh をユーザーに提供します。スクリプトを実行すると、インストール手順がガイドされ、App2Container CLI コマンドが含まれるようにユーザーのパスが更新されます。

最初に、App2Container CLI のために、インストールされたサーバーで init コマンドを使用して 1 回限りの初期化を実行します。

$ sudo app2container init
Workspace directory path for artifacts[default:  /home/ubuntu/app2container/ws]:
AWS Profile (configured using 'aws configure --profile')[default: default]:  
Optional S3 bucket for application artifacts (Optional)[default: none]: 
Report usage metrics to AWS? (Y/N)[default: y]:
Require images to be signed using Docker Content Trust (DCT)? (Y/N)[default: n]:
Configuration saved

これにより、アプリケーションコンテナ化のアーティファクトを格納するワークスペースが設定されます (最低 20GB の使用可能なディスク領域)。AWS のサービスを使用するように設定された AWS プロファイルを使用して、Amazon Simple Storage Service (S3) バケットにそれらを抽出できます。

次に、inventory コマンドを使用して、アプリケーションサーバーで実行されている Java プロセスを表示できます。各 Java アプリケーションプロセスには、アプリケーション ID である一意の識別子 (例: java-tomcat-9e8e4799) があります。この ID を使用して、他の App2Container CLI コマンドでアプリケーションを参照できます。

$ sudo app2container inventory
{
    "java-jboss-5bbe0bec": {
        "processId": 27366,
        "cmdline": "java ... /home/ubuntu/wildfly-10.1.0.Final/modules org.jboss.as.standalone -Djboss.home.dir=/home/ubuntu/wildfly-10.1.0.Final -Djboss.server.base.dir=/home/ubuntu/wildfly-10.1.0.Final/standalone ",
        "applicationType": "java-jboss"
    },
    "java-tomcat-9e8e4799": {
        "processId": 2537,
        "cmdline": "/usr/bin/java ... -Dcatalina.home=/home/ubuntu/tomee/apache-tomee-plume-7.1.1 -Djava.io.tmpdir=/home/ubuntu/tomee/apache-tomee-plume-7.1.1/temp org.apache.catalina.startup.Bootstrap start ",
        "applicationType": "java-tomcat"
    }
}

IIS バージョン 7.0 以降がインストールされた Windows Server の管理者が実行する PowerShell セッションで ASP.NET アプリケーションを初期化することもできます。Docker ツールとコンテナのサポートは、Windows Server 2016 以降のバージョンで使用できます。Docker ツールがインストールされているアプリケーションサーバーですべての app2container 操作を実行するか、Amazon ECS 最適化 Windows Server AMI を使用して Docker ツールでワーカーマシンを使用するかを選択できます。

PS> app2container inventory
{
    "iis-smarts-51d2dbf8": {
        "siteName": "nopCommerce39",
        "bindings": "http/*:90:",
        "applicationType": "iis"
    }
}

inventory コマンドは、コンテナ化できるアプリケーションサーバー上のすべての IIS ウェブサイトを表示します。各 IIS ウェブサイトプロセスには、アプリケーション ID である一意の識別子 (例: iis-smarts-51d2dbf8) があります。この ID を使用して、他の App2Container CLI コマンドでアプリケーションを参照できます。

アプリケーション ID を参照して特定のアプリケーションを選択し、analyze コマンドを使用してアプリケーションの分析レポートを生成できます。

$ sudo app2container analyze --application-id java-tomcat-9e8e4799
Created artifacts folder /home/ubuntu/app2container/ws/java-tomcat-9e8e4799
Generated analysis data in /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/analysis.json
Analysis successful for application java-tomcat-9e8e4799
Please examine the same, make appropriate edits and initiate containerization using "app2container containerize --application-id java-tomcat-9e8e4799"

アプリケーション分析によって生成された analysis.json テンプレートを使用して、analysisInfo セクションからすべてのシステム依存関係を識別するのに役立つ分析されたアプリケーションに関する情報を収集し、コンテナ化パラメータを更新して、containerParameters セクションを使用してアプリケーション用に生成されたコンテナイメージをカスタマイズできます。

$ cat java-tomcat-9e8e4799/analysis.json
{
    "a2CTemplateVersion": "1.0",
	"createdTime": "2020-06-24 07:40:5424",
    "containerParameters": {
        "_comment1": "*** 編集可能: 以下のセクションは、アプリケーションの要件に応じて編集できます。アプリケーションに関して発見された詳細については、以下の analyisInfo セクションを参照してください。 ***",
        "imageRepository": "java-tomcat-9e8e4799",
        "imageTag": "latest",
        "containerBaseImage": "ubuntu:18.04",
        "coopProcesses": [ 6446, 6549, 6646]
    },
    "analysisInfo": {
        "_comment2": "*** 編集不可: 分析結果 ***",
        "processId": 2537
        "appId": "java-tomcat-9e8e4799",
		"userId": "1000",
        "groupId": "1000",
        "cmdline": [...],
        "os": {...},
        "ports": [...]
    }
}

また、$ app2container extract --application-id java-tomcat-9e8e4799 コマンドを実行して、分析されたアプリケーションのアプリケーションアーカイブを生成できます。これは、アプリケーションのワークスペースフォルダーに以前に生成された analysis.json ファイルに依存し、そこで指定されたコンテナ化パラメータの更新に従います。extract コマンドを使用すると、アプリケーションサーバーで最初のコマンドセットを実行した後、ワーカーマシンでワークフローを続行できます。

これで、選択したアプリケーションのコマンドで生成された Docker イメージをコンテナ化できます。

$ sudo app2container containerize --application-id java-tomcat-9e8e4799
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Extracted container artifacts for application
Entry file generated
Dockerfile generated under /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/Artifacts
Generated dockerfile.update under /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/Artifacts
Generated deployment file at /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/deployment.json
Containerization successful.Generated docker image java-tomcat-9e8e4799
You're all set to test and deploy your container image.

Next Steps:
1.View the container image with \"docker images\" and test the application.
2.When you're ready to deploy to AWS, please edit the deployment file as needed at /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/deployment.json.
3.Generate deployment artifacts using app2container generate app-deployment --application-id java-tomcat-9e8e4799

このコマンドを使用すると、containerize コマンドが実行されているマシンで Docker イメージを使用して、生成されたコンテナイメージを表示できます。docker run コマンドを使用してコンテナを起動し、アプリケーション機能をテストできます。

コンテナイメージの生成に加えて、containerize コマンドは、次の generate-appdeployment コマンドで使用できる deployment.json テンプレートファイルも生成することに留意してください。deployment.json テンプレートファイルのパラメータを編集して、Amazon ECR に登録するイメージリポジトリ名、ECS タスク定義パラメータ、または Kubernetes アプリ名を変更できます。

$ cat java-tomcat-9e8e4799/deployment.json
{
       "a2CTemplateVersion": "1.0",
       "applicationId": "java-tomcat-9e8e4799",
       "imageName": "java-tomcat-9e8e4799",
       "exposedPorts": [
              {
                     "localPort": 8090,
                     "protocol": "tcp6"
              }
       ],
       "environment": [],
       "ecrParameters": {
              "ecrRepoTag": "latest"
       },
       "ecsParameters": {
              "createEcsArtifacts": true,
              "ecsFamily": "java-tomcat-9e8e4799",
              "cpu": 2,
              "memory": 4096,
              "dockerSecurityOption": "",
              "enableCloudwatchLogging": false,
              "publicApp": true,
              "stackName": "a2c-java-tomcat-9e8e4799-ECS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              },
              "gMSAParameters": {
                     "domainSecretsArn": "",
                     "domainDNSName": "",
                     "domainNetBIOSName": "",
                     "createGMSA": false,
                     "gMSAName": ""
              }
       },
       "eksParameters": {
              "createEksArtifacts": false,
              "applicationName": "",
              "stackName": "a2c-java-tomcat-9e8e4799-EKS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              }
       }
 }

この時点で、アーティファクトが生成されるアプリケーションワークスペースは、反復サンドボックスとして機能します。ここで生成された Dockerfile を編集してアプリケーションを変更し、docker build コマンドを使用して、必要に応じて新しいコンテナイメージをビルドできます。generate-deployment コマンドを使用して、Amazon EKS にアプリケーションコンテナをデプロイするために必要なアーティファクトを生成できます。

$ sudo app2container generate app-deployment --application-id java-tomcat-9e8e4799
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Created ECR Repository
Uploaded Cloud Formation resources to S3 Bucket: none
Generated Cloud Formation Master template at: /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml
EKS Cloudformation templates and additional deployment artifacts generated successfully for application java-tomcat-9e8e4799

You're all set to use AWS Cloudformation to manage your application stack.
Next Steps:
1.Edit the cloudformation template as necessary.
2.Create an application stack using the AWS CLI or the AWS Console.AWS CLI command:

       aws cloudformation deploy --template-file /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml --capabilities CAPABILITY_NAMED_IAM --stack-name java-tomcat-9e8e4799

3.Setup a pipeline for your application stack:

       app2container generate pipeline --application-id java-tomcat-9e8e4799

このコマンドは、containerize コマンドの実行の一部として生成された deployment.json テンプレートファイルに基づいて機能します。これで、App2Container は、ECS/EKS cloudformation テンプレートとそれらのスタックをデプロイするオプションも生成するようになりました。

このコマンドは、コンテナイメージをユーザー指定の ECR リポジトリに登録し、Amazon ECS および EKS デプロイ用の cloudformation テンプレートを生成します。ECS タスク定義を Amazon ECS に登録し、kubectl を使用して、App2Container が生成した amazon-eks-master.template.deployment.yaml を使用して、既存の Amazon EKS またはセルフマネージド kubernetes クラスターでコンテナ化されたアプリケーションを起動できます。

または、Amazon EKSに --deploy オプションを使用してコンテナ化されたアプリケーションを直接デプロイすることもできます。

$ sudo app2container generate app-deployment --application-id java-tomcat-9e8e4799 --deploy
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Created ECR Repository
Uploaded Cloud Formation resources to S3 Bucket: none
Generated Cloud Formation Master template at: /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml
Initiated Cloudformation stack creation.This may take a few minutes.Please visit the AWS Cloudformation Console to track progress.
Deploying application to EKS

Windows 認証での ASP.NET アプリケーションの処理
ASP.NET アプリケーションのコンテナ化は Java アプリケーションとほぼ同じプロセスですが、Windows コンテナを直接ドメインに参加させることはできません。ただし、Active Directory (AD) ドメイン ID を使用して、さまざまな認証シナリオをサポートすることはできます。

App2Container は、サイトが Windows 認証を使用しているかどうかを検出し、それに応じて IIS サイトのアプリケーションプールをネットワークサービス ID として実行し、Windows 認証 IIS アプリケーション用の新しい cloudformation テンプレートを生成します。gMSA と AD Security グループの作成、ECS ノードのドメイン参加、コンテナでのこの gMSA の使用は、これらのテンプレートによってすべて処理されます。

また、$ app2container containerize コマンドへの出力として 2 つの PowerShell スクリプトと、その使用方法に関する指示ファイルを提供します。

以下は出力例です。

PS C:\Windows\system32> app2container containerize --application-id iis-SmartStoreNET-a726ba0b
Running AWS pre-requisite check...
Running Docker pre-requisite check...
Container build complete.Please use "docker images" to view the generated container images.
Detected that the Site is using Windows Authentication.
Generating powershell scripts into C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b\Artifacts required to setup Container host with Windows Authentication
Please look at C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b\Artifacts\WindowsAuthSetupInstructions.md for setup instructions on Windows Authentication.
A deployment file has been generated under C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b
Please edit the same as needed and generate deployment artifacts using "app2container generate-deployment"

最初の PowerShell スクリプトである DomainJoinAddToSecGroup.ps1 は、コンテナホストに参加し、それを Active Directory セキュリティグループに追加します。2 番目のスクリプトである CreateCredSpecFile.ps1 は、グループ管理サービスアカウント (gMSA) を作成し、Active Directory セキュリティグループへのアクセスを許可し、この gMSA の認証情報の仕様を生成して、コンテナホストにローカルに保存します。これらの PowerShell スクリプトは、ECS ホストで実行できます。以下は、スクリプトの使用例です。

PS C:\Windows\system32> .\DomainJoinAddToSecGroup.ps1 -ADDomainName Dominion.com -ADDNSIp 10.0.0.1 -ADSecurityGroup myIISContainerHosts -CreateADSecurityGroup:$true
PS C:\Windows\system32> .\CreateCredSpecFile.ps1 -GMSAName MyGMSAForIIS -CreateGMSA:$true -ADSecurityGroup myIISContainerHosts

app2container generate-deployment コマンドを実行する前に、deployment.json ファイルを編集して、dockerSecurityOption の値を、CreateCredSpecFile スクリプトが生成した CredentialSpec ファイルの名前に変更します。例えば、次のようにします。
"dockerSecurityOption": "credentialspec:file://dominion_mygmsaforiis.json"

これで事実上、サイトのコンテナ内の IIS サーバーが行うネットワークリソースへのアクセスはすべて、上記の gMSA を使用して認証されることになります。最後の手順では、IIS サーバーがアクセスするネットワークリソースでこの gMSA アカウントを認証します。SQL Server 内でこの gMSA を認証するのが一般的です。

最後に、アプリケーションが完全に機能するためにはデータベースに接続する必要があり、かつ、Amazon ECS でコンテナを実行する場合は、ツールによって生成された Docker イメージから作成されたアプリケーションコンテナが同じデータベースに接続できるようにします。移行に関するオプションについては、AWS における Windows から Linux への MS SQL Server への移行Database Migration Service、および MS SQL Server の Amazon RDS へのバックアップと復元のドキュメントを参照してください。

今すぐご利用いただけます
AWS App2Container は無料で提供されます。Amazon EC2、ECS、EKS、S3 などの AWS のサービスの実際の使用量に対してのみ、その使用量に基づいて支払います。詳細については、App2Container のよくある質問ドキュメントを参照してください。ぜひお試しいただき、通常の AWS のサポートの連絡先、ECS の AWS フォーラムEKS の AWS フォーラム、または Github のコンテナロードマップのいずれかでフィードバックをお寄せください。

Channy;