【问题标题】:ERROR - 'Credentials' object has no attribute 'signer_email'错误 - 'Credentials' 对象没有属性 'signer_email'
【发布时间】:2022-07-04 21:23:58
【问题描述】:

我在 Google Cloud Run 上部署了一个 gRPC 服务,我想从 Composer 调用它。

我已将 roles/iam.serviceAccountTokenCreator 角色分配给我的 composer 工作节点正在运行的服务帐户,并且我没有挂载任何自定义服务密钥文件或设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量。

在气流 gRPC 挂钩中使用 JWT_GOOGLE authentication option 我收到以下错误:

[2022-05-31 14:20:16,082] {grpc.py:90} INFO - Calling gRPC service
[2022-05-31 14:20:16,097] {taskinstance.py:1152} ERROR - 'Credentials' object has no attribute 'signer_email'
Traceback (most recent call last):
  File "/usr/local/lib/airflow/airflow/models/taskinstance.py", line 985, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/lib/airflow/airflow/providers/grpc/operators/grpc.py", line 95, in execute
    for response in responses:
  File "/usr/local/lib/airflow/airflow/providers/grpc/hooks/grpc.py", line 136, in run
    with self.get_conn() as channel:
  File "/usr/local/lib/airflow/airflow/providers/grpc/hooks/grpc.py", line 104, in get_conn
    jwt_creds = google_auth_jwt.OnDemandCredentials.from_signing_credentials(credentials)
  File "/opt/python3.6/lib/python3.6/site-packages/google/auth/jwt.py", line 695, in from_signing_credentials
    kwargs.setdefault("issuer", credentials.signer_email)
AttributeError: 'Credentials' object has no attribute 'signer_email'
[2022-05-31 14:20:16,100] {taskinstance.py:1196} INFO - Marking task as FAILED. dag_id=example_dag, task_id=example_task, execution_date=20220531T135709, start_date=20220531T142015, end_date=20220531T142016
[2022-05-31 14:20:23,826] {local_task_job.py:102} INFO - Task exited with return code 1

有人知道我的凭据如何/为什么不包括我需要的字段吗?

【问题讨论】:

  • 您可以手动将服务帐户附加到 Cloud Run 和authenticate。让我知道这是否有帮助。
  • 我不确定这种方法是否相关 - 我们在 GCP Composer 中运行,因此气流工作人员可以访问理论上在此处具有正确权限的服务帐户
  • 好像是认证的问题。如果您尝试使用服务帐户向 IAP 中的 Cloud Composer API 进行身份验证,则需要获取 OIDC 令牌以进行身份​​验证,此link 中给出了步骤@ 如果有帮助,请告诉我。
  • 请查看我在问题中包含的链接 - 这就是 Airflow 的 gRPC 挂钩尝试获取帐户的方式,我希望他们的代码适用于我正在使用的服务帐户 - 我没有除此以外,不需要进行任何额外的身份验证,因为这就是气流连接和挂钩的用途
  • 您好 TCB,看来这个问题需要进一步调查,所以如果您有支持计划,请创建一个新的GCP support case

标签: google-cloud-platform airflow google-cloud-composer google-iam


【解决方案1】:

在与 Google Cloud 讨论后找到了解决方案 - 本质上,似乎没有为 GCE 服务帐户设置 JWT_GOOGLE 身份验证方法,所以我改为使用 CUSTOM 身份验证路线:

import google.auth.transport.grpc
import google.auth.transport.requests
import google.oauth2.credentials
import google.oauth2.id_token
from airflow.providers.grpc.operators.grpc import GrpcOperator

def connection_func(conn):
    """Custom connection function for gRPC authentication.

    Args:
        conn: Airflow Connection object

    Returns:
        An instantiated gRPC channel for making calls to our remote service.
    """

    request = google.auth.transport.requests.Request()

    if not str(conn.host).startswith("https://"):
        audience = f"https://{conn.host}"
    else:
        audience = conn.host

    token = google.oauth2.id_token.fetch_id_token(request, audience)
    creds = google.oauth2.credentials.Credentials(token)
    base_url = conn.host
    if conn.port:
        base_url = f"{base_url}:{conn.port}"
    channel = google.auth.transport.grpc.secure_authorized_channel(
        creds, None, base_url
    )
    return channel


return GrpcOperator(
        ...
        custom_connection_func=connection_func,
    )

这使用here 所见的方法来获取给定受众的 ID 令牌,然后从那里创建一组凭据,最后实例化 gRPC 安全通道以供操作员使用。

【讨论】:

    猜你喜欢
    • 2022-12-01
    • 2020-08-24
    • 1970-01-01
    • 2018-05-21
    • 2014-05-14
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多