AWS Java SDK - 无法通过区域提供程序链查找区域

Cod*_*tan 32 java amazon-s3 amazon-web-services aws-sdk aws-lambda

我已经完成了题为"以编程方式设置AWS区域1"的问题,但它没有提供我需要的所有答案.

Q1:我得到了SDKClientException-Unable to find a region via the region provider chain.我究竟做错了什么?还是我错过了一个错字.

public class CreateS3Bucket {

public static void main(String[] args) throws IOException {

    BasicAWSCredentials creds = new BasicAWSCredentials("aws-access-key", "aws-secret-key");
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).build();

    Region region = Region.getRegion(Regions.US_EAST_1);
    s3Client.setRegion(region);

    try {
        String bucketName = "testBucket" + UUID.randomUUID();
        s3Client.createBucket(bucketName);
        System.out.println("Bucket Created Successfully.");

    } catch(AmazonServiceException awse) {

        System.out.println("This means that your request made it AWS S3 but got rejected");
        System.out.println("Error Message:" +awse.getMessage());
        System.out.println("Error Message:" +awse.getErrorCode());
        System.out.println("Error Message:" +awse.getErrorType());
        System.out.println("Error Message:" +awse.getRequestId());

    } catch (AmazonClientException ace) {

        System.out.println("The Amazon Client encountered an Error with network Connectivity");
        System.out.println("Error Message:" + ace.getMessage());
    }


}
Run Code Online (Sandbox Code Playgroud)

}

Q2:如果我想从中构建一个Lambda函数,需要进行哪些代码更改?我知道如何创建它需要的lambda函数和角色.只需知道我编写的代码是否需要更改.我应该如何实现LambdaFuctionHandler类,如下所示:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

 public class LambdaFunctionHandler implements RequestHandler<String, String> {

@Override
public String handleRequest(String input, Context context) {
    context.getLogger().log("Input: " + input);


    return null;
}

}
Run Code Online (Sandbox Code Playgroud)

map*_*apm 30

关于Q1,尝试使用以下语法构建您的客户端:

AmazonS3 amazonS3 = AmazonS3Client.builder()
    .withRegion("us-east-1")
    .withCredentials(new AWSStaticCredentialsProvider(creds))
    .build();
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`Regions.US_EAST_1`. (19认同)
  • 在应用程序中对“区域”进行硬编码几乎肯定是一个坏主意。 (2认同)
  • 在不了解问题的情况下寻求快速解决方案的人数是想要学习的人数的两倍。在发表评论时,这个不完整(因此不正确)的答案有 40 票赞成,而由 Aniket Thakur 在下面发布的带有解释的正确答案则获得了一半的赞成票 (20)。 (2认同)

Ani*_*kur 11

如上面的答案中所提到的,你需要在同一区域内使用S3和lambda,这就是为什么 -

如果未使用withRegion方法显式设置区域,则SDK会查询默认区域提供程序链以尝试确定要使用的区域.使用的方法之一是 -

将检查AWS_REGION环境变量.如果已设置,则该区域用于配置客户端.

就Lambda而言 -

此环境变量由Lambda容器设置.

最后,要使用默认凭据/区域提供程序链来确定环境中的区域,请使用客户端构建器的defaultClient方法.

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
Run Code Online (Sandbox Code Playgroud)

这与使用标准后跟构建相同.

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
Run Code Online (Sandbox Code Playgroud)

AWS文档:https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html

更多detials:如何使用AWS SDK修复"无法通过区域提供程序链查找区域"异常

PS:以上链接转到我的个人博客,其中包含有关此内容的其他详细信息.


Kum*_*hek 7

实际上,虽然我遇到了这个问题,但不可能一直更新代码。

因此,我们需要调查发生这种情况的原因,在调查时我发现.aws在您的根目录下创建了一个文件夹。它是因为我尝试安装aws console一段时间而创建的。

解决方案是您需要使用区域更新配置文件。


小智 6

您可以采取以下步骤进行调查:

请确保您的Lambda函数和S3位于同一区域.(当您使用ProviderChain时,它将从Lambda函数中获取区域

此外,如果您使用Lambda,则不需要指定BasicCredentials(aws-key..etc).

请阅读Lambda权限模型(http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html):

基本上,您指定的Lambda角色应具有访问S3的权限.

所有你需要配置S3几乎是:

private static final AmazonS3 s3Client = 
AmazonS3ClientBuilder.defaultClient();
Run Code Online (Sandbox Code Playgroud)

要在本地测试它,请确保已在本地配置AWS凭据.

你可以检查你是否有凭证,如果你进入.aws /凭证(这将包含"aws-access-key","aws-secret-key")

http://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html

要在本地设置凭据,您只需运行AWS Cli命令:aws configure(http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.htm)


小智 5

这对我有用。

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();
Run Code Online (Sandbox Code Playgroud)


Pet*_*Chu 5

你可以试试这个

BasicAWSCredentials creds = new BasicAWSCredentials("your-accessKey", "your-secretKey");
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
        .withCredentials(new AWSStaticCredentialsProvider(creds))
        .withRegion(Regions.US_EAST_1).build();
Run Code Online (Sandbox Code Playgroud)