Création d'URL signées V4 dans CloudRun
Je souhaite créer des URL signées vers des ressources Google Cloud Storage à partir d'une application déployée à l'aide de CloudRun.
J'ai configuré CloudRun avec un compte de service personnalisé avec le rôle GCS en suivant ce guide.
Mon intention était d'utiliser la signature V4 pour créer des URL signées à partir de CloudRun. Il existe un guide pour ce cas d'utilisation où un fichier service_account.jsonest utilisé pour générer la configuration JWT. Cela fonctionne pour moi sur localhost lorsque je télécharge le fichier à partir de l'IAM de Google. Je voudrais éviter que ce fichier soit engagé dans le référentiel, utilisez celui que j'ai fourni dans l'interface utilisateur de CloudRun.
J'espérais que CloudRun injecte ce fichier de compte de service dans le conteneur d'application et le rend accessible en GOOGLE_APPLICATION_CREDENTIALSvariable, mais ce n'est pas le cas.
Avez-vous une recommandation sur la façon de procéder? Je vous remercie.
Réponses
Comme vous le dites, les bibliothèques clientes de stockage Golang nécessitent un fichier json de compte de service pour signer les URL.
Il existe actuellement une demande de fonctionnalité ouverte dans GitHub pour cela, mais vous devriez pouvoir contourner ce problème avec cet exemple que j'ai trouvé ici:
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 (et d'autres plates-formes de calcul) n'injecte pas de fichier de clé de compte de service. Au lieu de cela, ils rendent access_tokendisponibles sur le service de métadonnées d'instance . Vous pouvez ensuite échanger ce jeton d'accès avec un JWT.
Cependant, souvent, les bibliothèques clientes de Google gcloudfonctionnent directement sur les plates-formes de calcul de GCP sans avoir besoin de s'authentifier explicitement. Donc, si vous utilisez les instructions sur la page que vous avez liée (gcloud ou exemples de code), cela devrait fonctionner immédiatement.