AWS ECSの使い方
『IT自動化の力でビジネス加速を全ての企業に』
”IT自動化の専門会社”、リアルグローブ・オートメーティッド(RGA)の技術ブログ編集部の水谷です。本日もRGAの技師がまとめた技術情報を読者の皆様にお届けしていきます!
コンテナ技術は、使い始めると様々その便利さを体感いただけますが、一方で、管理するコンテナの規模が大きくなると、どのようにマネージするのが望ましいか、どうすればより効率的に運用できるか、ということが最適な運用を行う上で重要になってきます。
RGAでは、コンテナ基盤の導入構築支援と合わせて、複数あるコンテナのマネージドサービス選定に関するアドバイスも行っています。今回はそんなコンテナマネージメントツールの中からAmazon ECSに関する記事をお届けします。
――――――――――――――――――――――――――――――――――
Amazon ECSとは
まず、Amazon ECS (Amazon Elastic Container Service) とはそもそも何なのか? 簡単に書くと、これはコンテナ管理サービスの1つで、 クラスタ上のコンテナを簡単に実行、停止、管理できるもの。
大きな特徴の1つとしては、実行にはEC2とFargateの2つの実行タイプがあることが挙げられる。これについては、それぞれの特徴を後ほど説明する。
タスク定義
ECSでコンテナを動かす時には、「タスク」という単位でコンテナを実行する。このためには、まずタスク定義を登録して、タスクのリソース使用量や、タスクで実行するdockerコンテナの情報などを決める必要がある。
タスク定義の登録は、AWSの管理画面からも行えるが、入力項目が多く結局は直接JSONを登録する方がやりやすいため、terraformなどでコード化した方が良いと感じた。
1つのタスクが複数のコンテナを起動できるので、例えばwebアプリ用のタスクでnginx + API + redisの3コンテナを起動するようなことも可能である。
また、Dockerイメージはプライベートレジストリも使用可能だが、ECR(Amazon Elastic Container Registry)を使うほうが便利である。なぜなら、タスク実行のIAMロールに適切なポリシーを付与していれば、自動で認証してくれるのである。それ以外の場合は、AWS Secrets Managerに認証情報を登録しておいて、タスク定義でその認証情報を指定する必要がある。
ちなみに以前はswapは使えなかったが、今は使えるようになっている。
サービスとタスク
ECSで何かを動かす時には、「タスクを実行する」と「サービスを登録する」という2つの方法があるので、その違いを見ていく。
「タスクを実行する」は、その言葉通りで、タスク定義で登録したタスクを1度だけ実行するもの。ジョブの実行とかはこれを使うことになる。
一方「サービスを登録する」は、タスク定義で登録したタスクを実行して、停止していたら再起動してくれるもの。webサーバーなどのデーモンを実行する場合はこちらを使うことになる。
FARGATEとEC2
タスクやサービスの起動タイプにFARGATEかEC2のどちらかを選択する。EC2を使う場合はあらかじめEC2インスタンスを作成し、それをクラスターに登録しておく。そして、タスクを実行する際には、登録されたインスタンス上にECSが自動でタスクを配置し、実行するようになっている。
クラスターへの登録はECS管理画面からではなく「EC2をコンテナ用AMIで作成する + /etc/ecs/ecs.configにECS_CLUSTER=クラスタ名を書き込む」という方法で行う。これはドキュメントなどを見ながら行わないと、なかなか難しい。
FARGATEを使う場合には、EC2インスタンスのことは特に考える必要がない。というのも、EC2タイプで実行する場合はインスタンスの生成や分散といったリソースの管理を自分で行う必要があるが、FARGATEはそれらを自動で行ってくれるのだ。
webサーバーなどの常時起動するコンテナについては、EC2タイプで実行する方がコストは抑えられる。一方で、1時間に1回定期実行されるジョブなどは、ジョブ用にインスタンスを用意してEC2で実行するよりも従量課金のFARGATEで実行した方がコスト的にはメリットがあるだろう。
セキュリティグループ
最後にセキュリティについても触れておく。Amazon ECSでサービスの登録時やタスクの実行時に、コンテナ内のタスクに適用されるセキュリティグループを設定する。
ここで重要な点は、起動タイプにEC2を選択した場合でも、EC2インスタンスに対するセキュリティグループとタスクに対するセキュリティグループは別だということである。
非常に紛らわしいが、たとえば外部からEC2にSSH接続する際にはEC2のセキュリティグループが適用され、EC2内部からdocker execで起動したコンテナ内ではサービスやタスクに設定したセキュリティグループが適用される、ということだ。
なので「EC2でセキュリティグループ設定してるからサービスのセキュリティグループは特に何もしないでいいだろう」などと思って適当な設定にしてしまうと、EC2からはDBに接続できるのにコンテナからは接続できない、みたいな事態になってしまうので注意が必要だ。
――――――――――――――――――――――――――――――――――
執筆者プロフィール:奥 翔治郎
東京大学理学部情報科学科卒
主にwebアプリの開発・運用業務を通じて、クラウドサービス上での環境構築やデプロイの自動化を経験。
現在はリアルグローブ・オートメーティッドにて、インフラ構築の自動化やCI/CDのコンサルタントとして業務に従事。
【ご案内】
ITシステム開発やITインフラ運用の効率化、高速化、品質向上、その他、情シス部門の働き方改革など、IT自動化導入がもたらすメリットは様々ございます。
IT業務の自動化にご興味・ご関心ございましたら、まずは一度、IT自動化の専門家リアルグローブ・オートメーティッド(RGA)にご相談ください!
お問合せは以下の窓口までお願いいたします。
【お問い合わせ窓口】
株式会社リアルグローブ・オートメーティッド
代表窓口:info@rg-automated.jp
URL:https://rg-automated.jp