エンジニアリング

ElasticオブザーバビリティでAmazon ECSを監視する方法

アプリケーションやワークロードをコンテナーに移行する組織がさらに増えているため、コンテナーの状態と使用状況を監視および追跡する機能はこれまでにないほど重要になっています。多くのチームはすでに、MetricbeatのDockerモジュールを使用してDockerコンテナーの監視データを収集しているため、さらなる分析のためにElasticsearchに保存して分析することができます。しかし、ユーザーがAmazon Elastic Container Service(Amazon ECS)を使用している場合はどうなるのでしょうか。Metricbeatを使用してAmazon ECSを監視できるのでしょうか。もちろんできます!

このブログでは、Elasticオブザーバビリティを使用してAmazon ECSを監視する方法について、手順ごとに説明します。

Amazon ECSとは

Amazon ECSは、高度にスケーラブルかつ完全なマネージドサービスあり、Dockerコンテナーを簡単に管理およびプロビジョニングすることができます。「起動タイプ」と呼ばれる2つの基盤となるクラウドサービスによってサポートされており、どちらを使用するかによってコンピューティングリソースの管理方法が決まります。その2つとは、EC2とFargateです。

起動タイプとしてEC2を使用する場合、コンテナーはユーザー自身が管理するEC2インスタンス上で実行されます。もう1つの起動タイプであるFargateを使用する場合、ユーザーが行う必要のある作業はコンテナーとタスクを指定するだけです。指定すると、Fargateがバックエンドのインフラストラクチャのプロビジョニング、構成、 管理を行います。

では、それぞれの起動タイプについて、Metricbeatで監視する方法を見ていきましょう。 

ElasticでAmazon ECS EC2コンテナーを監視する方法

EC2上にコンテナーをデプロイする場合は、ユーザー自身が自分のAmazon ECSクラスターのデプロイと管理の責任を負います。監視の視点から見ると、それらのEC2インスタンスは他の通常のVMと同様です。つまり、ユーザーはそれらに接続し、Dockerの統計情報をDockerデーモンから直接収集できます。EC2上で実行されているAmazon ECSコンテナーを数回の簡単な手順で監視できる方法について見てみましょう。

前提条件:SSLキー

Amazon ECSクラスターを作成する際には、必ず有効なSSLキーをアタッチします。 そうすることでSSHでインスタンスにアクセスすることが可能になります。

手順1:セキュリティグループ

ネットワーキングのセクションで必ずセキュリティグループを選択します。そうすることで、SSHアクセスが可能になります(ポート22)。

手順2:EC2インスタンスの確認

Amazon ECSクラスターを正しく起動したら、EC2インスタンスの一覧が表示されるはずです。

手順3:SSL接続

それぞれに対して、ステップ1でアタッチしたキーペアを使用してSSH経由で接続できます。その例は次のとおりです。

ssh -i "ec2-ecs-test.pem" ec2-user@3.125.104.129

手順4:Metricbeatのインストール

クラスターのインスタンスすべてにアクセスできるため、各インスタンスにMetricbeatをインストールし、Dockerデーモンからメトリックの収集を開始することができます。

curl -L -O <a href="https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm">https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm</a> 
sudo rpm -vi metricbeat-7.10.1-x86_64.rpm 
sudo metricbeat modules disable system 
sudo metricbeat modules enable docker

これで、メトリックの送信先となるElasticsearchエンドポイントを定義できます。このケースではElastic Cloudで実行されているインスタンスです。実際にやってみる場合は無料トライアルをお試しださい

metricbeat.ymlを編集し、Elastic Cloudオプションを追加します。

通常、このファイルは/etc/metricbeat/metricbeat.ymlの下にあり、次のように編集できます。

sudo vi /etc/metricbeat/metricbeat.yml
cloud.id: "elastic-observability-deployment:ZXV…….k3MTI1ZTA1Ng==" 
cloud.auth: "elastic:2vXXXXXXXXXXXxxxxxxxxxxxV"

自己管理のElasticsearchクラスターで実行している場合は、Elasticsearch出力を構成する必要があります。

output.elasticsearch:
  hosts: ["https://myEShost:9200"] 
  username: "elastic" 
  password: "changeme"

次に、事前定義済みのダッシュボード、インデックス、およびマッピングを設定できます。

sudo metricbeat setup -e

Metricbeatを起動します。

./metricbeat -e -d & 
sudo service metricbeat start

また、システムが起動したときにMetricbeatサービスが自動的に開始されるように設定することもできます。

systemctl enable metricbeat
注:このプロセスは、クラスターのすべてのEC2インスタンスで実行する必要があります。

手順5:メトリックの収集の確認

これでMetricbeatが実行されたため、KibanaのDiscoverビューでDocker関連のメトリックを見ることで、イベントがElasticsearchクラスターに保存されていることを確認できます。

Amazon ECSクラスター上にタスクをデプロイすることができました。Metricbeatがそこからメトリックを収集します。それらのメトリックや、cloud_metadataおよびhost_metadataなどの追加のメタデータを使用してビジュアライゼーションを作成することができます。これらのメタデータは、AWSアカウント、リージョン、ホスト識別子、タイプなどごとにメトリックを相関付けるために、デフォルトで追加されています。たとえば、docker.info.containers.runningメトリックとhost.nameを組み合わせることで、実行中のコンテナーがいくつあるかを経時的に見ることができます。

手順6:事前構築済みのKibanaダッシュボードでのメトリックの表示

また、MetricbeatがバンドルされているデフォルトのDockerダッシュボードで、コンテナーのワークロードの分かりやすい概要を見ることもできます。

