バナー画像

AWS ECS(Amazon Elastic Container Service)は、Amazonでdocker技術を使ってコンテナを実行するためのサービスです。

AWSのdocker実行はAmazon ECS コンテナアプリケーションをAWS環境で起動

Amazon ECSは、コンテナを起動するサービスです。AWS Fargateが組み込まれていて、デフォルトでサーバーレスでのコンテナアプリケーション実行が可能です。サーバーの管理や容量計画、安全性についてもAWSに任せることができるので使い勝手が良いです。

【関連記事】
AWSのFargateは、サーバーレスでコンテナを実行/EC2アプリのコンテナ化の方法

サーバーレス実行はコスト面で有利ですが、サーバー終了時にデータも消失してしまいます。永続的なデータの保存が必要な場合は、EC2インスタンスとEBSを使ってコンテナを実行することもできます。

Amazon ECSの料金

Fargate起動タイプモデルと、EC2起動タイプモデルとで料金が異なります。

Fargate 起動タイプモデルでは、コンテナアプリケーション用の vCPU とメモリに料金が発生。コンテナイメージ取得時点から、 Amazon ECS タスク終了までが課金対象となり、秒単位で切り上げられます。最低料金は1分です。

EC2 起動タイプモデルでは、ECS使用のための追加料金は発生しません。用意したEC2インスタンスやEBSボリュームについてのみ料金が発生します。支払いは実際に使用した分だけで、最低料金や初期費用は不要です。

関連)料金 – Amazon ECS | AWS

Amazon ECSの使い方

AWSマネジメントコンソールまたは、ECS CLIからAmazon ECSの設定が可能です。

【関連記事】
AWSを集中管理したい!AWS マネジメントコンソールを使いこなそう!

マネジメントコンソールから、Amazon ECSの画面を開くと、「クラスターテンプレートの選択」画面が表示されます。

関連)Amazon ECS

テンプレートは、初期導入を簡単にするためのもので、あとからその他の設定などの追加することが可能です。

「ネットワーキングのみ」(Fargateによるサーバーレス実行)「EC2 Linux + ネットワーキング」「EC2 Windows + ネットワーキング」が選択可能です。

「ネットワーキングのみ」で作成するリソースは、クラスター、VPC(オプション)、サブネット(オプション)。AWS FargateかExternalインスタンスキャパシティーのいずれかで使用。

「EC2 Linux+ネットワーキング」「EC2 Windows+ネットワーキング」は、オペレーティング・システムがLinuxかWindowsかの違いはありますが、どちらも作成するリソースは、クラスター、VPC、サブネット。Linux AMI または、WindowsAMIを持つ Auto Scaling グループを作成します。

続いて、作成するクラスターの情報を設定します。以下はテンプレートで「ネットワーキングのみ」を選んだ場合の例です。

クラスター名、ネットワーキングでVPCを作成するかどうか、Tagsではタグを付与できます。タグはアクセス許可などの際に利用されます。CloudWatch Container Insightsは、コンテナアプリケーションの監視サービスです。

CloudWatch Container Insights はコンテナ化されたアプリケーションとマイクロサービス用のモニタリングおよびトラブルシューティングソリューションです。CPU、メモリ、ディスク、ネットワークなどの計算使用率や、コンテナー再始動失敗などの診断情報を、収集、集約、要約してクラスターの問題を切り分け、迅速に解決します。

引用:Amazon ECS CloudWatch Container Insights – Amazon Elastic Container Service

ECS CLIで、Fargateタスクのコンテナクラスターを作成する

AWS ECSには、ECS CLIというコマンドラインインタフェースが用意されています。awsからバイナリをダウンロードしてインストールします。Windows用、Mac用、Linux用が用意されています。

参考)Amazon ECS CLI のインストール – Amazon Elastic Container Service

設定には、AWS CLIを併用します。

【関連記事】
AWS CLIのインストール方法 AWSアクセスキーの登録と疎通確認

IAMのタスク実行ロールを作成するために、以下の内容でtask-execution-assume-role.jsonというファイルを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

作成したJSONファイルを使ってロールを作成します。

# タスク実行ロールを作成
aws iam --region us-west-2 create-role --role-name ecsTaskExecutionRole --assume-role-policy-document file://task-execution-assume-role.json
# タスク実行ロールのポリシーをアタッチ
aws iam --region us-west-2 attach-role-policy --role-name ecsTaskExecutionRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

続いて、Amazon ECS CLIを設定します。

#クラスター設定を作成
ecs-cli configure --cluster tutorial --default-launch-type FARGATE --config-name tutorial --region us-west-2
#アクセスキーとシークレットキーでCLIプロファイルを作成
ecs-cli configure profile --access-key AWS_ACCESS_KEY_ID --secret-key AWS_SECRET_ACCESS_KEY --profile-name tutorial-profile

クラスターの作成とセキュリティグループの設定をおこないます。

# ECSクラスターを作成
ecs-cli up --cluster-config tutorial --ecs-profile tutorial-profile
# VPCのデフォルトのセキュリティグループのIDを取得
aws ec2 describe-security-groups --filters Name=vpc-id,Values=VPC_ID --region us-west-2
# セキュリティグループルールを追加、ポート80でのインバウンドアクセスを許可する
aws ec2 authorize-security-group-ingress --group-id security_group_id --protocol tcp --port 80 --cidr 0.0.0.0/0 --region us-west-2

docker構成ファイルを作成します。ファイル名は、docker-compose.ymlとしています。内容は、ウェブサーバーへのトラフィック用にポート80を開き、コンテナのログをCloudWatchロググループに移動するように設定しています。

version: '3'
services:
  web:
    image: amazon/amazon-ecs-sample
    ports:
      - "80:80"
    logging:
      driver: awslogs
      options: 
        awslogs-group: tutorial
        awslogs-region: us-west-2
        awslogs-stream-prefix: web

続いて、ECS固有のパラメータ設定用のファイルを作成します。ファイル名は、ecs-params.ymlとしています。メモリやCPUの制限、VPC、サブネット、セキュリティグループを指定しています。

version: 1
task_definition:
  task_execution_role: ecsTaskExecutionRole
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - "subnet ID 1"
        - "subnet ID 2"
      security_groups:
        - "security group ID"
      assign_public_ip: ENABLED

設定ファイルをデプロイして、コンテナの実行を確認します。

# クラスターに設定ファイルをデプロイ
ecs-cli compose --project-name tutorial service up --create-log-groups --cluster-config tutorial --ecs-profile tutorial-profile
# クラスターの実行中のコンテナを確認
ecs-cli compose --project-name tutorial service ps --cluster-config tutorial --ecs-profile tutorial-profile

出力は以下のようになります。

Name                                           State    Ports                     TaskDefinition  Health
tutorial/0c2862e6e39e4eff92ca3e4f843c5b9a/web  RUNNING  34.222.202.55:80->80/tcp  tutorial:1      UNKNOWN

AWS ECSのまとめ

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。