gpt4 book ai didi

python - 将 ImpersonatedCredentials 与 python api 一起用于 GCP PubSub SubscriberClient

转载 作者:行者123 更新时间:2023-12-04 07:18:49 54 4
gpt4 key购买 nike

我正在尝试创建 SubscriberClient使用 ImpersontatedCredentials (模拟服务帐户)使用 python pubsub API,然后使用该客户端创建一些订阅。我正在尝试尝试在本地运行此代码(尽管最终它将被部署为云功能)
这样做时,我收到此错误:

filter: "attributes.provider_id = "integration_test_create_delete_provider_id_123"", metadata=[('x-goog-request-params', 'name=projects/my-project/subscriptions/integration_test_create_delete_provider_id_123'), ('x-goog-api-client', 'gl-python/3.8.6 grpc/1.39.0 gax/1.31.1 gccl/2.7.0')]), last exception: 503 Getting metadata from plugin failed with error: ('Unable to acquire impersonated credentials: No access token or invalid expiration in response.', '{\n "error": {\n "code": 400,\n "message": "Request contains an invalid argument.",\n "status": "INVALID_ARGUMENT"\n }\n}\n')


我创建模拟凭据的代码如下所示:
from google.auth import impersonated_credentials
from google.cloud import pubsub_v1

target_scopes = [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/pubsub",
]
target_principal = ("target-svc-account@my-project.iam.gserviceaccount.com",)

def _get_impersonated_pubsub_client():
return pubsub_v1.SubscriberClient(credentials=_get_impersonated_creds())


def _get_impersonated_creds():
default_creds, _ = google.auth.default()
impersonated_creds = impersonated_credentials.Credentials(
source_credentials=default_creds,
target_principal=target_principal,
target_scopes=target_scopes,
)
return impersonated_creds
从那里,我调用 create_subscription(request=my_request)在我通过调用 _get_impersonated_pubsub_client() 得到的客户端上,大约一分钟后,我看到了上述错误。
我的请求对象如下所示:
{
"name": "projects/my-project/subscriptions/integration_test_create_delete_provider_id_123",
"topic": "projects/my-project/topics/my-topic-dev-us-west1",
}
如果我在没有模拟或在 SubscriberClient 中指定凭据的情况下调用相同的电话构造函数,一切正常。
我的第一个想法是这是一个权限错误,但我仔细检查了我的源帐户是否有 ServiceAccountTokenCreator角色。
此外,我尝试使用 GCloud CLI(包括模拟)运行等效命令,如下所示: gcloud pubsub subscriptions create my_subscription_name --topic=projects/my-project/topics/my-topic-dev-us-west1 --impersonate-service-account target-svc-account@my-project.iam.gserviceaccount.com这完全符合预期——这让我相信 GCP 中的权限设置正确。 SubscriberClient不适用于 ImpersonatedCredentials ,或者我可以采取一些强制措施来使身份验证工作吗?
我还确保运行 gcloud config unset auth/impersonate_service_account然后 gcloud auth application-default login以确保我的本地凭据处于良好状态。
相关依赖:
google-api-core[grpc]==1.31.1; platform_python_implementation != 'PyPy'
google-api-python-client==2.15.0; python_version >= '3.6'
google-auth-httplib2==0.1.0
google-auth==1.34.0
google-cloud-core==2.0.0b1; python_version >= '3.6'
google-cloud-firestore==2.2.0; platform_python_implementation != 'PyPy'
google-cloud-pubsub==2.7.0
google-cloud-storage==1.41.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'
google-crc32c==1.1.2; python_version >= '3.6'
google-resumable-media==2.0.0b1; python_version >= '3.6'
googleapis-common-protos[grpc]==1.53.0; python_version >= '3.6'
grpc-google-iam-v1==0.12.3
grpcio==1.39.0
httplib2==0.19.1

最佳答案

恕我直言,您的 Python 代码看起来是正确的。
完成以下步骤:

  • 列出启用的服务:

  • gcloud服务列表--启用
  • 验证 iamcredentials.googleapis.com 已启用。启用:

  • gcloud 服务启用 iamcredentials.googleapis.com
  • 验证 cloudresourcemanager.googleapis.com 已启用。启用:

  • gcloud 服务启用 cloudresourcemanager.googleapis.com
  • 验证 Compute Engine 默认服务帐号是否具有角色 角色/iam.serviceAccountTokenCreator 或更好。

  • 所需的权限是:
  • iam.serviceAccounts.getAccessToken
  • iam.serviceAccounts.getOpenIdToken (获取身份 token 需要此权限)。
    gcloud 项目 add-iam-policy-binding [PROECT_ID]
    --成员“服务帐户:[GCE_DEFAULT_SA_FULL_EMAIL]”
    --role "角色/iam.serviceAccountTokenCreator"
  • 验证 Compute Engine 默认服务帐号是否具有角色 角色/serviceusage.serviceUsageConsumer 或更好。
    gcloud 项目 add-iam-policy-binding [PROECT_ID]
    --成员“服务帐户:[GCE_DEFAULT_SA_FULL_EMAIL]”
    --role "角色/serviceusage.serviceUsageConsumer"

  • 如果未启用/授予之前的任何一项,则 token 发行将失败。
    注意:如果您只希望 Compute Engine 服务帐号能够模拟一个服务帐号,请更改步骤 4 以授予服务帐号而不是项目的角色:
    gcloud iam service-accounts add-iam-policy-binding [SA_FULL_EMAIL] \
    --member serviceAccount:[GCE_DEFAULT_SA_FULL_EMAIL] \
    --role roles/iam.serviceAccountTokenCreator

    关于python - 将 ImpersonatedCredentials 与 python api 一起用于 GCP PubSub SubscriberClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68627952/

    54 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com