Amazon ECS Anywhereを使ってAWS外でもコンテナが運用できるようになったので使ってみた

2021.06.04

5月27日にECSの機能を利用してオンプレミスでもコンテナの実行、管理を可能にするAmazon ECS Anywhereが利用可能になりました。

今回はそれを使ってUbuntu上にECSからコンテナを起動させてみたいと思います。

Amazon ECS Anywhere

ECSは従来EC2やAWS FargateなどAWSが提供するコンピュートリソース上でのみ実行可能でした。 しかし、今回提供されたAmazon ECS Anywhereを使用すればオンプレミスでも今までと近い操作でコンテナの実行、管理が可能となります。 AWSが提供しているECSのコントロールプレーンに自分で用意したインスタンスを接続すればクラスターに参加できます。

EC2のECSインスタンスをオンプレミスで立ち上げてるような状態です。

仕組みとしてはSystems Manager Agentがインスタンス内で実行され、それがDockerエンジンを操作し、そのDocker上で動くECS AgentがECSと連携しタスクやコンテナの起動を管理するといった感じです。

ただ、VPCの外でこれらは実行されるため、もしRDSなどVPC内のリソースを使用したい場合はVPNなどを使ってVPCと通信可能にする必要があります。 詳しくは以下のブログに書いてあります。

以下では自分が実際にやってみた手順を示しておきます。 ブログではRaspberry Piを使用してクラスタを組んでいましたが、自分はUbuntu上に1つだけインスタンスを立てます。

これからやること

  1. ECSクラスターの作成
  2. Externalインスタンスの接続
  3. サービスの作成
  4. タスクの実行

ECS Anywhereを使ってみる

ECS クラスターを作成する

今回はネットワーキングのみで作成しました。

クラスターの名前は ecs-external としています。

ここで言うExternalインスタンスがECS Anywhereによって管理されるインスタンスになります。

Externalインスタンスを登録する

Externalインスタンスを立ち上げ、クラスターに参加させましょう。

「Externalインスタンスの登録」を押した後ステップ2で出てくるコマンドを実行するだけでセットアップは完了です

このcurl~から始まるコマンドをコピーし管理者権限で実行すればセットアップは終わります。 このコマンドに含まれるアクティベーションコードによって登録が行われています。

VMに必要なものをインストールする

自分はMultipassでUbuntu20.04(x86_64)を用意しました。 MultipassはCanonical社が開発しているVM管理ソフトです。 概ねDockerのような操作感です。

Externalインスタンスの準備

$ multipass find # 使用できるイメージを探す
Image                       Aliases           Version          Description
18.04                       bionic            20210512         Ubuntu 18.04 LTS
20.04                       focal,lts         20210510         Ubuntu 20.04 LTS
20.10                       groovy            20210511.1       Ubuntu 20.10

$ multipass launch 20.04 --name ecs # VMの起動
Launched: ecs

$ multipass list
Name                    State             IPv4             Image
ecs                     Running           XXX.XXX.XXX.XXX     Ubuntu 20.04 LTS


$ multipass exec ecs /bin/bash # VMにアタッチ

ubuntu@ecs:~$ curl --proto "https" \
  -o "/tmp/ecs-anywhere-install.sh" \
  "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" && \
  sudo bash /tmp/ecs-anywhere-install.sh \
    --region "ap-northeast-1" \
    --cluster "ecs-external" \
    --activation-id "XXXXXXXXXXXXX" \
    --activation-code "XXXXXXX"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19369  100 19369    0     0  20366      0 --:--:-- --:--:-- --:--:-- 20345
Running ECS install script on ubuntu 20.04

# 中略

# Trying to wait for ECS agent to start ...

Ping ECS Agent registered successfully! Container instance arn: "arn:aws:ecs:XXXXXXXX:XXXXXXXX:container-instance/ecs-external/XXXXXXXXXXX"

You can check your ECS cluster here https://console.aws.amazon.com/ecs/home?region=XXXXXXXXXXX#/clusters/ecs-external

# ok
##########################


##########################
This script installed three open source packages that all use Apache License 2.0.
You can view their license information here:
  - ECS Agent https://github.com/aws/amazon-ecs-agent/blob/master/LICENSE
  - SSM Agent https://github.com/aws/amazon-ssm-agent/blob/master/LICENSE
  - Docker engine https://github.com/moby/moby/blob/master/LICENSE
##########################

ブラウザに戻って確認してみるとインスタンスが増えています。

無事セットアップできたみたいですね。

サービスを作成しタスクを実行してみる

ここからは先ほど追加したインスタンス上でタスクが実行されるか確認していこうと思います。 今回はApacheサーバーを立ててみましょう。

タスクの定義

起動タイプはEXTERNALを選びましょう。

今回はシンプルにApacheのイメージを使用し、80番ポートをマッピングします。 メモリもそれほどいらないので256MiBで十分でしょう。

サービスの作成

タスクが定義できたらサービスを作成して、先ほどのタスクを実行してみましょう。

タスクが実行されているか確認する

サービスが作成できたらタスクが正しく実行されているか確認してみましょう。 Webコンソール上で見てみると一つタスクが実行中になっていますね。 利用可能なメモリも割り当てた分減っています。

再びVMに戻り、コンテナが実行されているか確認してみましょう。

インスタンス内で確認

ubuntu@ecs:~$ sudo docker ps
CONTAINER ID   IMAGE                            COMMAND              CREATED          STATUS                    PORTS                               NAMES
XXXXXXXXXXXX   httpd:2.4                        "httpd-foreground"   3 minutes ago    Up 3 minutes              0.0.0.0:80->80/tcp, :::80->80/tcp   ecs-apache-1-apache-XXXXXXXXXXX
XXXXXXXXXXXX   amazon/amazon-ecs-agent:latest   "/agent"             18 minutes ago   Up 18 minutes (healthy)                                       ecs-agent

ubuntu@ecs:~$ curl localhost:80
<html><body><h1>It works!</h1></body></html>

curlでマップされたポートにリクエストを送ると、 無事にApacheサーバーからHTMLが送られてきました。

感想

セットアップが簡単で良いと思いました。手動でも10分もあればインスタンスを追加できるんじゃないでしょうか。

個人的にはオンプレミスでもクラウドと近いサービスを使えるというのは可能性が広がって好きです。

参考