首页 > 解决方案 > 使用 AWS Java SDK 为基于角色的联合用户创建 SQS,无需凭证

问题描述

我正在尝试使用 AWS Java SDK 创建 SQS。我没有访问密钥和密钥 ID,我使用我公司提供的链接进入 AWS 控制台。它是基于角色的 SAML 访问(联合登录)。每当我尝试从 Java 代码创建 SQS 时,我会收到 403 错误(如果我没有为凭证编写任何代码),或者如果我尝试使用 AWS 博客中为联合用户指定的代码会遇到更多错误。

我尝试了以下代码,但它不起作用:

AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder
                    .standard()
                    .withCredentials(new DefaultAWSCredentialsProviderChain())
                    .withRegion(Regions.EU_WEST_1)
                    .build();

GetFederationTokenRequest getFederationTokenRequest = new GetFederationTokenRequest();
            getFederationTokenRequest.setDurationSeconds(7200);
            getFederationTokenRequest.setName("<username>@<company>.com");

// Define the policy and add it to the request.
            Policy policy = new Policy();
            policy.withStatements(new Statement(Statement.Effect.Allow)
                    .withActions(SQSActions.AllSQSActions)
                    .withResources(new Resource("arn:aws:sqs:::test-queue")));
            getFederationTokenRequest.setPolicy(policy.toJson());

// Get the temporary security credentials.
            GetFederationTokenResult federationTokenResult = stsClient.getFederationToken(getFederationTokenRequest);

Credentials sessionCredentials = federationTokenResult.getCredentials();

// Package the session credentials as a BasicSessionCredentials BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(
                    sessionCredentials.getAccessKeyId(),
                    sessionCredentials.getSecretAccessKey(),
                    sessionCredentials.getSessionToken());

AmazonSQSAsync amazonSQS = AmazonSQSAsyncClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(basicSessionCredentials))
                    .withRegion(Regions.EU_WEST_1)
                    .build();

CreateQueueRequest request = new CreateQueueRequest("wifi-test-queue");

String result = amazonSQS.createQueue(request).getQueueUrl();

不幸的是,上面的代码不起作用。我确信我的帐户有权创建/访问 SQS,因为我能够使用 Terraform 实现类似的事情。

有人可以帮我如何使用这样的帐户创建资源吗?

标签: javaamazon-web-servicesaws-sdkamazon-sqsaws-java-sdk

解决方案


您需要包含 AWS 区域和帐号的通配符

new Resource("arn:aws:sqs:*:*:test-queue")

您可以使用IAM 模拟器测试等效的 IAM 策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sqs:CreateQueue",
            "Resource": "arn:aws:sqs:*:*:test-queue"
        }
    ]
}

推荐阅读