背景
本来实现是通过 gcloud auth activate-service-account --key-file xxx.json 来切换用户
gcloud auth activate-service-account --key-file ${HOME}/${jsonf}
然后再用 gcloud alpha storage ls -l gs:// 命令去检索文件
gcloud alpha storage ls -l gs://${sakid}/
再把检索到的问题下载到本地 gcloud alpha storage cp gs://xxxx /tmp/xxxx
gcloud alpha storage cp gs://xxxx /tmp/xxxx
这种方式在单个处理里是OK的
问题
是如果一个终端想连接多个GCS的话,gcloud auth activate-service-account命令会让这个设定全局有效,也就是说会发生冲突导致想连接到别的GCS的处理出错。
解决方法
命令行会导致全局设定变化所以不可取了,只有局部有效的设定才能解决这个问题。
于是查找资料,发现了CLOUDSDK_ACTIVE_CONFIG_NAME环境变量可以解决这个问题。
处理中分别设定不同的CLOUDSDK_ACTIVE_CONFIG_NAME=XXXX,使设置在当前会话中有效
配置这个环境变量需要一些前提条件 设置configurations,方法如下
1.新建一个配置并命名
gcloud config configurations create alice-project #设置配置名称
2.给配置设置项目名
gcloud config set account alice@example.com
3.给配置设置区域
gcloud config set compute/zone us-central1-a
4.设置完了查看设置
gcloud config list
username $ gcloud config list
[compute]
zone = us-central1-a
[core]
account = alice@example.com
disable_usage_reporting = True
project = alice-project
Your active configuration is: [alice-project]
5.也可以用configurations 来查看配置一览
gcloud config configurations list
username $ gcloud config configurations list
NAME IS_ACTIVE ACCOUNT PROJECT DEFAULT_ZONE DEFAULT_REGION
alice-project True alice@example.com alice-project us-central1-a
6.同样的方法可以设置另一个项目
$ gcloud config configurations create bob-project
$ gcloud config set project bob-project
$ gcloud config set account bob@example.com
$ gcloud config set compute/zone asia-east1-a
7.切换配置时,可以使用命令gcloud config configurations activate
username $ gcloud config configurations activate alice-project
Activated [alice-project].
macbook:~ username $ gcloud config list
[compute]
zone = us-central1-a
[core]
account = alice@example.com
disable_usage_reporting = True
project = alice-project
Your active configuration is: [alice-project]
8.切换配置也可以不用命令行,使用环境变量CLOUDSDK_ACTIVE_CONFIG_NAME
username $ export CLOUDSDK_ACTIVE_CONFIG_NAME=bob-project
username $ gcloud config list
[compute]
zone = asia-east1-a
[core]
account = bob@example.com
disable_usage_reporting = True
project = bob-project
Your active configuration is: [bob-project]
9.只有一个项目时,也可以将CLOUDSDK_ACTIVE_CONFIG_NAME写入~/.bash_profile中
~ username $ echo "export CLOUDSDK_ACTIVE_CONFIG_NAME=bob-project" >> ~/.bash_profile
~ username $ source ~/.bash_profile
10.当在不同的处理(shell)中,可以分别给环境变量CLOUDSDK_ACTIVE_CONFIG_NAME设置不同的值
A Shell
export CLOUDSDK_ACTIVE_CONFIG_NAME=alice-project
B Shell
export CLOUDSDK_ACTIVE_CONFIG_NAME=bob-project
经验证两个Shell同时执行也不会受影响。
11.要删除配置可以用gcloud config configurations delete CONFIGURATION_NAME
$ gcloud config configurations list
NAME IS_ACTIVE ACCOUNT PROJECT COMPUTE_DEFAULT_ZONE COMPUTE_DEFAULT_REGION
default True sample@example.com default-project
my-config False my-project
$ gcloud config configurations delete my-config
The following configurations will be deleted:
- my-config
Do you want to continue (Y/n)? y
Deleted [my-config].
$ gcloud config configurations list
NAME IS_ACTIVE ACCOUNT PROJECT COMPUTE_DEFAULT_ZONE COMPUTE_DEFAULT_REGION
default True sample@example.com default-project
至此问题解决
参考:https://cloud.google.com/sdk/docs/configurations?hl=zh-cn