无法将 true/false 设置为云函数的环境变量值
Unable to set true/false as an environment variable's value for Cloud Function
我正在编写一个 Deployment Manager 脚本,它创建一个 Cloud Function 并设置一些环境变量。
除 Deployment Manager 无法正确识别我的 properties/variables 之外,一切正常。我不断收到错误消息。
我有一个 属性 is-local
是我从 CMD 行提供的。
它的值需要是 false/true 或者我也可以接受 yes/no。
在架构文件中,如果我将 属性 指定为 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 %}
部署管理器 CMD
gcloud deployment-manager deployments create setup --template main.jinja --properties code-bucket:something-random-test-code-bucket,is-local:false
Error#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"}}
Error#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
知道这里有什么问题吗...
我不熟悉 jinja,但据我了解,环境变量只能是字符串。
说到这里,阅读错误 #1 我得出结论,实际上,var 类型必须是字符串。
然后,在第二个错误中,我们可以清楚地看到您正在尝试将布尔值放入字符串中。
所以,是的,您必须将 true
/ false
作为字符串来玩。
根据有关 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 被视为相同。
和
要指定多个属性,请提供以逗号分隔的 key:value 对。以什么顺序指定这些对并不重要。例如:
`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
参数。
您可以在 jinja 文件本身中将值定义为字符串。请参阅 this post for some details and this page,其中提供了您可以使用的不同方法。
对于您的情况,您可以编辑 create_cloud_function.jinja
文件并更改:
environmentVariables:
{% for key, value in environmentVariables.items() %}
{{ key }} : {{ value }}
至:
environmentVariables:
{% for key, value in environmentVariables.items() %}
{{ key }} : {{ value|string }}
清单完全展开后,为了 API 调用 Cloud Functions API
,该值应被视为字符串
最终我做了 2 件事是从命令行传递 IS_LOCAL: '''false'''
并在我的 jinja 文件中传递 {{ key }} : {{ value }}
。
我正在编写一个 Deployment Manager 脚本,它创建一个 Cloud Function 并设置一些环境变量。
除 Deployment Manager 无法正确识别我的 properties/variables 之外,一切正常。我不断收到错误消息。
我有一个 属性 is-local
是我从 CMD 行提供的。
它的值需要是 false/true 或者我也可以接受 yes/no。
在架构文件中,如果我将 属性 指定为 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 %}
部署管理器 CMD
gcloud deployment-manager deployments create setup --template main.jinja --properties code-bucket:something-random-test-code-bucket,is-local:false
Error#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"}}
Error#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
知道这里有什么问题吗...
我不熟悉 jinja,但据我了解,环境变量只能是字符串。
说到这里,阅读错误 #1 我得出结论,实际上,var 类型必须是字符串。
然后,在第二个错误中,我们可以清楚地看到您正在尝试将布尔值放入字符串中。
所以,是的,您必须将 true
/ false
作为字符串来玩。
根据有关 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 被视为相同。
和
要指定多个属性,请提供以逗号分隔的 key:value 对。以什么顺序指定这些对并不重要。例如:
`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
参数。
您可以在 jinja 文件本身中将值定义为字符串。请参阅 this post for some details and this page,其中提供了您可以使用的不同方法。
对于您的情况,您可以编辑 create_cloud_function.jinja
文件并更改:
environmentVariables: {% for key, value in environmentVariables.items() %} {{ key }} : {{ value }}
至:
environmentVariables: {% for key, value in environmentVariables.items() %} {{ key }} : {{ value|string }}
清单完全展开后,为了 API 调用 Cloud Functions API
,该值应被视为字符串最终我做了 2 件事是从命令行传递 IS_LOCAL: '''false'''
并在我的 jinja 文件中传递 {{ key }} : {{ value }}
。