App2Containerを使ってECS on Fargate環境へWindowsアプリケーションをデプロイする

2021.10.31

いわさです。

先日のアップデートで、AWS FargateにてWindowsコンテナーがサポートされました。
そして、それに順応する形で、App2ContainerでもWindowsアプリケーションをデプロイする際にECS on Fargateを選択出来るようになりました。

App2Containerは既存アプリケーションをコンテナ化するために利用出来るツールです。
以前中山さんがJavaアプリケーションのコンテナ化をされています。

本日はIIS + .NETアプリケーションを使ってApp2Containerの使い方をおさらいしながら、従来までのデプロイ方法と何が変わるのかを確認し、App2Containerを使用してECS on FargateへWindowsアプリケーションをデプロイしてみます。

最初にまとめ

App2Containerの使い方の流れ

  • analyzeコマンドで、現行アプリのコンテナ化に必要な情報を分析し、analysis.jsonをアウトプットする。
  • containerizeコマンドで、analysis.jsonを基にDockerfileを生成しイメージをビルド、AWS環境へのデプロイ用設定ファイルdeployment.jsonをアウトプットする。
  • generate app-deploymentコマンドで、ECRを作成しイメージをプッシュし、deployment.jsonを基にAWS上でコンテナをホストするためのCloudFormationテンプレートを生成する。(CFn実行まで行えるオプションあり)

FargateのWindowsコンテナー対応はすでにサポートされており、今回App2Containerで大きく変わるのは、Windowsコンテナでもdeployment.jsonにECR on Fargateが設定出来るようになった点です。

やってみる(ECS on Fargate)

App2Containerを使ったデプロイ手順は以下のページに記されています。

なお、App2Containerでコンテナ化出来るアプリケーションには制約があるので以下を確認し、お使いのワークロードがApp2Containerでの移行に適しているかを事前によくご確認ください。

1) IISとデプロイ対象のアプリを用意

今回は、ASP.NET Web FormsなアプリをIISで実行させておきます。

2) 分析

事前準備に従い、App2ContainerやAWS Tools for PowerShellなどもセットアップ済みです。
また、App2Containerは利用前に、app2container initでAWS CLIのプロファイル設定や中間成果物の出力先S3バケットの指定などを済ませておく必要があります。

これらの準備ができていれば、app2container inventoryを実行することで、現在のIISに作成されているWebサイトが取得出来るので、app2container analyzeで分析を行います。

PS C:\Users\iwasa> app2container inventory
{
                "iis-default-web-site-a7b69c34": {
                                "siteName": "Default Web Site",
                                "bindings": "http/*:80:",
                                "applicationType": "IIS"
                },
                "iis-hoge-ecb666d7": {
                                "siteName": "hoge",
                                "bindings": "http/*:80:",
                                "applicationType": "IIS"
                }
}
PS C:\Users\iwasa> app2container analyze --application-id iis-hoge-ecb666d7
√ Created artifacts folder C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7
√ Generated analysis data in C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\analysis.json
Analysis successful for application iis-hoge-ecb666d7

Next Steps:
1. View the application analysis file at C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\analysis.json.
2. Edit the application analysis file as needed.
3. Start the containerization process using this command: app2container containerize --application-id iis-hoge-ecb666d7

生成されたanalysis.jsonには現行環境を分析した結果、containerParametersには、こういうパラメータでコンテナ化することにしたよ、という情報が格納されています。
ツールで分析結果出力後に手動で設定ファイルをカスタマイズすることも可能です。

3) コンテナ化

app2container containerizeを実行することで、先程生成されたanalysis.jsonを基にコンテナイメージが作成されます。

PS C:\Users\iwasa> app2container containerize --application-id iis-hoge-ecb666d7
√ AWS prerequisite check succeeded
√ Docker prerequisite check succeeded
√ Extracted container artifacts for application
√ Dockerfile generated under C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\Artifacts
√ Generated dockerfile.update under C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\Artifacts
√ Generated deployment file at C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\deployment.json
Containerization successful. Generated docker image iis-hoge-ecb666d7

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 with "docker run --name iis-hoge-ecb666d7 -Pit iis-hoge-ecb666d7".
2. When you're ready to deploy to AWS, adjust the appropriate fields in C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\deployment.json to generate the desired deployment artifact. Note that by default "createEcsArtifacts" is set to true.
3. Generate deployment artifacts using "app2container generate app-deployment --application-id iis-hoge-ecb666d7".
Please use "docker images" to view the generated container image.

生成されたdeployment.jsonはどの環境でデプロイするかが設定されたテンプレートファイルです。

上記ドキュメントでは以下の記述がありました。

The default value that is generated for the deployTarget parameter for .NET applications running on Windows is ec2. To deploy your application to Fargate, you can edit the deployment.json file, and change that value to fargate.

上記から、ECS on Fargateでデプロイしたい場合は、明示的にdeployment.jsonにてFARGATEへ変更後デプロイ操作を行う必要があるのかと思っていたのですが、確認したらところ、構成ファイルのdeployTargetはすでにFARGATEが指定されていました。

       ...
       "ecsParameters": {
              "createEcsArtifacts": true,
              "ecsFamily": "iis-hoge-ecb666d7",
              "cpu": 2,
              "memory": 4096,
              "dockerSecurityOption": "",
              "enableCloudwatchLogging": false,
              "publicApp": true,
              "stackName": "a2c-iis-hoge-ecb666d7-ECS",
              "resourceTags": [
                     {
                            "key": "example-key",
                            "value": "example-value"
                     }
              ],
              "reuseResources": {
                     "vpcId": "",
                     "reuseExistingA2cStack": {
                            "cfnStackName": "",
                            "microserviceUrlPath": ""
                     },
                     "sshKeyPairName": "",
                     "acmCertificateArn": ""
              },
              "gMSAParameters": {
                     "domainSecretsArn": "",
                     "domainDNSName": "",
                     "domainNetBIOSName": "",
                     "createGMSA": false,
                     "gMSAName": ""
              },
              "deployTarget": "FARGATE",
              "dependentApps": []
       },
       ...

