Ich habe die Frage mit dem Titel "Programmgesteuertes Festlegen der AWS-Region 1" durchgegangen, sie enthält jedoch nicht alle Antworten, die ich brauche.
F1: Ich bekomme einen SDKClientException-Unable to find a region via the region provider chain
. Was mache ich falsch? oder gibt es einen Tippfehler, den ich übersehen habe.
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());
}
}
}
F2: Welche Code-Änderungen müssen gemacht werden, wenn ich daraus eine Lambda-Funktion bauen möchte? Ich weiß, wie man eine Lambda-Funktion und Rollen erstellt, die sie benötigt. Sie müssen nur wissen, ob der von mir geschriebene Code geändert werden muss. Wie sollte ich die LambdaFuctionHandler-Klasse wie folgt implementieren:
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;
}
}
Versuchen Sie in Bezug auf Q1, Ihren Client mit der folgenden Syntax zu erstellen:
AmazonS3 amazonS3 = AmazonS3Client.builder()
.withRegion("us-east-1")
.withCredentials(new AWSStaticCredentialsProvider(creds))
.build();
Wie in der Antwort oben erwähnt, müssen Sie S3 und Lambda in derselben Region haben.
Wenn Sie nicht explizit eine Region mit den withRegion
-Methoden festlegen, konsultiert das SDK die Standard-Regionsanbieter-Kette, um die zu verwendende Region zu ermitteln. Eine der Methoden ist -
Die Umgebungsvariable AWS_REGION wird geprüft. Wenn festgelegt, wird dieser Bereich zur Konfiguration des Clients verwendet.
Und im Fall von Lambda -
Diese Umgebungsvariable wird vom Lambda-Container festgelegt.
Verwenden Sie schließlich die defaultClient-Methode des Client Builder, um die Standard-Anmeldeinformations-/Regionsanbieterkette zum Bestimmen der Region aus der Umgebung zu verwenden.
AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
Dies ist das gleiche wie bei der Verwendung von Standard gefolgt von Build.
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
AWS-Dokumentation: https://docs.aws.Amazon.com/sdk-for-Java/v1/developer-guide/Java-dg-region-selection.html
Weitere Detials: So beheben Sie die Ausnahme mit dem AWS SDK, dass eine Region über die Region-Provider-Kette nicht gefunden werden kann
PS: Über den obigen Link gelangen Sie zu meinem persönlichen Blog, der weitere Informationen dazu enthält.
Nun können Sie Schritte unternehmen, um nachzuforschen:
Stellen Sie sicher, dass sich Ihre Lambda-Funktion und S3 in derselben Region befinden. (Wenn Sie ProviderChain verwenden, wird die Region von der Lambda-Funktion übernommen
Wenn Sie Lambda verwenden, müssen Sie auch keine BasicCredentials (aws-key..etc) angeben.
Bitte lesen Sie über Lambda Permission-Modell ( http://docs.aws.Amazon.com/lambda/latest/dg/intro-permission-model.html ):
Grundsätzlich sollte die von Ihnen zugewiesene Lambda-Rolle die Berechtigung haben, auf S3 zuzugreifen.
Alles was Sie zur Konfiguration von S3 brauchen, ist so ziemlich:
private static final AmazonS3 s3Client =
AmazonS3ClientBuilder.defaultClient();
Stellen Sie zum lokalen Testen sicher, dass Sie die AWS-Anmeldeinformationen lokal konfiguriert haben.
Sie können überprüfen, ob Sie über die Berechtigungsnachweise verfügen, wenn Sie in .aws/Berechtigungsnachweise wechseln (dies enthält den "aws-access-key", "aws-secret-key").
http://docs.aws.Amazon.com/sdk-for-Java/v1/developer-guide/setup-credentials.html
Um Ihre Anmeldeinformationen lokal einzurichten, müssen Sie lediglich den AWS Cli-Befehl ausführen: aws configure ( http://docs.aws.Amazon.com/cli/latest/userguide/cli-chap-getting-started). htm )
Sie können dies wie folgt versuchen
BasicAWSCredentials creds = new BasicAWSCredentials("your-accessKey", "your-secretKey");
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(creds))
.withRegion(Regions.US_EAST_1).build();
Das hat bei mir funktioniert.
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider()).withRegion(Regions.AP_SOUTH_1).build();