【问题标题】:connection error from aws fargete to gcp bigquery by using Workload Identity使用 Workload Identity 从 aws fargete 到 gcp bigquery 的连接错误
【发布时间】:2022-06-12 08:00:16
【问题描述】:

我通过在 EC2 上使用分配的角色来使用从 AWS EC2 到 GCP Bigquery 的 Workload Identity,它运行良好。

但是,当我使用 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-bigquery aws-fargate workload-identity


    【解决方案1】:

    我有同样的问题,但对于 Python 代码,无论如何我认为它应该是相同的。 你得到这个是因为在 AWS Fargate 中获取 AWS IAM 角色与 AWS EC2 不同,在 EC2 中你可以从实例元数据中获取它们,如下所示:

    curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
    

    在 AWS Faragte 中:

    curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
    

    所以要解决这个问题,需要完成以下工作:

    1. 将 GCP 工作负载身份联合凭据文件内容 [wif_cred_file] 更改如下:
        wif_cred_file["credential_source"]["url"]=f"http://169.254.170.2{AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}"
    
    1. 在库的“python3.8/site-packages/google/auth/aws.py”文件中[尝试在Java中查找类似文件],我已经更新了这段代码如下:
    2. 评论此行: # role_name = self._get_metadata_role_name(request)
    3. _get_metadata_security_credentials 函数参数中删除 role_name

    或者,如果您愿意,可以更改 aws.py 文件中的第 1 步,两种方式都可以。

    应该就是这样。

    【讨论】:

      【解决方案2】:

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

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

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

      1. 使用 boto3 获取会话凭据
      import boto3
      
      task_credentials = boto3.Session().get_credentials().get_frozen_credentials()
      
      1. 设置相关环境变量
      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 的 Python,但是如果以下代码位于“google.auth.aws”中“Credentials”类下的“_get_security_credentials”函数中,它应该适用于其他版本的 google SDK " 包:

              # 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 分钟左右再次执行一次操作(暂时没有遇到临时凭证过期的问题)。

      【讨论】:

        猜你喜欢
        • 2021-05-06
        • 2021-11-08
        • 1970-01-01
        • 2018-07-17
        • 2019-12-07
        • 2015-09-08
        • 1970-01-01
        • 2019-07-31
        • 2021-04-14
        相关资源
        最近更新 更多