AWS Step FunctionsでPayloadサイズ上限256KBを超えた際の挙動を確認してみた

2022.06.26

こんにちは、CX事業本部 IoT事業部の若槻です。

AWS Step Functionsでは、State間の遷移で渡すことのできるPayloadサイズは最大256KBという制限があります。

AWSコンソールでサービスクォータを見ると確かにそのようになっています。

The maximum input or result data size in bytes as a UTF-8 encoded string for a task, state, or execution. AWS default quota value 262,144 bytes

今回は、AWS Step FunctionsでPayloadサイズ上限256KBを超えた際の挙動を確認してみました。

やってみた

準備

State Machineからs3:GetObjectAPIを叩いてオブジェクトを取得することにより挙動を確認します。

取得対象のオブジェクトとして、データサイズが256KBを超えるファイルと超えないファイルの2つをS3 Bucketにアップロードします。

#ファイルのアップロード
bucket=<BucketName>
aws s3 cp over256KB.jsonl s3://${bucket}
aws s3 cp under256KB.jsonl s3://${bucket}

アップロードできました。一方のファイルが262,144 bytes以上、もう一方が以下のサイズとなっています。

$ aws s3api list-objects-v2 --bucket ${bucket}
{
    "Contents": [
        {
            "Key": "over256KB.jsonl",
            "LastModified": "2022-06-26T14:45:42+00:00",
            "ETag": "\"de04f000069ba9edfeb6d1e61986482f\"",
            "Size": 264255,
            "StorageClass": "STANDARD"
        },
        {
            "Key": "under256KB.jsonl",
            "LastModified": "2022-06-26T14:46:02+00:00",
            "ETag": "\"f56bf65eaabb30ae32d9506b0f63a888\"",
            "Size": 258680,
            "StorageClass": "STANDARD"
        }
    ]
}

ちなみにファイルの内容はいずれもこんな感じのJSON Linesです。

AWS CDK v2(TypeScript)で次のようなCDKスタックを作成します。

lib/process-stack.ts

import { Construct } from 'constructs';
import {
  aws_s3,
  aws_stepfunctions,
  aws_stepfunctions_tasks,
  RemovalPolicy,
  Stack,
  StackProps,
} from 'aws-cdk-lib';

export class ProcessStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    // S3 Bucket
    const s3Bucket = new aws_s3.Bucket(this, 'dataBucket', {
      removalPolicy: RemovalPolicy.DESTROY,
    });

    // Get Object1
    const getObjectTask1 = new aws_stepfunctions_tasks.CallAwsService(
      this,
      'getObjectTask1',
      {
        service: 's3',
        action: 'getObject',
        parameters: {
          Bucket: s3Bucket.bucketName,
          Key: aws_stepfunctions.JsonPath.stringAt('$.key1'),
        },
        iamResources: [`${s3Bucket.bucketArn}/*`],
        iamAction: 's3:GetObject',
        resultPath: '$.getObjectTask1',
      },
    );

    // State Machine
    new aws_stepfunctions.StateMachine(this, 'stateMachine', {
      stateMachineName: 'stateMachine',
      definition: getObjectTask1,
    });
  }
}

上記をCDK Deployしてスタックをデプロイします。

取得したデータのサイズが256KB以下の場合

次の入力を指定してステートマシンを実行します。これによりデータサイズが256KB以下のオブジェクトを取得します。

{
    "key1": "under256KB.jsonl"
}

すると実行が成功しました。オブジェクトの内容が取得できています!

取得したデータのサイズが256KB以上の場合

次の入力を指定してステートマシンを実行します。これによりデータサイズが256KB以上のオブジェクトを取得します。

Input

{
  "key1": "over256KB.jsonl"
}

するとサービスリミットの最大値をaws-sdk:s3のReturnサイズが超過している旨のエラーが出て実行が失敗しました。想定通りの動作です!

The state/task 'aws-sdk:s3' returned a result with a size exceeding the maximum number of bytes service limit.

256KB以下のデータを取得した結果、Payloadが256KBを超えた場合

次の入力を指定してステートマシンを実行します。s3:getObjectのタスクの前に既にPayloadがある程度のサイズとなっている想定です。

Input

{
    "key1": "under256KB.jsonl",
    "existing": 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
}

するとs3:getObject自体は成功しましたが、State Machineの実行は失敗しました。こちらも想定通りの動作です!

The state/task 'getObjectTask1' returned a result with a size exceeding the maximum number of bytes service limit.

おわりに

AWS Step FunctionsでPayloadサイズ上限256KBを超えた際の挙動を確認してみました。

期待通りの結果となって良かったです。

以上