1923

都内と業界の隅っこで生活しているエンジニアのノート

Golang で Azure Blob Storage

Go 始めてみようと Tour of Go を終えた後、Azure Blob Storage を使った簡単なサンプルWebサイトを作った備忘録です。 Webフレームワークは最初に見かけた Gin を使って、Blobの操作は クイック スタート: Go を使用して BLOB をアップロード、ダウンロード、および一覧表示する を参考にしています。

作ったサンプルから、エラー処理などを省いてBLOB操作部分を抜粋すると以下な感じです。

main.go

一覧

   for marker := (azblob.Marker{}); marker.NotDone(); {
        listBlob, err := containerURL.ListBlobsFlatSegment(ctx, marker, azblob.ListBlobsSegmentOptions{})
        if err != nil {
            ctx.Error(err).SetType(gin.ErrorTypePublic)
            return
        }
        marker = listBlob.NextMarker

        for _, blobInfo := range listBlob.Segment.BlobItems {
            items = append(items, blobItem{
                Name: blobInfo.Name,
                Size: *blobInfo.Properties.ContentLength,
            })
        }
    }

アップロード

    formFiles := form.File["file1"]
    formFile := formFiles[0]
    fileName := formFile.Filename
    blobURL := containerURL.NewBlockBlobURL(fileName)

    file, err := formFile.Open()
    defer file.Close()
    if err != nil {
        ctx.Error(err).SetType(gin.ErrorTypePublic)
        return
    }
    buf := bytes.NewBuffer(nil)
    if _, err := io.Copy(buf, file); err != nil {
        ctx.Error(err).SetType(gin.ErrorTypePublic)
        return
    }

    _, err = azblob.UploadBufferToBlockBlob(ctx, buf.Bytes(), blobURL, azblob.UploadToBlockBlobOptions{
        BlockSize:   4 * 1024 * 1024,
        Parallelism: 16})

削除

   _, err := blobURL.Delete(ctx, azblob.DeleteSnapshotsOptionNone, azblob.BlobAccessConditions{})

Web App for Containers にデプロイして動作確認。

f:id:taka1923:20201130223112p:plain

DockerFile

FROM golang:latest
RUN go get -u github.com/Azure/azure-storage-blob-go/azblob && \
  go get -u github.com/gin-gonic/gin
COPY . /go/app
WORKDIR /go/app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/app/ .
CMD ["./main"]