簡體   English   中英

使用 Workload Identity 從 aws fargete 到 gcp bigquery 的連接錯誤

[英]connection error from aws fargete to gcp bigquery by using Workload Identity

我通過在 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

我有同樣的問題,但對於 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. role_name function 參數中刪除_get_metadata_security_credentials名稱。

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

應該就是這樣。

我在使用 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()
  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

解釋:
I am using Python3.9 with boto3 and google-cloud==2.4.0, however it should work for other versions of google SDK if the following code is in the function "_get_security_credentials" under the class "Credentials" in "google.auth .aws" package:

        # 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 生成臨時憑證。
為什么會出現問題? 好吧,由於任務是使用臨時憑據運行的,因此它會受到過期和刷新的影響。 為了解決這個問題,您可以設置一個后台 function 每隔 5 分鍾左右再次執行一次操作(沒有遇到臨時憑證過期的問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM