Проблема
При попытке загрузить статический контент для моего веб-приложения из корзины Google Cloud Storage несколько файлов возвращают код ответа 403, а все остальные загружаютсяуспешно.
Настройка
Приложение представляет собой приложение Python (3.7) на основе Django (2.1.3), размещенное в Google App Engine и использующее учетные данные учетной записи службы, которыебыли предоставлены разрешения редактора в IAM.Мы используем Bootstrap 3.3.7 для нашего внешнего интерфейса, размещая его исходные файлы в нашей корзине GCS, и плагин django-storages (1.7.1) для взаимодействия с GCS API.
Проблемные файлы - изображения Glyphicon.предоставляется с Bootstrap, а также с картой CSS.Все остальные ресурсы Bootstrap загружаются без проблем.Я пытался:
- Предоставление учетной записи службы многочисленных комбинаций разрешений IAM
- Воссоздание учетной записи службы и файла ключа, который мы используем для ее аутентификации
- Отключение иповторное включение API облачного хранилища Google
- Создание нового сегмента и перезагрузка всех статических файлов в него с использованием учетных данных учетной записи службы
- Предоставление AllUsers доступа на чтение к проблемным файлам (так как в настоящее время установлены политики))
- Предоставление доступа AllUsers для чтения ко всей корзине
Последняя попытка исправить (# 6) разрешила доступ к глификонам, но не является приемлемым решением.
Код
Статический путь к файлу / конфигурация GCP в нашей политике settings.py
:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
# If on GAE, use STATIC_ROOT; local, use STATICFILES_DIRS
STATIC_URL = '/static/'
if os.getenv('GAE_ENV', '').startswith('standard'):
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
else:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static/')]
# Media url
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media/')
# Google Cloud Platform Settings (Storage & Authentication)
# Authentication
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.path.join(BASE_DIR, 'conf/vwa.json')
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
os.path.join(BASE_DIR, 'conf/vwa.json')
)
# File Storage
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = os.getenv('GS_BUCKET_NAME', '')
# Static Storage
STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
IAM для корзины:
{
"bindings": [
{
"members": [
"serviceAccount:SERVICEACCOUNTADDRESS"
],
"role": "roles/storage.admin"
},
{
"members": [
"projectEditor:PROJECTNAME",
"projectOwner:PROJECTNAME"
],
"role": "roles/storage.legacyBucketOwner"
},
{
"members": [
"projectViewer:PROJECTNAME"
],
"role": "roles/storage.legacyBucketReader"
}
],
"etag": "CAI="
}
Политика ACL для сегмента:
[
{
"entity": "project-editors-649435531377",
"projectTeam": {
"projectNumber": "649435531377",
"team": "editors"
},
"role": "OWNER"
},
{
"entity": "project-owners-649435531377",
"projectTeam": {
"projectNumber": "649435531377",
"team": "owners"
},
"role": "OWNER"
},
{
"entity": "project-viewers-649435531377",
"projectTeam": {
"projectNumber": "649435531377",
"team": "viewers"
},
"role": "READER"
}
]
Политика IAM для глициконов:
{
"bindings": [
{
"members": [
"projectOwner:PROJECTNAME",
"projectEditor:PROJECTNAME",
"serviceAccount:SERVICEACCOUNTADDRESS",
"allUsers"
],
"role": "roles/storage.legacyObjectOwner"
},
{
"members": [
"projectViewer:PROJECTNAME",
"allAuthenticatedUsers"
],
"role": "roles/storage.legacyObjectReader"
}
],
"etag": "CAQ="
}
Политика ACL для глификонов:
[
{
"entity": "project-owners-649435531377",
"projectTeam": {
"projectNumber": "649435531377",
"team": "owners"
},
"role": "OWNER"
},
{
"entity": "project-editors-649435531377",
"projectTeam": {
"projectNumber": "649435531377",
"team": "editors"
},
"role": "OWNER"
},
{
"entity": "project-viewers-649435531377",
"projectTeam": {
"projectNumber": "649435531377",
"team": "viewers"
},
"role": "READER"
},
{
"email": "SERVICEACCOUNTADDRESS",
"entity": "user-SERVICEACCOUNTADDRESS",
"role": "OWNER"
},
{
"entity": "allAuthenticatedUsers",
"role": "READER"
},
{
"entity": "allUsers",
"role": "OWNER"
}
]
Я ожидаючто проблемные файлы должны бытьправильно загружен, но фактическим поведением является код ответа 403.Я ценю любую помощь, а также предложения по улучшению моего вопроса.Спасибо!