Под Google Cloud Run вы можете выбрать, какую учетную запись обслуживания работает ваш контейнер. Использование учетной записи Compute Service по умолчанию не может генерировать подписанный URL. Кажется, нет этого, чтобы сделать это в Cloud Run (не то, чтобы я мог найти). Проблемы/50
Вещи, которые я пробовал:
Назначенной учетной записи услуги: Роли/IAM.ServiceAccountTokenCReator < /code> < /li>
Проверьте обходной путь в том же проекте GCP в виртуальной машине (VS Cloud Run) < /li>
Проверьте код работает локально в контейнере с учетной записью службы, загруженной из частного ключа (через файл json). < /li>
< /ol>
from google.cloud import storage
client = storage.Client()
bucket = client.get_bucket('EXAMPLE_BUCKET')
blob = bucket.get_blob('libraries/image_1.png')
expires = datetime.now() + timedelta(seconds=86400)
blob.generate_signed_url(expiration=expires)
< /code>
Не удается с: < /p>
you need a private key to sign credentials.the credentials you are currently using just contains a token. see https://googleapis.dev/python/google-ap ... ce-account for more details.
/usr/local/lib/python3.8/site-packages/google/cloud/storage/_signing.py, line 51, in ensure_signed_credentials
< /code>
Попытка добавить обходной путь, < /p>
Error calling the IAM signBytes API:
{ "error": { "code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT" }
}
Exception Location: /usr/local/lib/python3.8/site-packages/google/auth/iam.py, line 81, in _make_signing_request
< /code>
обходной код, как упоминалось в выпуске Github: < /p>
from google.cloud import storage
from google.auth.transport import requests
from google.auth import compute_engine
from datetime import datetime, timedelta
def get_signing_creds(credentials):
auth_request = requests.Request()
print(credentials.service_account_email)
signing_credentials = compute_engine.IDTokenCredentials(auth_request, "", service_account_email=credentials.ser
vice_account_email)
return signing_credentials
client = storage.Client()
bucket = client.get_bucket('EXAMPLE_BUCKET')
blob = bucket.get_blob('libraries/image_1.png')
expires = datetime.now() + timedelta(seconds=86400)
signing_creds = get_signing_creds(client._credentials)
url = blob.generate_signed_url(expiration=expires, credentials=signing_creds)
print(url)
< /code>
Как мне сгенерировать подписанный URL -адрес в разделе Google Cloud Run? /p>
Изменить:
Чтобы попытаться уточнить, учетная запись службы имеет правильные разрешения - она работает в GCE и локально с частным ключом JSON. < /p>
Подробнее здесь: https://stackoverflow.com/questions/642 ... -cloud-run