google-bigquery - 使用 Workload Identity 从 aws fargete 到 gcp bigquery 的连接错误

标签 google-bigquery aws-fargate workload-identity

我通过在 EC2 上使用分配的角色,使用从 AWS EC2 到 GCP Bigquery 的工作负载身份,并且运行良好。

但是,当我通过 Fargate 任务角色使用从 AWS Fargete 到 GCP Bigquery 的 Workload Identity 时,它不起作用。

在这种情况下我应该如何设置工作负载身份?

我使用了下面的库。

implementation(platform("com.google.cloud:libraries-bom:20.9.0"))
implementation("com.google.cloud:google-cloud-bigquery")

Stacktrace 有以下消息

com.google.cloud.bigquery.BigQueryException: Failed to retrieve AWS IAM role.
    at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:115) ~[google-cloud-bigquery-1.137.1.jar!/:1.137.1]
…
    at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: java.io.IOException: Failed to retrieve AWS IAM role.
    at com.google.auth.oauth2.AwsCredentials.retrieveResource(AwsCredentials.java:217) ~[google-auth-library-oauth2-http-0.26.0.jar!/:na]
…
    at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.getDataset(HttpBigQueryRpc.java:126) ~[google-cloud-bigquery-1.137.1.jar!/:1.137.1]
    ... 113 common frames omitted
Caused by: java.net.ConnectException: Invalid argument (connect failed)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
    at com.google.auth.oauth2.AwsCredentials.retrieveResource(AwsCredentials.java:214) ~[google-auth-library-oauth2-http-0.26.0.jar!/:na]
    ... 132 common frames omitted

最佳答案

我在使用 Google Cloud Storage (GCS) 时遇到了类似的问题。

正如 Peter 提到的,在 AWS Farage 任务上检索凭证与在 EC2 实例上运行代码不同,因此 Google SDK 无法编写正确的 AWS 凭证以与 Google Workload Identity Federation 进行交换。

我想出了一个解决方法,通过执行以下两件事,省去了编辑“../google/auth/aws.py”中核心文件的麻烦:

  1. 使用 boto3 获取 session 凭据
import boto3

task_credentials = boto3.Session().get_credentials().get_frozen_credentials()
  • 设置相关环境变量
  • from google.auth.aws import environment_vars
    
    os.environ[environment_vars.AWS_ACCESS_KEY_ID] = task_credentials.access_key
    os.environ[environment_vars.AWS_SECRET_ACCESS_KEY] = task_credentials.secret_key
    os.environ[environment_vars.AWS_SESSION_TOKEN] = task_credentials.token
    

    说明:
    我正在使用带有 boto3 和 google-cloud==2.4.0 的 Python3.9,但是如果以下代码位于“google.auth”中“Credentials”类下的函数“_get_security_credentials”中,则它应该适用于其他版本的 google SDK .aws”包:

            # Check environment variables for permanent credentials first.
            # https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html
            env_aws_access_key_id = os.environ.get(environment_vars.AWS_ACCESS_KEY_ID)
            env_aws_secret_access_key = os.environ.get(
                environment_vars.AWS_SECRET_ACCESS_KEY
            )
            # This is normally not available for permanent credentials.
            env_aws_session_token = os.environ.get(environment_vars.AWS_SESSION_TOKEN)
            if env_aws_access_key_id and env_aws_secret_access_key:
                return {
                    "access_key_id": env_aws_access_key_id,
                    "secret_access_key": env_aws_secret_access_key,
                    "security_token": env_aws_session_token,
                }
    

    警告:
    在 ECS 任务内运行代码时,所使用的凭证是临时的(ECS 承担任务的角色),因此您无法像通常建议的那样通过 AWS STS 生成临时凭证。
    为什么这是一个问题?由于任务是使用临时凭据运行的,因此它会过期并刷新。为了解决这个问题,您可以设置一个后台功能,每隔 5 分钟左右再次执行该操作(没有遇到临时凭据过期的问题)。

    关于google-bigquery - 使用 Workload Identity 从 aws fargete 到 gcp bigquery 的连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70194948/

    相关文章:

    google-bigquery - Bigquery SELECT * WHEN COUNT(DISTINCT value) 不起作用

    mysql - 从 github_timeline : group pushes and downloads by repos, 中选择存储库 url 并通过 stargazers 过滤 repos

    amazon-web-services - 将 AWS SecretManager 与 Fargate : Unable to locate credentials 结合使用

    github - 使用通用表达语言限制特定工作流程的权限

    google-bigquery - 谷歌 BigQuery 错误 401 消息 :Unauthorized when processing large amount of data

    google-bigquery - BigQuery 中的映射(动态键)

    aws-cli - 如何创建具有多个负载均衡器的 aws fargate 服务

    amazon-web-services - 在 AWS API 上获取 ThrottlingException : Rate exceeded, 状态代码:400

    google-cloud-platform - GCP IAM 权限 - 服务帐户无法拥有权限