我通过在 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”中核心文件的麻烦:
- 使用 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/