Доступ к секретам в GCP Secret Manager из Python в Docker-nontsop Permission Denied

Я создаю простое приложение, которое хранит учетные данные Twilio в GCP Secret Manager и загружает их, когда они ему нужны. Однако я продолжаю получать ошибки отказа в разрешении (403) для ресурса проекта:

google.api_core.exceptions.PermissionDenied: 403 Разрешение отказано для проекта ресурса.

Я использую переменную среды, в которой указан путь к файлу JSON, содержащему учетные данные для учетной записи службы.

Вот что я уже пробовал:

  • Убедитесь, что разрешения установлены правильно в консоли GCP. Учетная запись службы устанавливается как владелец для проекта и как секретный аксессуар на уровне проекта, И как секретный аксессуар на уровне объекта для каждого из секретов.
  • Обеспечение правильной установки переменной среды - я убедился, что переменная ENV установлена ​​правильно и что файл, на который она указывает, можно прочитать. Я могу распечатать содержимое файла, открыв переменную ENV как файл JSON.
  • Подтверждено, что информация для аутентификации верна, путем сравнения содержимого моего файла JSON с данными в консоли GCP
  • Я использовал интерфейс командной строки gcloud для входа в систему под учетной записью службы, а затем использовал команды интерфейса командной строки для получения тех же секретов.
  • Я могу успешно получить доступ и отправить данные в корзину GCS, предполагая, что учетные данные правильно загружены из переменной ENV
  • Я пробовал получить доступ к секретам разными способами. Я пробовал другие методы, например, перечисление секретов в проекте. Все возвращают ошибку разрешений.

В качестве справки я следовал инструкциям на https://cloud.google.com/secret-manager/docs/reference/libraries, а также использовал документы официальной клиентской библиотеки. чтобы узнать, что еще может быть не так. Мне здесь ничто не помогло.

Я прочитал все ресурсы, которые смог найти, и ничего не помогает. есть идеи?

Спасибо!!!

РЕДАКТИРОВАТЬ: добавление кода ниже:

def access_secret(project_id, secret_id, version):
    """
    Access a secret- API token, etc- stored in Secret Manager

    Code from https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets#secretmanager-access-secret-version-python
    """
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the secret version
    name = client.secret_version_path(project_id, secret_id, version)

    # Access the secret version
    response = client.access_secret_version(name)

    # Return the secret payload
    payload = response.payload.data.decode('UTF-8')

    return payload

EDIT2: вот Dockerfile, в котором я запускаю этот код:

FROM python:3.8.2-slim-buster

WORKDIR /build

# Copy in the requirements.txt file and service account credentials
COPY requirements.txt <CREDENTIALS_FILENAME>.json /build/ 

ENV PYTHONUNBUFFERED=1 \
    GOOGLE_APPLICATION_CREDENTIALS=/build/<CREDENTIALS_FILENAME>.json \
    VOICEMAIL_TIMEOUT=55 \
    MULTIRING_TIMEOUT=15 \
    GCS_VM_BUCKET=<MY GCS BUCKET NAME> \
    GCP_PROJECT=<MY GCP PROJECT NAME> \
    PHONE_NUMBER=<PHONE NUMBER> \
    TWILIO_ACCOUNT_SID_VERSION=1 \
    TWILIO_AUTH_TOKEN_VERSION=1

# Install packages
RUN pip install -r requirements.txt

# Navigate to the directory containing the Python code
WORKDIR /code/src/

EXPOSE 5000

# Run the actual Python code
CMD ["python", "main.py"]

Позже у меня есть код Python, который вызывает указанную выше функцию:

GCS_VM_BUCKET = os.environ['GCS_VM_BUCKET']
GCP_PROJECT = os.environ['GCP_PROJECT']

TWILIO_SID = access_secret(GCP_PROJECT, 'TWILIO_ACCOUNT_SID', os.environ['TWILIO_ACCOUNT_SID_VERSION'])
TWILIO_AUTH_TOKEN = access_secret(GCS_PROJECT, 'TWILIO_AUTH_TOKEN', os.environ['TWILIO_AUTH_TOKEN_VERSION'])

