インターフェー型の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-opt
に awslogs-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 にログが送信されるようになります。