Lambda 関数を Amazon EC2 インスタンスまたは AWS インスタンススケジューラで正しく機能させるにはどうすればよいですか?

最終更新日: 2021 年 9 月 9 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスまたは AWS インスタンススケジューラを AWS Lambda 関数とともに使用します。しかし、Lambda 関数がタイムアウトしたり、呼び出しに失敗したり、エラーをスローしたりします。

簡単な説明

以下の理由により、AWS インスタンススケジューラ が原因となって、Lambda 関数が正しく機能しないことがあります:

  • SDK タイムアウトが発生する。この問題を解決するには、SDK タイムアウトを修正するのセクションの手順を完了します。
  • 関数のタイムアウトが発生する。この問題を解決するには、関数のタイムアウトを防止するのセクションの手順をを実行します。
  • Amazon EventBridge ルールが開始されませんでした。この問題を解決するには、スケジュールされたルールが呼び出されたことを確認するのセクションの手順を実行します。
  • 関数がスロットリングしている。この問題を解決するには、関数スロットリングを防止するのセクションの手順を完了します。
  • 重複した Lambda 呼び出しが発生する。この問題を解決するには、べき等性を使用してエラーを防止するのセクションの手順を完了します。

注: AWS インスタンススケジューラ は、 EventBridge ルールを使用して Lambda 関数をスケジュールし、設定した間隔で Lambda 関数を実行します。これにより、Lambda 関数が非同期で呼び出され、関数エラーの処理方法に影響します。実行時のエラーが原因で関数が失敗した場合、同じイベントがデフォルトではさらに 2 回まで再試行されます。その後、イベントは破棄されます。スロットルが発生した場合、イベントは破棄される前に最大 6 時間キューに入れられます。

解決方法

SDK タイムアウトを修正する

デフォルトのSDKタイムアウトは、以前のバージョンのAWSインスタンススケジューラでは上書きされません。以前のバージョンでは、インスタンスを開始または停止するための API コールの応答に 60 秒を超える時間がかかる場合、リクエストはタイムアウトします。

この問題を解決するには、AWS インスタンススケジューラ の最新バージョンを入手するか、Boto3 Config オブジェクト (Boto3 ウェブサイト上) の read_timeout 値を変更します。例:

import boto3
from botocore.config import Config

client_config = Config(read_timeout=890)

ec2 = boto3.client('ec2', config=client_config)

関数のタイムアウトを防止する

Lambda 関数がタイムアウトした場合は、関数が EC2 インスタンスが起動したことを確認するために待機しているかどうかを確認してください。詳細については、「EC2 インスタンスを開始または起動できないのはなぜですか?」を参照してください。

インスタンスが [RUNNING] (実行中) 状態になるまでに数分かかることがあります。[RUNNING] (実行中) 状態に達するまでの時間が、関数のために設定されたタイムアウト時間よりも長い場合、その関数はタイムアウトする可能性があります。この問題を解決するには、AWS CloudFormation テンプレートのタイムアウト値を300 (5 分) に変更して、関数のためのタイムアウト時間を増加させます。関数がタイムアウトする前に、インスタンスの起動に十分な時間が必要です。例:

"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
    "Mode": "Active"
}

注: Lambda 関数の設定可能な最大タイムアウト値は 15 分です。

関数が仮想プライベートクラウドにある場合は、関数がインターネットにアクセスして Amazon EC2 API を呼び出すことを許可する必要があります。

スケジュールされたルールが呼び出されたことを確認します

EventBridge によって呼び出されない Lambda 関数をトラブルシューティングするには、Lambda 関数が EventBridgeルールでトリガーされなかったのはなぜですか? を参照してください。

関数のスロットリングを防止します

関数のスロットリングを防ぐには、「レートを超過しました」というエラーと 429「TooManyRequestsException」というエラーの Lambda 関数のスロットリングをトラブルシューティングするにはどうすればよいですか? を参照してください。

非同期呼び出しの場合、アカウントの Lambda スロットリングは、関数呼び出しの可否に影響する可能性があります。すべての非同期呼び出しは、呼び出される前にイベントキューに送信されます。別の関数が多数の非同期呼び出しも受信した場合、イベントキューがバックログされる可能性があります。このバックログは、関数の呼び出しに失敗したことを意味するものではありません。このバックログは、イベントが遅延していることを意味します。イベントキューバックログがクリアされると、複数の呼び出しを確認できます。デフォルトでは、非同期イベントキュー内のイベントは最長 6 時間非同期イベントキューに残ります。

べき等性を使用してエラーを防止する

呼び出しの重複によるエラーを防ぐには、非同期呼び出しで設定されている Lambda 関数をべき等にします

非同期 Lambda 呼び出しは、イベントキューとの結果整合性のために複数回発生する可能性があることに注意してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?