当前位置: 首页 > 知识库问答 >
问题:

Spark是否允许对DynamoDB使用Amazon假定角色和STS临时凭据?

羊渝
2023-03-14
final JobConf jobConf = new JobConf(sc.hadoopConfiguration());
jobConf.set("dynamodb.servicename", "dynamodb");
jobConf.set("dynamodb.input.tableName", tableName);
jobConf.set("mapred.output.format.class", "org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat");
jobConf.set("mapred.input.format.class", "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat");
jobConf.set("dynamodb.awsAccessKeyId",  accessKey);
jobConf.set("dynamodb.awsSecretAccessKey", secretKey);
jobConf.set("dynamodb.endpoint", endpoint);

为了接收STS临时凭据,我使用以下代码:

AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.defaultClient();
AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
        .withRoleArn(roleArn)  // arn:aws:iam::XXXXXXX:role/assume-role-DynamoDB-ReadOnly
        .withDurationSeconds(3600)
        .withRoleSessionName("assumed-role-session");
AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);
Credentials credentials = assumeResult.getCredentials();

调用Credentials.getAccessKeyId()、Credentials.getSecretAccessKey()和Credentials.getSessionToken()返回生成的临时凭据。有了这些凭据,我就可以成功地使用java aws sdk AmazonDynamoDBClient(非Spark方法)从DynamoDB获取数据。

用Spark有可能吗?spark是否允许使用以下内容:jobconf.set(“dynamodb.awssessionToken”,sessionToken)

共有1个答案

松嘉运
2023-03-14

通过查看代码,您可能可以将Dynamodb.customawscredentialsProvider与com.amazonaws.auth.StsAssureeroLessionCredentialsProvider的实例一起使用,以实现您想要的工作。

https://github.com/awslabs/emr-dynamodb-connector/blob/master/emr-dynamodb-hadoop/src/main/java/org/apache/hadoop/dynamodb/dynamodbconstants.java#L30

https://docs.aws.amazon.com/awsjavasdk/latest/javadoc/com/amazonaws/auth/stsAssureerolesessionCredentialsProvider.html

编辑:所以这比我最初想象的要难一点。我最终实现了自己的围绕StsAssureerOleSessionCredentialsProvider的包装器。

package foo.bar;

import com.amazonaws.auth.AWSSessionCredentials;
import com.amazonaws.auth.AWSSessionCredentialsProvider;
import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider;
import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;

public class HadoopSTSAssumeRoleSessionCredentialsProvider
        implements AWSSessionCredentialsProvider, Configurable {

    private static final String ROLE_ARN_CONF = "assumed.creds.role.arn";
    private static final String SESSION_NAME_CONF = "assumed.creds.session.name";

    private Configuration configuration;
    private STSAssumeRoleSessionCredentialsProvider delegate;

    public AWSSessionCredentials getCredentials() {
        return delegate.getCredentials();
    }

    public void refresh() {
        delegate.refresh();
    }

    public void setConf(Configuration configuration) {
        this.configuration = configuration;
        String roleArn = configuration.get(ROLE_ARN_CONF);
        String sessionName = configuration.get(SESSION_NAME_CONF);

        if (roleArn == null || roleArn.isEmpty() || sessionName == null || sessionName.isEmpty()) {
            throw new IllegalStateException("Please set " + ROLE_ARN_CONF + " and "
                    + SESSION_NAME_CONF + " before use.");
        }
        delegate = new STSAssumeRoleSessionCredentialsProvider.Builder(
                roleArn, sessionName).build();
    }

    public Configuration getConf() {
        return configuration;
    }
}

然后您可以这样使用它:

val ddbConf: JobConf = new JobConf(sc.hadoopConfiguration)

ddbConf.set("dynamodb.customAWSCredentialsProvider",
    "foo.bar.HadoopSTSAssumeRoleSessionCredentialsProvider")
ddbConf.set("assumed.creds.role.arn", "roleArn")
ddbConf.set("assumed.creds.session.name", "sessionName")
 类似资料:
  • 我的意思是我的错误是: ``` 正在检查“contacts”表是否存在{unrecognizedClientException:请求中包含的安全令牌无效。在request.extractorry(/root/work/contacts_api/node_modules/aws-sdk/lib/protocol/json.js:51:27)在request.calllisteners(/root/w

  • 我需要给我的客户提供临时访问密钥来连接到物联网服务(发布、接收等)。)。为了提供这种访问,我创建了一个Lambda函数,该函数调用来创建临时STS密钥。那些钥匙正在被创建,看起来很好。 我在具有以下内联策略的角色中使用带有Lambda的assumeRole: 注意:我已经添加了ec2权限来尝试辅助(简化)测试。 此角色具有开放的信任关系: 但是,在我的客户端代码(浏览器)中,我无法连接到IoT,并

  • 我在调用代入 STS 方法时遇到错误。它说用户无权对资源执行。 我做了以下工作: 我创建了一个用于访问 S3 存储桶的角色。 我在策略模拟器上运行了一个测试,工作正常 我创建了一个新组,并在其中创建了一个新策略,该策略对所有资源启用所有 sts 操作。 我使用策略模拟器运行了一个测试,以 sts 承担角色,指向在步骤 1 中创建的角色的 ARN;并且工作正常; 我创建了一个新用户,并将其放在步骤

  • 我们在AWS VPC中使用基于角色的IAM凭据。这意味着您永远不会将密钥传递给AWS SDK的客户端。 之前我们使用了PHPSDK。Amazon特别建议在PHP SDK中使用基于角色的身份验证时缓存凭据: https://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html#caching-iam-role-credential

  • 我用Spring靴和Spring安全。 我这样添加基于url的安全性 有没有办法只授权get、post、put…在url上担任某些角色?

  • 我目前有一个WP站点设置,安装了一个独特的“multisite”插件,专门用于WooCommerce产品的一个管理区域,但有两个不同的前端,基于两个不同的域,具有不同的主题。 其中一个站点是“批发”站点,而另一个是“零售”站点。批发网站只允许交易客户进行购买。问题在于这两个站点共享一个域,因此用户帐户。 问题:我需要确保,如果没有用户角色“trade_customer”的用户尝试登录批发网站,则会