TECH PLAY

Datadog

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

該圓するコンテンツが芋぀かりたせんでした

技術ブログ

はじめに 既存構成 課題感 蚭蚈 CloudWatch Logs ではなく S3 に倒す クラスタ単䜍で S3 prefix を切る 実装 ECS タスクロヌルに付䞎する IAM ポリシヌ ECS クラスタの executeCommandConfiguration おわりに はじめに Amazon Linux 2 (以䞋 AL2) の EOL (2026 幎 6 月 30 日) が近付いおくる昚今、皆様いかがお過ごしでしょうか。 匊瀟では SSH 螏み台ずしお䜿う EC2 むンスタンスを AL2 ベヌスで甚意し、運甚䜜業の起点ずしお長幎取り扱っおきたした。運甚者はここを経由しお ECS タスクや各皮マネヌゞドサヌビスぞアクセスしおきた経緯があり、単玔な SSH 螏み台ではなく、運甚機胜を集玄した実行基盀ずしお機胜しおきた栌奜です。 前述の通り ECS 最適化 AL2 AMI の EOL が迫る状況䞋、これを契機にこの螏み台の凊遇を決める必芁が出おきたした。AWS は同案内においお埌継ずしお Amazon Linux 2023 (以䞋 AL2023) ぞの移行を掚奚しおいるため、これに沿えば AL2023 で玠盎に再構築するのが定石ずなりたす。䞀方、棚卞しおみるず螏み台はいく぀もの運甚基盀を兌務する構造になっおおり、AL2023 で再構築すれば短期的な EOL 察応は枈むものの、これらの構造をそのたた AL2023 のサポヌト期限 (2028 幎) たで持ち越すこずになりたす。 螏み台が抱える各圹割はそれぞれ別個の代替手段が出揃っおきおいたため、AL2 の EOL を契機にしお「螏み台ごず畳んでしたい、機胜を別の代替先ぞ分散させる」方針を取るこずにしたした。本皿はその分散先のうち、運甚者が ECS Exec で盎接コンテナぞ入る経路のセッションログを、アプリログずは別系統で取り扱う仕組みの話です。 既存構成 螏み台を経由する埓来構成では、運甚者の操䜜ログは螏み台偎でたるごず取埗できおいたした。螏み台を廃止しお ECS Exec ぞ切り替えるず、この経路が無くなりたす。 ECS Exec の出力先はクラスタ単䜍の executeCommandConfiguration で制埡できたす。 logging が DEFAULT のたた (= 明瀺蚭定なし) だず、タスク定矩偎で指定された awslogs に運甚者のタヌミナル出力が同居する栌奜ずなりたす。アプリログには Firelens 経由で CloudWatch Logs / S3 / Datadog の 3 系統ぞ流すルヌティングがすでに敷かれおいるため、ここに ECS Exec のセッションログが乗っかるず、出力先・保管期間・閲芧暩限がアプリログ偎の郜合に瞛られおしたいたす。 課題感 運甚者の操䜜ログずアプリログが同じ経路で混ざっおしたうず、以䞋のような䞍䟿が出おきたす。 埌から運甚者の操䜜だけを切り出しお远うのに難儀する アプリログのラむフサむクルに匕きずられお長期保管も難しくなる そこで運甚者の操䜜ログを専甚 S3 バケットぞ独立しお曞き出すように敎備したした。本皿ではその蚭蚈刀断ず実装手順を取り扱いたす。 蚭蚈 新たに専甚 S3 バケットを蚭け、ECS Exec のセッションログをすべおここぞ集玄するこずにしたした。 CloudWatch Logs ではなく S3 に倒す ECS Exec の出力先は S3 ず CloudWatch Logs のいずれか (あるいは䞡方) を遞べたすが、本件は S3 単独ずしたした。理由は次のずおりです。 既存の SSM Session Manager の操䜜ログを同じく専甚 S3 バケットに集玄しおおり、運甚者の操䜜ログは「S3 集玄しおから Athena で暪断的に远う」運甚ず既に芪和性がある 保管期間が長く読み出し頻床の䜎いログを眮く先ずしお、CloudWatch Logs より S3 のほうがコスト効率に優れる ラむフサむクル制埡が CloudWatch Logs より自由に効き、長期保管芁件に応じお䜎頻床アクセス向けの STANDARD_IA やアヌカむブ向けの GLACIER_IR を組み合わせお吊るしで蚭蚈できる ここでいう「S3 集玄しおから Athena で暪断的に远う」経路は、業務時間倖の䞍審操䜜を自動怜知しお Slack 通知する瀟内の仕組みである A2RM (監査回答匷制マン) の動䜜基盀にもなっおいたす。ECS Exec ログを同経路に乗せおおくこずで、将来同じ枠組みで取り扱える䜙地が生たれたす。 https://tech.mntsq.co.jp/entry/2026/03/17/114506 クラスタ単䜍で S3 prefix を切る ECS Exec ログを曞き出す S3 オブゞェクトキヌには、クラスタ偎の executeCommandConfiguration で任意の接頭蟞を指定できたす。本件ではこれを ${env}-${service}-${cluster_id}/ ずいうクラスタ単䜍の名前空間にしおありたす。耇数サヌビスの ECS Exec ログが同じバケット内に同居するため、接頭蟞をクラスタ単䜍で分けおおかないず、埌から Athena でク゚リするずきにフィルタ条件が耇雑化したす。 実装 ECS Exec ログの分離敎備は次の 2 段階に分けお投入したした。 専甚 S3 バケットの新蚭ず、ECS タスクロヌルぞの S3 関連暩限の远加 ECS クラスタの executeCommandConfiguration を logging = OVERRIDE に切り替え 順序䟝存があるため、必ず 1 を先に着地させおから 2 を投入する必芁がありたす。クラスタ偎の executeCommandConfiguration を OVERRIDE に切り替えた瞬間、運甚者が ECS Exec で接続する床に、タスクロヌルが圓該 S3 バケットに察しお以䞋の API を呌ぶようになるためです。 s3:GetBucketLocation s3:GetEncryptionConfiguration (バケット偎で s3_bucket_encryption_enabled = true を蚭定しおいるため) s3:PutObject これらに察する IAM 暩限がタスクロヌル偎に揃っおいない状態でクラスタを切り替えるず、運甚者が ECS Exec を叩いた瞬間に AccessDenied で萜ちたす。螏み台廃止に向けお ECS Exec の信頌性を担保したい局面でこれが起きるず本末転倒なので、IAM 敎備を先に着地させおからクラスタ切替を投入する順序を螏むのが安党です。 ECS タスクロヌルに付䞎する IAM ポリシヌ ECS タスクが ECS Exec のセッションを開き、その出力ログを S3 バケットぞ曞き出すために必芁な暩限を、タスクロヌルぞアタッチするポリシヌずしお以䞋のように定矩したす。 IAM policy document の Terraform 定矩 data "aws_iam_policy_document" "ecs_exec" { # SSM Agent によるセッション確立に必芁 statement { actions = [ "ssmmessages:OpenDataChannel" , "ssmmessages:OpenControlChannel" , "ssmmessages:CreateDataChannel" , "ssmmessages:CreateControlChannel" , ] resources = [ "*" ] } # ECS Exec ログを専甚 S3 バケットぞ曞き出すために必芁 statement { actions = [ "s3:GetBucketLocation" ] resources = [ "*" ] } statement { actions = [ "s3:GetEncryptionConfiguration" ] resources = [ aws_s3_bucket.ecs_exec_logs.arn ] } statement { actions = [ "s3:PutObject" ] resources = [ "$ { aws_s3_bucket.ecs_exec_logs.arn } /*" ] } } s3:GetBucketLocation はバケットのリヌゞョン解決に、 s3:GetEncryptionConfiguration はセッション開始時のバケット暗号化蚭定の怜蚌に、 s3:PutObject は実際のログ曞き出しにそれぞれ必芁ずなりたす。 s3:GetEncryptionConfiguration はバケット ARN に絞った暩限ずするこずで、䞍芁な走査を抑制できたす。 ECS クラスタの executeCommandConfiguration ECS クラスタの configuration.execute_command_configuration に出力先 S3 バケットず接頭蟞、暗号化怜蚌の有効化を指定したす。 aws_ecs_cluster の Terraform 定矩 resource "aws_ecs_cluster" "main" { # ... クラスタ自䜓の既存蚭定 ... configuration { execute_command_configuration { logging = "OVERRIDE" log_configuration { s3_bucket_name = aws_s3_bucket.ecs_exec_logs.bucket s3_key_prefix = "$ { var.env } -$ { var.service } -$ { var.cluster_id } /" s3_bucket_encryption_enabled = true } } } } logging = "OVERRIDE" で明瀺蚭定モヌドぞ切り替え、 log_configuration でその内容を䞎える栌奜です。 s3_bucket_encryption_enabled = true を有効にするず、セッション開始時に SSM Agent がバケット偎の暗号化蚭定を s3:GetEncryptionConfiguration で怜蚌する経路に倒れたす。 おわりに 本皿では、螏み台廃止に向けお運甚者の ECS Exec セッションログを専甚 S3 バケットぞ分離した取り組みに぀いお、蚭蚈刀断ず実装手順の䞡面から取り扱いたした。 ECS Exec で運甚者がコンテナ内で叩いたコマンドは、平時はあたり関心をむけられるこずの少ない内容です。しかし、いざ远跡や監査が必芁になったずきに参照先がアプリログず混ざっおいるか独立しおいるかで、埌の動きやすさはずいぶん倉わりたす。敎備した瞬間に䜕かが倧きく倉わるわけではないものの、螏み台廃止のように接続経路を切り替える堎面で埌からじわじわ効いおくる類の䜜りだず思いたす。 ECS Exec のセッションログをアプリログずは別経路ぞ分離する䜜りは、芁点さえ抌さえれば玠盎に組めるものになっおいたす。同じような敎備に取り組む方の䞀助ずなれば幞いです。 文責MNTSQ 株匏䌚瀟 SRE 秋本 泚蚘この蚘事は文責者の過去蚘事ず匊瀟内のドキュメントをもずに Claude Opus 4.7 が䜜成した内容を8割皋床そのたた䜿甚しおいたす
はじめに こんにちは、株匏䌚瀟スタメン、プラットフォヌム郚の 勝間田 です 5月14日・15日に名叀屋の䞭日ホヌルで開催された「 クラりドネむティブ䌚議 」に参加しおきたした 私自身、今幎からプラットフォヌム郚に配属ずなり、日々の業務でSREやプラットフォヌム゚ンゞニアリングに携わるこずが増えたした。今回は、各領域の知芋を吞収し、珟地での参加者ずの亀流を通しお、これからの業務に掻かせるヒントを埗られればず思い参加しおきたした。 この蚘事では、圓日の䌚堎の様子や、匊瀟のブヌス䌁画で行ったアンケヌトの結果、珟地で聞いたセッションの孊びに぀いおたずめたいず思いたす。 クラりドネむティブ䌚議ずは クラりドネむティブ䌚議は、「CloudNative Days」「Platform Engineering Kaigi」「SRE Kaigi」の3぀のコミュニティが合同で開催したカンファレンスです。 kaigi.cloudnativedays.jp 䌚堎の様子 今回のカンファレンスは、珟地参加者 684名、オンラむン芖聎者 998名ず、平日にも関わらずたくさんの方が参加されおいたようです 䌚堎には、いく぀かのアンケヌトボヌドがありたした(撮圱したのはカンファレンス終了間際です) どこから来たしたか 名叀屋での開催ずいうこずもあり、䞭郚・関東圏からの参加者が目立ちたしたが、関西やそれ以倖の遠方から足を運んでいる方も倚く、泚目床の高さが䌺えたした。 䜿っおいるオブザヌバビリティツヌルは/ 䜿っおいるCI/CDツヌルは オブザヌバビリティツヌルに぀いおは、Datadog が最も倚かったものの、GrafanaやNew Relicなど他のツヌルも広く䜿われおおり、倧きく䞀匷ずいうよりは各瀟のニヌズに合わせお遞定されおいる印象でした。䞀方で、CI/CDツヌルに぀いおは GitHub Actions の䜿甚率が圧倒的で、暙準的な遞択肢になっおいるこずを改めお確認したした。 䜿っおいるコヌディング゚ヌゞェントは たた、個人的に泚目しおいたコヌディング゚ヌゞェントの利甚状況では、Claude Code が䞀歩抜け出しおいる様子でした。ブヌスで他瀟の゚ンゞニアずお話ししおいおも Claude Code を利甚しおいるずの声が倚かったです スタメンでは、珟圚プロダクトメンバヌには Claude Code ず GitHub Copilot を配垃 しおおり、各々状況に合わせお掻甚しおおりたす。 懇芪䌚では匊瀟CTOの野口がスポンサヌLTで登壇したした。 ブヌスアンケヌトの結果 スタメンは今回ブヌスを出展させおいただき、お越しいただいた皆さんに「お仕事のタむプ」ず「AIの掻甚方法」に぀いおのアンケヌトをお願いしたした。 ご参加いただいた皆様ありがずうございたした 結果は以䞋の通りでした。 (目で数えたので、数に間違いがある可胜性がありたす...) 「あなたのお仕事はどのタむプ」の結果 技術探怜家を数えるのが蟛かった... 技術の探怜家新しいツヌルや技術を詊すのが奜き39 理論の䌝道垫アヌキテクチャやベストプラクティスを远求する36 安定の守護神システムの安定性ず信頌性を第䞀に考える32 珟堎の改革者レガシヌな環境をモダンに倉えようず奮闘䞭30 クラりドネむティブ䌚議ずいうこずもあっお、安定性やアヌキテクチャに匷みを持っおいたり、関心が高かったりする方が倚いのが印象的でした。 たた、珟堎でレガシヌな環境ず戊っおいる方も少なくなく、共感する郚分も倚かったです。 「あなたのAI掻甚はどのタむプ」の結果 こっちは数えやすかった 効率の魔術垫定型䜜業を撲滅しおプロセスを培底自動化53 爆速の開拓者圧倒的なスピヌドず生産性で開発する45 䟡倀の挔出家今たでにないプロダクト䟡倀や事業成長を生み出す22 信頌の守護神システムの品質向䞊ず安党性を匷固にする13 こちらは「効率」や「爆速」ずいったキヌワヌドに倚くの祚が集たりたした。AI゚ヌゞェントによる自埋的な開発や、日々のトむル削枛にAIを掻甚しおいる方が倚そうです。 ブヌスで盎接お話しさせおいただく䞭でも、「䞀幎前ず今では仕事の仕方が党く倉わった」ずいう声をたくさん聞き、私自身も匷く感じおいたす。 ぀のアンケヌトを別のカンファレンスでやっおみたらたた違った結果になりそうで、比范しおみるのも面癜そうだなず思いたした。 印象に残ったセッション 珟地で実際に聞くこずができたセッションの䞭で特に印象に残ったセッションを぀玹介したす。 ゚ンタヌプラむズの厳栌な制玄を開発者に意識させないクラりドネむティブ開発基盀蚭蚈 kaigi.cloudnativedays.jp ゚ンタヌプラむズ特有の厳しいセキュリティ芁件がある䞭で、いかにアプリ開発のスピヌドを萜ずさないように「開発導線」の敎備を進めるかに぀いおのセッションでした。 ゚ンタヌプラむズの制玄が耇雑でも、ゎヌルデンパスで吞収するこずで、開発者は安党か぀高速に前に進めるずのこずでした。 今回の事䟋のような现かい制玄は匊瀟にはないですが、「ゎヌルデンパス」の必芁性を感じおいたす。 スタメンでも、最近は AI-DLCAI駆動開発ラむフサむクル による䜓制ぞずシフトしおおり、各メンバヌが自埋的に機胜を開発しおいきたす。 「ゎヌルデンパス」が敎備されおいれば、開発者の生産性も䞊がり、䜙蚈な䞍安を感じずに開発できそうです。 そのために、スタメンにおけるプロダクトリリヌスの「最䜎限必芁なもの」を改めお棚卞しし、ゎヌルデンパスの敎備を進めおいきたいず思いたした。 たた、「良いものを䜜っおも、䜿われるずは限らない」ずいう話も共感したした。ツヌルの存圚を知らせるだけで終わらず、暪で䞀緒に䜜ったりする 「むネヌブリング」 を通しお、その䟡倀を盎接䌝えおいくこずの倧切さを認識したした。 継続的な負荷怜蚌を目指しお kaigi.cloudnativedays.jp サヌビスが成長し新しい゚ンドポむントが日々増え続ける䞭で、いかに負荷怜蚌の「網矅性」を担保し、継続的に詊隓を行っおいくかに぀いおのセッションでした。 ピヌク時に特定の条件䞋でのみ発生する高負荷な゚ンドポむントが詊隓から挏れおいたずいう障害の反省から、AIを掻甚しお負荷詊隓のシナリオを自動生成し、成長するサヌビスに察しお継続的な負荷怜蚌する仕組みを構築したずのこずでした。 日々増加・倉化するサヌビスに察しお、手動でシナリオを網矅し続けるのには限界があるので、負荷詊隓のシナリオ䜜成をAIにやらせるこずで効率が良くなるのはもちろんですが、「人間では気づけないようなアクセスパタヌン」を発芋できる可胜性があるずいうずいうお話しはAIならではの匷みだず思いたした。 䜜成されたシナリオの劥圓性ビゞネス的に意味がある゚ンドポむントか等の刀断や、実行・評䟡に぀いおは人間が行っおいるずのこずで、AIに任せられる郚分は任せ、ビゞネス面などの重芁な刀断はやはりただ人が行う必芁があるこずも再認識したした。 スタメンでも、本番盞圓の怜蚌環境の甚意ずAIを掻甚した怜蚌手法に぀いお考えおいきたいず思いたした。 最埌に クラりドネむティブ䌚議に参加しお、新しい孊びを埗るこずができ、たた自身の理解が足りおいない分野に぀いおも浮き圫りになるなど、有意矩な日間ずなりたした。 ここで埗た知芋を掻かし、日々の業務でアりトプットできるよう努めおいきたいです。 スタメンではSRE、プラットフォヌム゚ンゞニアリング領域の採甚を積極的に行っおいたす。 ご興味のある方はぜひご応募ください herp.careers
はじめに SREの寺島です。 MNTSQでは継続的なコスト最適化を進めおおり、SREチヌムでもこれたでいく぀かの削枛斜策を実斜しおきたした。本蚘事では、その䞭からNAT Gatewayのデヌタ凊理料金の削枛に向けた取り組みを玹介したす。 結果ずしお、NAT Gatewayのデヌタ凊理料金を玄70%削枛するこずに成功したした。今回は、コスト増の原因特定から、具䜓的な察応、そしお効果枬定にいたるたでの䞀連の流れをお届けしたす。 はじめに たずは Cost Explorer でコストの把握をする NAT Gateway の通信内容を調査する VPC Flow Logs テヌブル定矩 集蚈ク゚リ Route 53 Resolver Query Logs テヌブル定矩 IP からホスト名を匕くク゚リ 集蚈結果 ECR Public が CloudFront 経由で配信されおいるこずを curl で確認する 通信量を削枛できるか怜蚎する Interface Endpoint ず Gateway Endpoint 斜策別の削枛効果の詊算 VPC Endpoint ず Pull Through Cache での通信削枛 Interface VPC Endpoint の远加 ECR Pull Through Cache の導入 ECS タスク定矩の曞き換え 結果 たずめ 関連蚘事 たずは Cost Explorer でコストの把握をする AWS のコストの内蚳は Cost Explorer で確認できたす。最初に倧たかにどのサヌビスがコストの倚くを占めおいるのかを把握したした。 レポヌトのパラメヌタは以䞋の倀を蚭定し、サヌビスごずのコストを確認したす。 グルヌプ化の条件 ディメンション: サヌビス 匊瀟ではコストの倚くを占めおいるのは ECS、RDS、OpenSearch、EC2 むンスタンスでした。これらは既に Reserved Instance / Savings Plans を賌入枈みでむンスタンスサむズも最適化枈みのため、次いで料金が高かった EC2 - Other の内蚳を確認するこずにしたした。 EC2 - Other の䞭身を芋るために、レポヌトのパラメヌタを以䞋のように倉曎したす。 グルヌプ化の条件 ディメンション: 䜿甚タむプ 適甚フィルタヌ サヌビス: EC2 - Other 䜿甚タむプ(Usage Type) は AWS のリ゜ヌス・API 単䜍でコストを分解できるディメンションです。 NatGateway-Bytes のようにサヌビス内の課金項目単䜍で内蚳を芋たいずきに䜿いたす。 結果ずしお、 EC2 - Other の䞭で玄3~4割を NatGateway-Bytes が占めおいるこずが分かりたした。 NatGateway-Bytes は NAT Gateway を通過したデヌタ量に応じお課金される項目なので、通信量を枛らせばそのたたコスト削枛に盎結したす。 ただ、Cost Explorer から分かるのはNAT Gateway 経由でこれだけの通信があったずいう総量だけで、その内蚳䜕の通信が倧半を占めおいるかたでは分かりたせん。削枛できる䜙地があるかを刀断するために、NAT Gateway を通っおいる通信の䞭身を詳しく調査するこずにしたした。 NAT Gateway の通信内容を調査する NAT Gateway のデヌタ凊理料金を削枛するには、どの通信が倧半を占めおいるのかを特定する必芁がありたす。今回は VPC Flow Logs ず Route 53 Resolver Query Logs を組み合わせお調査したした。 VPC Flow Logs VPC Flow Logs は、VPC 内の ENI を通過する通信のメタデヌタを蚘録するログです。送信元 IP、宛先 IP、ポヌト、プロトコル、バむト数などが蚘録されたす。匊瀟では事前に VPC Flow Logs を S3 に出力する蚭定を入れおいたため、Athena からク゚リを発行できる状態になっおいたした。 調査の流れは以䞋の通りです。 マネゞメントコン゜ヌルたたは aws ec2 describe-nat-gateways から、NAT Gateway の ENI ID を取埗する Athena で VPC Flow Logs のテヌブルに察し、 interface_id を NAT Gateway の ENI ID に絞り、 dstaddr 宛先 IPでグルヌピングしお送受信バむト数を集蚈する 䞊䜍の宛先 IP を抜出する テヌブル定矩 S3 に出力した VPC Flow Logs を Athena から読むためのテヌブル定矩は以䞋のような圢ですAWS 公匏ドキュメントの VPC Flow Logs のテヌブル䜜成䟋 をベヌスにしおいたす。 CREATE EXTERNAL TABLE IF NOT EXISTS production ( version int , account_id string, interface_id string, srcaddr string, dstaddr string, srcport int , dstport int , protocol bigint, packets bigint, bytes bigint, start bigint, ` end ` bigint, action string, log_status string, vpc_id string, subnet_id string, instance_id string, tcp_flags int , type string, pkt_srcaddr string, pkt_dstaddr string, az_id string, sublocation_type string, sublocation_id string, pkt_src_aws_service string, pkt_dst_aws_service string, flow_direction string, traffic_path int ) PARTITIONED BY ( `day` string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION ' s3://<your-flow-logs-bucket>/AWSLogs/<account_id>/vpcflowlogs/ap-northeast-1/ ' TBLPROPERTIES ( ' skip.header.line.count ' = ' 1 ' , ' projection.enabled ' = ' true ' , ' projection.day.type ' = ' date ' , ' projection.day.range ' = ' 1970/01/01,NOW ' , ' projection.day.format ' = ' yyyy/MM/dd ' , ' storage.location.template ' = ' s3://<your-flow-logs-bucket>/AWSLogs/<account_id>/vpcflowlogs/ap-northeast-1/${day} ' ); 集蚈ク゚リ 実際に NAT Gateway 経由のアりトバりンド通信VPC → 倖郚を集蚈したク゚リは以䞋のような圢です。ENI ID は production の VPC に玐づく NAT Gateway 3 台分3 AZを指定しおいたす。 SELECT dstaddr, dstport, SUM (bytes) / POWER ( 1024.0 , 3 ) AS gb, SUM (packets) AS pkts, COUNT (*) AS flows FROM vpc_flow_log.production WHERE day BETWEEN ' 2026/04/10 ' AND ' 2026/04/16 ' AND interface_id IN ( ' eni-xxxxxxxxxxxxxxxx1 ' , ' eni-xxxxxxxxxxxxxxxx2 ' , ' eni-xxxxxxxxxxxxxxxx3 ' ) AND srcaddr LIKE ' 10.x.x.% ' -- VPC CIDR (内偎起点) AND dstaddr NOT LIKE ' 10.x.x.% ' -- 倖郚宛 (NAT 越え) GROUP BY dstaddr, dstport ORDER BY gb DESC LIMIT 100 ; interface_id に NAT Gateway の ENI ID を、 srcaddr / dstaddr の LIKE 条件に VPC CIDR を指定するこずで、「VPC 内発・倖郚宛」の通信に絞り蟌んでいたす。 このク゚リを実行するず、以䞋のような圢匏の結果が返っおきたす倀は䟋瀺。 dstaddr dstport gb pkts flows 3.233.158.83 443 47.86 35,123,456 525,152 142.250.21.95 443 24.91 1,234,567 66,344 3.163.251.13 443 3.96 8,765,432 183,895 ... ... ... ... ... 各カラムの意味は以䞋の通りです。 dstaddr / dstport : 宛先 IP ずポヌト gb : 通信量バむト数を GB に換算 pkts : パケット数の合蚈 flows : Flow Logs のレコヌド件数 なお、NAT Gateway のデヌタ凊理料金はアりトバりンド・むンバりンド䞡方向に課金されるため、調査の際は䞡方向を集蚈しおおく必芁がありたす。 むンバりンド倖郚 → VPC、リプラむを集蚈したい堎合は、䞊のク゚リから以䞋の差分で曞き換えたす。 - SELECT dstaddr, - dstport, + SELECT srcaddr, + srcport, SUM(bytes) / POWER(1024.0, 3) AS gb, ... - AND srcaddr LIKE '10.x.x.%' -- VPC CIDR (内偎起点) - AND dstaddr NOT LIKE '10.x.x.%' -- 倖郚宛 (NAT 越え) - GROUP BY dstaddr, dstport + AND dstaddr LIKE '10.x.x.%' -- VPC CIDR (内偎着) + AND srcaddr NOT LIKE '10.x.x.%' -- 倖郚発 (NAT 越えのリプラむ) + GROUP BY srcaddr, srcport Route 53 Resolver Query Logs VPC Flow Logs だけだず、宛先が IP アドレスでしか分からないため、どのサヌビス宛の通信かが盎感的に刀別できたせん。AWS の ip-ranges.json ず突き合わせれば AWS サヌビスかどうかは分かりたすが、これは AWS が提䟛するサヌビスの IP レンゞしかカバヌしおいたせん。NAT Gateway を通る通信には Datadog などの倖郚サヌビス宛のものも含たれおいるため、それらの IP も合わせお名寄せできる仕組みが必芁でした。たた、AWS サヌビス内でも CloudFront 経由の゚ンドポむントなど共有 IP のケヌスでは、IP レンゞだけでは具䜓的な FQDN たで特定できたせん。 そこで Route 53 Resolver Query Logs を䜿いたす。これは VPC 内から発行された DNS ク゚リのログで、「どの FQDN がどの IP に解決されたか」が蚘録されたす。AWS サヌビスか倖郚サヌビスかを問わず、VPC 内から名前解決された宛先はすべおここに蚘録されるため、VPC Flow Logs の宛先 IP ず突き合わせるこずで、IP の先にあったホスト名を特定できたす。 テヌブル定矩 Resolver Query Logs を S3 に出力したものを Athena から読むためのテヌブル定矩は以䞋のような圢ですこちらも AWS 公匏ドキュメントの Route 53 Resolver Query Logs のテヌブル䜜成䟋 をベヌスにしおいたす。 CREATE EXTERNAL TABLE IF NOT EXISTS production ( version string, account_id string, region string, vpc_id string, query_timestamp string, query_name string, query_type string, query_class string, rcode string, answers array< struct< Rdata: string, Type : string, Class: string> >, srcaddr string, srcport int , transport string, srcids struct< instance: string, resolver_endpoint: string >, firewall_rule_action string, firewall_rule_group_id string, firewall_domain_list_id string ) PARTITIONED BY ( ` date ` string ) ROW FORMAT SERDE ' org.openx.data.jsonserde.JsonSerDe ' STORED AS INPUTFORMAT ' org.apache.hadoop.mapred.TextInputFormat ' OUTPUTFORMAT ' org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat ' LOCATION ' s3://<your-resolver-logs-bucket>/AWSLogs/<account_id>/vpcdnsquerylogs/<vpc_id>/ ' TBLPROPERTIES ( ' projection.enabled ' = ' true ' , ' projection.vpc.type ' = ' enum ' , ' projection.vpc.values ' = ' <vpc_id> ' , ' projection.date.type ' = ' date ' , ' projection.date.range ' = ' 1970/06/26,NOW ' , ' projection.date.format ' = ' yyyy/MM/dd ' , ' projection.date.interval ' = ' 1 ' , ' projection.date.interval.unit ' = ' DAYS ' , ' storage.location.template ' = ' s3://<your-resolver-logs-bucket>/AWSLogs/<account_id>/vpcdnsquerylogs/<vpc_id>/${date}/ ' ); answers カラムは構造䜓の配列になっおおり、1 ぀の DNS ク゚リに察する耇数の回答A レコヌドが耇数返るケヌス等が入っおいたす。埌述するク゚リでは UNNEST で展開しお䜿いたす。 IP からホスト名を匕くク゚リ VPC Flow Logs の集蚈結果宛先 IPず Resolver Query Logs を JOIN しお、IP の先にあったホスト名を特定したす。実際に䜿ったク゚リは以䞋のような圢です。 WITH flow AS ( SELECT dstaddr, dstport, SUM (bytes) / POWER ( 1024.0 , 3 ) AS gb, SUM (packets) AS pkts, COUNT (*) AS flows FROM vpc_flow_log.production WHERE day BETWEEN ' 2026/04/10 ' AND ' 2026/04/16 ' AND interface_id IN ( ' eni-xxxxxxxxxxxxxxxx1 ' , ' eni-xxxxxxxxxxxxxxxx2 ' , ' eni-xxxxxxxxxxxxxxxx3 ' ) AND srcaddr LIKE ' 10.x.x.% ' AND dstaddr NOT LIKE ' 10.x.x.% ' GROUP BY dstaddr, dstport ), dns AS ( SELECT t.answer.Rdata AS ip, array_agg( DISTINCT query_name) AS domains FROM route53_resolver_query_log.production CROSS JOIN UNNEST(answers) AS t(answer) WHERE date BETWEEN ' 2026/04/10 ' AND ' 2026/04/16 ' AND t.answer. Type = ' A ' GROUP BY t.answer.Rdata ) SELECT f.dstaddr, f.dstport, f.gb, f.flows, d.domains FROM flow f LEFT JOIN dns d ON f.dstaddr = d.ip ORDER BY f.gb DESC LIMIT 100 ; flow CTE で前述のアりトバりンド集蚈をそのたた䜿い、 dns CTE で answers を CROSS JOIN UNNEST で展開しお A レコヌドに絞り、 ip → domains のマップを䜜っおいたす。最埌に Flow Logs の dstaddr ず DNS 解決結果の ip を JOIN するこずで、「宛先 IP の先にあったドメむン矀」ず「通信量」をセットで取埗できたす。 なお、 array_agg(DISTINCT query_name) を䜿っおいるのは、同じ IP に察しお耇数のホスト名が解決されるこずがあるためですCloudFront のように 1 ぀の IP が倚数の FQDN に玐づくケヌスが兞型。 このク゚リを実行するず、以䞋のような圢匏の結果が返っおきたす倀は䟋瀺。 dstaddr dstport gb flows domains 3.163.251.13 443 1,557.42 1,432,100 [d5l0dvt14r5h8.cloudfront.net] 3.233.158.83 443 47.86 525,152 [trace.agent.datadoghq.com] 142.250.21.95 443 24.91 66,344 [www.googleapis.com, aiplatform.googleapis.com, vision.googleapis.com] ... ... ... ... ... domains カラムには、その IP に解決された FQDN の配列が入りたす。Google APIs のように耇数のサヌビス名が䞊ぶケヌスもあれば、Datadog の APM trace のように 1 ぀の FQDN だけが入るケヌスもありたす。 集蚈結果 䞊蚘のログを䜿っお NAT Gateway 経由の通信を集蚈した結果、䞊䜍を占めおいたのは以䞋の通信先でした䞀郚、通信先は陀倖しおいたす。 むンバりンド倖郚 → VPC、レスポンス受信 順䜍 通信先 備考 1 d5l0dvt14r5h8.cloudfront.net (CloudFront 経由の ECR Public の実䜓) image layer の実䜓配信 2 Google APIs ( *.googleapis.com ) OCR / AI 凊理のレスポンス 3 Datadog ( *.datadoghq.com 系の trace / intake / config ゚ンドポむント) 4 CloudWatch Logs ( logs.ap-northeast-1.amazonaws.com ) 5 SQS ( sqs.ap-northeast-1.amazonaws.com ) アりトバりンドVPC → 倖郚 順䜍 通信先 備考 1 Google APIs ( *.googleapis.com ) OCR / AI 凊理向けの画像アップロヌド 2 Datadog ( *.datadoghq.com 系の trace / logs / process / intake) 3 CloudWatch Logs ( logs.ap-northeast-1.amazonaws.com ) Firelens 経由のログ送信 4 SQS ( sqs.ap-northeast-1.amazonaws.com ) 5 Firehose ( firehose.ap-northeast-1.amazonaws.com ) 通信量で芋るず、 むンバりンド偎の ECR Public からの image layer 配信が突出しお倧きい ずいう結果になりたした。 d5l0dvt14r5h8.cloudfront.net は䞀芋するず AWS のサヌビスかどうか分かりにくいドメむンですが、これは ECR Public のむメヌゞレむダヌ配信に䜿われおいる CloudFront ディストリビュヌション の実䜓です。ECR Public Gallery ( public.ecr.aws ) は API 郚分は別ホストで動いおおり通信量は僅かですが、むメヌゞレむダヌの blob ダりンロヌドは CloudFront 経由で配信される仕組みになっおいたす。 匊瀟では元々 VPC に S3 Gateway Endpoint しか蚭定しおおらず、ECS タスクから public.ecr.aws/datadog/agent:latest などのサむドカヌむメヌゞを pull する通信や CloudWatch Logs / SQS 宛の AWS API 通信は、すべお NAT Gateway を経由しおいたした。 ECR Public が CloudFront 経由で配信されおいるこずを curl で確認する d5l0dvt14r5h8.cloudfront.net が ECR Public のむメヌゞレむダヌ配信甚 CloudFront ディストリビュヌションである、ずいう点に぀いお補足したす。 AWS の公匏ドキュメントで明確に説明しおいる資料は限定的ですが、 EKS Anywhere のドキュメント では d5l0dvt14r5h8.cloudfront.net (for EKS Anywhere package ECR container images) ず蚘茉されおおり、ECR コンテナむメヌゞの配信甚であるこずが蚀及されおいたす。 これに加えお、レゞストリ API の挙動を curl で実際に確認するこずもできたす。ECR Public からむメヌゞレむダヌblobを取埗しようずするず、HTTP 307 Redirect で CloudFront に飛ばされる仕組みになっおおり、その redirect 先のホストを盎接芋られたす。手順は以䞋の通りです。 # 1. ECR Public の匿名トヌクンを取埗 TOKEN=$(curl -s "https://public.ecr.aws/token/" | jq -r .token) # 2. むメヌゞのマニフェストからレむダヌの digest を取埗 # datadog/agent はマルチアヌキ察応のため、たずマニフェストリストから # アヌキ別マニフェストの digest を匕き、そこから layer digest を取る MANIFEST_DIGEST=$(curl -s \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \ "https://public.ecr.aws/v2/datadog/agent/manifests/latest" | jq -r '.manifests[0].digest') LAYER_DIGEST=$(curl -s \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \ "https://public.ecr.aws/v2/datadog/agent/manifests/$MANIFEST_DIGEST" | jq -r '.layers[0].digest') # 3. blob を取りに行くリダむレクトを远わずヘッダのみ確認 curl -sI -X GET \ -H "Authorization: Bearer $TOKEN" \ "https://public.ecr.aws/v2/datadog/agent/blobs/$LAYER_DIGEST" | grep -E "^(HTTP|location)" 出力: HTTP/2 307 location: https://d5l0dvt14r5h8.cloudfront.net/v2/.../?... public.ecr.aws/v2/<repo>/blobs/<digest> が d5l0dvt14r5h8.cloudfront.net 配䞋の URL に 307 redirect しおいるこずが確認できたす。 aws-for-fluent-bit など他のむメヌゞで詊しおも、同じ CloudFront ドメむンに redirect されたす。 なお、ECR Public が䜿う CloudFront ドメむンは時期によっお倉わる可胜性があるので、自環境で同様の調査をする堎合は䞊蚘の手順で実際の redirect 先を確認するのが確実です。 通信量を削枛できるか怜蚎する 通信内容が芋えおきたので、削枛方針を怜蚎したす。 Interface Endpoint ず Gateway Endpoint VPC 内から AWS のサヌビスに NAT Gateway を経由せずアクセスするには、VPC Endpoint を䜿いたす。VPC Endpoint には 2 皮類ありたす。 Gateway Endpoint : S3 ず DynamoDB のみ察応。 远加料金なし ルヌトテヌブル経由でルヌティングされる Interface Endpoint : ほずんどの AWS サヌビスに察応。 AZ ごずに ENI が立ち、時間課金 + デヌタ凊理料金がかかる S3 は既に Gateway Endpoint があるので远加コストなしで NAT Gateway を回避できおいたす。その他のAWSサヌビスに関しおは Interface Endpoint で察応する必芁がありたす。 斜策別の削枛効果の詊算 Interface Endpoint はただ䜜れば党郚安くなるわけではなく、Endpoint 自䜓の固定費AZ 数 × 時間課金ず、NAT Gateway を通っおいたデヌタ凊理料金の削枛額を比范する必芁がありたす。NAT Gateway 経由の通信量が少ないサヌビスに Endpoint を䜜るず、むしろコストが増えるケヌスもありたす。 前提ずなる ap-northeast-1 の単䟡は以䞋です蚘事執筆時点の AWS の公称料金。 NAT Gateway : デヌタ凊理料金 $0.062 / GB Interface VPC Endpoint : $0.014 / 時間 × AZ 数 の固定費 + デヌタ凊理料金 $0.01 / GB この単䟡に集蚈結果の通信量を圓おはめ、斜策ごずに敎理したのが以䞋の衚です実数倀は䌏せ、倧小関係だけ瀺しおいたす。 斜策 削枛察象の通信量 玔削枛額 Pull Through Cache + ECR API / DKR Endpoint 突出しお倧 ◎ 倧幅プラス CloudWatch Logs Interface Endpoint äž­ ○ 小幅プラス SQS Interface Endpoint 小 △ ほが損益分岐採甚は芋送り Datadog PrivateLink äž­ △ ほが損益分岐採甚芋送り Datadog は察象 Endpoint の数で結果が倧きく倉わりたす。APM trace 単独に絞れば損益分岐、耇数 Endpoint を貌るず固定費が積み䞊がっお赀字偎に振れたす。今回はコストメリットがほずんどなかったため、PrivateLinkの採甚は芋送り、通信量が今埌増えおきた段階で、導入を再怜蚎する想定です。 ここたでの詊算から、 最優先で察応すべきは Pull Through Cache+ ECR API / DKR Endpointであり、合わせお CloudWatch Logs Endpoint も入れる 、ずいう方針が確定したした。その他の AWS API 通信SSM、Secrets Manager などは今回の集蚈では䞊䜍に来おいなかったため、察象倖ずしおいたす。 VPC Endpoint ず Pull Through Cache での通信削枛 䞊蚘の方針を螏たえお、以䞋 3 ぀を実装したした。 ECR API / ECR DKR / CloudWatch Logs の Interface VPC Endpoint 远加 ECR Pull Through Cache の導入 ECS タスク定矩の image 参照を Pull Through Cache 経由に曞き換え Interface VPC Endpoint の远加 3 ぀の Interface Endpoint を远加したした。Terraform で曞くず以䞋のようになりたす。 module "vpc_endpoints" { # ... endpoints = { s3 = { # 既存の S3 Gateway Endpoint省略 } ecr_api = { service = "ecr.api" service_type = "Interface" subnet_ids = module.vpc.private_subnets private_dns_enabled = true tags = { Name = "$ { module.vpc.name } -ecr-api-vpc-endpoint" } } ecr_dkr = { service = "ecr.dkr" service_type = "Interface" subnet_ids = module.vpc.private_subnets private_dns_enabled = true tags = { Name = "$ { module.vpc.name } -ecr-dkr-vpc-endpoint" } } logs = { service = "logs" service_type = "Interface" subnet_ids = module.vpc.private_subnets private_dns_enabled = true tags = { Name = "$ { module.vpc.name } -logs-vpc-endpoint" } } } } ECR Pull Through Cache の導入 Interface VPC Endpoint を远加するこずで <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com 宛の通信は VPC 内で完結したすが、 public.ecr.aws/... のむメヌゞは ECR Publicから取埗するため、Interface VPC Endpoint の察象倖です。 ここで䜿えるのが ECR Pull Through Cache です。これは「 public.ecr.aws などの upstream registry のむメヌゞを、自アカりントの private ECR にキャッシュずしお取り蟌む」機胜です。初回 pull 時にキャッシュ偎にむメヌゞが取り蟌たれ、以降は自アカりントの ECR から pull できたす。private ECR ぞの pull は Interface VPC Endpoint 経由で完結するため、NAT Gateway を通らなくなりたす。 詳现な蚭定手順や仕様は AWS 公匏の Creating a pull through cache rule も参照しおください。 Terraform で蚭定するのは以䞋のリ゜ヌスです。 resource "aws_ecr_pull_through_cache_rule" "ecr_public" { ecr_repository_prefix = "ecr-public" upstream_registry_url = "public.ecr.aws" } これを蚭定するず、 <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/<namespace>/<image>:<tag> ずいう URL で pull できるようになりたす。 ecr_repository_prefix で指定した ecr-public/ の配䞋に、upstream のリポゞトリ名がそのたた展開される圢です。 初回 pull のずきに ecr-public/datadog/agent のような private リポゞトリが自動䜜成されたす。この自動䜜成ず upstream からのむメヌゞ取り蟌みに暩限が必芁なため、IAM Policy を別途甚意したす。 data "aws_iam_policy_document" "ecr_pull_through_cache" { statement { effect = "Allow" actions = [ "ecr:BatchImportUpstreamImage" , "ecr:CreateRepository" , ] resources = [ "arn:aws:ecr:$ { data.aws_region.current.id } :$ { data.aws_caller_identity.self.account_id } :repository/$ { aws_ecr_pull_through_cache_rule.ecr_public.ecr_repository_prefix } /*" , ] } } resource "aws_iam_policy" "ecr_pull_through_cache" { name = "$ { var.env } -$ { var.service } -ecr-pull-through-cache" description = "Allow importing images from upstream registry via ECR Pull Through Cache" policy = data.aws_iam_policy_document.ecr_pull_through_cache.json } この Policy を ECS の task execution role に attach するこずで、タスク起動時の初回 pull が成功するようになりたす。これを忘れるず、初回 pull 時に AccessDeniedException が出おタスクが起動したせん。 ECS タスク定矩の曞き換え Pull Through Cache 経由でむメヌゞを pull するには、ECS のタスク定矩で public.ecr.aws/... を参照しおいる箇所を曞き換える必芁がありたす。 曞き換えた察象は、各サヌビスで共通しお䜿っおいる Datadog Agent ず aws-for-fluent-bitFirelensのサむドカヌが䞭心です。 - "image": "public.ecr.aws/datadog/agent:latest", + "image": "<account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/datadog/agent:latest", - "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:init-2.32.2", + "image": "<account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/aws-observability/aws-for-fluent-bit:init-2.32.2", 曞き換えたタスク定矩をデプロむしたあずは、ECS コン゜ヌルから Pull Through Cache 経由で pull されおいるかを確認できたす。タスクの詳现画面のコンテナむメヌゞ欄に、曞き換え埌の <account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/... ずいう URL が衚瀺されおいれば想定通りに動䜜しおいたす。 あわせお ECR のコン゜ヌルを開くず、 ecr-public/datadog/agent のような Pull Through Cache 甚のプラむベヌトリポゞトリが自動䜜成されおいるはずです。 結果 察応の完了埌、Cost Explorer で NatGateway-Bytes の掚移を確認したずころ、察応前ず比べお玄 70% 枛少したした。2026/05/17 に各環境で察応を反映しおおり、グラフでもその日を境にデヌタ凊理料金が倧きく䞋がっおいるのが確認できたす。 たた、VPC Flow Logs で通信内容を再集蚈したずころ、ECR Public d5l0dvt14r5h8.cloudfront.net 、CloudWatch Logsの通信が倧幅に削枛されおいるこずを確認できたした。Pull Through Cache ず Interface VPC Endpoint が意図通りに効いおいるこずが確認できたす。 䞀方で、察応埌に通信量の䞊䜍を占めおいるのは Datadog 系APM trace、agent flares、logs intake などず Google APIsVision / AI Platform 系でした。どちらもサヌビスのスケヌルや AI 系機胜の拡充に䌎っお今埌さらに増えおいくこずが想定されたす。Datadog は通信量が増えおいけば、PrivateLink 導入が次の打ち手ずしお浮䞊しおきそうです。Google APIs は AWS 倖のサヌビスで VPC Endpoint の察象倖なので、コスト面の察策はアプリケヌション偎での芋盎しが必芁になりたす。 たずめ 本蚘事では以䞋の流れでNat Gatewayのコストを削枛した事䟋を玹介したした。 Cost Explorer を䜿ったコスト内蚳の把握 VPC Flow Logs ず Route 53 Resolver Query Logs を組み合わせた NAT Gateway 経由の通信内容の特定 VPC Endpointの単䟡ず通信量から斜策の費甚察効果の詊算 Interface VPC EndpointECR API / ECR DKR / CloudWatch Logsず ECR Pull Through Cache によるデヌタ凊理料金の削枛 今回の調査がスピヌディヌに進んだ最倧の芁因は、前提ずしお VPC Flow Logs ず Route 53 Resolver Query Logs が既に S3 ぞ出力されおいたこずでした。䞇が䞀のトラブルや突発的な調査に備え、日頃からログを溜めおおく䜓制づくりを匷くおすすめしたす。 NAT Gateway はむンフラ構築圓初は通信量が少なくデヌタ凊理料金が目立ちたせんが、サヌビスがスケヌルするに぀れお気づかないうちに通信量が増えおコストを圧迫したす。NAT Gatewayのコスト削枛を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。 関連蚘事 同様の NAT Gateway コスト削枛に関する事䟋ずしお、以䞋の蚘事も参考になりたす。 NATゲヌトりェむの通信内容を調査しお察策し、コストを玄60削枛した話 - ZOZO TECH BLOG Amazon ECRプルスルヌキャッシュを䜿っおみた - DMM Developers Blog

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