Amazon ECSタスクのみの監視は、ほんの数回の手順でできます。そこから、Metricbeatを使用して、EC2クラスターに対する可視性を追加していくことができます。それでは次に、Fargateを使用する場合のAmazon ECSの監視方法を見ていきましょう。

ElasticでFargateコンテナーを監視する方法

Fargate上のAmazon ECSでは、実行しているタスクおびコンテナーのさまざまなメタデータ、ネットワークメトリック、およびDocker統計情報を、タスクメタデータエンドポイントを通じて取得することができます。Metricbeatはメタデータエンドポイントのバージョン4を使用します。これは、コンテナーごとに利用でき、AWS Fargateプラットフォームバージョン1.4.0以降ではデフォルトで有効化されています。

Fargate上で実行されているタスクを監視するためには、新たなコンテナー定義を手動で追加して、Metricbeatコンテナーをタスク自体にデプロイする必要があります。Standardセクションで、metricbeat-containerなどのContainer nameを指定し、 Elastic Dockerレジストリのdocker.elastic.co/beats/metricbeat:7.11.0にあるMetricbeat Dockerイメージを使用して、特定のバージョンのMetricbeatイメージを取得できます。

また、コマンドをこのコンテナーに追加して、Metricbeatを設定し、Elastic Cloudへのデータ転送を開始する必要があります。

./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

Environment variablesセクションで$ELASTIC_CLOUD_IDおよび$ELASTIC_CLOUD_AUTHに実際のクレデンシャルを値として追加する必要があります。これらの値はプレインテキストで保存されないようにするために、AWS Secrets Managerなどを使用する必要があります。

タスク定義を更新したら、[Actions]ドロップダウンメニューから[run task]をクリックすると、再起動時にMetricbeatがタスクに追加されます。

監視するタスクが数個以上ある場合に、手動でMetricbeatコンテナーを追加することは面倒で時間のかかる作業となります。その場合は、AWS CloudFormationの使用を推奨します。これはAWSのネイティブのリソース管理方法であり、手動作業の必要なく、コンテナーをプロビジョニングし、そのライフサイクル全体にわたって更新を行います。AWS CloudFormationにより、インフラをコードとして扱い、必要なすべてのリソースとそれらの依存関係を定義するテンプレートファイルによって管理することができます。

以下の例は、CloudFormationを使用してMetricbeatコンテナーをタスクに追加する簡略化された方法です。

 TaskDefinition:
   Type:AWS::ECS::TaskDefinition 
   Properties:
     Family: !Ref TaskName 
     Cpu:256 
     Memory:512 
     NetworkMode: awsvpc 
     ExecutionRoleArn: !Ref ExecutionRole 
     ContainerDefinitions:
       - Name: metricbeat-container 
         Image: docker.elastic.co/beats/metricbeat:7.11.0 
         Secrets:
           - Name:ELASTIC_CLOUD_ID 
             ValueFrom: !Ref CloudIDArn 
           - Name:ELASTIC_CLOUD_AUTH 
             ValueFrom: !Ref CloudAuthArn 
                 EntryPoint:
           - sh 
           - -c 
         Command:
           - ./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

awsfargateモジュール完全なAWS CloudFormationテンプレートを見つけることもできます。これによって新しいクラスター、Metricbeatコンテナーとストレステストコンテナーの両方のタスク定義を作成し、サービスを開始できます。ローカルでcloudformation.ymlファイルにコピーして、自由にお試しください。

Elastic Cloudを使用している場合、CLOUD IDとCLOUD AUTHをAWS Secrets Managerに保存することをお勧めします。以下はAWS CLIの例です。

シークレットELASTIC_CLOUD_AUTHの作成:

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_AUTH --secret-string XXX

シークレットELASTIC_CLOUD_IDの作成:

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_ID --secret-string YYY

シークレットを作成できたので、次はCloudFormationテンプレートファイルcloudformation.ymlを使用して1回のAWS CLIコールでスタック全体を作成しましょう。

CloudFormationスタックを作成します。

aws --region us-east-1 cloudformation create-stack --stack-name test-metricbeat-deployment --template-body file://./cloudformation.yml --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=SubnetID,ParameterValue=subnet-5d89de27 ParameterKey=CloudAuthArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_AUTH-abc ParameterKey=CloudIDArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_ID-abc ParameterKey=ClusterName,ParameterValue=metricbeat-fargate ParameterKey=RoleName,ParameterValue=ecsFargateTaskExecutionRole 
ParameterKey=TaskName,ParameterValue=task-metricbeat ParameterKey=ServiceName,ParameterValue=metricbeat-service ParameterKey=LogGroupName,ParameterValue=metricbeat-fargate-log-group

CloudFormationがスタックのCREATE_COMPLETEステータスを表示すると、監視メトリックが10秒ごとにElasticsearchに送信されるのが分かります。awsfargateモジュールが各コンテナーから、CPU、メモリ、ネットワーク、ディスクIO情報などのランタイムメトリックを収集します。また、awsfargateからのすべての監視データをKibanaで表示する、そのまま使えるダッシュボードもあります。

実験が終わったら、AWS CLIを使用して簡単にスタック全体を削除できます。

aws --region us-east-1 cloudformation delete-stack --stack-name test-metricbeat-deployment

おわりに

Amazon ECSコンテナーデプロイメントの監視ソリューションをお探しですか?Metricbeat Dockerawsfargateモジュールを使用すれば、簡単にAmazon ECSコンテナーを監視し、メトリックをElastic CloudのElasticsearch Serviceに送信できます。ご質問やフィードバックがおありの場合は、Beatsフォーラムにお気軽にお寄せください。