【问题标题】:Set IAM Policy works on local machine but not in GCE instance设置 IAM 政策适用于本地机器,但不适用于 GCE 实例
【发布时间】:2018-11-15 09:27:51
【问题描述】:

我的 Python 应用程序中的以下行在我的本地计算机上执行没有问题。

import googleapiclient.discovery
project_id = 'some-project-id'
resource_manager = googleapiclient.discovery.build('cloudresourcemanager', 'v1')
iam_policy_request = resource_manager.projects().getIamPolicy(resource=project_id, body={})
iam_policy_response = iam_policy_request.execute(num_retries=3)
new_policy = dict()
new_policy['policy'] = iam_policy_response
del new_policy['policy']['version']
iam_policy_update_request = resourcemanager.projects().setIamPolicy(resource=project_id, body=new_policy)
update_result = iam_policy_update_request.execute(num_retries=3)

当我在 GCE 实例中运行应用程序时,更准确地说是在 GCE 实例内的 Docker 容器中运行应用程序时,我得到了异常:

URL being requested: POST https://cloudresourcemanager.googleapis.com/v1/projects/some-project-id:setIamPolicy?alt=json
Traceback (most recent call last):
  File "/env/lib/python3.5/site-packages/google/api_core/grpc_helpers.py", line 54, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/env/lib/python3.5/site-packages/grpc/_channel.py", line 487, in __call__
    return _end_unary_response_blocking(state, call, False, deadline)
  File "/env/lib/python3.5/site-packages/grpc/_channel.py", line 437, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.PERMISSION_DENIED, User not authorized to perform this action.)>

即授权错误。奇怪的是,当我在 GCE 实例中打开 Python 终端会话并逐行运行 Python 代码时,我没有收到异常。它仅在代码作为应用程序的一部分运行时引发异常。

我在 GCE 实例中使用服务帐户,而不是我在本地计算机上的常规帐户。但我认为这不是问题,因为我能够在实例内部一一运行代码行,同时仍然依赖服务帐户角色。

我希望能够在 GCE 内的 Docker 容器内无异常地运行该应用程序。我觉得我错过了一些东西,但无法弄清楚丢失的部分是什么。

【问题讨论】:

    标签: python python-3.x docker google-cloud-platform google-compute-engine


    【解决方案1】:

    查看您的问题,这似乎是一个身份验证问题,因为您的应用程序没有经过正确身份验证:

    1- 首先运行此命令,它将让您的应用程序临时使用您自己的用户凭据: gcloud beta auth 应用-默认登录

    输出应该是这样的:

    凭据保存到文件:$SOME_PATH/application_default_credentials.json

    2-那么您已将 GOOGLE_APPLICATION_CREDENTIALS environment 变量设置为密钥文件的路径:

    导出 GOOGLE_APPLICATION_CREDENTIALS=$SOME_PATH/application_default_credentials.json

    之后尝试运行你的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-04
      • 2014-12-22
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多