cloud.google.com/go/cloudsqlconn 创建数据库实例Ipv4Enabled设置为false无效

原创 吴就业 95 0 2024-07-23

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/d111ff0e2fce4b709758a41cf3d6a288

作者:吴就业
链接:https://wujiuye.com/article/d111ff0e2fce4b709758a41cf3d6a288
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

sdk:cloud.google.com/go/cloudsqlconn v1.11.1

创建或更新数据库实例设置Ipv4Enabled为false时无效,不管设置true或false,最终的效果都是true。

我们debug代码的过程中发现,当Ipv4Enabled设置为false时,序列化后会忽略该字段,并且当实例创建出来后,我们使用get获取实例信息,该字段的值是true。从控制台看也是如此。

当Ipv4Enabled设置为true的时候:

截屏2024-07-23 17.09.59

序列化后:

截屏2024-07-23 17.10.36

当Ipv4Enabled设置为false的时候:

截屏2024-07-23 17.09.19

序列化后:

截屏2024-07-23 17.08.34

案例代码:

operation, err := sqlSvc.Instances.Insert(s.project, &sqladmin.DatabaseInstance{
		Kind:            "sql#instance",
		DatabaseVersion: req.MysqlVersion,
		InstanceType:    "CLOUD_SQL_INSTANCE",
		Name:            req.InstanceName,
		RootPassword:    getDefaultRootPassword(session),
		Region:          "us-central1",
		Settings: &sqladmin.Settings{
			Kind:             "sql#settings",
			AvailabilityType: availabilityType,
			DataDiskSizeGb:   req.StorageCapacity,
			DataDiskType:     "PD_SSD",
			Tier:             req.MachineShapes,
			IpConfiguration: &sqladmin.IpConfiguration{
				Ipv4Enabled:                             req.EnablePublicIPAddress,
				PrivateNetwork:                          s.vpc,
				AuthorizedNetworks:                      authorizedNetworks,
				EnablePrivatePathForGoogleCloudServices: true,
			},
			BackupConfiguration: &sqladmin.BackupConfiguration{
				Kind:             "sql#backupConfiguration",
				BinaryLogEnabled: true,
				Enabled:          true,
				StartTime:        "12:00",
			},
			UserLabels: session.Extend,
		},
	}).Context(ctx).Do()

详情请看Issue:https://github.com/GoogleCloudPlatform/cloud-sql-go-connector/issues/847

解决方案:

使用ForceSendFields,例如ForceSendFields: []string{"Ipv4Enabled"},需要注意的是:指定的是go结构体的字段名,而不是json的字段名,所以是大写的Ipv4Enabled,而不是ipv4Enabled。

案例代码:

operation, err := sqlSvc.Instances.Insert(s.project, &sqladmin.DatabaseInstance{
		Kind:            "sql#instance",
		DatabaseVersion: req.MysqlVersion,
		InstanceType:    "CLOUD_SQL_INSTANCE",
		Name:            req.InstanceName,
		RootPassword:    getDefaultRootPassword(session),
		Region:          "us-central1",
		Settings: &sqladmin.Settings{
			Kind:             "sql#settings",
			AvailabilityType: availabilityType,
			DataDiskSizeGb:   req.StorageCapacity,
			DataDiskType:     "PD_SSD",
			Tier:             req.MachineShapes,
			IpConfiguration: &sqladmin.IpConfiguration{
				Ipv4Enabled:                             req.EnablePublicIPAddress,
				PrivateNetwork:                          s.vpc,
				AuthorizedNetworks:                      authorizedNetworks,
				EnablePrivatePathForGoogleCloudServices: true,
                                ForceSendFields:                         []string{"Ipv4Enabled"},  
			},
			BackupConfiguration: &sqladmin.BackupConfiguration{
				Kind:             "sql#backupConfiguration",
				BinaryLogEnabled: true,
				Enabled:          true,
				StartTime:        "12:00",
			},
			UserLabels: session.Extend,
		},
	}).Context(ctx).Do()

相关文档:

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

Google Cloud如何给ServiceAccount授予资源细粒度的权限控制

Google Cloud如何给ServiceAccount授予资源细粒度的权限控制?介绍如何在控制台上配置,然后介绍如何通过API写代码配置。

如何理解Google Cloud的ServiceAccount、Role和Policy等概念

这些云平台搞的权限控制是真难理解,搞得好复杂。这篇写给刚接触Google Cloud的开发者,介绍一下如何快速理解Google Cloud的IAM的一些概念。

技术的成长其实是被逼出来的

如何提升解决问题的能力,那一定是在实战中成长,经历-挑战-总结,不断的训练。

关于mount踩的一些坑

关于mount命令使用遇到的一些问题,以及如何解决。

原创被抄袭,付费专栏变免费,版权问题如何解决?

我最痛恨的事情还是发生了,我的付费专栏被抄了,付费变免费。