Невозможно установить true/false в качестве значения переменной среды для Cloud Function.

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

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

У меня есть свойство is-local, которое я предоставляю из строки CMD.

Его значение должно быть ложным/истинным, или я также могу жить с да/нет.

В файле схемы, если я укажу свойство как boolean и укажу значение как false/true, тогда начнется развертывание, и только компонент Cloud Function выйдет из строя с ошибкой. Я указал ошибку как Error#1 ниже.

если я укажу свойство как string и укажу значение как false/true, тогда развертывание начнется, но немедленно завершится ошибкой. Я указал ошибку как Error#2 ниже.

main.jinja

{% set PROJECT_NAME = env['project'] %}
{% set CODE_BUCKET = properties['code-bucket'] %}
{% set IS_LOCAL = properties['is-local'] %}

resources:
- name: create-cf
  type: create_cloud_function.jinja
  properties:
    name: test-cf
    project: {{ PROJECT_NAME }}
    region: europe-west1
    bucket: {{ CODE_BUCKET }}
    runtime: nodejs10
    entryPoint: test
    topic: test
    environmentVariables: { 'CODE_BUCKET': {{ CODE_BUCKET }}, 'IS_LOCAL': {{IS_LOCAL}} }

main.jinja.schema

imports:
- path: create_cloud_function.jinja

required:
- code-bucket
- is-local

properties:
  code-bucket:
    type: string
    description: Name of the code bucket to host the code for Cloud Function.
  is-local:
    type: boolean
    description: Will Cloud Function run locally or in cloud.

create_cloud_function.jinja

{% set codeFolder = properties['name'] %}
{% set environmentVariables = properties['environmentVariables'] %}

resources:
#- type: cloudfunctions.v1.function
- type: gcp-types/cloudfunctions-v1:projects.locations.functions
  name: {{ properties['name'] }}
  properties:
    parent: projects/{{ properties['project'] }}/locations/{{ properties['region'] }}
    location: {{ properties['region'] }}
    function: {{ properties['name'] }}
    sourceArchiveUrl: gs://$(ref.{{ properties['bucket'] }}.name)/{{ codeFolder }}.zip
    entryPoint: {{ properties['entryPoint'] }}
    runtime: {{properties['runtime']}}
    eventTrigger:
      resource: $(ref.{{ properties['topic'] }}.name)
      eventType: providers/cloud.pubsub/eventTypes/topic.publish
    environmentVariables:
      {% for key, value in environmentVariables.items() %}
        {{ key }} : {{ value }}
      {% endfor %}

Командная строка диспетчера развертывания

gcloud deployment-manager deployments create setup --template main.jinja --properties code-bucket:something-random-test-code-bucket,is-local:false

Ошибка №1: — когда тип свойства является логическим в файле схемы

