🪣

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 が一致しなかった場合の処理
        }
    }
}
Happy Elements

Discussion