ということで、このままデプロイしてみましょう。

4) デプロイ

PS C:\Users\iwasa> app2container generate app-deployment --application-id iis-hoge-ecb666d7
√ AWS prerequisite check succeeded
√ Docker prerequisite check succeeded
√ Processing application iis-hoge-ecb666d7...
√ Created ECR repository 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/iis-hoge-ecb666d7
√ Pushed docker image 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/iis-hoge-ecb666d7:latest to ECR repository
√ Local ECS Task Definition file created
√ Uploaded CloudFormation resources to S3 Bucket: iwasa-app2container
√ Generated CloudFormation Master template at: C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\EcsDeployment\ecs-master.yml
CloudFormation templates and additional deployment artifacts generated successfully for application iis-hoge-ecb666d7

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 C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\EcsDeployment\ecs-master.yml --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND --stack-name a2c-iis-hoge-ecb666d7-ECS


3. Set up a pipeline for your application stack using app2container:

        app2container generate pipeline --application-id iis-hoge-ecb666d7

このコマンドで、コンテナはECRにプッシュされ、ECS構築用のCloudFormationが生成されます。
コンソールに従って、CloudFormationテンプレートをデプロイすれば完了です。

Webサイトにアクセスすることが出来ました。

FARGATEで起動されていますね。

やってみる(ECS on EC2)

試しにECS on EC2でもデプロイしてみます。

先程生成されたdeploy.jsonを一箇所修正してgenerate app-deploymentだけ実行しましょう。
deployTargetFARGATEからEC2に変更しています。

{
       "a2CTemplateVersion": "1.0",
       "applicationId": "iis-hoge-ecb666d7",
       "imageName": "iis-hoge-ecb666d7",
       "exposedPorts": [
              {
                     "localPort": 80,
                     "protocol": "http"
              }
       ],
       "environment": [],
       "ecrParameters": {
              "ecrRepoTag": "latest"
       },
       "ecsParameters": {
              "createEcsArtifacts": true,
              "ecsFamily": "iis-hoge-ecb666d7",
              "cpu": 2,
              "memory": 4096,
              "dockerSecurityOption": "",
              "enableCloudwatchLogging": false,
              "publicApp": true,
              "stackName": "a2c-iis-hoge-ecb666d7-ECS",
              "resourceTags": [
                     {
                            "key": "example-key",
                            "value": "example-value"
                     }
              ],
              "reuseResources": {
                     "vpcId": "",
                     "reuseExistingA2cStack": {
                            "cfnStackName": "",
                            "microserviceUrlPath": ""
                     },
                     "sshKeyPairName": "",
                     "acmCertificateArn": ""
              },
              "gMSAParameters": {
                     "domainSecretsArn": "",
                     "domainDNSName": "",
                     "domainNetBIOSName": "",
                     "createGMSA": false,
                     "gMSAName": ""
              },
              "deployTarget": "EC2",
              "dependentApps": []
       },
       ...
}

なお、今回は--deployフラグを使って、CFnスタックの作成まで自動で行ってみます。

PS C:\Users\iwasa> app2container generate app-deployment --application-id iis-hoge-ecb666d7 --deploy
√ AWS prerequisite check succeeded
√ Docker prerequisite check succeeded
√ Processing application iis-hoge-ecb666d7...
√ Created ECR repository 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/iis-hoge-ecb666d7
√ Pushed docker image 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/iis-hoge-ecb666d7:latest to ECR repository
√ Local ECS Task Definition file created
√ Uploaded CloudFormation resources to S3 Bucket: iwasa-app2container
√ Generated CloudFormation Master template at: C:\Users\iwasa\AppData\Local\app2container\iis-hoge-ecb666d7\EcsDeployment\ecs-master.yml
√ Initiated CloudFormation stack creation. This may take a few minutes. To track progress, open the AWS CloudFormation console
√ AWS CloudFormation Stack Created: https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/stackinfo?stackId=arn%3Aaws%3Acloudformation%3Aap-northeast-1%3A123456789012%3Astack%2Fa2c-iis-hoge-ecb666d7-ECS%2F3aebd000-3937-11ec-b6d9-0e74f4fc2ad3
√ Stack a2c-iis-hoge-ecb666d7-ECS deployed successfully!
Deployment successful for application iis-hoge-ecb666d7

The URL to your Load Balancer Endpoint is:
a2c-i-Publi-BKMQGH08G4J0-412305369.ap-northeast-1.elb.amazonaws.com
Successfully created ECS stack a2c-iis-hoge-ecb666d7-ECS. Check the AWS CloudFormation Console for additional details.
3. Set up a pipeline for your application stack using app2container:

        app2container generate pipeline --application-id iis-hoge-ecb666d7

今度は、CloudFormationスタックも自動作成されていますね。

起動タイプがEC2で作成されました。

注意点

AWS Fargate for Window の料金は現時点で、最低15分からの1秒単位での課金です。
また、ECS Exec、エフェメラルストレージ、FireLens、gMSAなどサポートされていない機能があります。

また、アプリケーション自信もIIS Webアプリケーションディレクトリ外のファイルやレジストリを利用するものはサポートされていませんのでこちらもご注意ください。

参考