当前位置: 首页 > 知识库问答 >
问题:

AttributeError:“tuple”对象没有“authorize”属性-GCP创建工作负载标识联合的服务帐户

宁卓
2023-03-14

我正在尝试在GCP中使用Python创建一个服务帐户。当我将env var GOOGLE_APPLICATION_凭证设置为JSON凭证文件,并使用以下代码时,这一切都很好:

GoogleCredentials.get_application_default()

但是,以下代码在使用Workload Identity Federation的CI-Github操作中失败:

import google
import googleapiclient.discovery
import os
from util import get_service_name

environment = os.getenv('ENVIRONMENT')

def create_service_account(requested_project_id):
    project_id = requested_project_id
    credentials = google.auth.default()

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service_account_name = f'svc-{get_service_name()}'

    service_accounts = service.projects().serviceAccounts().list(
        name='projects/' + project_id).execute()

    service_account_exists = False

    for account in service_accounts['accounts']:
        if (service_account_name in account['name']):
            service_account_exists = True
            service_account = account
            break

    if (service_account_exists == False):
        service_account = service.projects().serviceAccounts().create(
            name='projects/' + project_id,
            body={
                'accountId': service_account_name,
                'serviceAccount': {
                    'displayName': service_account_name
                }
            }).execute()
        
    print(f'{"Already Exists" if service_account_exists else "Created"} service account: ' + service_account['email'])

    return service_account

失败与错误:

 File "/opt/hostedtoolcache/Python/3.9.0/x64/lib/python3.9/site-packages/googleapiclient/_helpers.py", line 131, in positional_wrapper
    return wrapped(*args, **kwargs)   File "/opt/hostedtoolcache/Python/3.9.0/x64/lib/python3.9/site-packages/googleapiclient/discovery.py", line 298, in build
    service = build_from_document(   File "/opt/hostedtoolcache/Python/3.9.0/x64/lib/python3.9/site-packages/googleapiclient/_helpers.py", line 131, in positional_wrapper
    return wrapped(*args, **kwargs)   File "/opt/hostedtoolcache/Python/3.9.0/x64/lib/python3.9/site-packages/googleapiclient/discovery.py", line 600, in build_from_document
    http = _auth.authorized_http(credentials)   File "/opt/hostedtoolcache/Python/3.9.0/x64/lib/python3.9/site-packages/googleapiclient/_auth.py", line 119, in authorized_http
    return credentials.authorize(build_http()) AttributeError: 'tuple' object has no attribute 'authorize'

我正在使用以下Github操作向Google进行身份验证

- name: Authenticate to Google Cloud To Create Service Account
  uses: google-github-actions/auth@v0.4.3
  with:
    workload_identity_provider: 'projects/xxx/locations/global/workloadIdentityPools/github-actions-identity-pool/providers/github-provider'
    service_account: 'svc-iam-creator-dev@acme-dev-tooling.iam.gserviceaccount.com'

有人能帮忙吗?

共有1个答案

敖淮晨
2023-03-14

你有两个问题。这行代码失败:

credentials = google.auth.default()

问题1-生成Google OAuth访问令牌

将GitHub操作步骤更改为:

- name: Authenticate to Google Cloud To Create Service Account
  uses: google-github-actions/auth@v0.4.3
  with:
    token_format: 'access_token'  # Your python code needs an access token
    access_token_lifetime: '300s' # make this value small but long enough to complete the job
    workload_identity_provider: 'projects/xxx/locations/global/workloadIdentityPools/github-actions-identity-pool/providers/github-provider'
    service_account: 'svc-iam-creator-dev@acme-dev-tooling.iam.gserviceaccount.com'

问题2-创建凭据

由于ADC(应用程序默认凭据)无法提供凭据,此行将不起作用。

credentials = google.auth.default()

将Workload Identity Federation生成的访问令牌从GitHub操作输出传递到您的程序:

${{ steps.auth.outputs.access_token }}

从访问令牌创建凭据:

credentials = google.oauth2.credentials.Credentials(access_token)
service = googleapiclient.discovery.build('iam', 'v1', credentials=credentials) 
 类似资料:
  • Google docu表示,工作负载标识可以用来授权GKE POD使用Google API提供的服务(而且效果很好)。它还表示,将有一个自动创建的标识池,名为PROJECT\u ID.svc。id.goog。 关于工作负载标识联合的Docu说:“您可以使用工作负载标识池来组织和管理外部标识。” 在我按照这里所述配置了工作负载标识(并且工作正常)之后,我正在尝试检索项目中现有的工作负载标识池,我希望

  • 我按照指南设置GCP的工作负载标识,并使其适用于针对默认库伯内特斯命名空间配置的服务号,如下所示: 我想知道是否有办法为所有k8s命名空间创建绑定;如下所示,我已将默认命名空间替换为: 有什么办法可以做到这一点吗?

  • 使用Python 2.7,我使用Tkinter构建了一个图形用户界面。在我的图形用户界面上,我有一个打开输入弹出框的按钮。对弹出框的调用是: 弹出框构造为: 在弹出框中输入任何内容之前,我得到一个错误;完整堆栈跟踪如图所示(分为几行,因此它不仅仅是一堆文本): Tkinter回调中的异常 回溯(最近一次呼叫最后一次): 文件“C:\用户\ajpung\AppData\本地\连续体\Anaconda

  • 有人知道如果有任何其他方式的认证/授权访问谷歌云存储除了服务帐户密钥,当我使用@谷歌云/存储Node.js模块从这里?我读过关于“工作负载标识联合”的文章,但是在我看来,当我使用@google-Cloud/存储库时,我不能使用这种方法。我找不到任何合适的构造函数,只有这两个: 有什么建议吗?谢谢你们

  • 我目前正在测试这个Github操作,以使用Workload Identity Federation对gcloud资源进行身份验证。 我创建了一个工作负载标识提供程序,它具有自定义的属性映射Github存储库和使用Github Action的分支: 在授予服务帐户模拟权限时,我可以使用此命令确保Github操作从存储库的分支触发: 虽然这非常适合匹配一个确切的分支名称,但我也想使用同样的方法来使用通

  • 问题内容: 我想转换火花数据框架以使用以下代码添加: 详细的错误消息是: 有人知道我在这里做错了吗?谢谢! 问题答案: 您无法使用数据框,但可以将数据框转换为RDD并通过映射将其映射。在Spark 2.0之前,别名为。使用Spark 2.0,您必须先明确调用。