【やってみた】Amazon ECS(Fargate)を使ってみた

AWS

2022.12.15

Topics

はじめに

こんにちは、yasujunです。
Amazon ECSというコンテナ管理サービスを使ってWebコンテナのデプロイを試してみました。また、ECSの起動オプションであるEC2とECS(Fargate)について解説します。さらには、ECS(Fargate)とサーバー管理不要とコンテナを使ったデプロイ可能な共通点を持つLambdaの説明と、その使い分けについて解説します。

ECS(EC2)とは?

EC2インスタンスを用いたDockerコンテナでデプロイする仕組みです。
EC2で起動するため、OSのメンテナンスは自身で受け持つ必要がありますが、EC2に接続できるのとコンテナにbashが使えるという利点があります。
また、OSのメンテナンス以外にもDockerイメージ内のライブラリの脆弱性はこちら側で管理するため、気を付ける必要があります。

ECS(Fargate)とは?

AWSが管理するホストマシン上にコンテナを実行できる環境です。
ホストマシンはAWSで管理するためOSのメンテナンスはAWS側で行うため、利用者が意識する点はアプリケーションとコンテナのスケールのみという利点があります。
ただ、ECS(EC2)と同様にDockerイメージ内のライブラリの脆弱性はこちら側で管理するため、気を付ける必要があります。
サーバーレスでコンテナをデプロイできるサービスです。

Lambdaとは?

Lambdaはサーバーをプロビジョニングしたり管理しなくてもプログラミングコードを実行できるコンピューティングサービスです。
こちらもECS(Fargate)と同様にホストマシンのメンテナンスはAWSで実施するため、利用者が意識する点はプログラミングコードのみという利点があります。
いわゆるFaaS(Function as a Service)というやつです。

ECS(Fargate)とLambdaの使いわけ

ECS(Fargate)の使用が向いているユースケース

・ARMコアやGPUを使いたい場合
・メモリが10GB以上必要な場合
・ステートフル処理の場合
・開発言語をLambdaで縛られたくないとき

Lambdaの使用が向いているユースケース

・実行時間が15分未満で、10GB以下のメモリで収まる処理
・CPU処理のみを必要とする場合
・ステートレス処理の場合

実際に作ってみる

事前に用意しておくもの


・インターネットに出れるパブリックサブネットを持ったVPCの作成
・ECS(Fargate)で使うWebコンテナ用の80番ポートが空いたセキュリティグループの作成

今回作成する構成

ECS(Fargate)を使ってWebコンテナをデプロイするまでの流れ

  1. ECR用のIAMユーザー作成
  2. 手元のCLI環境にIAMユーザーを登録する
  3. ECRからプライベートリポジトリを作成
  4. 作成したプライベートリポジトリへ手元のDockerイメージをプッシュする
  5. ECSの画面からクラスターを作成
  6. タスク定義を作成
  7. サービスを作成
  8. Webページを確認

1. ECR用のIAMユーザー作成


IAMの画面から「ユーザー」を選択し、「ユーザーを追加」を選択する。
 


ユーザーを追加の画面からユーザー名を入力し、「アクセスキー、プログラムによるアクセス」にチェックを入れる。
 


アクセス許可の設定から「既存のポリシーを直接アタッチ」を選択し、ポリシーのフィルターに、「AmazonEC2ContainerRegistryFullAccess」を入力し検索する。
フィルタされた「AmazonEC2ContainerRegistryFullAccess」にチェックを入れて、「次のステップ:タグ」を選択する。
 


タグの追加(オプション)はお好みでタグをつけて、「次のステップ:確認」を選択する(タグはつけなくても次に進める)。
 


設定情報を確認し、「ユーザーの作成」を選択する。
 


作成の際に出てくる「アクセスキーID」と「シークレットアクセスキー」は必ず控えておく。

2. 手元のCLI環境にIAMユーザーを登録する。

