【问题标题】:Unable to set true/false as an environment variable's value for Cloud Function无法将 true/false 设置为 Cloud Function 的环境变量值
【发布时间】:2020-02-19 15:08:04
【问题描述】:

我正在编写一个部署管理器脚本,它创建一个云函数并设置一些环境变量。

除了部署管理器无法正确识别我的一个属性/变量这一事实之外,一切都运行良好。我不断收到错误消息。

我有一个属性 is-local 从 CMD 行提供。

它的值必须是假/真,否则我也可以接受是/否。

在架构文件中,如果我将属性指定为boolean 并将值提供为false/true,则部署开始,只有云功能组件失败并出现错误。我在下面将错误指定为Error#1

如果我将属性指定为string 并将值提供为false/true,则部署开始但立即失败并出现错误。我在下面将错误指定为Error#2

ma​​in.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}} }

ma​​in.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 %}

部署管理器 CMD

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

知道这里的问题是什么...

【问题讨论】:

    标签: google-cloud-platform google-cloud-functions google-deployment-manager


    【解决方案1】:

    我对 jinja 不熟悉,但据我了解,环境变量只能是字符串。

    这么说,阅读 Error#1 我会得出结论,实际上,var 类型必须是字符串。

    然后,在第二个错误中,我们可以清楚地看到您正在尝试将布尔值放入字符串中。

    所以,是的,你必须使用 true / false 作为字符串。

    【讨论】:

    • 我试过true'true'"true"yes"yes"'yes',0,"0"'0',但似乎没有任何工作...它似乎将所有内容都检测为布尔值并给出了错误#2
    • 如果你尝试'false',它会准确显示True is not of type 'string' at ['is-local'] ?
    • 我的意思是我尝试了所有可能的真/假、是/否、0/1 组合,但它们都失败了,错误是它们不是字符串类型...不确定如何解决这个问题...如果我将属性设为布尔值,它仍然会失败,如果它是字符串,它也会失败。对我来说似乎很奇怪......
    • 使用双引号应该可以在 jinja 中使用。我怀疑 gcloud 命令没有将双引号传递给 jinja 模板。如果您编辑 main.jinja 模板并为值使用双引号(例如“true”),是否仍然会出现相同的错误?
    【解决方案2】:

    根据有关Using environment variables in 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'] }}-compute@developer.gserviceaccount.com scopes: - ...

    假设您从 CMD 行提供is-local 的值,并根据this documentation

    布尔值不区分大小写,因此 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 参数。

    【讨论】:

    • 1) 我谈到在为 Cloud Functions 设置环境变量时遇到问题,而在我的 jinja 脚本中使用环境变量时没有问题。 2) 正如我在问题中所解释的那样,如果我将属性类型设置为 Boolean 并提供任何形式的 true 它都不起作用。如果我将属性类型更改为字符串并提供任何形式的 true 它也不起作用...
    【解决方案3】:

    您可以将值设置为 jinja 文件本身中的字符串。有关详细信息,请参阅 this post 和提供您可以使用的不同方法的 this page

    在您的情况下,您可以编辑 create_cloud_function.jinja 文件并更改:

    环境变量: {% for key, value in environmentVariables.items() %} {{ 核心价值 }}

    到:

    环境变量: {% for key, value in environmentVariables.items() %} {{键}}:{{值|字符串}}

    清单完全展开后,该值应被视为一个字符串,以便 API 调用 Cloud Functions API

    【讨论】:

    • 似乎不起作用。现在我在 main.jinja.schema 中有 is_local 作为 Boolean 并根据你的建议更新了代码,但得到了相同的 Error#1 .
    【解决方案4】:

    最终我要做的 2 是从命令行传递 IS_LOCAL: '''false''' 并在我的 jinja 文件中传递 {{ key }} : {{ value }}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 2018-07-20
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多