J'ai suivi le tutoriel go-cloud et j'ai réussi à écrire un fichier dans mon compartiment S3.
Mais comment définir ACL: s3.ObjectCannedACLPublicRead aka public-read aka work readable permissions sur cet objet?!
Ma solution de contournement consiste malheureusement à définir une politique de compartiment public pour mon projet basé sur gocloud.dev/blob/s3blob . p >
3 Réponses :
Il semble que la bibliothèque s'attend à ce que tout élément incohérent entre les fournisseurs soit fourni sous forme de rappels 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)
Attention: je n'ai pas du tout testé ce code, mais il a fmt, donc ça devrait fonctionner?
Je vous préviens, il semble que cette bibliothèque soit en alpha, pour ce type de raisons. Le fait de vous fier à ce type de travail vous posera des problèmes pour essayer de le réutiliser pour tous les fournisseurs de cloud. En fin de compte, je suggère simplement de mettre en œuvre la fonctionnalité que vous souhaitez en utilisant les SDK fournis et de tirer parti du modèle Factory / Adapter pour récupérer le bon adaptateur pour un appel donné.
Je sais que c'est possible avec le aws-sdk-go. J'essaie d'y parvenir avec "Programmation cloud portable avec Go Cloud".
Mon erreur. J'ai mis à jour ma réponse pour tirer parti de la bibliothèque que vous demandez. Si cela fonctionne pour ce que vous essayez de faire, veuillez "✔ Accepter" cette réponse - Sinon, dites-moi ce que je peux faire pour vous aider.
tout élément incohérent entre les fournisseurs doit être fourni comme BeforeWrite comme l'a dit @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, })
Définir l'ACL au niveau du bucket / conteneur est probablement la bonne chose à faire. La définition d'ACL par objet blob peut être difficile à gérer efficacement. Il est possible sur certains fournisseurs de stockage d'objets blob (AWS S3, GCS) mais pas sur d'autres (Azure), donc Go Cloud n'a pas ajouté de prise en charge pour cela. En outre, les 3 fournisseurs (et Go Cloud) prennent en charge la fonctionnalité "URL signée", dans laquelle vous, en tant que propriétaire de la ressource, pouvez créer une URL qui fournit un accès public en lecture pendant une période limitée.
Également créé un bogue github.com/google/go-cloud/issues/1108