手元にCLI環境を用意し、awsコマンドが使えるようにする。
(当記事ではLinuxを使ったセットアップを実施する)
当環境外のCLIを使用される際には下記を参照してインストールする。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

下記コマンドを実行し、AWSCLIが利用できるようにする。

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

$ unzip -u awscliv2.zip

$ sudo ./aws/install

$ ./aws/install -i /usr/local/aws-cli -b /usr/local/bin

$ aws --version

$ aws configure
AWS Access Key ID [None]:[アクセスキーを入力]
AWS Secret Access Key [None]:[シークレットキーを入力]

3. ECRからプライベートリポジトリを作成する

 


ECRの画面から「リポジトリを作成」を選択する。
 


一般設定の可視性設定から「プライベート」を選択し「リポジトリ名」を入力する。
 


「リポジトリを作成」を選択する。
 

4. 作成したプライベートリポジトリへ手元のDockerイメージをプッシュする。

 


作成したプライベートリポジトリを選択し、「プッシュコマンドの表示」を選択する。
 


ポップアップされたコマンド通りに手元のCLI環境からコマンドを実行する。
 

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

$ docker build -t yasujun .

$ docker tag yasujun:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/yasujun:latest

$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/yasujun:latest

 

リポジトリにイメージがプッシュされたことを確認する。
リポジトリ内のイメージのURIをコピーする。

5. ECSの画面からクラスターを作成

 


ECSのクラスターの画面から「クラスターの作成」を選択。
 


クラスターテンプレートの選択から「ネットワーキングのみ」を選択し、「次のステップ」を選択。
 


クラスターの設定から「クラスター名」を入力し「作成」を選択。

6. タスク定義を作成

 


ECSのタスク定義の画面から「新しいタスク定義の作成」を選択。
 


起動タイプの互換性の選択から「Fargate」を選択し、「次のステップ」を選択。
 


タスクとコンテナの定義の設定から「タスク定義名」を入力。
※タスクロールは他のAWSと連携する際に設定する(今回は連携させないためなしでOK)
オペレーティングシステムファミリーを「Linux」に選択。
タスク実行ロールは「新しいロールの作成」を選択。
※タスク実行ロールはECSコンテナエージェントが利用するIAMロール(ECRからイメージをプルするときに使う)
 


「タスクサイズ」はお好みで調整し「コンテナの追加」を選択。
 


「コンテナ名」を入力し、「イメージ」に手順4でコピーしたイメージのURIを張り付ける。
「ポートマップ」を80と入力し「追加」を選択。
 


「作成」を選択する。

7. サービスを作成

 


クラスターの画面から、サービスを「作成」を選択。
 


サービスの作成の「起動タイプ」をFARGATEに選択。
オペレーティングシステムファミリーをLinuxに選択。
 



「サービス名」を入力し「タスクの数」は1に設定。
「最小ヘルス率」を100にし「最大率」を200にして「次のステップ」を選択。
 


「クラスターVPC」は事前に作成したパブリックサブネットを保有するVPCに選択し、「サブネット」はインターネットに出れるパブリックサブネットのものを選択。
「パブリックIPの自動割り当て」はEnableを選択。
 



今回はALBなしの構成のため、「次のステップ」を選択。
 


AutoScalingは「サービスの必要数を直接調整しない」を選択し、「次のステップ」を選択。
 


「サービスの作成」を選択する。

8. Webページを確認

 


無事にubuntu/apache2コンテナのデフォルトページが表示されました!

最後に

今回はECS(Fargate)を簡単な構成でWebコンテナをデプロイしてみました。
ALBやスケーリング等、冗長性を組んだ構成は次々回あたりに作成予定の、「【やってみた】Amazon ECS(EC2)を使ってみた」にて執筆しようかと思います。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

yasujun

インフラの勉強と趣味の武道をバランス良く両立していきたいエンジニアです。 よろしくお願いいたします!

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら