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

我已经完成了题为“以编程方式设置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()); } } 

}

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

 import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class LambdaFunctionHandler implements RequestHandler { @Override public String handleRequest(String input, Context context) { context.getLogger().log("Input: " + input); return null; } } 

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

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

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

请确保您的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(); 

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

你可以检查你是否有凭据,如果你进入.aws / credentials(这将包含“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

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

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

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

就Lambda而言 –

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

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

 AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); 

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

 AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build(); 

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

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

这对我有用。

 AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();