アプリケーションやワークロードをコンテナーに移行する組織がさらに増えているため、コンテナーの状態と使用状況を監視および追跡する機能はこれまでにないほど重要になっています。多くのチームはすでに、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コンテナーデプロイメントの監視ソリューションをお探しですか?MetricbeatDocker
とawsfargate
モジュールを使用すれば、簡単にAmazon ECSコンテナーを監視し、メトリックをElastic CloudのElasticsearch Serviceに送信できます。ご質問やフィードバックがおありの場合は、Beatsフォーラムにお気軽にお寄せください。