{"ResourceType":"gcp-types/cloudfunctions-v1:projects.locations.functions","ResourceErrorCode":"400","ResourceErrorMessage":{"code":400,"message":"Invalid value at 'function.environment_variables[1].value' (TYPE_STRING), false","status":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.BadRequest","fieldViolations":[{"field":"function.environment_variables[1].value","description":"Invalid value at 'function.environment_variables[1].value' (TYPE_STRING), false"}]}],"statusMessage":"Bad Request","requestPath":"https://cloudfunctions.googleapis.com/v1/projects/someproject/locations/europe-west1/functions","httpMethod":"POST"}}

Ошибка №2: — когда тип свойства является строкой в ​​файле схемы

errors:
- code: MANIFEST_EXPANSION_USER_ERROR
  location: /deployments/setup/manifests/manifest-1571821997285
  message: |-
    Manifest expansion encountered the following errors: Invalid properties for 'main.jinja':
    True is not of type 'string' at ['is-local']
     Resource: main-jinja Resource: config

Любая идея, в чем проблема здесь ...


person niklodeon    schedule 23.10.2019    source источник


Ответы (4)


Я не знаком с jinja, но, насколько я понимаю, переменные среды не могут быть ничем иным, как строками.

Сказав это, прочитав ошибку № 1, я пришел к выводу, что фактически тип var должен быть строкой.

Затем, при второй ошибке, мы ясно видим, что вы пытаетесь поместить логическое значение в строку.

Так что да, вам придется играть с true / false как со строками.

person Jesús Fuentes    schedule 23.10.2019
comment
Я пробовал true, 'true', "true", yes, "yes", 'yes', 0, "0", '0', но ничего не работает... Кажется, все определяется как логическое и выдается ошибка № 2 - person niklodeon; 23.10.2019
comment
Если вы попробуете «false», он покажет именно True is not of type 'string' at ['is-local'] ? - person Jesús Fuentes; 23.10.2019
comment
Я имел в виду, что я пробовал все возможные комбинации true/false, yes/no, 0/1, но все они терпят неудачу с ошибкой, что они не являются строкой типа... Не уверен, как это исправить... Если Я делаю свойство логическим, оно все равно терпит неудачу, и если это строка, она также терпит неудачу. Мне кажется довольно странным... - person niklodeon; 23.10.2019
comment
использование двойных кавычек должно было работать в jinja. Я подозреваю, что команда gcloud не передает двойные кавычки шаблону jinja. Если вы редактируете шаблон main.jinja и используете двойные кавычки для значения (например, true), вы по-прежнему получаете ту же ошибку? - person Patrick W; 01.11.2019

Вы можете определить значение set как строку в самом файле jinja. См. этот пост для получения дополнительной информации и эта страница, на которой представлены различные методы, которые вы можете использовать.

В вашем случае вы можете отредактировать файл create_cloud_function.jinja и изменить:

    environmentVariables:
      {% for key, value in environmentVariables.items() %}
        {{ key }} : {{ value }}

to:

    environmentVariables:
      {% for key, value in environmentVariables.items() %}
        {{ key }} : {{ value|string }}

После того, как манифест будет полностью развернут, значение следует считать строкой для целей вызова API к API облачных функций.

person Patrick W    schedule 01.11.2019
comment
похоже не работает. Теперь у меня есть is_local как логическое значение в main.jinja.schema, и я обновил код в соответствии с вашим предложением, но получил ту же ошибку № 1. - person niklodeon; 04.11.2019

В конце концов, мне нужно было передать IS_LOCAL: '''false''' из командной строки и {{ key }} : {{ value }} в моем файле jinja.

person niklodeon    schedule 31.03.2020

Согласно этой документации об использовании переменных среды в Jinja, вы должны использовать следующий синтаксис, чтобы добавить переменную окружения в ваши шаблоны:

{{ env["deployment"] }} # Jinja

И они показывают следующий пример:

- type: compute.v1.instance name: vm-{{ env["deployment"] }} properties: machineType: zones/us-central1-a/machineTypes/f1-micro serviceAccounts: - email: {{ env['project_number'] }}[email protected] scopes: - ...

Учитывая, что вы указываете значение is-local из строки CMD и в соответствии с эта документация:

Булевы значения нечувствительны к регистру, поэтому TRUE, true и True обрабатываются одинаково.

А ТАКЖЕ

Чтобы указать несколько свойств, укажите пары ключ:значение, разделенные запятыми. Неважно, в каком порядке вы указываете пары. Например:

`развертывания диспетчера развертывания gcloud создают my-igm

--template vm_template.jinja 

--properties zone:us-central1-a,machineType:n1-standard-1,image:debian-9`

Вы должны использовать TRUE, true, or True для параметра is-local.

person Joss Baron    schedule 23.10.2019
comment
1) Я говорил о проблемах с настройкой переменной среды для облачных функций, а не о проблемах с использованием переменных среды в моем скрипте jinja. 2) Как я объяснил в своем вопросе, если я установлю тип свойства Boolean и предоставлю любую форму true, это не сработает. Если я изменю тип свойства на строку и предоставлю любую форму true, это также не сработает... - person niklodeon; 24.10.2019