こんにちは、クラウドインテグレーション2部 技術1課 宮形 です。
私の住む地方にも春が来ました。家の前が公園なので、毎日お昼休憩に「お花見」が出来る贅沢な環境です。近所の癒しスポットでお手軽に気分転換ができる、これもクラウドワークスタイルの魅力かもしれませんね。
前回BLOGでは Windows コンテナ検証を EC2 上で行いましたが、今回BLOGでは本番環境に見立ててWindowsコンテナアプリケーションを AWS の ECS 上で動かしていきます。
↓前回BLOGはコチラ blog.serverworks.co.jp
アプリケーション開発の経験無い、インフラエンジニア視点での文章となります。専門の方がみてお見苦しい表現があるかもしれません。ご了承ください。
ECR へのコンテナイメージPUSH
前回BLOGで作成したオリジナルHTMLコンテンツを有するIISのWindowsコンテナを、AWS上のレジストリサービス ECR (Amazon Elastic Container Registry)にPUSH(アップロード)します。
AWSマネージメントコンソールより ECSコンソールへ推移し、「Amazon ECR」-「リポジトリ」を選択します。
Amazon ECR 管理画面となります。サイドメニューより「Repositories」を選択します。「Private」タブを選択し、「リポジトリを作成」をクリックします。
「リポジトリを作成」の画面が表示されます。「可視性設定」は「プライベート」とします。「リポジトリ名」は docker build コマンドで指定した「イメージ名」と同じ名前を付けます。 画面下部へスクロールして「リポジトリの作成」をクリックします。
リポジトリが作成されました。選択された状態で「プッシュコマンドの表示」をクリックします。
「(リポジトリ名)のプッシュコマンド」の画面が表示されます。Dockerで作成したコンテナイメージを ECR へ PUSH するコマンド例が表示されます。 今回検証はWindows コンテナなので「Windows タブ」を選択します。「1. 認証トークンを取得し、レジストリに対して Docker クライアントを認証します」のコマンドをコピーして控えておきます。
前回ブログで オリジナルHTMLコンテンツを含むコンテナイメージを builde,run していたEC2上から PUSH を行います。 Windows Server のEC2なので、AWS Tools for PowerShell が初期状態で利用可能です。検証では AdministratorAccess 権限を有するIAMユーザーのアクセスキー、シークレットキーでAWS認証して行いました。
Import-Module AWSPowerShell Set-AWSCredentials -AccessKey XXXX(アクセスキー)XXXX -SecretKey XXXX(シークレットキー)XXXX -StoreAs myga-aws Set-DefaultAWSRegion -Region ap-northeast-1 Set-AWSCredential -ProfileName myga-aws
先ほどコピーしておいたコマンドを実行します。
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin XXX(AWSアカウントID)XXX.dkr.ecr.ap-northeast-1.amazonaws.com
ローカルのDockerイメージにタグ付けを行います。
docker tag myga-iis-test:latest XXX(AWSアカウントID)XXX.dkr.ecr.ap-northeast-1.amazonaws.com/myga-iis-test:latest
Docker Push コマンドを実行します。
docker push XXX(AWSアカウントID)XXX.dkr.ecr.ap-northeast-1.amazonaws.com/myga-iis-test:latest
成功すると、AWSマネージメントコンソールの ECR にイメージが Push (アップロード) されたことが確認できます。
ECS のセットアップ
続けて、Dockerコンテナを実行する AWSリソースとなる、ECS をセットアップします。検証目的なので、最低限の設定となります。
ECS クラスターの作成
AWSマネージメントコンソールより ECSコンソールへ推移し、「クラスター」-「クラスターの作成」をクリックします。
「クラスターテンプレートの選択」で「EC2 Windows + ネットワーキング」を選択します。「次のステップ」をクリックします。
「クラスターの設定」の画面となります。最低限の設定とします。気を付けた点としては下記にになります。
- EC2 AMI ID はコンテナイメージを作成したOSと同じとした。 (本例では Windows Server 2019 AMI)
- VPC、サブネット、セキュリティグループはインターネットが接続できる環境を選択・設定する。パブリックサブネットの場合は「パブリックIPの自動割り当て:有効」とする。
「作成」をクリックします。しばらく待つと全てステータスがグリーンとなります。
コンテナを実行させる EC2 が自動的に作成されています。
しばらく待つと、ECSクラスターの「ECS インスタンス」タブに、EC2が表示されます。
表示されない場合、何か設定が間違っている可能性があります。私が躓いたのは、EC2がインターネット接続が出来ない設定で進めてしまった為、いつまで待っても表示されない状態に陥りしました。
タスク定義の作成
続けてタスク定義を設定します。ECSコンソールより「タスク定義」-「新しいテスク定義の作成」をクリックします。
「起動タイプの互換性の選択」の画面が表示されます。「EC2」を選択します。「次のステップ」をクリックします。
「タスクとコンテナの定義の設定」の画面が表示されます。こちらも最低限の設定となります。画面中ほどへスクロールすると「コンテナの追加」ボタンがあるのでクリックします。
別ウインドウとなり「コンテナの追加」の画面が表示されます。「コンテナ名」には任意の名前を設定します。「イメージ」には、先ほどPUSHしたECRのリポジトリURIをコピーしてペーストします。 「ポートマッピング」は TCP8080→TCP80 と変換する設定としました。
画面中ほどに「CPUユニット数」という箇所があるので、私は 1024 と設定しました。
ここが未設定だとゼロになってしまうようで、私の検証では後続のタスク動作が行えないトラブルに見舞われました。
今回は最低限の設定なので他はデフォルトとし、「追加」をクリックします。
ひとつ前の画面に戻ります。画面下部へスクロールして「作成」をクリックします。
サービスの作成
ECSコンソールより「クラスター」-「対象クラスターを選択」-「サービス」タブ-「作成」ボタンをクリックします。
「サービスの設定」の画面が表示されます。「起動タイプ:EC2」を選択します。「タスク定義」では、先ほど作成したタスク定義(本例では:myga-ecs-taskdef) を選択します。 「クラスター」は先ほど作成したクラスター名(本例では:myga-ecs-win) が表示されていることを確認します。「サービス名」は任意の名前を設定します。「タスクの数」は 1とします。
最低限の設定であれば、他はデフォルトで大丈夫です。「次のステップ」で画面を進めて、「サービスの作成」をクリックします。
完了の画面が表示されます。タスク定義に基づいて、Dockerコンテナアプリケーションのデプロイが開始されます。「サービスの表示」をクリックします。
「タスク」タブを開きます。設定したタスク定義が起動する準備状態となります。しばらくして、「前回のステータス」が PENDING から RUNNING へ変われば、デプロイは成功です。
イメージサイズにもよると思いますが、10分程度たっても RUNNING に変わらない場合は、トラブルシューティングをした方がよいです。「イベント」タブや「デプロイメント」タブを開いて、エラーが出ていないか確認します。
コンテナアプリケーションの動作確認
ここまで正常に進んでいれば、Dockerコンテナアプリケーションが ECS 上にデプロイされ利用可能となります。「タスク」の英数字羅列をクリックします。
タスクの詳細画面が表示されます。画面中ほどへスクロールすると、「外部リンク」として「グローバルIPアドレス:8080」が表示されています。 コンテナを実行する EC2 がアクセス可能であれば、「外部リンク」をクリックすると、Dockerコンテナアプリケーションが表示されます。
私のオリジナルコンテンツを含むWindowsコンテナアプリケーションも、無事動作確認ができました。
まとめ
今回の検証で参考にした AWS 公式ドキュメントとして下記になります。
Getting started with Windows containers using the classic console - Amazon Elastic Container Service
この例では ECR は使わず、タスク定義をJSONで記載している違いがあります。 試してみると簡単に動作確認できましたので、一度経験しておくとよいかもしれません。
今回BLOGの検証は、私の未経験領域が多くトライ&エラーくりかえしに時間を要しましたが、コンテナアプリケーションのレジストリPUSH・タスク定義(デプロイ)の一連流れを知れたので、とてもよい経験になりました。今回は動かすことで精一杯でしたが、次回は IIS アクセスログ、管理方法、ユースケースなど踏み込んで検証し、理解を深めていきたいと思います。ご覧いただいた方の、システム検討の参考になれば幸いです。