使用 serviceaccount 创建的 AWS 会话令牌针对 s3 对 Spark 应用程序进行身份验证

问题描述 投票:0回答:1

我正在尝试在 kubernetes 上运行 Spark 应用程序,然后该应用程序将在小型 YARN 集群上运行,但还没有那么远。
我通过 configmap 中的配置文件配置 Spark
Spark 应用程序应使用 AWS S3 存储桶作为默认 FS。
在 kubernetes 部署中,我使用指向角色 ARN 的服务帐户
当我看到以下环境变量时,部署进展顺利:

AWS_DEFAULT_REGION=.....
AWS_REGION=.....
AWS_ROLE_ARN=......
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_STS_REGIONAL_ENDPOINTS=regional

现在,我希望 Spark 使用存储在文件中的会话令牌和角色名称
我正在使用

TemporaryCredentialsProvider
但我找不到传递会话令牌的方法,我正在尝试:
spark.hadoop.fs.s3a.aws.credentials.provider: org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider spark.hadoop.fs.s3a.session.token.file: /var/run/secrets/eks.amazonaws.com/serviceaccount/token

但这行不通,我明白:
No AWS Credentials provided by TemporaryAWSCredentialsProvider : org.apache.hadoop.fs.s3a.CredentialInitializationException: Access key, secret key or session token is unset

我怎样才能传递令牌?有什么建议或替代方案吗?

apache-spark amazon-s3 amazon-eks
1个回答
0
投票

尝试使用 WebIdentityTokenCredentialsProvider 进行链接。

WebIdentityTokenCredentialsProvider awsCredentialProvider = WebIdentityTokenCredentialsProvider.builder()
        .roleArn(System.getenv("AWS_ROLE_ARN"))
        .roleSessionName(System.getenv("AWS_ROLE_SESSION_NAME"))
        .webIdentityTokenFile(System.getenv("AWS_WEB_IDENTITY_TOKEN_FILE"))
        .build();
© www.soinside.com 2019 - 2024. All rights reserved.