この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、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:GetObject
APIを叩いてオブジェクトを取得することにより挙動を確認します。
取得対象のオブジェクトとして、データサイズが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を超えた際の挙動を確認してみました。
期待通りの結果となって良かったです。
以上