@@ -49,6 +49,7 @@ const (
4949 metadataFilePath = "filePath"
5050 metadataPresignTTL = "presignTTL"
5151 metadataStorageClass = "storageClass"
52+ metadataTags = "tags"
5253
5354 metatadataContentType = "Content-Type"
5455 metadataKey = "key"
@@ -191,6 +192,15 @@ func (s *AWSS3) create(ctx context.Context, req *bindings.InvokeRequest) (*bindi
191192 if contentTypeStr != "" {
192193 contentType = & contentTypeStr
193194 }
195+
196+ var tagging * string
197+ if rawTags , ok := req .Metadata [metadataTags ]; ok {
198+ tagging , err = s .parseS3Tags (rawTags )
199+ if err != nil {
200+ return nil , fmt .Errorf ("s3 binding error: parsing tags falied error: %w" , err )
201+ }
202+ }
203+
194204 var r io.Reader
195205 if metadata .FilePath != "" {
196206 r , err = os .Open (metadata .FilePath )
@@ -209,12 +219,14 @@ func (s *AWSS3) create(ctx context.Context, req *bindings.InvokeRequest) (*bindi
209219 if metadata .StorageClass != "" {
210220 storageClass = aws .String (metadata .StorageClass )
211221 }
222+
212223 resultUpload , err := s .authProvider .S3 ().Uploader .UploadWithContext (ctx , & s3manager.UploadInput {
213224 Bucket : ptr .Of (metadata .Bucket ),
214225 Key : ptr .Of (key ),
215226 Body : r ,
216227 ContentType : contentType ,
217228 StorageClass : storageClass ,
229+ Tagging : tagging ,
218230 })
219231 if err != nil {
220232 return nil , fmt .Errorf ("s3 binding error: uploading failed: %w" , err )
@@ -418,6 +430,26 @@ func (s *AWSS3) parseMetadata(md bindings.Metadata) (*s3Metadata, error) {
418430 return & m , nil
419431}
420432
433+ // Helper for parsing s3 tags metadata
434+ func (s * AWSS3 ) parseS3Tags (raw string ) (* string , error ) {
435+ tagEntries := strings .Split (raw , "," )
436+ pairs := make ([]string , 0 , len (tagEntries ))
437+ for _ , tagEntry := range tagEntries {
438+ kv := strings .SplitN (strings .TrimSpace (tagEntry ), "=" , 2 )
439+ isInvalidTag := len (kv ) != 2 || strings .TrimSpace (kv [0 ]) == "" || strings .TrimSpace (kv [1 ]) == ""
440+ if isInvalidTag {
441+ return nil , fmt .Errorf ("invalid tag format: '%s' (expected key=value)" , tagEntry )
442+ }
443+ pairs = append (pairs , fmt .Sprintf ("%s=%s" , strings .TrimSpace (kv [0 ]), strings .TrimSpace (kv [1 ])))
444+ }
445+
446+ if len (pairs ) == 0 {
447+ return nil , nil
448+ }
449+
450+ return aws .String (strings .Join (pairs , "&" )), nil
451+ }
452+
421453// Helper to merge config and request metadata.
422454func (metadata s3Metadata ) mergeWithRequestMetadata (req * bindings.InvokeRequest ) (s3Metadata , error ) {
423455 merged := metadata
0 commit comments