Tạo URL đã ký V4 trong CloudRun
Tôi muốn tạo URL đã ký cho tài nguyên Google Cloud Storage từ một ứng dụng được triển khai bằng CloudRun.
Tôi thiết lập CloudRun bằng Tài khoản dịch vụ tùy chỉnh có vai trò GCS theo hướng dẫn này .
Mục đích của tôi là sử dụng V4 Signing để tạo các URL đã ký từ CloudRun. Có một hướng dẫn cho trường hợp sử dụng này, nơi một tệp service_account.jsonđược sử dụng để tạo cấu hình JWT. Điều này phù hợp với tôi trên localhost khi tôi tải xuống tệp từ IAM của google. Tôi muốn tránh để tệp này được cam kết trong kho lưu trữ, hãy sử dụng tệp mà tôi đã cung cấp trong CloudRun UI.
Tôi đã hy vọng rằng CloudRun sẽ đưa tệp tài khoản dịch vụ này vào vùng chứa ứng dụng và làm cho nó có thể truy cập được trong GOOGLE_APPLICATION_CREDENTIALSbiến nhưng không phải vậy.
Bạn có đề xuất về cách làm điều này không? Cảm ơn bạn.
Trả lời
Như bạn nói, Thư viện khách hàng của Golang Storage yêu cầu tệp json tài khoản dịch vụ để ký url.
Hiện có một yêu cầu tính năng đang mở trong GitHub cho việc này nhưng bạn sẽ có thể làm việc này với mẫu mà tôi tìm thấy ở đây:
import (
"context"
"fmt"
"time"
"cloud.google.com/go/storage"
"cloud.google.com/go/iam/credentials/apiv1"
credentialspb "google.golang.org/genproto/googleapis/iam/credentials/v1"
)
const (
bucketName = "bucket-name"
objectName = "object"
serviceAccount = "[PROJECTNUMBER][email protected]"
)
func main() {
ctx := context.Background()
c, err := credentials.NewIamCredentialsClient(ctx)
if err != nil {
panic(err)
}
opts := &storage.SignedURLOptions{
Method: "GET",
GoogleAccessID: serviceAccount,
SignBytes: func(b []byte) ([]byte, error) {
req := &credentialspb.SignBlobRequest{
Payload: b,
Name: serviceAccount,
}
resp, err := c.SignBlob(ctx, req)
if err != nil {
panic(err)
}
return resp.SignedBlob, err
},
Expires: time.Now().Add(15*time.Minute),
}
u, err := storage.SignedURL(bucketName, objectName, opts)
if err != nil {
panic(err)
}
fmt.Printf("\"%v\"", u)
}
Cloud Run (và các nền tảng máy tính khác) không đưa vào tệp khóa tài khoản dịch vụ. Thay vào đó, chúng access_tokencung cấp sẵn trên dịch vụ siêu dữ liệu phiên bản . Sau đó, bạn có thể trao đổi mã thông báo truy cập này với JWT.
Tuy nhiên, đôi khi, các thư viện ứng dụng khách của Google và gcloudhoạt động hiệu quả trên nền tảng máy tính của GCP mà không cần xác thực rõ ràng. Vì vậy, nếu bạn sử dụng các hướng dẫn trên trang mà bạn đã liên kết (gcloud hoặc mẫu mã), nó sẽ hoạt động hiệu quả.