見出し画像

無限に動くLambda関数への対策を考えてみた

はじめに

こんにちは。株式会社SHIFT DAAEの栗山です。今日は血も凍るような怖い話をしたいと思います。

Lambda関数は誤った使い方をすると、無限に動きます。
そのLambda関数がS3にオブジェクトを作成でもしようものなら、あっという間に何百万、何千万という膨大な数のオブジェクトがS3に作成されます。そして、それらのサービスに紐づけられたログ監視サービス(CloudWatchやCloudTrailなど)がその分のログを記録します。

そして、その分の費用が請求されるのです・・・。

概要

本稿では「Lambda関数を無限に動かしてしまう」という失敗例をテーマに、その失敗の根本的な原因や対策について私見をまとめました。
「身近なところでLambda関数が無限に動く事故が発生した」「自分がやらかしてしまった」といった方の参考になれば幸いです。

Lambda関数を使う前に意識するべきこと

Lambda関数を使う前に意識しておくべきことが3つあります。それは、

  • AWSは無限のリソースを持っていること。

  • Lambda関数は簡単にその無限のリソースにアクセスできること。

  • 使った分だけ請求されること。

の3つです。

AWSは元々Amazonを動かすためのサービスです。これは世界中のユーザーから休むことなくアクセスを受け続け、安定して動き続けるために無限ともいえるコンピューティングリソースを持っています。我々が通常、開発で使用するAWSのサービスは、そのAWSが持っているリソースのほんの一部に過ぎません。

オンプレミスでの限られたサーバー資源での開発と違い、AWSには無限のリソースがあります。そしてLambda関数の使い方にミスをすると、我々はその無限のリソースにアクセスしてしまうのです。

そしてその分の金額が請求されるのです。

「事故は必ず起こる」ということ

対策の前にひとつはっきりさせたいことがあります。それは

「事故は必ず起こる」

ということです。

人命に直結する医療事故。
大勢の人が命を失う恐れがある航空機事故。

これらの事故をなくすために人類は長年頑張ってきました。 しかし、それでも事故がゼロになってはいません。

「Lambda関数が無限に起動し多額の費用がかかる事故」の発生原因はヒューマンエラーの類のものです。 設計をミスった、実装をミスった、注意書きをよく読まなかった、などの。

こういったヒューマンエラーも当然ゼロにすることはできません。ゼロにするべく努力することは大事です。しかしヒューマンエラーは必ず起こるし、事故はなくならない。それが現実です。

効果的な対策が大事であること

「事故は必ず起こる」というのならどうすればいいのでしょうか?

それは

「効果的な対策」

をすることです。

上記で「航空機事故」に触れましたが、実はこの業界は「失敗に対する対策」がとてもよくなされています。
航空業界では事故が起きると徹底的な調査がなされ、対策がされます。その結果、飛行機は現代ではとても安全な乗り物になりました。「効果的な対策」をすることで、危険な乗り物だった飛行機が安全な乗り物になったように、事故の数を少なくすることができるのです。

※こういった内容に興味のある方は失敗の科学がお勧めです。

対策その1:CloudWatchによる起動回数の監視

さて「Lambda関数の無限起動」に効果的と考えられる対策は、

CloudWatchでLambda関数の起動回数を監視する

ことです。

なぜならば問題は 「Lambda関数が無限に起動し続けること」 だからです。それを防ぐには 「Lambda関数の起動回数を監視する」 ことが最も直接的なのです。
※コストを監視するのもいいのですが、1~2日のタイムラグが生じるのが難点です。

Lambdaの起動回数を監視するCloudWatchのアラームは、マネジメントコンソールから作成することができます。
画面が多くなるので詳細は割愛しますが、

CloudWatchでアラームの作成
→メトリクスの選択
→対象のLambda関数の選択
→呼び出し(Invocations)をメトリクスに選択

という流れで作成することができます。

対策その2:Lambda関数の緊急停止方法を知る

Lambda関数の起動回数を監視することができるようになりました。では、実際にLambda関数が想定外に多く起動してしまったときはどうすればよいでしょうか?

Lambda関数は緊急時の非常停止手段があります。それを覚えてからLambda関数の開発をすることでリスクを大きく下げることができるでしょう。

緊急停止は、対象のLambda関数の画面で「スロットリング」を押下することで可能です(図右上)。
Lambda関数を起動したらモニタリングタブを選択し(図中央)、左下のInvocations(起動回数)のグラフを確認しましょう。その際に起動回数が想定よりも多い場合は、スロットリングをすればLambda関数を止めることができます。

Lambda関数が無限に動く仕組み

最後に、Lambda関数が無限に動く仕組みに触れます。
Lambda関数が無限に起動するのは、「Lambda関数が再帰的に起動する」設計になっているからです。
例えば「S3バケットにファイルが書き込みされた際にLambda関数を使用してそのファイルの属性を変更する」といったものです。

ほかにも、「いくつかのサービス(あるいはAWS外のリソース)を含めて、Lambda関数が再帰的に動くようになっていた」という事例もあります。
※こういった事例に興味のある方は「lambda 無限」などで検索するとよいです。

参考文献

こういった事故への対策を考える上、私がお勧めだと思うものを以下にあげます。

  • クラウド破産の実例と対策

    • Lambda関数に限らずクラウドサービスで金銭的に失敗した事例がまとまっています。

  • 失敗の科学

    • 本文中でも紹介しましたが「失敗から何かを得たいと思う全ての人にお勧めの本」だと思います

最後に

最後までお読みいただきありがとうございます。
本稿が皆様の安心・安全なクラウド開発ライフの一助になれば何よりです。

【DAAAEマガジン】


\もっと身近にもっとリアルに!DAAE公式Twitter/


執筆者プロフィール:Kuriyama Akira
DAAE開発エンジニア。コーヒーの焙煎が趣味です。コーヒーの味も豆への火の通り方も定量的に表せないのです。それがいいのです。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/