「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関数を構築する場合、どのようなコード変更が必要ですか?ラムダ関数とそれが必要とする役割を作成する方法を知っています。私が書いたコードを変更する必要があるかどうかを知る必要があります。次のように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;
}
}
Q1に関しては、次の構文を使用してクライアントをビルドしてください。
AmazonS3 amazonS3 = AmazonS3Client.builder()
.withRegion("us-east-1")
.withCredentials(new AWSStaticCredentialsProvider(creds))
.build();
上記の回答で述べたように、S3とラムダを同じリージョンに配置する必要があります。これが理由です-
withRegion
メソッドを使用して明示的に領域を設定しない場合、SDKはデフォルトの領域プロバイダーチェーンを調べて、使用する領域を決定しようとします。使用される方法の1つは-
AWS_REGION環境変数がチェックされます。設定されている場合、その領域はクライアントの構成に使用されます。
そして、ラムダの場合-
この環境変数は、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
詳細: AWS SDKで「リージョンプロバイダーチェーンを介してリージョンを見つけることができない」例外を修正する方法
PS:上記のリンクは、これに関する追加の詳細がある私の個人的なブログに行きます。
調査のために実行できる手順:
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 Credentialsをローカルで設定したことを確認してください。
.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 )
以下のようにこれを試すことができます
BasicAWSCredentials creds = new BasicAWSCredentials("your-accessKey", "your-secretKey");
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(creds))
.withRegion(Regions.US_EAST_1).build();
これは私のために働いた。
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();