AWS EC2上のDockerコンテナからCloudWatch Logsにログを飛ばす

959
AWS EC2上のDockerコンテナからCloudWatch Logsにログを飛ばす

インターフェー型のVPCエンドポイントをを利用して、AWS の プライベートサブネット内にある EC2上で稼動しているコンテナから CloudWatch Logs にログを送信する方法です。

https://docs.docker.com/config/containers/logging/awslogs/ を参考にしています。

基本的には docker run のオプションで --log-driver=awslogs を指定してやるとコンテナの出力するログが CloudWatch Logs に送信されます。インターネット経由で接続する場合は、これで十分ですが、AWS のVPC内の EC2 上で Docker コンテナが稼動している場合は外部のインターネット経由ではなく、 AWS の内部経路(PrivateLink)を使って CloudWatch Logs に接続したほうがよいでしょう。

図にすると以下のような感じでしょうか。

CloudWatch Logs に接続するためのエンドポイントを作成するには、「VPC」>「エンドポイント」>「エンドポイントを作成」の画面で、「サービス」として com.amazonaws.REGION.logs を選択します。下図は、フィルターに logs と入力したときの候補を表示しています。

サービスを選択した後、エンドポイントをアタッチするVPCとサブネット、およびセキュリティグループを選択して、「作成」をクリックします。

CloudWatch Logs に接続するエンドポイントが作成できたら、以下のように --log-driver=awslogs--log-optawslogs-endpoint を設定します。

docker run \
  --log-driver awslogs \
  --log-opt awslogs-region=ap-northeast-1 \
  --log-opt awslogs-group=my-logs-group \
  --log-opt awslogs-stream=my-logs-stream \
  --log-opt awslogs-endpoint=https://vpce-xxxxxxxxxxxx-xxxxxx.logs.ap-northeast-1.vpce.amazonaws.com \
  your-image

awslogs-endpoint に設定するURLは、作成された「エンドポイント」画面の「詳細」タブの「DNS名」でコピーすることができます。

以上で、EC2上で稼動する Docker コンテナから CloudWatch Logs にログが送信されるようになります。