🪣
AWS SDK for Go を用いて S3 の条件付き書き込みのエラーをハンドリングする
AWS S3 の条件付き書き込み機能を用いた際の AWS SDK for Go でのエラーハンドリング方法です。
BucketAlreadyExists などは専用の型が存在していますが、 2025/04/30 時点では PreconditionFailed に関するエラーは一般的なエラー型から判断する必要があります。
AWS SDK for Go での API 呼び出しに関する操作は "github.com/aws/smithy-go" を利用しているため、 smithy-go のレスポンスエラーとしてハンドリングを行います。
package main
import (
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
smithy "github.com/aws/smithy-go/transport/http"
)
func main() {
awsConfig := config.LoadDefaultConfig(context.Background())
s3Client := s3.NewFromConfig(awsConfig)
_, err := s3.PutObject(context.Background(), &s3.PutObjectInput{
Bucket: aws.String("example-bucket"),
Key: aws.String("example-key"),
Body: strings.NewReader("example-body"),
IfMatch: aws.String("example-etag"),
})
var httpError *smithy.ResponseError
if errors.As(err, &httpError) {
if httpError.HTTPStatusCode() == http.StatusPreconditionFailed {
// ETag が一致しなかった場合の処理
}
}
}
Discussion