I am trying to transfer files between the two projects. I managed to create a service account and gave read access to the storage in the source project and write access to the storage in the destination project. I created a storage trigger function in the source project which will read the file when created. Now my requirement is to copy the same file to the destination project.
I have this code copied from online examples, which can copy files between bucket in the same project. I want to achieve the same between two different projects. Is this possible? TIA.
package p
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"time"
"cloud.google.com/go/functions/metadata"
"cloud.google.com/go/storage"
)
var (
storageClient *storage.Client
sourceBucket = "testSource"
destinationBucket = "testDestination"
)
type Event struct {
Kind string `json:"kind"`
ID string `json:"id"`
SelfLink string `json:"selfLink"`
Name string `json:"name"`
Bucket string `json:"bucket"`
Generation string `json:"generation"`
Metageneration string `json:"metageneration"`
ContentType string `json:"contentType"`
TimeCreated time.Time `json:"timeCreated"`
Updated time.Time `json:"updated"`
TemporaryHold bool `json:"temporaryHold"`
EventBasedHold bool `json:"eventBasedHold"`
RetentionExpirationTime time.Time `json:"retentionExpirationTime"`
StorageClass string `json:"storageClass"`
TimeStorageClassUpdated time.Time `json:"timeStorageClassUpdated"`
Size string `json:"size"`
MD5Hash string `json:"md5Hash"`
MediaLink string `json:"mediaLink"`
ContentEncoding string `json:"contentEncoding"`
ContentDisposition string `json:"contentDisposition"`
CacheControl string `json:"cacheControl"`
Metadata map[string]interface{} `json:"metadata"`
CRC32C string `json:"crc32c"`
ComponentCount int `json:"componentCount"`
Etag string `json:"etag"`
CustomerEncryption struct {
EncryptionAlgorithm string `json:"encryptionAlgorithm"`
KeySha256 string `json:"keySha256"`
}
KMSKeyName string `json:"kmsKeyName"`
ResourceState string `json:"resourceState"`
}
func init() {
var err error
storageClient, err = storage.NewClient(context.Background())
if err != nil {
log.Fatalf("storage.NewClient: %v", err)
}
}
func FileTransfer(ctx context.Context, e Event) error {
meta, err := metadata.FromContext(ctx)
if err != nil {
return fmt.Errorf("metadata.FromContext: %v", err)
}
//Retry Logic - Ignore events that are too old
expiration := meta.Timestamp.Add(10 * time.Second)
if time.Now().After(expiration) {
log.Printf("event timeout: halting retries for expired event '%q'", meta.EventID)
return nil
}
byt, _ := json.Marshal(&e)
fmt.Println("Event Data: ", string(byt))
docData, err := read(storageClient, e.Bucket, e.Name)
if err != nil {
fmt.Println("Document read failed")
return fmt.Errorf("Document read failed")
}
fmt.Println("Document Data Read success: ", string(docData))
err = copyToBucket(storageClient, destinationBucket, e.Bucket, e.Name)
if err != nil {
fmt.Println("Document copy failed")
return fmt.Errorf("Document copy failed")
}
return nil
}
func read(client *storage.Client, bucket, object string) ([]byte, error) {
ctx := context.Background()
// [START download_file]
rc, err := client.Bucket(bucket).Object(object).NewReader(ctx)
if err != nil {
return nil, err
}
defer rc.Close()
data, err := ioutil.ReadAll(rc)
if err != nil {
return nil, err
}
return data, nil
// [END download_file]
}
func move(client *storage.Client, bucket, object string) error {
ctx := context.Background()
// [START move_file]
dstName := object + "-rename"
src := client.Bucket(bucket).Object(object)
dst := client.Bucket(bucket).Object(dstName)
if _, err := dst.CopierFrom(src).Run(ctx); err != nil {
return err
}
if err := src.Delete(ctx); err != nil {
return err
}
// [END move_file]
return nil
}
func copyToBucket(client *storage.Client, dstBucket, srcBucket, srcObject string) error {
ctx := context.Background()
// [START copy_file]
dstObject := srcObject
src := client.Bucket(srcBucket).Object(srcObject)
dst := client.Bucket(dstBucket).Object(dstObject)
if _, err := dst.CopierFrom(src).Run(ctx); err != nil {
return err
}
// [END copy_file]
return nil
}