где TWILIO_ACCOUNT_SID и TWILIO_AUTH_TOKEN - названия секретов в GCP.

Полная трассировка ошибки:

Traceback (most recent call last):   

File "/usr/local/lib/python3.8/site-packages/google/api_core/grpc_helpers.py", line 57, in error_remapped_callable                                                                                                        return callable_(*args, **kwargs)                                                                                                                                                                                     
File "/usr/local/lib/python3.8/site-packages/grpc/_channel.py", line 826, in __call__                                                                                                                                     
return _end_unary_response_blocking(state, call, False, None)                                                                                                                                                         
File "/usr/local/lib/python3.8/site-packages/grpc/_channel.py", line 729, in _end_unary_response_blocking                                                                                                                 
raise _InactiveRpcError(state)                                                                                                                                                                                      
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:                                                                                                                                                
status = StatusCode.PERMISSION_DENIED                                                                                                                                                                                   
details = "Permission denied on resource project <MY GCP PROJECT NAME>."                                                                                                                                                       
debug_error_string = "{"created":"@1588389938.954039708","description":"Error received from peer ipv4:172.217.12.138:443","file":"src/core/lib/surface
/call.cc","file_line":1056,"grpc_message":"Permission denied on resource 
project <MY GCP PROJECT NAME>.","grpc_status":7}"                                                                                                                                                               >                                                                                                                                                                                                                                                                                                                                                                                                                                               
The above exception was the direct cause of the following exception:                                                                                                                                                                                                                                                                                                                                                                            
Traceback (most recent call last):                                                                                                                                                                                        
File "main.py", line 7, in <module>                                                                                                                                                                                       
from parameters import *                                                                                                                                                                                              
File "/code/src/parameters.py", line 16, in <module>                                                                                                                                                                      
TWILIO_SID = access_secret(GCP_PROJECT, 'TWILIO_ACCOUNT_SID', 
os.environ['TWILIO_ACCOUNT_SID_VERSION'])                                                                                                         
File "/code/src/utils.py", line 46, in access_secret                                                                                                                                                                      
response = client.access_secret_version(name)                                                                                                                                                                         
File "/usr/local/lib/python3.8/site-packages/google/cloud/secretmanager_v1
/gapic/secret_manager_service_client.py", line 963, in access_secret_version                                                                    
return self._inner_api_calls["access_secret_version"](                                                                                                                                                                
File "/usr/local/lib/python3.8/site-packages/google/api_core/gapic_v1
/method.py", line 143, in __call__                                                                                                                   
return wrapped_func(*args, **kwargs)                                                                                                                                                                                  
File "/usr/local/lib/python3.8/site-packages/google/api_core/retry.py", line 
281, in retry_wrapped_func                                                                                                                   
return retry_target(                                                                                                                                                                                                  
File "/usr/local/lib/python3.8/site-packages/google/api_core/retry.py", line 
184, in retry_target                                                                                                                         
return target()                                                                                                                                                                                                       
File "/usr/local/lib/python3.8/site-packages/google/api_core/timeout.py", 
line 214, in func_with_timeout                                                                                                                  
return func(*args, **kwargs)                                                                                                                                                                                          
File "/usr/local/lib/python3.8/site-packages/google/api_core
/grpc_helpers.py", line 59, in error_remapped_callable                                                                                                        
six.raise_from(exceptions.from_grpc_error(exc), exc)                                                                                                                                                                  
File "<string>", line 3, in raise_from                                                                                                                                                                                
google.api_core.exceptions.PermissionDenied: 403 Permission denied on 
resource project <MY GCP PROJECT NAME>.          

1 ответ

Решение

Хорошо, оказывается, я использовал ИМЯ проекта, а не идентификатор проекта.

вздох. По крайней мере, ответ был легким.:]

Другие вопросы по тегам