yc-actions / yc-sls-function

GitHub Action to deploy Serverless Function to Yandex Cloud.
MIT License
40 stars 8 forks source link

Поддержка Lockbox #355

Closed Inv1x closed 1 year ago

Inv1x commented 1 year ago

Сейчас приходится использовать отдельный action для получения секретов из Lockbox, а затем их пробрасывать как environment variable. При этом далеко не все значения, приходящие из Lockbox, могут записаться. Было бы круто, если бы была возможность указать именно lockbox переменные

Снимок экрана 2023-03-19 в 0 08 31 Снимок экрана 2023-03-19 в 0 10 09
nikolaymatrosov commented 1 year ago

Пришлёте PR? Ну или хотя бы пример того, как бы вы хотели описывать эти значения в action'е?

Inv1x commented 1 year ago

Например:

yc-sa-json-credentials: 'credentials'
...
lockbox-secrets:
- name-in-function: 'test1'
  secret_id: 'some_id'
  version_id: 'ver_id'
  key: 'key'
- name-in-function: 'test2'
  secret_id: 'some_id'
  version_id: 'ver_id'
  key: 'key'

Конкретно сейчас набросить код для подобного не могу, но я надеюсь, что написал понятно и идея видна. По сути, lockbox-secrets просто будет принимать массив из объектов, описывающих каждый секрет отдельно

nikolaymatrosov commented 1 year ago

Так работать не будет. Input'ы в github action принимают только строки. Никаких списков объектов. https://github.com/actions/toolkit/issues/184#issuecomment-1198653452

Inv1x commented 1 year ago

А если на подобии такого? Имплементация в Serverless Plugin. Единственное требование - доступ к Lockbox у того же SA, что отвечает за деплой функции. Передавать в качестве multiline параметра

lockbox-secrets: |
  name-in-func: ${{ lockbox:<lockbox_secret_id>/<lockbox_secret_key> }}
  name-in-func2: ${{ lockbox:<lockbox_secret_id>/<lockbox_secret_key2> }}
Inv1x commented 1 year ago

Единственное, решение в Serverless, по всей видимости, не самое актуальное, так как нет ни версий функций, ни значений из файла.

async getLockboxSecretKey(secretId: string): Promise<Record<string, string | undefined>> {
    const result: Record<string, string | undefined> = {};
    const response = await this.lockboxPayloadService.get(CloudApiLockboxPayloadService.GetPayloadRequest.fromPartial({
        secretId,
    }));

    for (const entry of response.entries) {
        result[entry.key] = entry.textValue;
    }

    return result;
}
nikolaymatrosov commented 1 year ago

Так вы не можете примонтировать в переменные окружения функции секрет с типом файл. Так просто не будет работать. Поэтому и нет.

Inv1x commented 1 year ago

Сделал PR, опирался на эту доку