MeWrite Docs

AWS Lambda: Task timed out

AWS Lambdaで実行時間がタイムアウトした場合のエラー

概要

AWS Lambda関数の実行時間が設定されたタイムアウト値を超えた場合に発生するエラーです。

エラーメッセージ

Task timed out after 3.00 seconds

または CloudWatch Logs で:

REPORT RequestId: xxx Duration: 3000.00 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 64 MB
Status: timeout

原因

  1. 処理時間の長さ: データ処理や外部API呼び出しに時間がかかる
  2. コールドスタート: 初回起動時の遅延
  3. ネットワーク待機: RDSやAPIへの接続待ち
  4. 無限ループ: コードのバグによる無限ループ

解決策

1. タイムアウト値を増加

1
2
3
4
5
6
# SAM template
Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Timeout: 30  # 最大900秒(15分)
1
2
3
4
# AWS CLI
aws lambda update-function-configuration \
  --function-name my-function \
  --timeout 30

2. 非同期処理への変更

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 悪い例:同期的に全て処理
exports.handler = async (event) => {
  for (const item of event.items) {
    await processItem(item);  // 大量データでタイムアウト
  }
};

// 良い例:SQSで非同期処理
exports.handler = async (event) => {
  const sqs = new AWS.SQS();
  for (const item of event.items) {
    await sqs.sendMessage({
      QueueUrl: process.env.QUEUE_URL,
      MessageBody: JSON.stringify(item)
    }).promise();
  }
};

3. VPC設定の最適化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# VPCを使用する場合はNATゲートウェイが必要
Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      VpcConfig:
        SubnetIds:
          - !Ref PrivateSubnet
        SecurityGroupIds:
          - !Ref LambdaSecurityGroup

4. Provisioned Concurrencyでコールドスタート対策

1
2
3
4
aws lambda put-provisioned-concurrency-config \
  --function-name my-function \
  --qualifier prod \
  --provisioned-concurrent-executions 5

5. 接続プーリング(RDS Proxy)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// RDS Proxy経由で接続
const pool = mysql.createPool({
  host: process.env.RDS_PROXY_ENDPOINT,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  connectionLimit: 10
});

// ハンドラー外で接続を維持

6. 処理の分割(Step Functions)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
StateMachine:
  Type: AWS::StepFunctions::StateMachine
  Properties:
    Definition:
      StartAt: ProcessBatch
      States:
        ProcessBatch:
          Type: Map
          ItemsPath: $.items
          Iterator:
            StartAt: ProcessItem
            States:
              ProcessItem:
                Type: Task
                Resource: !GetAtt ProcessItemFunction.Arn
                End: true

7. メモリ増加でCPU性能向上

1
2
3
4
# メモリを増やすとCPUも比例して増加
aws lambda update-function-configuration \
  --function-name my-function \
  --memory-size 1024  # 128MB → 1024MB

8. X-Rayでボトルネック特定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const AWSXRay = require('aws-xray-sdk');
const AWS = AWSXRay.captureAWS(require('aws-sdk'));

exports.handler = async (event) => {
  const segment = AWSXRay.getSegment();
  const subsegment = segment.addNewSubsegment('heavy-operation');

  // 処理
  await heavyOperation();

  subsegment.close();
};

9. 初期化コードの最適化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 悪い例:ハンドラー内で初期化
exports.handler = async (event) => {
  const client = new DynamoDB.DocumentClient();  // 毎回初期化
  // ...
};

// 良い例:ハンドラー外で初期化
const client = new DynamoDB.DocumentClient();

exports.handler = async (event) => {
  // clientを再利用
};

よくある間違い

  • デフォルトの3秒タイムアウトを変更していない
  • VPC内Lambdaでインターネットアクセスにパブリックサブネットを使用
  • 同期呼び出しで長時間処理を実行
  • DB接続をハンドラー内で毎回作成

AWS の他のエラー

最終更新: 2025-12-09