Как настроить публичное чтение с помощью go-cloud s3blob? - PullRequest
0 голосов
/ 10 января 2019

Я следовал учебнику по go-cloud и мне удалось записать файл в мою корзину S3.

Но как мне установить ACL: s3.ObjectCannedACLPublicRead, также доступный для чтения или рабочие права на чтение этого объекта?!

Мой обходной путь - к сожалению, установить публичную политику корзины для моего gocloud.dev / blob / s3blob проекта .

Ответы [ 3 ]

0 голосов
/ 14 января 2019

все несоответствие между провайдерами должно быть предоставлено как BeforeWrite, как сказал @syntaqx.

b, err := s3blob.OpenBucket(ctx, bucket, s, nil)
    if err != nil {
        return
    }
    before := func(asFunc func(interface{}) bool) error {
        req := &s3manager.UploadInput{}
        ok := asFunc(&req)
        if !ok {
            return errors.New("invalid s3 type")
        }
        req.ACL = aws.String(acl)
        return nil
    }
    w, err := b.NewWriter(ctx, appendTime(fileName), &blob.WriterOptions{
        ContentType: forceContentTypeByExtension(fileName),
        BeforeWrite: before,
    })
0 голосов
/ 14 января 2019

Настройка ACL на уровне корзины / контейнера, вероятно, является правильным решением. Настройка ACL для каждого блоба может быть затруднена для эффективного управления. Это возможно для некоторых поставщиков хранилищ больших двоичных объектов (AWS S3, GCS), но не для других (Azure), поэтому в Go Cloud его поддержка не добавлена. Кроме того, все 3 провайдера (и Go Cloud) поддерживают функцию «подписанный URL», при которой вы, как владелец ресурса, можете создать URL-адрес, который предоставляет открытый доступ для чтения на него в течение ограниченного периода времени.

0 голосов
/ 10 января 2019

Похоже, что библиотека ожидает, что что-то непоследовательное между провайдерами будет предоставлено как BeforeWrite обратные вызовы:

opts := &blob.WriterOptions{}
opts.BeforeWrite(func(i interface{}) bool {
    p, ok := i.(*s3manager.UploadInput)
    if !ok {
        return false
    }
    p.ACL = aws.String("public-read")
    return true
})

w, err := b.NewWriter(ctx, "feeds/index.html", opts)

Предупреждение: Я полностью не тестировал этот код, но он fmt'd, поэтому он должен работать?

Я предупрежу вас, кажется, что эта библиотека находится в альфа-версии, по этим причинам. Если вы решите использовать этот способ обхода, у вас возникнут проблемы с его повторным использованием для всех облачных провайдеров. В конечном счете, я предлагаю просто реализовать функциональность, которую вы хотели бы, используя предоставленные SDK, и использовать шаблон Factory / Adapter для получения подходящего адаптера для данного вызова.

...