概要
DatadogをECSで利用するときにタスクをプライベートサブネット上で起動させているとpublicなイメージをNAT経由で取得しようとするのでコストが嵩みます。Amazon ECRプルスルーキャッシュリポジトリという機能を使えばそれを回避できるので活用しましょう。
問題に気づいたきっかけ
一部プロジェクトにDatadogを導入したのですが、導入したプロジェクトで導入したタイミングからNATゲートウェイの使用料が増加していることに気づきました。
NATゲートウェイの利用料が増加した過去の事例として、ECRに対してVPCエンドポイントを設定していなかったという事例がありました。(参考:そのトラフィック、NATゲートウェイを通す必要ありますか?適切な経路で不要なデータ処理料金は削減しましょう)
問題のあった箇所
DatadogをECS Fargateで利用する際にはコンテナのイメージとしてpublic.ecr.aws/datadog/agent:latestを指定することを指示されます。
https://docs.datadoghq.com/ja/integrations/ecs_fargate/?tab=webui
実際には以下のようになるかと思います
{
"name": "datadog-agent",
"image": "public.ecr.aws/datadog/agent:latest",
"essential": true,
"portMappings": [
{
"hostPort": 8126,
"protocol": "tcp",
"containerPort": 8126
}
],
"environment": [
{
"name": "DD_API_KEY",
"value": "(APIキー)"
},
{
"name": "ECS_FARGATE",
"value": "true"
},
{
"name": "DD_APM_ENABLED",
"value": "true"
}
]
}
上記の中で以下の部分が見直すべき箇所となります
"image": "public.ecr.aws/datadog/agent:latest",
対処方法
プライベートレポジトリから取得すればNAT Gatewayを使用しなくなるので一度Publicから落としてPrivateレポジトリにPushしてあげれば問題は起きなさそうです。ただそれだとImageにバージョンアップがあった際に追随して再度PullとPushをしなけばならないので煩雑です。
どう対処すべきか調べていた過程でまさにこれを解決するための機能と言えるプルスルーキャッシュレポジトリという機能が2021/11にできたを知りました。おそらくこの機能ができるまでは上記のやり方でやるしかなかったのでしょう。
Amazon ECRプルスルーキャッシュリポジトリをVPCエンドポイント経由で試す
この機能を活用することによってイメージをプライベートレポジトリから落としつつ、最新版に1日に1回アップデートしてくれるというも実現できます
Terraformでの設定
設定はTerraform上で可能で、以下の記述を入れるだけでした
resource "aws_ecr_pull_through_cache_rule" "this" {
ecr_repository_prefix = "ecr-public"
upstream_registry_url = "public.ecr.aws"
}
そして、ECSでのImageを差し替えて実行します
"image": "(アカウントID).dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest",
初回試した時は、エラー内容をメモしていなかったのですがImageが落とせないというエラーで失敗しました。
別途他のサーバーから
docker image pull (アカウントID).dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest
とすると問題なくイメージが落とせ、Webコンソール上にも表示されたほかECSも問題なく起動できるようになりました。
おそらくIAMの権限不足でレポジトリの作成ができなかったのが原因ではと思います。うまくいかなければそこを見直してみてください。
[プルスルーキャッシュルールの使用](https://d
ocs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html)
結果
コストをがっつりと下げる事ができました!単位はお見せできないのですが、対応前と比較してNatGateway-Bytesが減っているのがわかるかと思います。
ECSのタスク数と起動停止が少なければそこまで効果はないでしょうが、今回は本番稼働しているサービスかつオートスケールで起動停止があるものだったのでインパクトが大きめでした。
まとめ
以上でpublicなイメージをAmazon ECRプルスルーキャッシュリポジトリを利用することによりコストの削減ができました。
Datadogで手順通りにセットアップしていくと、特に断りもないのでpublic.ecr.aws/datadog/agent:latestのままにしてしまうケースが多いかと思います。簡単に直せるので是非見直してみてください。