在 Go 1.15 版本中,能否使用 GAE 獨有的 API?

请注意,2022年4月13日起,GAE(Google App Engine)对于从Go 1.12及更高版本环境进行的GAE独有API访问已正式发布。请留意本文已过时。

 

截止到2021年10月3日,由于仍处于预览阶段,即使在app.yaml文件中添加了app_engine_apis: true,似乎也需要使用gcloud beta app deploy命令才能启用该功能。

以下是截至2021年7月29日的信息。


虽然GAE提供了方便的独有API,但在称为第2代的环境中不再受支持。我认为这是GAE/Go用户继续使用Go 1.11的主要原因。

但是在最近发布的 golang/appengine v2.0.0-rc2 中,已经支持了 Go 1.12 以及更高版本。

 

整理遗留 API 的界面,该 API 将在 Go 1.12+ 版本中得到支持。

因为最近有一些在Go 1.11中无法运行的库,即使它仍然是RC版本,所以能够迁移到新版本的Go非常有吸引力。
因此,我想了解当前版本(v1.6.7)和新版本之间的区别。

请注意,除非特别说明,否则所有信息截至于2021年7月29日。

简短的结论

在 Go 1.15 中,GAE 的专有 API 无法正常运行。

支持API的差异

正如发行说明中所述,不是所有的API都可用,还删除了一些API。
下表是从godoc和提交日志中提取的大致差异以及实际测试结果(部分)。

除非另有特别说明,否则以下信息仅适用于2021年7月29日。

パッケージ (v1.6.7)v2.0.0-rc2 でのサポートGo 1.15 環境で試した結果appengine利用可能partialaetest利用可能OKblobstore利用可能-capability利用可能-channel削除-cloudsql削除-datastore利用可能-delay利用可能NGfile削除-image利用可能-log利用可能 (一部制限あり)partialmail利用可能NGmemcache利用可能NGmodule利用可能NGremote_api削除-runtime利用可能NGsearch削除-socket削除-taskqueue利用可能NGurlfetch利用可能NGuser利用可能OKxmpp削除-

请实际操作一下

我对一些包进行了实际测试,分别在 Go 1.11 和 Go 1.15 版本上运行。(请注意,我并未尝试所有包含的功能。)

我把使用过的代码存放在以下存储库中。

 

API無法運作

许多 API 在使用 Go 1.15 时会返回以下错误。似乎需要明确启用对 GAE 独有的 API 的访问。

module hostname: Call error 7: App Engine APIs are not enabled, please add app_engine_apis: true to your app.yaml to enable.

仔细查看,部署时会输出下面的警告。

WARNING: There is a dependency on App Engine APIs, but they are not enabled in your app.yaml. Set the app_engine_apis property.

关于此设置,GAE/Python 3 有一份说明(测试版)的文档中提到了。

 

但是即使在app.yaml中添加了app_engine_apis: true,在使用gcloud app deploy的情况下,它仍然被忽视,而在使用gcloud beta app deploy时会出错,因此无法使用。
目前,它似乎受到使用限制,并且在GAE/Go中无法使用。

ERROR: (gcloud.beta.app.deploy) INVALID_ARGUMENT: version.app_engine_apis is not valid for runtime go115
- '@type': type.googleapis.com/google.rpc.BadRequest
  fieldViolations:
  - description: version.app_engine_apis is not valid for runtime go115
    field: version.app_engine_apis

API有動作

在Appengine中,那些需要使用GAE独有API的函数就像前面提到的那样不起作用,但是那些通过引用环境变量来实现的函数(主要是IsXXX系列函数)在Go 1.15版本中仍然能够正常工作。

aetest 包能够很顺利地执行测试,(即使在版本v1.6.7上也能在新的Go中执行)。

用户包在内部参考了GAE特有的HTTP标题,并且没有使用GAE自有的API,因此在Go 1.15上也能正常运行。

使用有限制的API。

log包中的API已被删除,日志输出也已更改为输出结构化日志而不是通过GAE独有的API调用。从代码看,似乎也输出了追踪ID,但在日志查看器中没有显示出来,并且与请求日志的关联也已经消失。

go115_with_v2.0.0-rc2.png

其他

登录:管理员设置

尽管 Go 1.12 及更高版本已不推荐使用,但 app.yaml 中的 login: admin 指定仍然可正常运作。

将App Engine迁移到Cloud Run

在研究 app_engine_apis: true 的过程中,我发现了一个将GAE服务转换为Cloud Run的非官方工具。

 

查看代码后发现包含以下警告输出。

runtime が第 1 世代の環境を使用している場合は第 2 世代に移行するように警告する

app_engine_apis が指定されている場合は Google Cloud client libraries に移行したうえで設定を削除するように警告する

Google 云构建包

我查看了在部署GAE/Go时运行的buildpacks的代码。部署时的警告消息似乎是在下面的位置定义的。

 

概述

不幸的是,在 Go 1.15 中,GAE 的特定 API 无法运行。

我认为将来可以通过向app.yaml添加设置来在第二代环境下使用GAE特有的API,但也会有一些功能不再可用。

需要特别注意的是,特别是与请求日志的关联已经丢失的日志输出部分。

https://cloud.google.com/appengine/docs/standard/runtimeshttps://cloud.google.com/appengine/docs/standard/go/go-differences

https://cloud.google.com/appengine/docs/standard/go111/writing-application-logs#writing_structured_logs

bannerAds