AWS SDK for JavaScript v3 のメモ
AWS SDK for Javascript v3 の挙動
AWSTypeScriptJavascriptAWS-SDKS3環境
deno 1.31.3 (release, x86_64-unknown-linux-gnu)
v8 11.0.226.19
typescript 4.9.4
"@aws-sdk/client-s3": "^3.294.0"
"@aws-sdk/lib-storage": "^3.294.0"
エラーハンドリング
公式ブログに instanceof
で判別できると書いてあるが使えない。
https://aws.amazon.com/jp/blogs/news/service-error-handling-modular-aws-sdk-js/
try {
await client.send(someCommand);
} catch (e) {
if (e instanceof InvalidSignatureException) {
// Handle InvalidSignatureException
} else if (e instanceof ResourceNotFoundException) {
// Handle ResourceNotFoundException
} else if (e instanceof FooServiceException) {
// Handle all other server-side exceptions from Foo service
} else {
// Other errors
}
e.name
での判別は動くのでそれを使いましょう。
存在しないオブジェクトデリート操作と応答
const client = new S3Client({設定});
awati client.send(new DeleteObjectCommand({
Bucket: バケット名,
Key: オブジェクトキー
}))
バケットが存在しない場合は NoSuchBucket
エラーが返ってきます。
バケットが存在していて、オブジェクトキーが存在しないとき S3
は 204 No Content
を返し正常として扱います。S3 互換のMinIO
, Wasabi
も同様です。
しかし、Google Cloud Storage
は 404 Not Found
を返すため NoSuchKey
のエラーが throw されます。
エラーを catch して e.name === 'NoSuchKey'
をハンドリングすることが必要な場面もあるかもしれません。
Multipart Upload
@aws-sdk/lib-storage
の Upload
クラスを使えば partSize
(デフォルト 5MB) で PutObjectCommand
と UploadPartCommand
を使い分けてくれます。
Google Cloud Storage
でも 2021 年より対応 しているようですが手元で実行するとエラーになるので何か対処が必要なようです。(未調査)
'$fault': 'client',
'$metadata': {
httpStatusCode: 400,
requestId: undefined,
extendedRequestId: undefined,
cfId: undefined,
attempts: 1,
totalRetryDelay: 0
},
Code: 'MalformedCompleteMultipartUploadRequest',
Details: 'XML not conformant to the schema at line: 1 column: 113. element "CompleteMultipartUpload" incomplete; missing required element "Part"'