我已经完成了题为“以编程方式设置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<String, String> {
@Override
public String handleRequest(String input, Context context) {
context.getLogger().log("Input: " + input);
return null;
}
}
答案 0 :(得分:18)
关于Q1,请尝试使用以下语法构建客户端:
AmazonS3 amazonS3 = AmazonS3Client.builder()
.withRegion("us-east-1")
.withCredentials(new AWSStaticCredentialsProvider(creds))
.build();
答案 1 :(得分:9)
如上面的答案中所述,您需要在同一区域中拥有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
更多详细信息:How to fix "Unable to find a region via the region provider chain" exception with AWS SDK
PS:上面的链接转到我的个人博客,其中对此有更多详细信息。
答案 2 :(得分: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();
要在本地测试它,请确保您已在本地配置AWS凭据。
如果你进入.aws /凭证,你可以检查你是否有凭证(这将包含&#34; aws-access-key&#34;,&#34; aws-secret-key&#34; )
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)
答案 3 :(得分:2)
这对我有用。
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();
答案 4 :(得分:0)
实际上,虽然我面临这个问题,但不可能一直都在更新代码。
因此,我们需要调查其发生的原因。在调查过程中,我发现在您的根目录中已创建.aws
文件夹。之所以创建该文件,是因为我尝试过一段时间安装aws console
。
解决方案是您需要使用区域更新配置文件。
答案 5 :(得分:0)
withRegion(Regions.DEFAULT_REGION)帮助我解决了问题
return AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.withRegion(Regions.DEFAULT_REGION)
.build();