EC2はもう古い!?ECSでコンテナ運用|研修コースに参加してみた
今回参加したコースは EC2はもう古い!?ECSでコンテナ運用 です。
いま、サーバーでアプリケーションを実行する技術として、コンテナがよく使われるようになりました。
従来のように、EC2などの上にサーバーを構築するのに比べて、必要なファイル全部をまとめてコンテナにパッケージできます。そのため、必要なソフトをひとつひとつインストールする必要がなく、インストール漏れやバージョン違いの問題を解決できると言われています。
ただし、コンテナでアプリケーションを動かすのにKubernetesを使うことがありますが、自分でKubernetesを構築して運用するのは大変です。
そこでこのコースでは、AWSのコンテナオーケストレーションサービス Amazon ECS と、ECSを簡単に使えるようにする AWS Fargate を使って、マネージドサービスでコンテナを動かす方法を学びます。
ハンズオン形式で、実際にAWSのコンソールを操作し、ほかのAWSサービスと組み合わせて、コンテナによりサーバーアプリケーションを実行する方法を体験します。
では、どのような内容だったのか、レポートします。
もくじ
コース情報
想定している受講者 |
|
---|---|
受講目標 |
|
講師紹介
このコースで登壇されたのは 大澤文孝 さんです。
テクニカルライター/プログラマー、情報処理資格としてセキュリティスペシャリスト、ネットワークスペシャリストを取得。
Web システムの設計・開発とともに、長年の執筆活動のなかで、電子工作、 Web システム、プログラミング、データベースシステム、パブリッククラウドに関する書籍を多数執筆している。
-
主な著書
- 「 AWS ネットワーク入門 第 2 版」(インプレス 刊)
- 「 AWS Lambda 実践ガイド 第 2 版」(日経 BP 社 刊)
- 「 Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂 3 版」(共著 日経 BP 社 刊)
- 「ハンズオンで分かりやすく学べる Google Cloud 実践活用術 AI・機械学習編 Google 監修」(日経 BP 社 刊)
- 「ゼロからわかる Amazon Web Services 超入門 はじめてのクラウド」(技術評論社 刊) など
コンテナってなに?
まずはコンテナって何でしょうか。
- サーバーの中で プロセスを隔離して実行 できる仕組み
- コンテナランタイム 上で動く
- Linux環境 で動く
隔離するというところが、輸送のコンテナと共通しているのですね。
- 外部から直接アクセスできない
- 必要に応じて最低限の穴を開ける
- ファイルシステムをマウント
- 通信でポートのマッピング設定
また、コンテナはポータビリティも輸送のコンテナと共通していそうです。
- コンテナを開発して イメージ 化
- イメージを展開してコンテナを起動
これによって、実行環境へのコピー漏れやバージョン違いとかの心配がなくなるのがメリットとのことでした。このへんが、講座タイトルの「EC2はもう古い」の意味のひとつだそうです。
コンテナのポイントをまとめます。
- データは基本的にコンテナの外に出すのが基本
- 2つの方法
- バインドマウント
- ボリュームマウント
- コンテナを削除すると保存しておいたデータは消える
- 残しておきたいデータは外に置く
- 外に出しておくとコンテナの削除や差し替えが用意
- 2つの方法
- コンテナイメージ
- 開発者が作るってホストに直接コピーすることもできるが、多くの場合はそうしない
- コンテナレジストリに登録する
- それにより
- 複数台への展開が容易
- 問題があったとき、過去バージョンへの切り替えも容易
- 自分たち専用もあるが、パブリックなレジストリもある
- 代表:Docker Hub
- そのほか、AWSではECR(Elastic Container Registry)
- プライベートなネットワークにあるとDocker Hubにアクセスできなかったりするので、そんなときはECR
- それにより
- コンテナイメージを実行するときに環境ごとに違う設定をしたい
- 多くの場合、環境変数で設定するのが慣例
- 設定ファイルで設定する場合もある
- イメージにはバージョン番号などが タグ として付いている
- コンテナイメージは改良して動かすこともできる
- 追加して実行したいコマンド、コピーして入れ込みたいファイルなど
コンテナを使わない場合と比べて、構成もワークフローも大きく変わりそうです。
実行エンジンとオーケストレーションツール
実行サーバーのハードウェアからコンテナエンジンまで保守運用するのは、意外と面倒なので、誰かにまかせられるならまかせたいところです。
このコースではAWSの AWS Fargate を使います。
- コンテナエンジンがインストールされた環境
- 従量課金制
- 無料枠はないので注意
- メンテナンスフリーで使える
Fargateは単体では使えず、オーケストレーションサービスと組み合わせる必要があります。
- Amazon ECS
- AWS独自のサービス。シンプルで習得コストが低い
- ECS自体は無料。Fargateの料金はかかる
- Amazon EKS
- Kubernetesにもとづくコンテナオーケストレーションサービス
- 高機能だが複雑
- EKS自体の運用費用がかかる
このコースではECSを使います。ECSやFargateの作業の流れは次のようになります。
- ECSでタスク定義を書いて、クラスターに登録
- タスク定義からFargateインスタンスでコンテナが実行される
- タスク定義でサービスを削除するとインスタンスも消える
- VPCやサブネットはあらかじめ作っておく必要がある
タスク定義……なにやら謎めいていますが、やってみることにしましょう。
ハンズオン① Apache
ここからハンズオンに入ります。最初のお題では、Apache WebサーバーのコンテナをECSで起動します。
構成は次のとおりです。
- VPCとサブネットを作る
- インターネットからアクセスできるようインターネットゲートウェイも用意
- ECSでクラスターを作成
- 実行環境や利用コンテナをタスク定義で定義
- それをサービスに登録
VPCとインターネットゲートウェイの構築は、AWSを使っている人ならいつものとおりです。ここではVPCの名前は「ecstest」などとしておきます。
このパブリックサブネットでApacheのコンテナを動かします。
- クラスターの作成
- ECSのメニューから「クラスターの作成」を実行するだけ
- クラスター名:ここでは仮に「ExampleCluster」
- インフラストラクチャ:AWS Fargate
- ちなみに裏でCloudFormationが動いてクラスターを作成する
- ECSのメニューから「クラスターの作成」を実行するだけ
- タスク定義
- 実体は以下のことを定義したJSONファイル
- どんな構成のコンピュータで
- どのようなIAMロールで
- どのイメージのコンテナをどう動かすか(コンテナの数だけタスクを定義)
- どんなストレージを使うか(オプション)
- ECSの「タスク定義」で「新しいタスク定義の作成」
- タスク名:ここでは仮に「apache-task」
- 起動タイプ:AWS Fargate
- コンテナの詳細:
- 名前:ここではapache
- イメージURI:httpd:2.4(Docker Hub上)
- ポートマッピング:80番ポート
- 実体は以下のことを定義したJSONファイル
- サービスとしてデプロイ
- タスク側から操作する方法とクラスタ側から操作する方法がある
- どちらでもいいが、ここではクラスター側から
- 「サービス作成」を実行
- コンピューティング設定:起動タイプ
- 起動タイプ:Fargate
- デプロイ設定:サービス
- タスク定義:さきほど定義した「apache-task」
- サービス名:ここでは仮に「apache-service」とする
- サービスタイプ:レプリカ
- ネットワーキング:
- VPC:ecstest-vpc
- セキュリティグループ:
- ポート80をあける
- セキュリティグループ:ここでは仮に「httpd-sg」とする
- HTTPの ソース:Anywhere
- パブリックIP:オン
- タスク側から操作する方法とクラスタ側から操作する方法がある
これでデプロイが実行されます。まずは、クラスターの作成、タスク定義、デプロイ、という流れを覚えておかなくちゃ。
デプロイされたサービスの起動をクラスタ画面から確認します。
- サービスが「アクティブ」になっていることを確認
- 「タスク」のところで実行されているタスクが表示される
- タスクをクリックすると詳細が見える
- 「パブリックIP」の表示を見る
このIPアドレスにWebブラウザーでアクセスすると、Apacheのデフォルトメッセージが表示されます。動いてました!
終了の方法はいくつかあります。
- コンテナを0にする
- サービスの設定から
- 増やせば復活する
- 復活したタスクは先程とは別の新しいコンテナなので注意
- サービスを削除する
- サービス一覧から「サービスを削除」
コンテナの数を0にすると止まる、というのがコンテナオーケストレーションっぽいですね。
ハンズオン② Apache+マウント
次のお題は、前のお題の発展形で、Apacheから自分のコンテンツを表示するものです。
まず、そのコンテンツをどこに置くか考えます。
- 最初に学んだように、データは基本的にコンテナの外に出すのが基本
- いくつか方法はありますが、ここではAmazon EFS(Elastic File System)をマウントする
- 作業用EC2インスタンスからもマウントして書き込む
- この構成の注意点
- セキュリティグループでTCPポート2049へのアクセスを許可する必要
- 今回は簡単な方法で解決する
- defaultセキュリティグループが設定されたものどうしは全通信ができる
- defaultは誰でもアクセスするため、セキュリティには配慮していない。あくまで実習用
- 本当は新しいセキュリティを作って設定する
AWSをうまく使うには、目的を果たすためにどんなサービスが使えて、そのために何に注意するかの知識が必要ですね。
EFSファイルシステムを作る
では、EFSファイルシステムを作ります。
- 「Elastic File System」から「ファイルの作成」
- 設定するのは2項目のみ
- 名前:ここでは「webcontents」とする
- VPC:ecstest-vpc
簡単ですね。
作業用EC2インスタンスを作ってコンテンツを置く
これをマウントする作業用EC2インスタンスを作ります。普通にEC2インスタンスを作ります。
- 名前:ここでは「operate-ec2」とする
- マシンイメージ:Amazon Linux 2023 AMIの
- ネットワーク:EFSを置いたVPCで、sshで接続するのでパブリックなサブネット
このEC2インスタンスにdefaultセキュリティグループを適用しておきます。
続いてコンテンツを作成します。
EC2インスタンスにログインして、まずはEFSユーティリティをインストールします。
$ sudo yum install -y amazon-efs-utils
EFSファイルシステムをマウントします。EFSの「アタッチ」ボタンから表示される説明文でマウント方法がわかります。マウントポイントは/efsとします。
$ sudo mkdir /efs
$ sudo mount -t efs -o tls <名前>:/ efs
マウントした/efsにファイルを置いていきます。たとえばテキストエディタで次のような内容を/efs/index.htmlに書き込みます。
<html>
<body>
Hello My Contents.
</body>
</html>
だいたい普通のLinuxサーバーと同じですね。
ECSでマウント
このEFSをECS側からもマウントします。
- 既存タスクを変更する
- マウントする設定を追加
- 「ストレージ」の「ボリューム」
- ボリューム名:ここでは「webcontents-volume」
- コンテナマウントポイント:
- コンテナ:apache
- ソースボリューム:webcontents-volume
- コンテナパス/usr/local/apache2/htdocs
これをデプロイすればいいのですが、このままではサービスにdefaultセキュリティグループが設定されておらず、後からは設定できないという問題があります。
そこでサービスを作り直します。前と同じ手順で、サービス名をここでは「apache-searvice2」として、セキュリティグループでdefaultとhttpd-sgの2つを追加します。
これでデプロイしたら、パブリックIPを確認してWebブラウザーでアクセスすると、「Heloo My Containers」と表示されます。
コンテンツを変更してみましょう。作業用インスタンスで/efs/index.htmlを編集してWebブラウザーでリロードすると、変更が反映されます。EC2とECSで同じEFS上のコンテンツを参照していることが確認できました。
ハンズオン③ 冗長構成
次のお題として、Apacheの前段にAWSのALB(Application Load Balancer)を付けて冗長構成で動かします。
注意点として、プライベートIPの問題があります。
- ALB配下のサーバーはパブリックIPは必要ない
- しかしIPアドレスを割り当てないとインターネットに接続できずDocker Hubからイメージの取得ができない
- ここでは、Fargateインスタンスに直接パブリックIPを割り当てる
ではやってみます。
- サービスを新規作成
- 基本的な設定は同じ
- name:ここでは「apache-service03」とする
- ネットワークでVPCのパブリックのものを選ぶ
- セキュリティグループはdefaultとhttpd-sg
- パブリックIPはオン
- 「ロードバランシング-オプション」でロードバランサーを設定
- 新しいロードバランサーを作る
- ロードバランサー名:ここでは「web-alb」とする
- ロードバランス用のコンテナ:apache 80:80
- 新しいターゲットグループを作成
これでFargateインスタンス1つの前にALBが置かれた構成が作られます。少し時間がかかりました。
できあがってサービスを見ると「ロードバランサーを表示」ボタンができていて、クリックするとロードバランサーの状態を表示できます。その中にある「DNS名」を使って、Webブラウザーからアクセスすると、Apacheのコンテンツが表示されます。
後始末
FargateやALBは有料サービスなので、実行しっぱなしではもったいないですね。最後に後始末をしましょう。
- ECSサービスの削除
- サービスを選んで「サービスを削除」
- EFSの削除
- 選んで「削除」
- EC2の削除
- インスタンスを選んで「インスタンスを終了」
- VPCも削除
まとめ
以上、FargateとECSでコンテナを実行するところを体験しました。
Fargateを使うと、タスク定義でコンテナのイメージを指定すれば動いて楽でした。コンテナエンジンやサーバーの管理もいりません。そのかわり、AWSのサービスとその組み合わせ方について慣れる必要があると感じました。
SEカレッジでは、コンテナ関連やAWS関連のコースがいろいろあります。コンテナやAWSについて、スキルを高めていきましょう。