[英]Improving cold start up times on Google App Engine running Django on Python 3.7 Standard environment
[英]How to signed url for Google cloud storage on Google App Engine Standard environment with Python3.7?
我找不到使用 Python3.7 在 Google App Engine 標准環境中使用簽名網址的方法。
我在這里查看文檔: https : //cloud.google.com/storage/docs/access-control/signing-urls-manually
在 Google App Engine 應用程序中,您可以使用App Engine App Identity服務來簽署您的字符串。
但是 App Engine App Identity 依賴於google.appengine
包,這在 python 3.7 env 上不可用,如解釋here
專有 App Engine API 在 Python 3 中不可用。本節列出了推薦的替代品。
總體目標是您的應用程序應該是完全可移植的,並且可以在任何標准 Python 環境中運行。 您編寫的是標准 Python 應用程序,而不是 App Engine Python 應用程序。 作為這一轉變的一部分,您不再需要為應用的核心功能使用專有的 App Engine API 和服務。 目前,App Engine API 在 Python 3.7 運行時中不可用。
sdk 上的所有 api 都依賴於google.appengine
並在 python 3.7 env 上引發異常: EnvironmentError('The App Engine APIs are not available.')
在此處引發依賴專有 api 的異常:
try:
from google.appengine.api import app_identity
except ImportError:
app_identity = None
我知道我可以使用許多解決方案,例如ServiceAccountCredentials.from_json_keyfile_dict(service_account_dict)
但我必須直接在應用引擎上上傳帶有憑據的文件,我不能這樣做,因為項目憑據將在 git 或 ci 上公開。
我真的很想依賴來自應用引擎的默認憑據,比如其他 Google Cloud api,比如storage.Client()
,例如開箱即用。
有什么建議嗎?
對於Python與Google Cloud的交互,請使用App Engine標准Python 3運行時支持的Python客戶端 。
要使用App Engine Standard中的google-cloud-storage訪問雲存儲:
storage.Client()
身份驗證。 根據您需要實現的目標,我還建議您嘗試不同的方法:
也可以使用appengine api對blob進行簽名 :
google.appengine.api.app_identity.sign_blob()
這個問題可能很老,但它是第一個在 Google 搜索中顯示的問題,所以我認為它可能會幫助將來尋找的人也在這里發布這個問題。
此處發布的答案@guillaume-blaquiere確實有效,但它需要一個未提及的額外步驟,即將 IAM 中的Service Account Token Creator
角色添加到您的默認服務帳戶,這將允許所述默認服務帳戶“模擬服務帳戶” (創建 OAuth2 訪問令牌、簽署 blob 或 JWT 等)。”
這允許默認服務帳戶根據signBlob 文檔對 blob 進行簽名。
我在 AppEngine 上嘗試過,一旦獲得許可,它就可以完美運行。
import datetime as dt
from google import auth
from google.cloud import storage
# SCOPES = [
# "https://www.googleapis.com/auth/devstorage.read_only",
# "https://www.googleapis.com/auth/iam"
# ]
credentials, project = auth.default(
# scopes=SCOPES
)
credentials.refresh(auth.transport.requests.Request())
expiration_timedelta = dt.timedelta(days=1)
storage_client = storage.Client(credentials=credentials)
bucket = storage_client.get_bucket("bucket_name")
blob = bucket.get_blob("blob_name")
signed_url = blob.generate_signed_url(
expiration=expiration_timedelta,
service_account_email=credentials.service_account_email,
access_token=credentials.token,
)
我下載了 AppEngine默認服務帳戶的密鑰以進行本地測試,為了使其在 AppEngine 環境之外正常工作,我必須根據設置SCOPES
的注釋行向憑據添加適當的范圍。 如果僅在 AppEngine 本身中運行,您可以忽略它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.