wake-up-neo.net

AWS Java SDK - Region kann nicht über die Anbieterkette der Region gefunden werden

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;
}

}
16
Codistan

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();
13
mapm

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.

7
Aniket Thakur

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 )

6
Ian

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();
3
Peter.Chu

Das hat bei mir funktioniert.

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